ITU656 と ipcore.jp

ITU 656 についてまとめ始めた。(VHDLITU 656 のプロトコルを認識し、ITU 601 に従って YUV(422) を RGB に変換することは出来た。XMB (Xylon Memory Bus. MPMC よりも高速!!) での展開も出来た。簡単な logiWIN が出来たことになる。
テスト環境も整えた。どうみても実機でやり続けるのは非効率だ。シミュレーションをしたい。しかし、シミュレーションをするにも今度は基本的な画像データがない。ITU 656 を出力するモジュールがない。そこで、テストベンチで YUV を流すプログラムを書いた。更に、先に作ったモジュールが YUV から RGB に変換してくれるので、その RGB を raw データとしてファイルに書き出す。書き出したファイルを C で書いたシミュレーション結果と比較する。一致していれば、正しく VHDL がかけていることになる。
任意のデータも欲しい。ITU-656 の出力をするチップのデータをのっとる proxy モジュールも作った。これで、タイミングはそのチップのタイミングになるが、画像データは任意のものに置き換えられる。今はあまり複雑なパターンを作ることは出来ないが、スピードが許せば SD カードから動画も再生できるだろう。
更に LVDS からの出力の置き換えモジュールも作った。このモジュールは aptina のセンサーモジュールのデータを置き換える。それによりタイミングは aptina だがこれまた任意のデータを出力できる。また logiCAFEBABE を拡張し、センサーからの情報を受け取るモジュールを作っている。これにより aptina のタイミングも知ることが出来るようになるだろう。
作ってみると、どうやって on the fly を実現するのかがポイントであることがわかった。例えば連続する 8bit のデータをためて 32bit に出力しようとすると、無限のバッファをもつわけにはいかないので "on the fly" に対応するしか選択肢がない。さらに 32bit 分ためた次のクロックでは、すでに 8bit の次のデータが来ているから、それが 32bit のデータを書きつぶさないように、一時的にデータをセーブする必要がある。つまり、それは FIFO だ。8bit 一個分なのでさすがに FIFO モジュールは使わないが、原理的には FIFO だ。
ITU 656 も interlace を BOB のプログレッシブに変えようと思うと(weave には VRAM が必要だ)、1line で 2line 分出さなくてはならなくなる。時間に余裕がないので、クロックは倍にする必要があるだろう。1 line 分ためる必要があるから、line ごとに時間的に重なりができる。すべての line をブロックRAM に記憶することは容量的に出来ないだろうから、バッファを使いまわすことになる。ここも FIFO が必要だ。もし、もっと早く出力をしようと思えば 0.5 line 覚えたところで次の情報取りながらすでに取り込んだ情報を変換して出すという離れ業をしなければならない。
ここには基本的な計算に加えて、バッファを使いまわすという非常に高度な技術が必要になる。つまり CPU の動作のようにステージを作り、パイプライン化して、同時に動作をさせる必要がある。残念ながら現在の VHDL にはそれらを効率的に書く手段は用意されていないので、複雑なデータの受け渡しを記述しなければならない。うまくジャグリングするプログラムを手で書かなければならないのだ。
このジャグリングは基本的にパターン(定型)だと思うのでなんとかマクロ化のようなことをして自動生成させたい。