10‐03 5層目のRAMアクセス(HDL)

●タイムチャートを見ながらHDLを書いてみる

 4層目はRAM_X4(2個のフレームバッファからなる)に書き、5層目はそれを読みます。
 4層目はRAM_X4_WR_SELという信号でフレームバッファを0, 1, 0, 1...と代わりばんこに書き込みます。4層目は1画面の書き込みが320usなので、バッファの選択は図10‐24のようにCnnBlockH(0) (CNNの1ブロック周期でH/L)で行います(*1)。

 5層目は
RAM_X4_RD_SELという信号で読み出しバッファを選択しますが、それは書き込みの選択と逆論理 (not CnnBlockH(0)) となります(ピンポンモード)。

 またcount32768(16×128×16進カウンタ)を設け、その下位7ビットをin5ChSel、その上の4ビットを
RAM_X4_RD_ADDRとします。そうすれば、このタイムチャートのようにバッファからX0, X1, X2... X15を読み出し、さらにそれらをin5ChSelで128個に時分割し、計2048個のデータを得ることができます。

(*1)層が進むごとにレイテンシが発生するので図10-24では各信号は適宜遅延させてある(CnnBlockH_aftlay3など)


図10-24 RAM_X4の読み出し信号の生成(gts_timing.vhd)

●フレームバッファのアドレスは共通

 RAM_X4_RD_ADDRは図10‐25のように2つのRAMのアドレスとなり、
RAM_X4_RD_DATA_0, 1が読み出されます。

 それらはRAM_X4_RD_SELによって選択され
RAM_X4_RD_DATAとなり、5層目 (conv_layer5) のLAY5INに入力されます。

図10‐25 RAM_X4を介して4層目から5層目に入力 (gts_hw.vhd)

●5層目conv_layer5.vhdの中で入力chが分離される

 conv_layer5内部では入力信号の名前は
LAY5INとなります。
 LAY5INは640ビットですが、図10‐26のように
5ビットづつ、in5ChSelによって時分割で多重化されます(inch)。フレームバッファの各アドレスに128chぶんのデータがあることを思い出しましょう。

図10‐26 このタイムチャートのin5ChSelで多重化 (conv_layer5.vhd)

●積和演算器16個で並列演算

 inchは16個の積和演算器に入力されます。それぞれが出力8個を計算し(このタイムチャートのmac0...mac7, mac8...mac15, mac120...mac127)、計
128個の結果が得られます。

図10‐27 積和演算器dotproは16個ある (conv_layer5.vhd)


次のページへ


目次へ戻る