7‐04 2層目のRAMアクセス(HDL)

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

 1層目はRAM_X1に書き、2層目はそれを読みます。1層目はRAM_X1_WR_SELという信号でラインバッファを選択しますが、このように0〜3まで順番に書き込むので、その信号はラインカウンタCnnLineCountの下位2ビットで生成できます。

 2層目はRAM_X1_RD_SELという信号で読み出しバッファを選択しますが、それはCnnBufCount(*1)にKernelVを足したものです。そうすればこのように書き込みバッファを追いかけることができます。

(*1)CnnBufCountはRAM_X1_WR_SEL(書き込みバッファ選択)に1を足したもの(このタイムチャート)。CnnLineCountの下位2ビットはRAM_WR_SELと同じ

 読み出しアドレスRAM_X1_RD_ADDRはRdAddrHで、これはKernelH+CnnPixCountです。以上を鑑みて書いたHDLの一部を図7‐30に示します。

図7-30 RAM_X1の読み出し信号の生成(gts_timing.vhd)

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

 RAM_X1_RD_ADDRは図7‐31のように4つのラインバッファのアドレスとなります。読み出されるデータは
RAM_X1_RD_DATA0〜3で、それぞれ5×16=80ビットです(2層目の入力16ch、データ幅5ビットなので)。

図7‐31 1層目と2層目の間にある4つのバッファ (gts_hw.vhd)

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

 RAM_X1_RD_DATA0〜3はRAM_X1_RD_SELで切り替えられてRAM_X1_RD_DATAとなり、conv_layer2(2層目)の
LAY2INに入力されます(図7‐32)。

図7‐32 RAM_X1からconv_layer2へデータ入力 (gts_hw.vhd)

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

 conv_layer2内部では入力信号の名前はLAY2INとなります。
 LAY2INは80ビットですが、そのうち上位
20ビット(bit79〜60)がinch_00になります(*2)。

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


 同図のようにinch_00には入力ch0〜3が多重化されています。そして
inch_01には入力ch4〜7が、inch_02には入力ch8〜11が、inch_03には入力ch12〜15が多重化されます。一つの積和演算器が入力4ch受け持つことを思い出しましょう。

図7‐33 このタイムチャートのin1ChSelで多重化 (conv_layer2.vhd)

入力が16ch、出力が32ch、積和演算器128個で計算

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

 2層目の出力は32chあるのでdotpro_01_00〜dotpro_01_03は出力Ch1、dotpro_31_00〜dotpro_31_03は出力Ch31を受け持ちます。

図7‐34 積和演算器dotproは4×32=128個ある (conv_layer2.vhd)

次のページへ

目次へ戻る