乗算器

出典: フリー百科事典『ウィキペディア(Wikipedia)』

これはこのページの過去の版です。Kstar (会話 | 投稿記録) による 2012年5月9日 (水) 14:57個人設定で未設定ならUTC)時点の版 (→‎アナログ乗算器)であり、現在の版とは大きく異なる場合があります。

乗算器(じょうざんき、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 を足すのではなく、それ以外の合計から引かなければならない。

上で説明した乗算器を2の補数による符号付整数を扱えるように修正するには、足し合わせる際に以下のように一部の項を逆転させ、かつ p0 と p7 の左端に 1 を補う。ここでマイナス記号 (-) の意味に注意されたい。これは符号の反転ではなく、ビットの反転である。各部分積 pxMSBが反転されているのは、符号拡張を省くためである。p7 が逆にMSB以外のビットが反転されているのは、減算を加算で表すためである。これは2の補数の性質を巧妙に利用したものである。

                                                   1   -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
   1  +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]

なお、乗数も被乗数も負の場合算術オーバーフローが発生するが、無視すればよい。

実装

古い乗算器アーキテクチャでは、シフターとアキュムレータを使って部分積を足し合わせる必要があった。 また、部分積ひとつを計算するのに 1クロックサイクルを要した。 最近の乗算器アーキテクチャは、Wallace treeと呼ばれるものに似ていて、1クロックサイクルで部分積をすべて加算する。 Wallace tree型乗算器の性能をさらに向上させるためには、被乗数の一方にBooth encodingを施して加算すべき部分積の数を減らす。


アナログ乗算器

トランジスタによる乗算回路 [1]

アナログに乗算を実行する回路で、周波数帯域の変換等に用いられる。 一般的な実装方法はA*B=exp(log(A)+log(B))という等式を利用するものである[2]

基本的な原理は次のものである。

  1. バイポーラトランジスタでVbe∝log(Ic)となることを利用して、入力信号の対数を得る。
  2. オペアンプで加算する。
  3. 1と同様にIc∝exp(Vbe)を利用して2.で得た和の指数を取る(これが2数の積)。

(注意:アナログ回路なので実際には各ステップは、ほぼ瞬時に進む。)

2の部分を減算に変更すれば、同様の原理で除算も可能。

参照

  1. ^ 小島正典・高田 豊著「基礎アナログ回路」p.154 米田出版 2003 ISBN 978-4-946553-15-8
  2. ^ トランジスタ技術 2004年8月号 p.223 乗算回路を作る

関連項目

外部リンク