6‐05 1層目のRAMアクセス(読み方)

●書きながら読み出すためのピンポンモード

 畳み込み1層目にはRAMを介してデータが入力されます。CMOSカメラからのリアルタイム動画を扱うため、図6‐21(a)のように「ピンポンモード」で、
書いていない方から読み出します

 ピンポンゆえにRAMは2つあり、それぞれ0〜1023(32×32)番地まであります(*1)。CNNの1ブロック
30×30なので、同図(b)のように画面の右と下に「隙間」ができます。

(*1)1層目の入力が入るRAMはフレームメモリになる。2,3,4層目の入力が入るメモリはラインバッファ×4になる。

図6-21 RAMの番地を2次元的に考える

9画素読出し→9画素読出し→9画素読出し…を繰り返す

 図6‐21(b)では3x3のカーネルが右に動くようすを示しています。9画素毎の読出しは・・・
 23行目の0, 1, 2列→ 24行目の0, 1, 2列→ 25行目の0, 1, 2列→
 23行目の1, 2, 3列→ 24行目の1, 2, 3列→ 25行目の1, 2, 3列→
 23行目の2, 3, 4列→ 24行目の2, 3, 4列→ 25行目の2, 3, 4列→ ・・・といった読み出し方になります。


 RAMの読出しアドレスRAM_X0_RD_ADDRは図6‐22のように生成します。まずKernelHという信号にCnnPixCountという信号を加算し、それをアドレスの下位5ビットとします。次にKernelVにCnnLineCountを加算し、それをアドレスの上位5ビットします。そうすれば図6‐21(b)のようなアドレッシングができます。

図6-22 RAMを読み出すためのアドレッシング

●ピンポンモードの選択信号

 RAM_X0_RD_SELは図6‐21(a)のピンポンモードのRAMの読み出し選択に使用します。書き込み選択RAM_X0_WR_SELはその逆論理になります。


●RGB3chをそれぞれ係数と掛けて3ch累積する

 W1Addrは重み係数ROMのアドレスです。入力3chぶん入っており、それらの選択はアドレスにオフセット(0, 9, 18)を加算するだけです。
 なおダミーchもあるので、その係数は
0でマスクします。0には何をかけても0なので、4chぶん積和したとしても結果的に3chぶんの積和になります。

積和演算器16個で出力16ch並列演算

 outCh0, 23, 0は出力ch0の23ライン、0画素目の値、outCh0, 23, 1はその右隣の画素の値です。1層目の出力は16chあるので積和演算が16並列で行われ、出力ch0〜15は同時に演算されます。



●パイプライン動作なので入力の時間に合わせて出力

 出力の1画素を演算するのに 10ns x 9 x 4ch = 360ns, 出力の1ラインを演算するのに 360ns x 28 = 10.08usかかります。出力の1画面には 10.08us x 28 = 282.24usかかりますが、入力1画面の時間320usと合わせるので、休み時間を含めて320usとなります(次ページ参照)。

次のページへ

目次へ戻る