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

30th Season


#30-6 VGAカメラ再び:第2話

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

a141_ov7670.jpg

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

アダプタボードの設計・工作

 前回検討の結果、PMODコネクタとの接続信号線と、PMOD外で接続すべき信号線が決定しました。本節では、OV7670端子 ⇔ PMODコネクタのアダプタボードを設計して工作して行きます。

 下図に、万能基板を使ったアダプタボードの配線図を示し、要点を解説します。

a306_adapter.png

  要点解説:

 なるべく容易に工作できる様に考えたつもりですが、上のプランでも、10数本の配線をはんだ付けしなくてはならず、そこそこ大変です\(1_)/。まあ、一回作ってしまえば、Cmod A7ボードでOV7670モジュールを使う時のハードルが一気に下がりますので、工作一回分の困難は我慢して、何とか乗り越えるんだ〜!


 上に解説した要点に従って、工作したアダプタボードを以下図に示します。

a306_adapter.jpg

 OV7670を装着してCmod A7ボードに実装した様子は、後日の実験にて、ご覧に入れます。

システム設計

 OV7670を制御して画像データを取り込む方法については、DUEで実行した記事を参照してください。

 DUEではソフトウェアで各ストローブ信号をモニタしながら、データを取り込みました。今回はFPGAなので、ハードウェアを設計してデータを取り込みます。実は、ハードウェアで実行した方が、圧倒的に簡単(※)で、かつ高速なのです。設計を進めましょう。

 OV7670から出力されるストローブ信号(VSYNC,HREF)とデータ(8ビットデータバス)は、ピクセルクロックPCLKに同期して出力されています(下図)。

a141_frmtmg.png
※OV7670データシートから引用

 OV7670の信号出力は、PCLKの立ち下がりエッジ更新、立ち上がりエッジ受け、となっているので、設計する回路は、PCLKに同期させて動かす事になります。

※「高速」なのは想像していたかもしれませんが、実は「簡単」でもあるのです。上で解説した様に、全てのストローブ信号がPCLKに同期しているからです。何も考えずにPCLKでサンプリングしながら、ストローブ信号に従って処理を進めるだけで勝手にデータが取り込めてしまう、そんな感じです。

非同期FIFO

 OV7670とのインターフェイス回路は、PCLKに同期して動作する回路となります。一方、Cmod A7ボードで動作させるオリジナル16ビットCPUコアMoscoviumは、24MHzのCPUクロックclkで動作しているため、PCLKとは非同期です。
 非同期クロック間データ転送の基本は、ハンドシェークだと解説したことがありました。この基本に変わりありませんが、今回のケースでは、OV7670が垂れ流してくるデータをひたすら受け続ける形ですので、非同期型のFIFOバッファを使ってインターフェイスするのが良いでしょう。

 FIFOバッファへの書き込みはPCLK同期で、読み出しはclk同期とします。

 自分で設計した小容量のFIFO回路(非同期クロック対応版)も有りますが、小容量FIFO(数10〜数100[バイト])を想定した、分散RAM(LUT RAM)版でした。今回は数Kバイトの大容量FIFOを使いたいので、VivadoのFIFOマクロを使います。

ストリームとフレーム

 FIFOに流すデータについて考察して行きましょう。
 こちらで信号線数を削減したことで、取り込む画像データは、RGB222形式(6ビットカラー、64色)のピクセルデータです。順当には、取り込んだ6ビットのピクセルデータをそのまま、FIFOに流し込めば良いのです。

 ただ、このままだと、ただの「ストリーム(流れ)」ですよね?ピクセルデータが、ただただ流れてくるのですが、どこが始まりで、どこが終わりなのか、全く解りません。フレーム(画像データ)は、横方向×縦方向ピクセルの行列であるので、ただのストリームではありません。
 ストリームの中で、どこから画像データが始まって(VSYN)、どこから横方向のラインが始まる(HSYN)のか?を示すデータを付加して、初めて1枚のフレームを再構築できる様になります。

 そこで、RGB222の6ビットデータに、同期ビット、VSYN(1ビット)とHSYN(1ビット)を追加した、計8ビットデータでストリームを形成して、FIFOへ流し込む事にします(下図)。

a306_pixfmt.png

 切り良く、2冪数の8ビットデータとなって、Happyですよね(1^−^)。

 追加した同期ビットに注目して、FIFOに流れるストリームとフレームの関係を以下図に示します。

a306_frame.png

 緑色破線が、FIFOを流れるストリームデータを表しています。CPUでFIFOからピクセルデータを読み出しながら、VSYNビットを確認することでフレームの始まり、HSYNビットを確認することで、ラインの始まりを見つけることが可能で、結果としてフレームを再構築することができるのです。

PCLKの周波数

 PCLKはOV7670内部で、入力されたXCLKから逓倍後→分周して作り出しています。逓倍比と分周比は、OV7670の内部I/Oレジスタで設定できます。DUEの時に考察・解説済みなので、詳しくは、こちらの記事をご確認ください。

 OV7670でVGAサイズの画像データを30fpsで取り込もうとすると、fPCLK≒24MHzが必要です。1ピクセル当たり16ビットのRGB444フォーマットだと、8ビットデータバスで2サイクル分の転送時間がかかるので、fPCLK≒24MHzの場合、ピクセルレートは半分の約12MHzです。
 それでも、2バイト/2サイクル@PCLKと言う転送速度なので、Moscovium @24MHzにとっては相当高速です。まあ、本ページでは、一旦、Moscoviumでハンドリング可能な周波数まで、PCLKの周波数を落として使う事にします。


 今回のアダプタボード工作が、実は本テーマ最大の難所であり、肝でもありました。アダプタボードを一度作っておくと、Cmod A7ボード(FPGA)にOV7670モジュールを手軽に装着できて、使い勝手が格段に向上します。


btn_arduino.png

btn_prev.png btn_next.png

home