キャプチャーした画像に赤い斑点が…

 さて、実際の回路設計に移ります。人によって回路を構成するモジュールの分割の仕方が異なるかもしれませんが、自分はYUV422(以下、YUV)からRGBへのデコーダー回路、デコーダーと主記憶の緩衝となるFIFO、メモリー制御回路、レジスター回路と分割しました。以下に、実際に自分の設計したキャプチャー回路のモジュール分割図を示します。

キャプチャー回路モジュール分割図
[画像のクリックで拡大表示]

 まず、YUVからRGBに変換するデコーダー回路を制作します。ここでのポイントは、カメラからのデータが1バイトずつYUV422の色情報単位で送られてくることです。YUVからRGBに変換するには、4バイト分を回路内に一時的に保存する必要があります。そこで、回路内に一時記憶領域を4つ用意し、カメラからのデータをクロックごとに1→2→3→4とコピーしていくことでデータを蓄積し、カウンターを用いて変換するタイミングを計ります。最後に、変換したデータがRGBを表現する値として適切になるように対策してFIFOに格納します。

 ここで大切なのが各動作のタイミングです。カメラから送られてきたデータを一時記憶領域に書き込む動作には1クロック必要なので、データがその領域を経る度に1クロック遅れていきます。これをしっかり考慮しないとFIFOに変換結果を書き込むタイミングがずれて、めちゃくちゃなデータを書き込んでしまうことになります。この点に注意して実装し、シミュレーションで動作を確認します。

 以下に示したのは、サンプルとして与えられたYUV形式の画像を自分で設計したデコーダー回路を用いてRGB形式の画像へと変換した時の結果です。よく見ると、赤い斑点が各所に出ています。これは、YUVからRGBに変換する際に変換後の値がRGBを表現する値として不適切であることを検出しています。実際に自分も適切な値にするための対策が不十分でした。

YUV形式の画像をRGB形式に変換した結果。赤い斑点が各所に出ている。(撮影者の許可をいただいて掲載しています)
[画像のクリックで拡大表示]