8-02 vgg-2層目のVHDL化

●2層目も1層目と同じ64並列

 図8‐26にvgg-2層目のタイミングのイメージを示します。

 2層目の入力は
64ch、出力は64chなので最大限並列化するには乗算器が64x64=4096個必要になります。2層目以降は乗算器はビットシフトで達成しますが(*1)、それでも4096個となるとFPGAのリソースを圧迫します。

(*1)係数値を-4, -1, +1, +4に限定。みな2の累乗なのでビットシフトで乗算を達成できる。

 そこで図8-26の右(赤字)にあるように、
入力64chの読み出しと計算は逐次処理出力64chの計算と書き込みは並列処理として、乗算器の数を1x64=64個に減らします。


図8-26 vgg-2層目のタイミングのイメージ


●入力は逐次的、出力は並列的に処理する

 図8‐26の左上、「outCh0の1画素」は出力チャネル0の1画素を計算するようすです。

 
入力は64chあり、それらの読出しは逐次的に行います。係数も64chぶんあり、カーネルは3x3=9なので、9x64個の係数(このEXCELのA列の576個)が逐次読みだされ、入力画像と乗算されます。

 クロック周期を10nsとすると10ns x 9 x 64ch = 5760nsでoutCh0の1画素を計算します。
 その隣、「outCh1の1画素」は出力チャネル1、その隣は出力チャネル2、最後は出力チャネル63の1画素の計算になります。
出力の計算は並列なので、これらは64個の乗算器を使って同時に計算されます(同図の左下)。

●横方向、縦方向に間引くプーリングがある

 同図左下のように出力64チャネルの「1ライン」は並列に計算されます。1ラインは300画素からなるので、300 x 5.76us = 1.728msで1ライン計算します。

 さらに1フレームは300ラインあるので、300 x 1.728ms = 518.4msで1画面の計算が終わります。ただし2層目は
プーリングがあり(ここの左上の"P")、300×300画素が150×150画素になります。それゆえ1画素を出力する周期は5.76us x 2 = 11.52us、1ライン出力する周期は1.728ms x 2 = 3.456msになります(*1)

(*1)図8‐26の右下参照。有効・無効ラインを繰り返すので×2。

2層目も1層目と同じで518.4ms毎に1画面処理

 したがって1画面を処理する周期は3.456ms x 150 =
518.4msとなり、結局1層目と同じになります。

 このように各層の周期をそろえれば、図8‐27のように縦続接続して同時に動かし(パイプライン化)、
スループット518.4msで全体を動作させることができます。


図8-27 1層目、2層目、3層目同時に動かしてパイプライン化


次のページへ



目次へ戻る