1001 :被乗数(X) ×) 0101 :乗数 (Y) ---------- 1001 :部分積 0000 1001 0000 --------- 0101101 (0x2d = 45(dec))乗数Yの各桁に対して、被乗数Xを順番にずらして 並べていき、最後にすべてを足すわけですが、 途中の、被乗数Xを順番にずらしていった項を 部分積と呼びます。 部分積を求めるのは簡単で、 被乗数Yの、その桁が1であればXそのもの、 その桁が0であれば0、となります。
一般に、N桁の被乗数Xと乗数Yを、次のように表現することにしましょう。
x3 x2 x1 x0 被乗数X ×) y3 y2 y1 y0 乗数Y --------------------------------------- x3・y0 x2・y0 x1・y0 x0・y0 部分積0 x3・y1 x2・y1 x1・y1 x0・y1 部分積1 x3・y2 x2・y2 x1・y2 x0・y2 部分積2 x3・y3 x2・y3 x1・y3 x0・y0 部分積3 --------------------------------------------------------------- z7 z6 z5 z4 z3 z2 z1 z0 積Z
この回路の部分積の加算の部分は、ちょっと工夫がしてあって、 全加算器の入力が3つであることを使って、 1つの行(横並び)の中でキャリーの伝播をさせず、 それを、次の行の全加算器の入力のひとつにつないであります。 (このような構成を、キャリー保存加算器(CSA)と呼びます) ただし最後(一番下)に、前の行(最後の部分積の和を求めている)から 先送りされていたキャリーをすべて最後の結果に反映させる (キャリーの吸収と呼びます)必要がありますので、 最後の行だけは、普通の多ビット加算器が必要になり、 キャリー伝播加算器(RCA)やキャリー先見加算器(CLA)などが 使われます(この例ではCLAを使っている)。 このような構成の乗算器を並列乗算回路と呼びます。
並列乗算回路では、部分積の段数、つまり乗数Yの桁数分と ほぼ等しい数だけ加算器が並びますので、 この段数が、全体の演算時間を決めるもっとも大きな要因となります。
まず、被乗数Xと乗数Yを、N桁の符号つきの2進数で 次のようにあらわすことにします。
x2=0(正の数) x2=1(負の数) ---------------------------- 000 (0) 100 (-4) 001 (1) 101 (-3) 010 (2) 110 (-2) 011 (3) 111 (-1)つまり最上位ビットx3-1が0の数から、 -4 = -1・23-1をひくと、 最上位ビットx3-1だけを1にした数、になっていますから、 先の式のように、 「-1・xN-12N-1」という項を含めて、 負の数と正の数をまとめて表すことができるわけです。
ここで、やや唐突ですが、次のようなYjを考えましょう。
ポイントは、この加算が、(N-2)/2回、つまり普通に部分積を足していく場合の 半分程度の回数で済む、ということです。 これは、y2j +y2j-1 - 2y2j+1という項を 使って、1個とばしで部分積を足していく方法、と考えることができます。
このうち、Yjに含まれる y2j, y2j-1, y2j+1の組み合わせは 8通りしかありませんから、それをまとめると次のようになるでしょう。
y2j+1 | y2j | y2j-1 | Yj | Zj | Zjを求める作業 | A | B | M |
0 | 0 | 0 | 0 | 0 | 何もしない | 0 | 0 | 0 |
0 | 0 | 1 | 1 | X・22j | 2j ビットシフト | 1 | 0 | 0 |
0 | 1 | 0 | 1 | X・22j | 2j ビットシフト | 1 | 0 | 0 |
0 | 1 | 1 | 2 | X・22j+1 | (2j+1)ビットシフト | 0 | 1 | 0 |
1 | 0 | 0 | -2 | -X・22j+1 | (2j+1)ビットシフトし、2の補数 | 0 | 1 | 1 |
1 | 0 | 1 | -1 | -X・22j | 2j ビットシフトし、2の補数 | 1 | 0 | 1 |
1 | 1 | 0 | -1 | -X・22j | 2j ビットシフトし、2の補数 | 1 | 0 | 1 |
1 | 1 | 1 | 0 | 0 | 何もしない | 0 | 0 | 0 |
まずX, Yを2進数で求めると次のようになります。
j | y2j+1 | y2j | y2j-1 | Yj | Zj |
0 | 0 | 1 | 0 | 1 | X・20 |
1 | 1 | 0 | 0 | -2 | -2X・22 |
2 | 0 | 1 | 1 | 2 | 2X・24 |
Z0 = 11111110111 (11桁にあわせる) Z1 = -2・ 11011100 = 00001001000 (11桁にあわせる) Z2 = 2・1101110000 = 11011100000 ---------------------------------- 11100011111この求められた結果は、2進数で2の補数の00011100001 = 225の 負の数=-225ですから、たしかに-9×25 = -225となっていることが わかります。