7‐04 2層目のRAMアクセス(読み方/書き方、全体像)

●RAM_X1の中に4ラインぶんのバッファ

 1層目と2層目のデータのやり取りはラインバッファ
RAM_X1を使って行われます。図7‐20の上が1層目がRAM_X1を書くようすです。出力1画素演算するのに90ns x 4ch = 360ns、1ライン28画素演算するのに360ns x 28 = 10.08usになります。

 1ラインごとに別のラインバッファが選択されて書き込まれ、その選択はReluWrSelで行われます。ラインバッファはこのように4つあり、RAMの読み方は書き方の後を追いかけます。

図7-20 1層目が書いて2層目が読むようす

●3ラインぶん+プーリングで4ラインぶんのレイテンシ

 カーネルが3×3ゆえに、読み方は演算に3ラインぶん使います。したがって、書き方が
3ラインぶん書くのを待つ必要があります。図7‐20の下部は2層目がRAM_X1を読むようすです。1ライン書くのに10.08usかかるので、その3倍の時間待てば3ラインが有効になります。

 同図ではCnnLineCount=3から有効になるので、その辺りから2層目に演算結果が現れます。ただ、2層目には
プーリングがあるので、更に1ラインぶん遅れてCnnLineCount=4の辺りから2層目の出力は有効になります。

3つのバッファの選択とアドレッシング

 図7‐21はカーネルが左から右に移動するようすです。このようなRAMアクセスをするために、ラインバッファのアドレスにRAM_X1_RD_ADDR、ラインバッファの選択にRAM_X1_RD_SELという信号を用意します。

 前者は012, 012, 012, 123, 123, 123, 234, 234, 234... と遷移してラインバッファを読み出します。後者は000, 111, 222, 000, 111, 222, 000 111, 222... と遷移してラインバッファを選択します。これらにより図7‐21のようなRAMアクセスが可能になります。

図7‐21 カーネルを右にずらしながらラインバッファ読む

●プーリングでぐっと画像が小さくなる

 同図のようにラインバッファは28画素ぶんあるので、カーネルの動く範囲は26×26、さらにプーリングがあるので2層目の出力画素は13×13になります。

次のページへ

目次へ戻る