11‐03 6層目のRAMアクセス(HDL)

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

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

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

 またcount32768(16×128×16進カウンタ)の下位7ビットを
RAM_X5_RD_ADDRとします。そうすれば、このタイムチャートのようにバッファからX0, X1, X2... X127を読み出すことができます。

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


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

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

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

 それらはRAM_X5_RD_SELによって選択され
RAM_X5_RD_DATAとなり、6層目 (conv_layer6) のLAY6INに入力されます。

図11‐25 RAM_X5を介して5層目から6層目に入力 (gts_hw.vhd)

●6層目conv_layer6.vhdの中に積和演算器は1個

 conv_layer6内部では入力信号の名前は
LAY6INとなります。
 LAY6INは
5ビットなのでそのままinchという信号に渡され、1個の積和演算器に入力されます(図11‐26)。

 このタイムチャートのmac0, mac1, mac2, ... mac41, mac42のように、計
43個計算するのに55.04usで済むので積和演算器はこの1個で十分です。

図11‐26 積和演算器dotproは1個で間に合う (conv_layer6.vhd)

次のページへ

目次へ戻る