FC2カウンター FPGAの部屋 2011年01月12日
FC2ブログ

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

FPGAの部屋

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

OV9655を使ってみる3(回路の書き換え)

OV9655はSXGA (ピクセルクロックは108MHz) とVGA (ピクセルクロックは25MHz) で使う予定なので、CMOSカメラのドットクロックとVGA Display Controller のドットクロックが合わなくなる。今までは、CMOSカメラに25MHzを入力して帰ってきたPCLKでCamera ControllerとVGA Display Controller を動作させていた。
CamDispCntrler_DDR2_2_100709.png
CamDispCntrler_DDR2_3_100709.png

これらのクロックは、Spartan-3A Starter Kit の50MHzのクロックをDCMで1/2にしてCMOSカメラに入力していたが、ここも独立させてDCMを1個使用することにした。VGA Display Controller のクロックもCMOSカメラのPCLKから取るのやめて、独立にDCMを追加した。
下にdcm_CAM_DDR2_clk.vのVerilog ソースを示す。

// DCM module (dcm_CAM_DDR2_clk.v)
// 50MHzを入力して、DDR2_SDRAM用のclkを生成する。
// 125MHzクロック出力に変更。CMOSカメラ用の25MHzも生成する
// 2011/01/11 : VGA Display Controller のクロックとCAMのクロックを独自のDCMで生成する

`default_nettype none
`timescale 1ns / 1ps

(* KEEP_HIERARCHY = "TRUE" *)module dcm_CAM_DDR2_clk (sysclk, reset, clk_ddr2, clk_cam, clk_vga, dcm_ddr2_locked, dcm_cam_locked, dcm_vga_locked);
    `include "ddr2_cont_parameters.vh"
    input    wire    sysclk;
    input    wire    reset;
    output    wire    clk_ddr2;
    output    wire    clk_cam;
    output    wire    clk_vga;
    output    wire    dcm_ddr2_locked;
    output    wire    dcm_cam_locked;
    output    wire    dcm_vga_locked;
    
    wire clk_bufg, clk_node, dcm1_locked;
    wire clk_ddr2_node, clk_ddr2_bufg;
    wire clk_cam_node, clk_cam_bufg;
    wire clkc_bufg, clkc_node, dcmc_locked;
    wire clkv_bufg, clkv_node, dcmv_locked;
    wire clk_vgadc_node, clk_vgadc_bufg;
    wire reset_vc_dcm;
    
    // DDR2 SDRAM用クロック
    DCM dcm_DDR2_clk_dcm (
        .CLKIN(sysclk),
        .CLKFB(clk_bufg),
        .DSSEN(1'b0),
        .PSINCDEC(1'b0),
        .PSEN(1'b0),
        .PSCLK(1'b0),
        .RST(reset),     // 前段のDCMがロックするまでリセット
        .CLK0(clk_node),
        .CLK90(),
        .CLK180(),
        .CLK270(),
        .CLK2X(),
        .CLK2X180(),
        .CLKDV(),
        .CLKFX(clk_ddr2_node),
        .CLKFX180(),
        .LOCKED(dcm1_locked),
        .PSDONE(),
        .STATUS()
    );
    defparam dcm_DDR2_clk_dcm.CLKIN_PERIOD = 20.0;
    defparam dcm_DDR2_clk_dcm.DLL_FREQUENCY_MODE = "LOW";
    defparam dcm_DDR2_clk_dcm.DUTY_CYCLE_CORRECTION = "TRUE";
    defparam dcm_DDR2_clk_dcm.CLKDV_DIVIDE = 2.0;
    defparam dcm_DDR2_clk_dcm.PHASE_SHIFT = 0;
    defparam dcm_DDR2_clk_dcm.CLKOUT_PHASE_SHIFT = "NONE";
    defparam dcm_DDR2_clk_dcm.STARTUP_WAIT = "FALSE";
    defparam dcm_DDR2_clk_dcm.CLKFX_DIVIDE = 2;
    defparam dcm_DDR2_clk_dcm.CLKFX_MULTIPLY = 5;
    // defparam dcm_DDR2_clk_dcm.FACTORY_JF = 16'hFFFF;
    
    BUFG CLK_BUFG_INST (
        .I(clk_node),
        .O(clk_bufg)
    );
    
    BUFG CLK200_BUFG_INST (
        .I(clk_ddr2_node),
        .O(clk_ddr2_bufg)
    );
    assign reset_vc_dcm = ~dcm1_locked;

    // CMOSカメラ用クロック(24MHz)
    DCM dcm_cam (
        .CLKIN(clk_bufg),
        .CLKFB(clkc_bufg),
        .DSSEN(1'b0),
        .PSINCDEC(1'b0),
        .PSEN(1'b0),
        .PSCLK(1'b0),
        .RST(reset_vc_dcm),     // 前段のDCMがロックするまでリセット
        .CLK0(clkc_node),
        .CLK90(),
        .CLK180(),
        .CLK270(),
        .CLK2X(),
        .CLK2X180(),
        .CLKDV(),
        .CLKFX(clk_cam_node),
        .CLKFX180(),
        .LOCKED(dcmc_locked),
        .PSDONE(),
        .STATUS()
    );
    defparam dcm_cam.CLKIN_PERIOD = 20.0;
    defparam dcm_cam.DLL_FREQUENCY_MODE = "LOW";
    defparam dcm_cam.DUTY_CYCLE_CORRECTION = "TRUE";
    defparam dcm_cam.CLKDV_DIVIDE = 2.0;
    defparam dcm_cam.PHASE_SHIFT = 0;
    defparam dcm_cam.CLKOUT_PHASE_SHIFT = "NONE";
    defparam dcm_cam.STARTUP_WAIT = "FALSE";
    defparam dcm_cam.CLKFX_DIVIDE = 25;
    defparam dcm_cam.CLKFX_MULTIPLY = 12;
    // defparam dcm_cam.FACTORY_JF = 16'hFFFF;
    
    BUFG CLKC_BUFG_INST (
        .I(clkc_node),
        .O(clkc_bufg)
    );
    
    BUFG CLK_CAM_BUFG_INST (
        .I(clk_cam_node),
        .O(clk_cam_bufg)
    );

    // VGA Display Controller 用クロック(25MHz)
    DCM dcm_vgadc (
        .CLKIN(clk_bufg),
        .CLKFB(clkv_bufg),
        .DSSEN(1'b0),
        .PSINCDEC(1'b0),
        .PSEN(1'b0),
        .PSCLK(1'b0),
        .RST(reset_vc_dcm),     // 前段のDCMがロックするまでリセット
        .CLK0(clkv_node),
        .CLK90(),
        .CLK180(),
        .CLK270(),
        .CLK2X(),
        .CLK2X180(),
        .CLKDV(),
        .CLKFX(clk_vgadc_node),
        .CLKFX180(),
        .LOCKED(dcmv_locked),
        .PSDONE(),
        .STATUS()
    );
    defparam dcm_vgadc.CLKIN_PERIOD = 20.0;
    defparam dcm_vgadc.DLL_FREQUENCY_MODE = "LOW";
    defparam dcm_vgadc.DUTY_CYCLE_CORRECTION = "TRUE";
    defparam dcm_vgadc.CLKDV_DIVIDE = 2.0;
    defparam dcm_vgadc.PHASE_SHIFT = 0;
    defparam dcm_vgadc.CLKOUT_PHASE_SHIFT = "NONE";
    defparam dcm_vgadc.STARTUP_WAIT = "FALSE";
    defparam dcm_vgadc.CLKFX_DIVIDE = 4;
    defparam dcm_vgadc.CLKFX_MULTIPLY = 2;
    // defparam dcm_vgadc.FACTORY_JF = 16'hFFFF;
    
    BUFG CLKV_BUFG_INST (
        .I(clkv_node),
        .O(clkv_bufg)
    );
    
    BUFG CLK_VGADC_BUFG_INST (
        .I(clk_vgadc_node),
        .O(clk_vgadc_bufg)
    );

    assign clk_ddr2 = clk_ddr2_bufg;    
    assign dcm_ddr2_locked = dcm1_locked;
    assign dcm_cam_locked = dcmc_locked;
    assign dcm_vga_locked = dcmv_locked;
    assign clk_cam = clk_cam_bufg;
    assign clk_vga = clk_vgadc_bufg;
endmodule


この構成で、OV7670カメラ回路を動作させたら問題なく動作した。
次に、OV9655に取り替えて、VGAに設定したつもりで、SCCB設定レジスタに以下の項目を設定した。最初の2文字がレジスタのアドレスで、後の2文字が設定データ。FF00は終了の合図。

6B0A
1267
40F0
FF00


aitendoのOV9655モジュールではDVDDの1.8Vは内蔵のレギュレータを使用しているので、設定レジスタ6Bのビット4は0にしておく必要があると思う。設定レジスタ12で30fps VGAとRGBモードに、設定レジスタ40でデータのレンジを00からFFまでにとRGB555に設定したつもりだ。CMOSカメラに入れるクロックは24MHzだ。
これで確かめてみたところ、PCLKには12MHzが出力され、入力したクロックの半分になっていた。VSYNCは3.5Hz程度、HREFは4KHz程度だった。どうもSXGAモードになっているみたいだった。
OV9655のマニュアルを良く読んだら、SCCBインターフェースでアクセスすべきアドレスが違っていた。OV7670のWriteでは42番地だったが、OV9655のWriteでは60番地だそうだ。これでは設定できない。。。
早速、One_Transaction_SCCB.vhdの

constant ID_ADDRESS_PATTERN_SDA : std_logic_vector := "010000100";



constant ID_ADDRESS_PATTERN_SDA : std_logic_vector := "011000000";


に変更した。
これでSCCB設定レジスタに設定できるようになったようだが、今度はHREFが30Hz、VSYNCが30Hzになってしまった。おかしい。。。
SXGAモードでは、CMOSカメラの入力周波数を24MHzにして、6BレジスタでPLLをBypassモードからX4モードに設定すると、PCLKは48MHz、VSYNCが15Hz程度、HREFが15KHz程度になって、これでいい感じなのではないか?と思う。
VGAモードを探っていきたいが、サンプルをWebから入手したので、これを設定してVGAモードになるかどうか?を確かめてみたい。
  1. 2011年01月12日 05:37 |
  2. OV9655
  3. | トラックバック:0
  4. | コメント:0