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

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

FPGAの部屋

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

Spartan-3A Starter KitでEDKを使ってカメラ表示17(シミュレーションでデバック1)

Spartan-3A Starter KitでEDKを使ってカメラ表示16(回路をXPSに登録)”の続き。

Spartan-3A Starter Kitにダウンロードして、ディスプレイが同期もしていなかったので、いくら何でもおかしいということでシミュレーションを行った。”EDKのシミュレーション”を参考にした。

Project Navigatorでテストベンチのテンプレートを作成して修正した。テストベンチsystem_top_tb.vの自分で追加した部分を下に示す。

    assign resetx = ~fpga_0_rst_1_sys_rst_pin;
    
    OV7670_Model OV7670_inst (
        .clk(fpga_0_rst_1_sys_rst_pin),
        .resetx(resetx),
        .vsync(cam_vsync),
        .href(cam_href),
        .pclk(cam_pclk),
        .ydata(cam_data)
    );
        
    parameter PERIOD = 200; // 200MHz clock
    parameter real DUTY_CYCLE = 0.5;
    parameter OFFSET = 0;
    
    initial    // Clock process for clk
    begin
        fpga_0_clk_1_sys_clk_pin = 1'b0;
        #OFFSET;
        forever begin
            fpga_0_clk_1_sys_clk_pin = 1'b0;
            #(PERIOD-(PERIOD*DUTY_CYCLE)) fpga_0_clk_1_sys_clk_pin = 1'b1;
            #(PERIOD*DUTY_CYCLE);
        end
    end

    initial begin
        // Initialize Inputs
        fpga_0_RS232_DTE_RX_pin = 0;
        fpga_0_RS232_DCE_RX_pin = 0;
        fpga_0_DIPs_4Bit_GPIO_IO_I_pin = 0;
        fpga_0_BTNs_4Bit_GPIO_IO_I_pin = 0;
        fpga_0_DDR2_SDRAM_DDR2_DQS_Div_I_pin = 0;
        fpga_0_rst_1_sys_rst_pin = 1'b1;

        // Wait 100 ns for global reset to finish
        #1000;
        
        // Add stimulus here
        #500
        fpga_0_rst_1_sys_rst_pin = 1'b0;
        
    end
 


これで、Simulate Behavioral Modelをダブルクリックコンパイルして、ISimを起動した。
Spa3A_SKit_OV7670_76_110919.png

そうすると、ipif_Bus2IP_MstRd_sof_n等が'U'になっていた。(慌ててデバックしたので、画像を取ってありませんでした)
いろいろ見ていると、CamDisp_EDK_OV7670\system\pcores\display_controller_v1_00_a\hdl\vhdlフォルダのdisplay_controller.vhdのMPLB_Clkが0のままだったことが判明した。それで、レジスタの初期化もできていないので、'U'になっていたみたいだ。
ソースを見ると、CamDisp_EDK_OV7670フォルダのsystem.v を見ると、plb_v46_1のPLB_Clkがnet_gnd0 に接続されていた。これではクロックが来ていない。

  plb_v46_1_wrapper
    plb_v46_1 (
      .PLB_Clk ( net_gnd0 ),


plb_v46_0 もnet_gnd0 に接続されていた。
ちなみに、plb_v46_1がdisplay_controllerに接続されているPLBで、plb_v46_0がcamera_controllerに接続されているPLBだ。
Spa3A_SKit_OV7670_77_110919.png

どうやって、PLBにクロックを入れるのか?と思ってXPSをいじってみたが、GUIで設定はできないようだった。
system.mhsを見ると、mb_plbの記述に対して、

BEGIN plb_v46
 PARAMETER INSTANCE = mb_plb
 PARAMETER HW_VER = 1.05.a
 PORT PLB_Clk = clk_62_5000MHz
 PORT SYS_Rst = sys_bus_reset
END


に対して、plb_v46_0, plb_v46_1には、PLB_ClkとSYS_Rstの記述がなかった。

BEGIN plb_v46
 PARAMETER INSTANCE = plb_v46_0
 PARAMETER HW_VER = 1.05.a
 PARAMETER C_ARB_TYPE = 0
END

BEGIN plb_v46
 PARAMETER INSTANCE = plb_v46_1
 PARAMETER HW_VER = 1.05.a
END


plb_v46_0, plb_v46_1にPLB_ClkとSYS_Rstの記述をmb_plb同様に追加した。

BEGIN plb_v46
 PARAMETER INSTANCE = plb_v46_0
 PARAMETER HW_VER = 1.05.a
 PARAMETER C_ARB_TYPE = 0
 PORT PLB_Clk = clk_62_5000MHz
 PORT SYS_Rst = sys_bus_reset
END

BEGIN plb_v46
 PARAMETER INSTANCE = plb_v46_1
 PARAMETER HW_VER = 1.05.a
 PORT PLB_Clk = clk_62_5000MHz
 PORT SYS_Rst = sys_bus_reset
END


これで、XPSをXPSでProjectメニューから> Clean All Generate Filesして、XPSでProjectメニューから> Rescan User Repositoriesしてから、シミュレーションすると、CamDisp_EDK_OV7670\system\pcores\display_controller_v1_00_a\hdl\vhdlフォルダのdisplay_controller.vhdのMPLB_Clkにクロックが出力された。
Spa3A_SKit_OV7670_78_110919.png

ipif_Bus2IP_MstRd_sof_nなども'U'にならないで、ちゃんとした信号が出るようになった。

CamDisp_EDK_OV7670フォルダのsystem.v を見ると、plb_v46_1のPLB_Clkがきちんとclk_62_5000MHzに接続されていた。

  plb_v46_1_wrapper
    plb_v46_1 (
      .PLB_Clk ( clk_62_5000MHz ),
      .SYS_Rst ( sys_bus_reset[0] ),

  1. 2011年09月19日 05:22 |
  2. EDK
  3. | トラックバック:0
  4. | コメント:0