● 3×3フィルタに対応する4ライン構成のライン・バッファ
ライン・バッファは,目的に応じてさまざまなタイプがあります.本稿で紹介するライン・バッファは,いわゆる3×3フィルタ(図2-2)に対し,9ピクセル分のデータを一括して供給するための前ライン保存バッファです.
図2-2 3×3フィルタ(輪郭強調フィルタ)の係数例
実現するためにはライン・バッファがあるとよい.
このライン・バッファをシンプルに構成しようとすると,4ライン構成となります.つまり,あるライン・メモリに書き込みを行っている間に,過去3ラインのデータを,それが蓄積されている3ブロックのライン・メモリから読み出すのです(図2-3).
図2-3 4ライン構成のライン・バッファの概要
今回の構成の場合,実際にはシンプルな1ポート・メモリが使えます.リード側とライト側がタイミング的に同期しているので,双方同じアドレス進行となります.しかも,リード側とライト側は常に異なるメモリ・ブロックをアクセスすることとなり,調停が不要です.
今回はせっかく「仲の悪い二人」の話をしました.そういう場合でも調停力のある2ポート・メモリをあえて使ってみました.
● ライン・バッファの構成要素を整理する
4ライン構成のライン・バッファのVerilog HDL記述をリスト2-1に示します.
・メモリ・ブロック
四つのメモリ・ブロックを4本のライン・バッファに割り当てます.今回は一つのブロックが24ビットを1ワードとする1024ワード構成としています.24ビット構成にしたのはRGB各8ビットのフルカラー・データを意識してのものです.
・書き込みアドレス
書き込みアドレスは,前述のビデオ・タイミング・ジェネレータから,水平アドレス10ビット,垂直アドレス2ビットを接続します.
・書き込みメモリ・セレクタ(デコーダ)
垂直アドレスは,ライン・バッファ用メモリ・ブロックの選択に使用します.2ビットの垂直アドレスを単純にデコードしています.ライン・バッファの本数を増やすときは垂直アドレスを増やして,デコード幅を増やします.
・読み出しアドレス
今回のような3×3フィルタにおいては,読み出しアドレスと書き込みアドレスは同一で構いません.もし,この読み出しアドレスを書き込みアドレスと異なる入力の仕方をすれば,左右反転や,拡大/縮小(横だけ),あるいは水平スクロールなどの効果が得られます.
・読み出しメモリ・セレクタ
今回の用途では,読み出すライン・バッファは常に書き込み中のライン・バッファの相対位置となるようにします.また3×3フィルタのどの位置に対してどのバッファを割り当てるかを,常に垂直書き込みアドレスから算出するようにしています.この役割を負うのが読み出しメモリ・セレクタ・ブロックです.