2017年1月9日月曜日

ZYBO31 (OV7670用IPの作成 1)

OV7670用のIPが出来た。回路はverilogで記述した。

構成図


・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は現在の書込対象ページ番号ではなく、直近で書込が完了したページ番号が出力される。

・SCCB
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 件のコメント:

コメントを投稿

自作CPUで遊ぶ 25

まだ制御ソフトが完成していないので今まではスピンドルを移動するために一々簡単なプログラムを書いて移動させていたのだが、非常に面倒なのでCNCペンダント的なものを作ることにした。 右側の縦に2つ並んでいるスイッチ...