モノ創りで国造りを

ハード/ソフト問わず知見をまとめてます

MAX10で画像処理

背景

FPGAで画像処理をしたい。
SoC FPGAでやろうと思ったけど、学習コストが高く、途中で挫折してしまった。
一旦、FPGAマイコンをハード的に分けることで何かしらの進捗を出し、モチベーションを高める。

やりたいこと

  1. カメラモジュールをマイコン(Arduino)のI2Cで制御。
  2. カメラモジュールの画像データをFPGAに出力。
  3. 画像データをFPGA内部で処理。
  4. FPGAからVGA信号をディスプレイに出力。

各モジュールの簡単な説明

マイコン

言わずと知れたArduino Uno。
f:id:yuji2yuji:20190926065121p:plain

カメラモジュール

OV7675のモジュール品を使用する。
秋月で購入。550円。安い。
OV7675使用30万画素カメラ B0070: カメラ 秋月電子通商-電子部品・ネット通販

供給電源は3.3V、出力形式は選択可能。
画像データはパラレル8出力。
f:id:yuji2yuji:20190926064847p:plain

1~4ピン(電源、GND、I2C)をArduinoに接続する。

MAX10 EVAL Kit

Intelから販売されているMAX10の安価な評価ボード。
FPGAへのデータ書き込みには専用のツールが必要。
https://www.intel.co.jp/content/www/jp/ja/programmable/products/boards_and_kits/dev-kits/altera/kit-max-10-evaluation.html

f:id:yuji2yuji:20190926065603p:plain

f:id:yuji2yuji:20190926065648p:plain

カメラモジュールをマイコンのI2Cで制御

OV7675カメラモジュールのデータは以下。
細かい点は色々あるが、まずはデータを出力できればよい。
真っ黒だとデータが出力されているかどうかが不明なのでつらい。

http://akizukidenshi.com/download/ds/omnivision/ov7675.pdf

データシートから、何かしらの画像データを出力するために以下の設定が必要とわかる。

ENとPWDNは以下の設定が必要。

Pin Level
PWDN L
PEN H

初期化時に各アドレスへ送信するデータは以下。

address data description
0xB8 4'h1 1.8V requirement
0xB8 4'h2 1.8V requirement
0x71 0x01 Test pattern Enable
0x17 Horizontal start
0x18 Horizontal stop
0x32 Horizontal start[2:0] and stop[5:3]
0x19 Vertical start
0x1A Vertical stop
0x03 Vertical start[2:0] and stop[5:3]

スレーブアドレスは、Write0x42、Read0x43。
Write/Readで末尾に1/0を付加されている。
一般的にI2Cで使用される7bitのアドレスは0x21。

Direction b6 b5 b4 b3 b2 b1 b0 W/R
Write 0 1 0 0 0 0 1 1
Read 0 1 0 0 0 0 1 0

OV7675カメラモジュールとArduinoを接続する。

SCCB(I2C)でデータの送受信を行う。
ArduinoはI2Cのポートを有するが、Digital IOポートを使ってSCCBの制御を行っているコードをgithubで見つけた。ただしOV7670。
https://gist.github.com/muhammadyaseen/75490348a4644dcbc70f
これを修正すればよさそう。
Arduino一つで複数カメラの制御もできそうなので、
今後の拡張性を考慮してありがたく拝借して使用する。

OV7675の画素はベイヤパターン。
f:id:yuji2yuji:20190926073254p:plain

しかしレジスタの設定を変えることで、出力Formatは変更可能。
今回はRGB565でやってみる。
RGB565は、R:5bit、G:6bit、B:5bitの合計16bitを1画素のデータとするFormat。

OV7675は画像データの表示領域を選択できる。
0x17~0x1A、0x03、0x32で設定する。
f:id:yuji2yuji:20190926073344p:plain

VGAのデータ出威力ダイアグラムは以下。 f:id:yuji2yuji:20190927073822p:plain
データをディスプレイ上に表示するためには、VGAを使ったアナログ信号だとDAコンバータが必要。
今回はDAコンバーターがないので、デジタルデータを閾値で0/1切り替えて表示する。

とりあえず画像だし

FPGAにデータを書き込み、OV7675を初期化すると画像が出るようになった。
ただし、FPGAによるVGA出力とOV7675のデータ入力は同期をとっていないので、
表示される画像はひどい有様だった。

そこで、OV7675から入力されるPCLK信号(画素データのクロック)を使ってFPGAからVGAデータを出力したところ、
画像が表示されなかった(入力データがない状態)。
波形を観測すると、PCLKは鈍っており十分な信号レベルが出力されていないことがわかった。
コンパレーターかアンプが必要とわかったが、そこまで改修するのも手間なので、今回はここまでとする。