メモ置き場

メモ置き場です.開発したものや調べたことについて書きます.

[tex: ]

FPGA(Nexys4 DDR)を使ってCMOSカメラ(OV7670)の画像をVGA出力する

CMOSカメラ(OV7670)をFPGA評価ボード(Nexys4 ddr)に繋いでVGAで出力する.
ソースコードはここ
https://github.com/okchan08/OV7670
にある.Vivado 2017.2で作成したプロジェクトである.


Nexys4ボードにはPmod端子が付いているので,そこにカメラモジュールを繋ぐ.
OV7670を写真のようにボードに接続した.

このページにあるOV7670のタイミングチャートを示す.

f:id:okchan08:20190108222817p:plain
OV7670のタイミングチャート

HREFがHighの時にD[7:0]がValidとなる.カメラからのデータは1Byteずつ送られてくる.1画素あたりは2Byteなので,受信にはplkcで2クロック必要となる.

カメラの画像は(VGAモードの場合)640×480のサイズとなる.HREFはカメラ画像の横ライン1本,つまり640画素が送られてくる間Highとなっている.
ライン1本が終わったらHREFは一旦Lowになり,何クロックかののち再びHighになりデータが送られてくる.
これを480本分繰り返し,画面1個分のデータ送信が完了する.1画面分完了したことを表す信号がVSYNCである.VSYNCがHighになることで1画面分の送信完了を示す.VSYNCは何クロックかののちにLowになり,再び画像の送信が開始される.OV7670ではこれを延々と繰り返している.

したがってカメラ画像をキャプチャーするには,VSYNCがHigh→LowになりHREFがHighになった瞬間を見つけ,そこから画素1個,2個…と数えつつデータを受信すれば良い.

キャプチャーしたデータはBRAMに保存される.VGA表示回路はBRAMのデータを順次読み出し,画面表示信号として出力する.VGA表示回路は1920*1080サイズのモニターに出力することを想定している.モニターの大きさに合わせて適宜パラメータを変更する必要がある.
Camera_controllerモジュールではOV7670に搭載されたレジスタにi2c通信で値を書き込み,カメラの設定をしている.

実際にカメラの映像を表示して見た結果を示す.

youtu.be


Nexys4のVGAはRGBともに4bitずつしか出力できないらしいので,少し色味がおかしくなっている.