FC2カウンター FPGAの部屋 CMOSイメージセンサ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

MT9D111のフレームレートを 15 fps から 30 fps にした

CMOSカメラモジュールのMT9D111 のCLKINに 36 MHz を入れると、PIXCLK に 18 MHz が出てきていた。
カメラでは8ビットの 2 バイトで1つのピクセルを表すので、つまり、ピクセルクロックとしては 18 MHz の半分の 9 MHz となり、約 15 fps ということになる。(SVGA でのピクセルクロックは 40 MHz)アプティナのカメラの出力フォーマットはVGA信号よりも情報が詰まっているので、これで計算が合うのだ。

このフレームレートを 15 fps から 30 fps にしたいと常々思っていた。MT9D111 のマニュアルにも「30 fps in preview mode (800 x 600)」 と書いてあるし、やってみた。

まずは、preview mode のデフォルトでは、PLL がディスエーブルされていると思うので、PLL を活かしてクロックを倍にしたいなと思った。しかし、カメラの設定用レジスタは多すぎて、やってみるのが怖い。
それでも mbed の mt9d111.cpp mt9d111.h は参考になりそうだった。

とりあえず、カメラのレジスタ設定は変えずにフレームレートを倍にするには、カメラのCLKIN に入れるクロックの周波数を倍にすれば良いだろうというということで、今まで 36 MHz を入れていたが、72 MHz にしてみることにした。MT9D111 のマニュアルでもPLL をバイパスしているときの最高の入力周波数は 80 MHz ということなので、問題ないはずだ。

PYNQ のFASTX コーナー検出のプロジェクトでやってみた。
pynq_fastx ブロックデザインで processing_system7_0 をダブルクリックして設定する。
mt9d111_15_30fps_1_170223.png

開いたダイアログで、Clock Configuration をクリックして、FCLK_CLK2 の周波数設定を 36 MHz から 72 MHz に変更した。
mt9d111_15_30fps_2_170223.png

制約ファイルでは、カメラの出力クロック pclk の period を 55.56 ns から 27.88 ns に変更した。
mt9d111_15_30fps_3_170223.png

これで、論理合成、インプリメント、ビットストリームの生成を行い、SDK でPYNQボードにダウンロードしてFASTX コーナー検出をやってみたが動作した。フレームレートが速くなっている気がする(気のせいじゃないよね?)
うまく行ったので、30 fps で使うことにする。

なお、ZYBO でもコードで延長したMT9D111 でもうまく動いている。72 MHz のクロックを出してもちゃんと受けられているみたいだ。
  1. 2017年02月23日 04:43 |
  2. CMOSイメージセンサ
  3. | トラックバック:0
  4. | コメント:0

2 Mega pixel Camera Module MT9D111 JPEG Out + HQ lens

eBay で注文した”2 Mega pixel Camera Module MT9D111 JPEG Out + HQ lens”が今日届きました。
HQ_lens_mt9d111_1_130912.jpg

HQ_lens_mt9d111_2_130912.jpg

使っていた日昇テクノロジーの MT9D111メガピクセルカメラモジュールとピン配置が一緒だったので、付け替えて電源ONしてディスプレイに表示してみました。しかし、カメラが重そうです。。。いよいよ、マウント用のスペーサを付ける必要がありそうです。そのためにカメラ・インターフェイス基板には取り付け用の穴を開けておきました。
HQ_lens_mt9d111_3_130912.jpg

画面に表示はするのですが、おかしな表示になりました。
ZedBoard_Linux_93_130215.jpg

これは、MT9D111がデフォルト状態の時の表示です。YUVモードになっていて、I2Cでレジスタを設定してRGB565に設定できていない状態ですね。

下に示すのが、日昇テクノロジーの MT9D111メガピクセルカメラモジュールの回路図の一部です。
HQ_lens_mt9d111_4_130912.png

5番ピンと6番ピンのSDAとSCLが10KΩでプルアップされています。

下に示すのが、今度購入した”2 Mega pixel Camera Module MT9D111 JPEG Out + HQ lens”の回路図の一部です。
HQ_lens_mt9d111_5_130912.png

5番ピンと6番ピンのSDAとSCLはプルアップされていないのが分かります。

これが原因かもしれません?早速PlanAhead で、FPGAの出力ピンでPull Upしてみましょう。
PlanAhead を開くと、mt9d111_Scl, mt9d111_Sda の Pull Type が None になっていました。
HQ_lens_mt9d111_6_130912.png

これを PULLUP に変更しました。
HQ_lens_mt9d111_7_130912.png

そして、インプリメント、ビットストリームを生成しました。
インプリメント・デザインを開くとmt9d111_Scl, mt9d111_Sda の Pull Type が PULLUP なのが見えますね。
HQ_lens_mt9d111_8_130912.png

ハードウェアをエクスポートして、SDKを立ちあげました。
Cleanして、コンパイルをし直しました。
HQ_lens_mt9d111_9_130912.png

それで、BOOT.binを作ってやってみましたが、ZedBoard の Done LED が点灯しなかったので、SDKをすべてクリアして、やり直しました。

cam_disp プロジェクトを作って、そこのプロジェクトの右クリックメニューから Create Boot Image を選択しました。
HQ_lens_mt9d111_10_130912.png

すると、FSBLを作っておくと、FSBL.elf と cam_disp.elf がダイアログに入っていて、Output folder もcam_disp\bootimage に設定されています。
HQ_lens_mt9d111_11_130912.png

後は、ビットストリームをAdd して、真ん中の位置に収めて、Create Image ボタンをクリックすると、cam_disp\bootimage に cam_disp.bin が出来ます。
HQ_lens_mt9d111_12_130912.png

それを、SDカードに書いて、BOOT.bin とリネームすればSDカードは出来上がりです。ZedBorad にそのSDカードを入れて、電源ONすると、カメラの画像が写りました。
HQ_lens_mt9d111_13_130912.jpg

ちゃちいレンズとHQレンズの画質の違いはよくわかりませんが、ピントを合わせるときの剛性が高い気がします。F1.2なので、夜の撮影に威力を発揮すると思います。
  1. 2013年09月12日 05:46 |
  2. CMOSイメージセンサ
  3. | トラックバック:0
  4. | コメント:3

MT9D111のお勉強6

MT9D111のお勉強5で大体、MT9D111の勉強は良いかな?と思ったのだが、おるさんに教えていただいて、まだまだ理解が足りないことがわかった。もう少し勉強してみたいと思う。

Start-Up and Usage (148ページ)
スタートアップシーケンスを下に示す。
 1. Power-up
 2. Hardware reset
 3. Configure and enable PLL
 4. Configure pad slew rate
 5. Configure preview mode
 6. Configure and enable auto focus
 7. Configure capture mode
 8. Perform lock or capture

1.は電源ONしたということだ。

2.Hard Reset Sequence (149ページ)
電源ONの後はリセットする必要がある。電源が安定したらRESET#(アクティブ・ロー)をアサートする。RESET#をリリースしてから、24クロック後にI2Cがコマンドを受けられる状態になる。
 1.すべての電源が規格内に入ってくるまで待つ
 2.クロックを入力
 3.RESET# (active LOW)を少なくとも1us の間アサートする
 4.RESET# (active LOW)をディアサート(クロックは入れておく)
 5.24クロック後にI2Cインターフェースが使用可能になる。

下にFigure 33を引用する。
MT9D111_8_121219.png

2.Soft Reset Sequence (150ページ)
 1.もしPLLを使っていれば、PLLをバイパスする。(R0x65:0=0xA000, PLL Bypass, Power-down PLL During Standby, 通常の場合はPLLがPower-downしない設定になっている)
 2.R0xC3:1=0x0501 を設定して、MCUリセットを実行する。(bit0 が reset microcontroller.)
 3.R0x0D:0=0x0021 に設定することでソフトリセットをイネーブル。Bit5のReset SOC とBit0の sensor core reset を行う。
 4.R0x0D:0=0x0000 に設定することで、リセットをディスエーブル。
 5.24クロック後にI2Cインターフェースが使用可能になる。

3.Enable PLL
入力クロックがどうなっているかわからないので、デフォルトではPLLはディスエーブルされている。PLLはM,N,Pの値で出力周波数が決定される。
 1.PLL出力周波数を設定する。(R0x66-67:0 M, N, Pを設定)
 2.PLLの電源ON。(R0x65:0[14] = 0)
 3.PLLのセットリング時間( > 150us)待つ。
 4.PLLバイパスを解除する。(R0x65:2[15] = 0)

4.Configure Pad Slew (151ページ)
DOUT, PIXCLK, FRAME_VALID, and LINE_VALID、SDATA and SCLKのスルーレートを R10:1 で指定する。

5.Configure Preview Mode
デフォルトのプレビューのイメージサイズは800x600で、80MHzの内部クロックで30fpsで動作する。mode.output_width_A と mode.output_height_A (ファームウエアのID = 7)を変更し、seq.cmd=5 (ファームウエアのID=1, Offs=3, 値5)のREFRESHコマンドを発行することでサイズを変更できる。(プレビューはスキップ1で1画素ずつスキップしている)
例として、160x120 LCD RGBのプレビュー画面を設定する。
 • mode.output_width_A=160
 • mode.output_width_B=120
 • mode.out_format_A=0x20
 • seq.cmd=5
プレビューコントラスト、明るさ、ガンマ、フレームレート、および多くの他のパラメータもここでロードすることができます。この時点で既知である場合、ユーザーは、キャプチャのパラメータをプログラムすることができます。必要であれば、ここで、AE / WB/ AFロックコマンドを設定します。

7.Configure Capture Mode
キャプチャーのパラーターがわかっていれば(ビデオ、静止、圧縮、解像度)、modeとother drivers を設定する。

8.Perform Lock or Capture
Figure 32を引用する。
MT9D111_9_121219.png

・Sequencer Driver
 ・シーケンサ = ステートマシン
 ・preview, capture などの状態を持つ。
 ・シーケンサは previewing, preview lock, capture, などの処理を実行している。
 ・シーケンサに特定の処理を実行されるためには、cmd内のプログラム番号を設定する。
 ・解像度を変更および/またはフレームをキャプチャする時に、ホストはステートをモニタする必要がある。
 ・各ステートの構成は、 (see "Firmware Driver Variables" on page 68)
 ・プログラムを実行する前に、プログラムをカスタマイズするためにステート設定を設定する。例えば、圧縮されたフレームをキャプチャーするために、captureステート設定で圧縮をイネーブルする。

通常のシナリオを下に示す。
 1.ハードウェア・リセット後のモード変数設定
  a.プレビュー用センサ・イメージ・サイスの設定
  b.ディスプレイ・イメージ・サイズの設定
  c.FIFO to smooth data rate の設定
 2.プレビュー・モードの設定
  a.自動露出、自動ホワイト・バランス、オート・フォーカス速度のセット
 3.センサ・リフレッシュ・コマンドの実行
 4.シャッターボタンを押されるまでのプレビューで動作
  a.シャッターボタンを半押しした時は、ロック・プログラムを実行
   i. previewステートでの設定で、自動露出、自動ホワイト・バランス、オート・フォーカスをディスエーブル
   ii.高速設定のためにPreviewLeaveステートで設定を行う
   iii.ロック・プログラムを実行
   iv.PreviewLeaveステートを通ったロック・プログラムは、ロックを実行して、Previewステートに遷移する
  b.シャッターボタンが押されたら、キャプチャー・プログラムを実行する
   i.すでにロックモードだったら、PreviewLeaveステートをディスエーブルして、キャプチャー・プログラムを実行する
   ii.ロックステートではなく、オート・フォーカスなどの幾つかの設定が必要な場合は、PreviewLeaveステートで設定する
   iii.キャプチャー・プログラムを実行する。PreviewLeaveへの遷移は、設定を実行して、キャプチャーへのモード変更を進める
 5.Captureフレーム
  a.イメージ・サイズ、圧縮、ビデオか写真かなどのキャプチャー・モード変数は設定されている
  b.フレームを取得するキャプチャー・ステートの時は、ステート変数をモニタする
オプションで、 Capture Enter or Preview Leaveでブランクの出力をすることが出来る。これは、キャプチャーのために正しいフレームを取得する助けになる。

・ステートマシンの遷移は、Driver Variables−Sequencer Driver (ID = 1) Offs = 3 (cmd)(70ページ)
 0 — Run
 1 — Do Preview
 2 — Do Capture
 3 — Do Standby
 4 — Do lock
 5 — Refresh
 6 — Refresh mode
・もしくは、Driver Variables−Sequencer Driver (ID = 1) Offs = 5 (stepMode)
 Bit 0—Step mode On/Off (1 = On)
 Bit 1—1 forces the sequencer to do next step
  1. 2012年12月19日 05:57 |
  2. CMOSイメージセンサ
  3. | トラックバック:0
  4. | コメント:4

MT9D111のお勉強5

・Changes to Gain Settings

・R0x2B:0 : Green1 Gain (R/W)
・R0x2C:0 : Blue Gain (R/W)
・R0x2D:0 : Red Gain (R/W)
・R0x2E:0 : Green2 Gain (R/W)
・R0x2F:0 : Global Gain (R/W)


なぜ、G1とG2があるかは、”MT9D111のお勉強4”の最初の図を見ればわかると思う。

Feature Description
・PLL Generated Master Clock
・センサーコアに組み込まれたPLLは80MHzまで。
・入力クロックは、6MHzから64MHzまで。
・PLLクロックは、R0x66:0 and R0x67:0 で制御している。
・R102—0x66 - PLL Control 1 (R/W)
Bit FieldDescriptionDefault(Hex)
Bits 15:8MM value for PLL must be 16 or higher.28
Bits 5:0NN value for PLL.9

・R103—0x67 - PLL Control 2 (R/W)
Bit FieldDescriptionDefault(Hex)
Bits 11:7ReservedDo not change from default value.
Bits 6:0PP value for PLL.1

上のR102:0 と R103:0 で指定されるPLL出力、fPLL, fOUT は下の式で表される。

fPLL, fOUT = fPLL, fIN, x M / [2 x (N+1) x (P+1)]


分母は偶数になってしまう。奇数で割れないんだね。

・Table 29(123ページを引用)
MT9D111_7_121218.png
条件がキツイ気がする。PLLバイパスの方が良いか?

・R101—0x65 - Clock (R/W) (40ページ)
Bit FieldDescriptionDefault (Hex)
Bit 15PLL Bypass1—Bypass the PLL. Use CLKIN input signal as master clock.
0—Use clock produced by PLL as master clock.
1
Bit 14PLL Powerdown1—Keep PLL in power-down to save power (default).
0—PLL powered-up.
1
Bit 13Power-down
PLL During
Standby
This register only has an effect when bit 14 = 0.
1—Turn off PLL (power-down) during standby to save
power (default).
0—PLL powered-up during standby.
1
Bit 2clk_newrowForce clk_newrow to be on continuously.0
Bit 1clk_newframeForce clk_newframe to be on continuously.0
Bit 0clk_shipForce clk_ship to be on continuously.0

Bit 15にPLL Bypassがあった。デフォルトでは、PLL Bypass。

・PLL Power-up

1. Program PLL frequency settings (R0x66:0 and R0x67:0)
2. Power up the PLL (R0x65:0[14] = 0)
3. Wait for a time longer than PLL locking time (> 1ms)
4. Turn off the PLL bypass (R0x65:0[15] = 0)

  1. 2012年12月18日 04:38 |
  2. CMOSイメージセンサ
  3. | トラックバック:0
  4. | コメント:4

MT9D111のお勉強4

・Sensor Core (116ページ)
・Pixel Array Structure
センサーコアのピクセルアレイは、1688x1256の領域があって、その一部を出力する。その指定は、R0x01:0、R0x02:0、R0x3:0、R0x4:0 で指定する。
・R0x01:0 Row Start  デフォルト値 0x001C (28)
・R0x02:0 Column Start デフォルト値 0x003C (60)
・R0x03:0 Row Width   デフォルト値 0x04B0 (1200)
・R0x04:0 Col Width  デフォルト値 0x640 (1600)

・Figure 15: Pixel Color Pattern Detail (Top Right Corner)
フレーム最初のベイヤーパターン。Figure 15を引用する。
MT9D111_1_121212.png

・Figure 18: Pixel Data Timing Exampleを引用する。
MT9D111_4_121214.png
LINE_VALIDが1の時に、ピクセルデータを出力する。

・Figure 19: Row Timing and FRAME_VALID/LINE_VALID Signalsを引用する。
MT9D111_5_121214.png
ピクセルクロック周波数の推奨値は36MHz

・Frame Time
・表示する画面は、Context AとContext B と2つあるようだ。どちらを表示するかは、R0xF2:0 の値で決まり、デフォルトではContext Bになる。
MT9D111_6_121217.png 

・Fame - Long Integration Time (シャッター幅の設定によって、Vertical Blankingが長くなってしまう)
フレーム内の行の積算時間よりもシャッター幅の方が長くなると(R0x09:0 > R0x03:0/S + BORDER + VBLANK_REG)、Vertical Blankingが長くなってしまう。その場合の V' と F' を下に示す。

V' : Vertical Blanking (long integration time) : (R0x09:0 – (R0x03:0)/S) * (A + Q) + (Q - 2*P)
F' : Total Frame Time (long integration time) : (R0x09:0) * (A + Q)

  1. 2012年12月14日 05:38 |
  2. CMOSイメージセンサ
  3. | トラックバック:0
  4. | コメント:6

MT9D111のお勉強3

・Firmware Driver Variables(68ページ)
・SFR and MCU SRAM と同様にR198(0xC6):1(アドレス)とR200(0xC8):1(データ)でアクセスする。
Table 9を下に引用する。
MT9D111_2_121213.png

・Driver IDとオフセットによって設定値を指定する。
・Driverにアクセスする方法
 1.R198(0xC6):1[15] (1 = 8bit access, 0 = 16bit access)
 2.R198(0xC6):1[14:13] = 01 の時にDriver が指定される。それ以外はMCUのメモリアクセス
 3.R198(0xC6):1[12:8] :Driver ID
 4.R198(0xC6):1[7:0] :Driver variable offset
 5.R200(0xC8):1 に16ビットか、もしくは8ビットアクセスの場合は下位8ビットにデータを書く

・MCU Register List and Memory Map
Table 20: Memory Map を下に引用する。
MT9D111_3_121213.png

・Special Function Register List
 ・Native Registers
 ・Math Coprocessor Registers
 ・Register I/O Bus Master
 ・SFR - GPIO

・Output Format and Timing(110ページ)
・データの出力タイミングはFRAME_VALIDとLINE_VALIDによって示される。
・FRAME_VALIDは画面の1フレームであることを示す。
・LINE_VALIDはそのラスタのピクセルデータが出力中であることを示す。
・FRAME_VALID=1, LINE_VALID=1の時にピクセルデータが出力中となる。
・YCrCb、RGB565, RGB555, RGB444x, RGBx444のタイミングはOdd, Evenで1組のデータとなる。つまり1ピクセル出力するのに2クロック必要
・ベイヤーデータは10ビットで10ビットそのまま出すモードと8ビットのデータポートに2回に分けて出すモードがある。(Odd - D9~D2、Even - 000000,D1,D0)
・R151(0x97):1 にOutput Format Configuration があった。YUV, ITU-R BT.601 codes、RGB565, RGB555, RGB444x, RGBx444を切り替える。
・R9(0x9):1 Factory Bypassの[1:0] = 00 の時に、00 = 10-bit sensor. ベイヤー出力になると思われる。


・JPEG Compressed Output
  1. 2012年12月13日 05:29 |
  2. CMOSイメージセンサ
  3. | トラックバック:0
  4. | コメント:0

MT9D111のお勉強2

3.4.Special Function Registers (SFR) and MCU SRAM
・SFRはレジスタでマイクロコントローラのローカルバスにつながっている。
・SFRは、GPIO, waveform generatorとファームウエアの操作に重要なレジスタがある。
・SFRは、physical address でアクセスされる。
・MCU SRAMは1K のシステムメモリと1Kのユーザーメモリから構成される。(8bits単位か? 16bits単位か?)

・SFRとユーザーメモリは、R198:1(アドレス)とR200:1(データ)でアクセスする。ちなみにR198:1は、IFP page 1レジスタの198番目、つまりアドレス0xC6のレジスタへのアクセスとなる。
SFRとMCU SRAMのアクセス例を下に引用する。

• Write into user SRAM. Use to upload code
 a. R198:1 = 0x400 // address
 b. R200:1 = 0x1234 // write 16-bit value
• Read from user SRAM
 c. R198:1 = 0x400 // address
 d. Read R200:1 // read 16-bit value
• Write to 8-bit GPIO register
 e. R198:1 = 0x9079 // GPIO_DIR_L at 0x1079
 f. R200:1 = 0x00FE // Configure GPIO[0] as output
• Read from 8-bit GPIO register
 g. R198:1 = 0x9079 // GPIO_DIR_L at 0x1079
 h. Read R200:1 //Check GPIO[7:0] pad state


・JPEG Indirect Registers
・アクセス方法、R30:2がアドレス、R31:2がデータでJPEG Indirect Registers にアクセスする。
・JPEG Indirect Registers のアドレスは11ビット長

・見つけたBeagleBoard用Linuxの drivers/media/video/omap/sensor_ex3691.c ここに、”TI EX3691 (also known as Micron MT9D111) camera SOC driver. ”と書いてあった。
これを見ると、例えばRGB565にセットする時にファームウエアのドライバIDを指定して値をセットしているようだ。この操作は、R0x97:1 に値をセットするのと等価のようだ。
  1. 2012年12月12日 05:52 |
  2. CMOSイメージセンサ
  3. | トラックバック:0
  4. | コメント:0
»