Zynq-7000 VIPのお勉強

あぁ、Zynq-7000 VIPってこれだけでいいのね?

https://www.xilinx.com/support/documentation/ip_documentation/processing_system7_vip/v1_0/ds940-zynq-vip.pdf

もっと、複雑なのかと思った。

`timescale 1ns / 1ps

module tb;
    reg tb_ACLK;
    reg tb_ARESETn;

    wire temp_clk;
    wire temp_rstn;

    reg [31:0] read_data;
    wire [3:0] leds;
    reg resp;

    initial
    begin
        tb_ACLK = 1'b0;
    end

    //------------------------------------------------------------------------
    // Simple Clock Generator
    //------------------------------------------------------------------------

    always #10 tb_ACLK = !tb_ACLK;

    initial
    begin
    `ifndef XILINX_SIMULATOR
           tb.zynq_sys.design_1_i.processing_system7_0.inst.M_AXI_GP0.master.IF.PC.fatal_to_warnings=1;
           #40;
           tb.zynq_sys.design_1_i.processing_system7_0.inst.M_AXI_GP0.master.IF.PC.fatal_to_warnings=0;
     `endif
    end

    initial
    begin

        $display ("running the tb");

        tb_ARESETn = 1'b0;
        repeat(2)@(posedge tb_ACLK);
        tb_ARESETn = 1'b1;
        @(posedge tb_ACLK);

        repeat(5) @(posedge tb_ACLK);

        //Reset the PL
        tb.zynq_sys.design_1_i.processing_system7_0.inst.fpga_soft_reset(32'h1);
        tb.zynq_sys.design_1_i.processing_system7_0.inst.fpga_soft_reset(32'h0);

        //This drives the LEDs on the GPIO output
        tb.zynq_sys.design_1_i.processing_system7_0.inst.write_data(32'h40000000,4, 32'hDEADA5A5, resp);
        tb.zynq_sys.design_1_i.processing_system7_0.inst.read_data(32'h40000008,4,read_data,resp);
        $display ("%t, running the testbench, data read from GPIO was 32'h%x",$time, read_data);
        if(read_data[3:0] == 4'h5) begin
           $display ("AXI VIP Test PASSED");
        end
        else begin
           $display ("AXI VIP Test FAILED");
        end
        $display ("Simulation completed");
        $stop;
    end

    assign temp_clk = tb_ACLK;
    assign temp_rstn = tb_ARESETn;

base_zynq_wrapper zynq_sys
   (.DDR_addr(),
    .DDR_ba(),
    .DDR_cas_n(),
    .DDR_ck_n(),
    .DDR_ck_p(),
    .DDR_cke(),
    .DDR_cs_n(),
    .DDR_dm(),
    .DDR_dq(),
    .DDR_dqs_n(),
    .DDR_dqs_p(),
    .DDR_odt(),
    .DDR_ras_n(),
    .DDR_reset_n(),
    .DDR_we_n(),
    .FIXED_IO_ddr_vrn(),
    .FIXED_IO_ddr_vrp(),
    .FIXED_IO_mio(),
    .FIXED_IO_ps_clk(temp_clk),
    .FIXED_IO_ps_porb(temp_rstn ),
    .FIXED_IO_ps_srstb(temp_rstn),
    .leds_4bits_tri_o(leds));

endmodule

VIPのデータシートって見難いんだよねぇ〜

APIの入力って、どの順番かっていうと、データシートの上から順番だってことはわかるんだけど、パッと見てVIPのデータシートは見難いでので直接ソースコードを覗いちゃいましょう。

/opt/Xilinx/Vivado/2017.2/data/ip/xilinx/processing_system7_vip_v1_0/hdl/processing_system7_vip_v1_0_1_apis.v

ああぁ、そういうことなのね・・・

実行できるタスクは勉強会の課題にしよう。