”FPGAで遊んでみる”では、セミナー用に作成したサンプル回路などを整理して少しづつ紹介していきます。
セミナ開催します
手ぶらでOK!実習・Raspberry Pi PicoW×MicroPython I/Oデバイス「時短」開発入門
-- 133MHz ARM Cortex-M0マイコンをPythonでプログラミング
2024年12月6日(金)CQ出版社セミナルーム CQ出版社セミナ・ルーム
詳しくはこちらへ
ZYBOの本
FPGAパソコンZYBOで作るLinux I/Oミニコンピュータ CQ出版 発売中
Papilioの本
FPGA版Arduino!!Papilioで作るディジタル・ガジェット CQ出版 発売中
第9回(その2) カメラモジュールから画像をFPGAへ取り込んでみる DE0編
今回は、第9回のカメラモジュールをterasic社の評価ボードDE0(Altera社EP316F486搭載)へ実装してみました。
回路の中身は第9回(その1)のカメラモジュールと同じですが、内部RAMをAltera社のもの置き換えしています。
さらに カメラの設定を内部のROMから行うように変更しまいた。
評価機器
上がDE0、その左がカメラモジュール、下ががSVGAモニタ(RGB)
DE0のRGB出力をSVGAモニタに接続しています。DE0はUSBケーブルでPCと接続しています。
DE0はダウンロードケーブルの機能を持っているので、ダウンロードケーブルは不要です。
モニタ映っているオートバイはカメラモジュールの先にある写真を撮影しています。
カメラモジュール・インターフェースのソース(zip圧縮してあります)
camera_de0.zip
内容
camera_if.v カメラモジュールインターフェース回路
vram_ctrl.v 入力画像のメモリ保存、出力画像のメモリ読出し回路
ov7670_cmd_genv ov7670の設定情報の生成
i2c_ov7670_ctrl.v ov7670の設定情報からi2cモジュール制御情報生成
camera_ap.v 周辺回路も含めたFPGAの最上階層
svga_if.v SVGA画像出力回路(第4回で紹介)
layer_a.v 移動する箱のグラフィック生成(第4回で紹介)
layer_b.v カラーパタンのグラフィック生成(第4回で紹介)
msg_buf.v メッセージバッファ回路(第8回で紹介)
fifo.v メッセージ保持用FIFO(第8回で紹介)
ram.v メッセージ保持用FIFO用RAM(第8回で紹介)
rs232c_txrx.v RS232Cインターフェースモジュール(第3回で紹介)
vram_dumy.v チップスコープ使用時にメモリが足りないので、使用するvramのダミー記述
camera_ap_test.v camera_apのテストベンチ
camera_ap.qsf FPGAボードにDE0を使用した場合のPIN配置指定
camera_ap.mif OV7670設定用のROMデータファイル
※この回路を使用する場合は、自己責任でお願いします。
仕様説明(camera_if.v)
動作概要
カメラモジュール(0V7670)からの画像データをメモリに保存して、第4回で紹介したSVGA画像出力回路へ画像データを出力します。
FPGAの容量の少ない内部メモリに画像保存しているので、扱う画像サイズは128×128ピクセルです。
出力では、256×256に拡大しています。
また、0V7670を設定するための制御情報をi2c通信モジュールへ出力する機能もあります。
第9回(その1)のカメラモジュールと違う部分
基本的に第9回(その1)のカメラモジュールと同じ動きをしますので、DE0版で変更した部分を紹介します。
カメラの設定を内部ROMから実施をできるように機能を追加しています。
全体的な動作は第9回(その1)を見てください。
ブロック図
入力出力信号
camera_if.vは第9回(その1)から追加は
init_n:カメラ設定開始、0でROMからデータを読み込みi2c通信で設定を開始する
パラメータ(vram_ctrl内に設定)
camera_if.vは第9回(その1)から変更はありません。
詳細動作
第9回(その1)の機能にプラスして、ov7680_cmd_genでROMからデータを読み出してi2c通信でカメラに設定を行うようになっています。
FPGAリセット後またはinit_n=0->1でカメラに設定を開始します。
波形
ROMの作り方(alteral)
ここでALTERA社のツールでのROMの作り方を紹介しておきます。ROMはQuartusUのMegaWizardを使います。
手順1.ROMの入れるデータファイルをの用意
今回はcamera_ap.mifとして用意しました。mifファイルフォーマットはアルテラ社さんサイト(http://www.altera.co.jp/support/software/nativelink/quartus2/glossary/def_mif.html)を参照してださい。
camra_ap.mifの中身
WIDTH=16; DEPTH=256; ADDRESS_RADIX=UNS; DATA_RADIX=HEX; CONTENT BEGIN 0 : 1280; 1 : 1101; 2 : 3A0D; --途中省略 159 : FFFB; 160 : FFFF; [161..255] : 0000; END; |
手順2.QuartusUのMegaWizardからrom作成
以下の方法でromを作成します。
MegaWizardの起動
ファンクションの新規作成
作成ファンクションの指定
ビット数とワード数の指定
アウトプットポート指定
メモリ内のデータ指定、予め準備したcamra_ap.mifを指定
シミュレーションモデルの作成、デフォルト設定
出力ファイルの指定、Finishで完了
手順3.組み込み
ov7680_cmd_gen.vへset_up_romをインスタンスします。インスタンス例はset_up_rom_inst.vにあるので参考してください。
ov7680_cmd_gen.vにset_up_romのインスタンス記述
//省略 set_up_rom set_up_rom ( .address(set_up_adr), .clock(CLK), .q( ram_out)); //以下省略 |
FPGAトップモジュール(camera_ap.v)
camara_ifの周辺回路には、カメラモジュールがなくても動作確認できるよう疑似的カメラ信号信号を出力するdmy_camera.vを追加してます。
dmy_camera_mode=0の時にカメラモジュール入力選択、1の時にdmy_cameraの信号選択
トップモジュール(camera_ap.v)のブロック図
DE0とカメラモジュールの接続
カメラモジュールとDE0はDE0のGPIO用のヘッダーピンに接続しています。詳しくはQSFファイルを見てください。
camera_ap.qsfのカメラモジュールのピン配置
#省略 set_location_assignment PIN_U8 -to i_c_vsync #GPIO1_D[29] set_location_assignment PIN_Y7 -to i_pclk #GPIO1_D[28] set_location_assignment PIN_U10 -to i_in_data[0] #GPIO1_D[24] set_location_assignment PIN_R11 -to i_in_data[2] #GPIO1_D[22] set_location_assignment PIN_U12 -to i_in_data[4] #GPIO1_D[20] set_location_assignment PIN_T14 -to i_in_data[6] #GPIO1_D[18] set_location_assignment PIN_V6 -to i_href #GPIO1_D[30] set_location_assignment PIN_T9 -to xclk #GPIO1_D[27] set_location_assignment PIN_R12 -to i_in_data[1] #GPIO1_D[23] set_location_assignment PIN_T12 -to i_in_data[3] #GPIO1_D[21] set_location_assignment PIN_R14 -to i_in_data[5] #GPIO1_D[19] set_location_assignment PIN_AB7 -to i_in_data[7] #GPIO1_D[17] set_location_assignment PIN_J6 -to dmy_camera_mode #SW0 set_location_assignment PIN_G3 -to init_n #BUTTON1 #以下省略 |
紹介した回路を試す場合は、自己責任でお願いします。
リンクフリーです。
リンクされた場合はご連絡をいただけると嬉しいです。
メール:
変更履歴
(2011/12/17) 初版