9‐03 4層目のRAMアクセス(HDL)

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

 3層目はRAM_X3(4個のラインバッファからなる)に書き、4層目はそれを読みます。
 3層目はRAM_X3_WR_SELという信号でラインバッファを0〜3まで順番に書き込みます。3層目は1ライン書き込みが20.16usなので、バッファの選択はCnnLineCountDiv2(CnnLineCountを2分周したもの)で行います(図9-24)。

 4層目は
RAM_X3_RD_SELこのタイムチャート)という信号で読み出しバッファを選択しますが、それはCnnLineCountを2分周したものに1を足して、さらにKernelVを足したものです。そうすればこのように書き込みバッファを追いかけることができます(*1)。

 また読み出しアドレス
RAM_X3_RD_ADDRはKernelHにCnnPixCountDiv4(CnnPixCountを4分周したもの)を加算します。4層目は入力16chを一つの積和演算器が受け持ちます。したがってこのタイムチャートのようにinCh4Selが0〜15までの期間、すなわちCnnPixCountが0〜3までの期間(360ns x 4 = 1.44us)で1画素計算するからです。

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

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

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

 RAM_X3_RD_ADDRは図9-25のように4つのラインバッファのアドレスとなります。読み出されるデータは
RAM_X3_RD_DATA0〜3で、それぞれ5×64=320ビットです(4層目の入力64ch、データ幅5ビットなので)。

図9‐25 3層目と4層目の間にある4つのバッファ (gts_hw.vhd)

●4つの読み出しデータをミックスして3層目に入力

 RAM_X3_RD_DATA0〜3はRAM_X3_RD_SELで切り替えられて
RAM_X3_RD_DATAとなり、conv_layer4 (4層目)のLAY4INに入力されます(図9-26)。

図9‐26 RAM_X3からconv_layer4へデータ入力 (gts_hw.vhd)

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

 conv_layer4内部では入力信号の名前は
LAY4INとなります。
 LAY4INは320ビットですが、そのうち80ビット(bit319〜240)がinch_00になります(*2)。

(*2)図9-27のように、in3ChSelの値により、5ビット×16chが多重化されている。また、RAMの読出しで1サイクル遅延するのに合わせてin3ChSel_dlyとなっている。

 同図のようにinch_00には入力ch0〜15が多重化されています。そしてinch_01には入力ch16〜31、inch_02には入力ch32〜47、inch_03には入力ch48〜63が多重化されます。一つの積和演算器が入力16ch受け持つことを思い出しましょう。

図9‐27 このタイムチャートのin3ChSelで多重化 (conv_layer4.vhd)

●入力が64ch、出力が128ch、積和演算器512個で計算

 inch_00〜03はそれぞれ別の積和演算器に行きます。図9-28のdotpro_00_00〜dotpro_00_03は出力Ch0を受け持ちます。

 4層目の出力は128chあるのでdotpro_01_00〜dotpro_01_03は出力Ch1、dotpro_127_00〜dotpro_127_03は出力Ch127を受け持ちます。


図9‐28 積和演算器dotproは4×128=512個ある (conv_layer4.vhd)

次のページへ

目次へ戻る