3.4 乗算器
2桁以上の乗算は筆算で図3.27 のように行われます。この中でも乗算がありますが、これは1 桁の乗算で九九の表を使います。乗算結果のところで乗算をしていますが, これは桁位置を変えるだけで実際に計算する必要はありません。
図3.27 筆算の乗算
桁位置をずらして加算するだけで乗算の結果が得られます。たくさんの加算器を使う非記憶の方法と加算器をひとつだけ使う記憶の方法があります。どちらの場合も2 進数で計算しますから、1 桁の計算は次の4 種類です。
3.4.1 非記憶方式
図3.27 と同じ方法で、2 進数の8 ビットどうしを乗算して16 ビットの結果を得る非記憶の乗算器をリスト21に作りました。
リスト21 8 ビットの乗算器(非記憶)
図3.28 がリスト21 を実行したものです。
乗算器は言語の演算子でも提供されていますが、必要なビット数よりも大きな乗算器を使わないように自分で作ったものを使用すると論理の大きさを適切なものにできます。筆算方式を使う場合には非記憶の場合も記憶の場合も論理がわかっておりビット数に応じた構成にすることも簡単です。

3.4.2 記憶方式
記憶方式の乗算器は加算器とシフトレジスタで作ることができます、計算の方法は筆算の方法と同じです。リスト22 でC=A×B の計算をしています。論理の構成は図3.29 のようになっています。
記憶方式の乗算器は非記憶の乗算器のリスト21 のn0p~n7p の計算を時分割で行ってacc に累算していきます。8 ビットの乗算器なら累算は8 回で終了しますが入力値によってはそれより短くなり ます、それはb の上位8 ビットが0 になったことでわかります。

リスト22 8ビットの乗算器(記憶)

- 0 × 0=0
- 0 × 1=0
- 1 × 0=0
- 1 × 1=1
3.4.1 非記憶方式
図3.27 と同じ方法で、2 進数の8 ビットどうしを乗算して16 ビットの結果を得る非記憶の乗算器をリスト21に作りました。
リスト21 8 ビットの乗算器(非記憶)
entity main input A[8]; input B[8]; output C[16]; bitn n0p[16]; bitn n1p[16]; bitn n2p[16]; bitn n3p[16]; bitn n4p[16]; bitn n5p[16]; bitn n6p[16]; bitn n7p[16]; n0p.0=B.0&A.0; n0p.1=B.0&A.1; n0p.2=B.0&A.2; n0p.3=B.0&A.3; n0p.4=B.0&A.4; n0p.5=B.0&A.5; n0p.6=B.0&A.6; n0p.7=B.0&A.7; n1p.1=B.1&A.0; n1p.2=B.1&A.1; n1p.3=B.1&A.2; n1p.4=B.1&A.3; n1p.5=B.1&A.4; n1p.6=B.1&A.5; n1p.7=B.1&A.6; n1p.8=B.1&A.7; n2p.2=B.2&A.0; n2p.3=B.2&A.1; n2p.4=B.2&A.2; n2p.5=B.2&A.3; n2p.6=B.2&A.4; n2p.7=B.2&A.5; n2p.8=B.2&A.6; n2p.9=B.2&A.7; n3p.3 =B.3&A.0; n3p.4 =B.3&A.1; n3p.5 =B.3&A.2; n3p.6 =B.3&A.3; n3p.7 =B.3&A.4; n3p.8 =B.3&A.5; n3p.9 =B.3&A.6; n3p.10=B.3&A.7; n4p.4 =B.4&A.0; n4p.5 =B.4&A.1; n4p.6 =B.4&A.2; n4p.7 =B.4&A.3; n4p.8 =B.4&A.4; n4p.9 =B.4&A.5; n4p.10=B.4&A.6; n4p.11=B.4&A.7; n5p.5 =B.5&A.0; n5p.6 =B.5&A.1; n5p.7 =B.5&A.2; n5p.8 =B.5&A.3; n5p.9 =B.5&A.4; n5p.10=B.5&A.5; n5p.11=B.5&A.6; n5p.12=B.5&A.7; n6p.6 =B.6&A.0; n6p.7 =B.6&A.1; n6p.8 =B.6&A.2; n6p.9 =B.6&A.3; n6p.10=B.6&A.4; n6p.11=B.6&A.5; n6p.12=B.6&A.6; n6p.13=B.6&A.7; n7p.7 =B.7&A.0; n7p.8 =B.7&A.1; n7p.9 =B.7&A.2; n7p.10=B.7&A.3; n7p.11=B.7&A.4; n7p.12=B.7&A.5; n7p.13=B.7&A.6; n7p.14=B.7&A.7; C=n0p+n1p+n2p+n3p+n4p+n5p+n6p+n7p; ende図3.27 のJ . M に相当する部分がn0p~n7pです、8 ビットなので8 段になります、これを全部加算するとC=A×B の乗算結果が得られます。
図3.28 がリスト21 を実行したものです。
乗算器は言語の演算子でも提供されていますが、必要なビット数よりも大きな乗算器を使わないように自分で作ったものを使用すると論理の大きさを適切なものにできます。筆算方式を使う場合には非記憶の場合も記憶の場合も論理がわかっておりビット数に応じた構成にすることも簡単です。
図3.28 リスト21の実行
3.4.2 記憶方式
記憶方式の乗算器は加算器とシフトレジスタで作ることができます、計算の方法は筆算の方法と同じです。リスト22 でC=A×B の計算をしています。論理の構成は図3.29 のようになっています。
記憶方式の乗算器は非記憶の乗算器のリスト21 のn0p~n7p の計算を時分割で行ってacc に累算していきます。8 ビットの乗算器なら累算は8 回で終了しますが入力値によってはそれより短くなり ます、それはb の上位8 ビットが0 になったことでわかります。
図3.29 乗算器の構成
リスト22 8ビットの乗算器(記憶)
entity main
input RESET;
input A[8];
input B[8];
output C[16];
output READY;
bitr a[16],b[16];
bitr acc[16];
C=acc;
switch(b.8:15)
case 0: READY=1;
endswitch
if (RESET)
a.0:7=A; {下8 ビットに設置}
b.8:15=B; { 上8 ビットに設置}
else
a.1:15=a.0:14; { 上桁移動}
b.0:14=b.1:15; { 下桁移動}
endif
if (RESET)
acc=0;
else
if (b.8)
acc=acc+a; { 累算}
else
acc=acc;
endif
endif
ende 図3.30 はリスト22 を実行したものです。図3.30 リスト22 の実行
渕上賢二


コメントする