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)
次のページへ
目次へ戻る
|