8-02 vgg-2層目のVHDL化(続き)

●ビットシフト乗算と累積

 図8‐32は積和演算の部分で、乗算器は使わないビットシフト乗算になっています。画像は5ビット(PixRomData)、係数は2ビット(MatRomData)になっています。

 係数は-4, -1, +1, +4の4種類でそれらが-2, -1, 0, 1にエンコードされているので例えばPixRomDataが2でMatRomDataが1ならmuloutは2x4 = 8、PixRomDataが5でMatRomDataが‐2ならmuloutは5x(-4) = -20になります。

 またmuloutを累積したものがaddoutになっており、それを適当なタイミングでラッチしたものがMATMULOUTになります。


図8‐32 積和演算をZoom In


●出力1画素計算するのに5760ns

 ここの左上に示すようにoutCh0の1画素は、64チャネルの入力データとそれらに対応する係数(9個一組)との積和になるので、90ns x 64 = 5760nsの間隔でラッチします。図8‐33は上図をZoom Outしたもので、MATMULOUTがその信号になります。


図8‐33 積和演算をZoom Out


●ラインの周期は倍になるがライン数が半分になる

 1層目の出力はここに示すように5.76us x 300 = 1.728msで1ラインぶんの演算が終わります。図8‐34を見るとLay2WrSel(2層目の入力ラインバッファの切り替え信号)が1.728msで切り替わっています。

 2層目の出力にはプーリングがあるので、11.52us x 150 = 1.728msで1ライン計算しますが、ここの右下のように無効ラインの期間が入るので、その倍の
3.456msで1ライン出力されます。図8‐34を見るとReluWrSel(出力ラインバッファの切り替え信号)が3.456msで切り替わっています。

 プーリングにより150ラインになるので1画面の処理は3.456ms x 150 = 518.4msとなり、結局1層目と同じになります。


図8-34 入力1ラインの周期と出力1ラインの周期


●relu.outに出力が書かれている

 2層目も出力はテキストファイルに落とされます。図8‐35はrelu.outの最後の部分、プーリングで150×150画素になっているので1画面で22500行になります。これをPythonの結果と比較します。


図8-35 envが出力をテキストファイルに保存する


次のページへ



目次へ戻る