公開日:2024/06/15
title.png

30th Season


#30-7 VGAカメラ再び:第3話

 Arduino DUEのCPUパワー(@84MHz)を最大限使って制御した、VGAカメラOV7670モジュール(下図、および記事)を、今度はCmod A7ボード(FPGA)を使って、サクッと、制御してみたいと思います。

a141_ov7670.jpg

 OV7670モジュールを、「再び、三度、四度、……」と、もっと気軽にサクッと使える様にハードウェア(FPGA)の底力を存分に発揮しようとするテーマの第3話です(第1話は、こちら)。

CAM7670ユニット

 ここからは具体的に、OV7670を制御してデータを取り込むための回路設計を進めて行きます。

ブロック図

 以下図にOV7670カメラインターフェイスCAM7670ユニットのブロック図を示し、解説を続けます。

a307_cam7670.png

※薄黄色の箱はCPUからアクセス可能なI/Oレジスタ、薄緑色の箱はハードマクロ、青破線はRTLとハードマクロの境界線です。

  解説:

I/Oレジスタ仕様

 以下にCAM7670ユニットのI/Oレジスタ表を示し、解説を続けます。

Addr Name R/W Bit:15〜0 Memo
0xf180 cm76ctl RW FF
UL
FA
BL
FR
BS
PC
KV
CE
NB
XC
KE
camera control
0xf182 cm76pix R VS
YN
HS
YN
R[1:0] G[1:0] B[1:0] pixel data
0xf184 reserved
0xf186 reserved
0xf188 reserved
0xf18a reserved
0xf18c reserved
0xf18e reserved

 BUSC出力のセレクト信号はbcs_cm76_nです。上表の範囲でアサートされるので、CAM7670ユニット内では、アドレスbadr[3:0]を復号してレジスタを特定しています。このI/Oユニットはバイトアクセス禁止です。必ずワードアクセスしてください。

  I/Oレジスタ仕様:

カメラ画像の取り込み手順

 OV7670を制御して、カメラ画像を取り込む手順を以下に示します。

 OV7670が垂れ流してくるデータから、1フレーム分のデータを切り出してSRAMに格納できたので、フレームデータを処理するなり、UART経由でPCにアップロードするなり、所望の処理に移行することができます。

※例えば、OV7670モジュールをQVGA(320×240[ドット])出力に設定した場合、横方向に320ピクセル、縦方向に240ラインのデータが受信できると想像すると思います。しかし実際に試してみると、OV7670の設定値次第では、ピクセル数が足りなかったり、逆にライン数が増えたりする場合があります。OV7670はバグだらけなので、要注意。

FIFOフル時のリセット手順

 FIFOがフルとなって停止した場合のリセット手順は、以下の通りに実行してください。

 FIFOをリセットして、そのまま機能を停止させるなら、1)の手順だけ実行すればOKです。リセットしてすぐに再起動したい場合には、1)〜4)の手順を遂行してください。リセットには、PCLKの発振が必要なので、XCKEビット=1の状態を維持してください。

デザイン

 次回、Moscoviumで実行するプログラムをご覧いただくと判りますが、コードサイズが4Kバイトを超えてしまいました。抽象度の低いアセンブラ言語でプログラミングしていると、大抵はコードサイズ4Kバイトもあったら十分です。しかし時々、調子に乗ってプログラミングしていると、4Kバイトでは足りなくなる場合があります。
 そこで、今回設計したCAM7670ユニットを搭載したマイコンとして、命令ROM容量を8Kバイトに設定したMCOC115SV0832(mcoc115sv0832.vh)を起こしました(型名規則は、こちら)。


 Cmod A7ボード用Moscoviumマイコンの設計データ(Vivadoプロジェクト)は、GitHubにて配布しております。以下バナーよりアクセスしてください。

btn_moscovium.png

 ダウンロード方法などについては、トップのREADME.mdをご覧ください。

デザイン(回路)をCmod A7ボードに書き込む手順については、こちらをご確認ください。

コンパイル

 カメラモジュールOV7670インターフェイス対応のCAM7670ユニットを搭載した、MCOC115SV0832をコンパイル(論理合成・配置配線)してみました。結果は以下の通りです。

 コンパイル結果:

 OV7670インターフェイスのPCLKは、取り込み速度30FPSなら約24MHzで良いのですが、マージン込みで31.25MHzの制約をかけています。少しマージン取り過ぎ、な感もありますが、こちら側の回路(CAM7670ユニット)には、タイミング的に余裕があるので問題なしです。


 FPGAの回路設計まで終了しました。残るは、オリジナル16ビットCPUコアMoscoviumで実行するプログラムの設計と、実際に動かしてみる実験を残すのみです(次回最終話)。


btn_arduino.png

btn_prev.png btn_next.png

home