7‐03 乗算器を使わないビットシフト乗算

●数万円台のボードのFPGAに乗算器はせいぜい100個

 畳み込み2層目はこのように乗算器128個使って並列演算させますが、このボードのFPGAに乗算器は87個しかありません。したがってこのように「ビットシフトによる乗算」を行います。


 ハードウエアにおいて数値は2進数で扱われます。したがって係数が2の累乗に限られる場合、乗算は「ビットシフト」でまかなえます。図7‐15にその一例を示します。

図7-15 ビットシフト乗算器の回路図

●乗算器の代わりになる回路

 図7‐15は係数が
4種類(+64, +16, -16, -64)に限られる場合です。画素データPIXDATAの全ビットが反転され、さらに1が加算されます。これは「-1倍」を意味します。
 係数COEFFの最上位ビットは
符号ビットで、0ならPIXDATA、1ならPIXDATA×(-1)がセレクタで選択されます。

 セレクタの出力は4ビット、6ビット
左シフトされ、16倍、64倍の値が生成されます。
 最後にCOEFFの値が±16か±64かによって
セレクタを切り替えます。これにより+64の場合は64倍、+16の場合は16倍、-16の場合は-16倍、-64の場合は-64倍の値が出力されMULOUTとなります(*1)。

(*1)2層目の係数はは8種類(+64, +32, +16, +4, -4, -16, -32, -64)なので、セレクタ入力がもう2つ(±4、±32)ある。


●1を足すだけならハーフアダーで済む

 図7‐15には加算器(+1)がありますが、これは「ハーフアダー」というシンプルな回路でまかなえます(図7‐16)。
図7‐16 ANDとEXORだけ

●9ビットなのでハーフアダーを9個縦続接続

 ハーフアダーをビット数ぶん(9個)、図7‐17のように繋げば「+1」の回路の完成です。


図7‐17 1を足すだけの9ビット加算器

●シンプルな回路なので128個あっても大丈夫

 乗算器を128個も用意するのは現実的でないということで、「乗算器の代わりになる回路」を設計しました。このようにNOT, AND, EXOR、シフタ、セレクタなど単純なロジックで構成されるため、128個あってもFPGAのリソースをそれほど圧迫しないでしょう。


●回路図をHDL化する

 図7‐15では係数が4種類でしたが、2層目の係数はは
8種類(+64, +32, +16, +4, -4, -16, -32, -64)なので図7‐18のようなHDLになります。
 同図ではビットシフトは本来より
2ビット少なくなっています(理由は図7‐19)。

図7‐18 VHDLで書いたビットシフト型乗算器


本来の1/4になっているので・・・

 2層目は入力16chを4chづつ4個の積和演算器で処理しますが(ここ参照)、それら4つを足し込む際(図7‐19のMacShift_XX)に2ビット左シフト(4倍)して相殺します。演算途中の
ビット数を減らしてFPGAのリソースを節約するためです。


図7‐19 dotproの外で4倍して相殺する

目次へ戻る