乗算器
出典: フリー百科事典『ウィキペディア(Wikipedia)』
乗算器(じょうざんき、multiplier)とは、2数の乗算を行うためのハードウェアの回路であり、 #デジタル乗算器と#アナログ乗算器がある。
目次 |
[編集] デジタル乗算器
デジタルに乗算を実行する回路で、CPUの実行ユニット内にALUとして実装されることが多い。
デジタル乗算器を実装するには様々な技法が考えられる。 多くの技法は分割した部分の積を計算し、それを加算してまとめることで実現する。 このやり方は、小学校で習う十進整数の筆算による乗算と似ている。 しかし、乗算器ではそれを二進数で実現する。
[編集] 符号無整数の場合の例
ここでは、例示のために8ビットの符号無整数の乗算について説明する。 乗算器の入力であるふたつの数を a[7:0] と b[7:0] とし、ビット配列とみなす。 この場合、8回の 1ビット乗算で 8つの部分積を求める。aの各ビットをbにかける。 つまり、それはaのビットを取り出して、その値に応じて 00000000 か 11111111 のどちらかのビットパターンを作り、ビット演算でANDを実行するのと等しい。
p0[7:0] = a[0] × b[7:0] = {8{a[0]}} & b[7:0] p1[7:0] = a[1] × b[7:0] = {8{a[1]}} & b[7:0] p2[7:0] = a[2] × b[7:0] = {8{a[2]}} & b[7:0] p3[7:0] = a[3] × b[7:0] = {8{a[3]}} & b[7:0] p4[7:0] = a[4] × b[7:0] = {8{a[4]}} & b[7:0] p5[7:0] = a[5] × b[7:0] = {8{a[5]}} & b[7:0] p6[7:0] = a[6] × b[7:0] = {8{a[6]}} & b[7:0] p7[7:0] = a[7] × b[7:0] = {8{a[7]}} & b[7:0]
次に最終的な積を求めるため、部分積を以下のように足し合わせる。
p0[7] p0[6] p0[5] p0[4] p0[3] p0[2] p0[1] p0[0] + p1[7] p1[6] p1[5] p1[4] p1[3] p1[2] p1[1] p1[0] 0 + p2[7] p2[6] p2[5] p2[4] p2[3] p2[2] p2[1] p2[0] 0 0 + p3[7] p3[6] p3[5] p3[4] p3[3] p3[2] p3[1] p3[0] 0 0 0 + p4[7] p4[6] p4[5] p4[4] p4[3] p4[2] p4[1] p4[0] 0 0 0 0 + p5[7] p5[6] p5[5] p5[4] p5[3] p5[2] p5[1] p5[0] 0 0 0 0 0 + p6[7] p6[6] p6[5] p6[4] p6[3] p6[2] p6[1] p6[0] 0 0 0 0 0 0 + p7[7] p7[6] p7[5] p7[4] p7[3] p7[2] p7[1] p7[0] 0 0 0 0 0 0 0 ------------------------------------------------------------------------------------------- P[15] P[14] P[13] P[12] P[11] P[10] P[9] P[8] P[7] P[6] P[5] P[4] P[3] P[2] P[1] P[0]
別の言い方をすると、P[15:0] は p0, p1 << 1, p2 << 2, …… を足し合わせ、最終的に 符号なしの16ビットの積が求められる。
[編集] 符号付整数の場合
b が符号付整数だった場合、部分積を符号拡張した上で足し合わせる必要がある。 a が符号付整数だった場合、部分積の p7 を足すのではなく、それ以外の合計から引かなければならない。
[編集] 実装
古い乗算器アーキテクチャでは、シフターとアキュムレータを使って部分積を足し合わせる必要があった。 また、部分積ひとつを計算するのに 1クロックサイクルを要した。 最近の乗算器アーキテクチャは、Wallace treeと呼ばれるものに似ていて、1クロックサイクルで部分積をすべて加算する。 Wallace tree型乗算器の性能をさらに向上させるためには、被乗数の一方にBooth encodingを施して加算すべき部分積の数を減らす。
[編集] アナログ乗算器
アナログに乗算を実行する回路で、周波数帯域の変換等に用いられる。 一般的な実装方法はA*B=exp(log(A)+log(B))という等式を利用するものである。
基本的な原理は次のものである。
- バイポーラトランジスタでVbe∝log(Ic)となることを利用して、入力信号の対数を得る。
- オペアンプで加算する。
- 1と同様にIc∝exp(Vbe)を利用して2.で得た和の指数を取る(これが2数の積)。
(注意:アナログ回路なので実際に各ステップ間に時間経過があるわけではない。)
2の部分を減算に変更すれば、同様の原理で除算も可能。