乗算器

提供: testwiki
ナビゲーションに移動 検索に移動

テンプレート:出典の明記 乗算器(じょうざんき)とは、二つの数について乗算を行うための電子回路であり、#デジタル乗算器#アナログ乗算器がある。

デジタル乗算器

デジタルに乗算を実行する回路で、演算装置の一種である。

デジタル乗算器を実装するには様々な技法が考えられる。 多くの技法は分割した部分の積を計算し、それを加算してまとめることで実現する。 このやり方は、小学校で習う十進整数の筆算による乗算と似ている。 しかし、乗算器ではそれを二進数で実現する。

符号無整数の場合の例

ここでは、例示のために8ビットの符号無整数の乗算について説明する。 乗算器の入力であるふたつの数を a[7:0]b[7:0] とし、ビット配列とみなす。 この場合、8回の 1ビット乗算で 8つの部分積を求める。aの各ビットをbにかける。 つまり、それは a のビットを取り出して、その値に応じて 0000000011111111 のどちらかのビットパターンを作り、ビット演算論理積AND)を実行するのと等しい。

{p0[7:0]=a[0]×b[7:0]={a[0]} AND b[7:0]p1[7:0]=a[1]×b[7:0]={a[1]} AND b[7:0]p2[7:0]=a[2]×b[7:0]={a[2]} AND b[7:0]p3[7:0]=a[3]×b[7:0]={a[3]} AND b[7:0]p4[7:0]=a[4]×b[7:0]={a[4]} AND b[7:0]p5[7:0]=a[5]×b[7:0]={a[5]} AND b[7:0]p6[7:0]=a[6]×b[7:0]={a[6]} AND b[7:0]p7[7:0]=a[7]×b[7:0]={a[7]} AND 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]p0p1の1ビット左シフト + p2の2ビット左シフト + … + p15の15ビット左シフトに等しく、最終的に 符号なしの16ビットの積が求められる。

符号付整数の場合

b が符号付整数だった場合、部分積を符号拡張した上で足し合わせる必要がある。a が符号付整数だった場合、部分積の p[7] を足すのではなく、それ以外の合計から引かなければならない。

上で説明した乗算器を2の補数による符号付整数を扱えるように修正するには、足し合わせる際に以下のように一部の項を逆転させ、かつ p[0]p7 の左端に 1 を補う。ここで負号()の意味に注意されたい。これは符号の反転ではなく、ビットの反転である。各部分積 pi最上位ビットが反転されているのは、符号拡張を省くためである。p7 が逆に最上位以外のビットが反転されているのは、減算を加算で表すためである。これは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クロックサイクルを要した。最近の乗算器アーキテクチャは、Baugh–Wooley algorithm、ウォレス木en:Dadda multiplier等を使用して、1クロックサイクルで部分積をすべて加算する。ウォレス木型乗算器の性能は、被乗数の一方にブースの乗算アルゴリズムを施して加算すべき部分積の数を減らすことで、さらに向上させることが出来る。

アナログ乗算器

トランジスタによる乗算回路 テンプレート:Sfn

アナログに乗算を実行する回路で、周波数帯域の変換等に用いられる。 一般的な実装方法は AB=elogA+logB という等式を利用するものであるテンプレート:Sfn。 基本的な原理は次のものである。

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

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

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

テンプレート:Main テンプレート:Clear

参照

テンプレート:脚注ヘルプ テンプレート:Reflist

参考文献

テンプレート:Refbegin

テンプレート:Refend

関連項目

外部リンク

テンプレート:Electronics-stub テンプレート:Computer-stub

テンプレート:Normdaten