構成図
・cif_rx
OV7670からの信号を受けるモジュールで、色変換処理(YUV422➔RGB888やRGB565➔RGB888)も行う。OV7670からは一応VSYNC、HREF信号も受けているが使用していない。OV7670はCCIR656 formatをサポートしており、このformatに設定すると画像データのrowデータ列の前後に同期情報を含んだ4バイトのヘッダが付加される。
データシートにはSync Byteの詳細が記載されていないが、ITU656の規格を調べた結果以下の値であることが判った。
ロジアナでOV7670の実際の出力を確認したところ、OV7670はfield 2の値(SAV2,EAV2,SBV2,EBV2)のみが出力されているようだった。
SAV
EAV
SBV
EBV
RTLはfield1,2両方を検出するようにした。
色変換
OV7670のピクセルフォーマットはYUV422やRGB565に設定し、cif_rxでRGB888形式に変換するつもりだが、変換しないモードも選択できるようにした。
YUV➔RGB変換部は以前TCM8230MD用に作ったRTLを再利用した。
http://bravo-fpga.blogspot.jp/2010/12/yuv422.html
・cif_m_axi
cif_m_axiはAXI MASTER moduleでcif_rxから来る画像データをDRAM上のバッファ領域に書き込む。
・cif_s_axi
cif_s_axiはAXI SLAVE moduleでソフトウェアはこのI/Fを介してこのIPを制御する。
cifのレジスタ構成
バッファは最大4ページまで管理することが可能で、PAGENレジスタにページ数を、そして、BASEnレジスタにバッファの先頭番地を設定する。PAGENに設定する値は0基準でありページ数から1を引いた値を設定する。各ページは環状に使用され1画面分書き込む度にページが更新される。現在どのページが書込対象になっているかはCPAGEレジスタで知ることができる。ページ番号と書込完了信号はf_CPAGEとf_FSYNCとしてmodule外部に出力されている。但し、f_CPAGEは現在の書込対象ページ番号ではなく、直近で書込が完了したページ番号が出力される。
OV7670の内部レジスタへのアクセスはSCCB I/Fを介して行う。 SCCBはI2Cと殆ど同じ仕様だがリードシーケンスがI2Cと異なる。具体的にはI2Cの場合はレジスタアドレスを指定するCycleとRead Cycleはシームレスに繋がっておりレジスタアドレスを指定するCycleのStop Conditionは無い。
(日立 I2C EEPROMのデータシートから引用)
これに対して、SCCBの場合は2-Phase Write Transmission Cycleに続いて2-Phase Read Transmission Cycleを実行することでリードを行うが、それぞれのCycleはStart Conditionで始まりStop Conditionで終わらなければならない。
レジスタの設定(書込)だけであれば自作のI2C IPをそのまま使用できるが、読出しもしたいのでステートマシンのリード部分を変更している。
・VivadoでIP化
RTLをVivadoでIP化してbase_design_systemのBlock Designに組み込んだ。同時にVGA用のdisplay controllerやVDMAは不要なので削除した。
合成は成功し、timingもmetした。
0 件のコメント:
コメントを投稿