FC2カウンター FPGAの部屋 ZedBoard AXI4 Lite Slave 演習2(シミュレーション)
FC2ブログ

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

FPGAの部屋

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

ZedBoard AXI4 Lite Slave 演習2(シミュレーション)

ZedBoard AXI4 Lite Slave 演習1”の続き。

今回は、ZedBoard AXI4 Lite Slave 演習の回路 led8_axi_lite_slave.v を作り、テストベンチ (led8_axi_lite_slave_tb.v) を作った。更に、AXI4 Master BFMのラッパーとして、AXI4 Lite Master BFM を作製した。
Project Navigator のプロジェクトを作製して、シミュレーションを行った。
下に、Project Navigator のプロジェクトを示す。(ISE14.7)
AXI4_practice_11_131214.png

AXI4 Lite Slave Write Transaction を示す。Writeの手順を下に示す。

・オフセット4 (LED Counter Load Register) に 32'hAA を Writeする。
・オフセットC (LED Interval Register) に 32'h8 を Writeする。
・オフセット0 (Command Register) に 1 を Writeする。


下に、AXI4 Lite Slave Write のシミュレーション波形を示す。
AXI4_practice_12_131214.png

次に、AXI4 Lite Slave Read Transaction を示す。Readの手順はオフセット0、オフセット4、オフセット8、オフセットCと順番に Readした。シミュレーション波形を下に示す。
AXI4_practice_13_131214.png

最後に、led8_axi_lite_slave.v のシミュレーション波形を下に示す。
AXI4_practice_14_131214.png

テストベンチ、led8_axi_lite_slave_tb.v を下に貼っておく。

`default_nettype none

`timescale 100ps / 1ps

////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date:   05:08:14 12/14/2013
// Design Name:   led8_axi_lite
// Module Name:   D:/HDL/FndtnISEWork/Zynq-7000/ZedBoard/AXI4_bus/parctices/PS_PL_Tutorial/system/pcores/led8_axi_lite_v1_00_a/led8_axi_lite_verilog/led8_axi_lite_tb.v
// Project Name:  led8_axi_lite_verilog
// Target Device:
// Tool versions:
// Description:
//
// Verilog Test Fixture created by ISE for module: led8_axi_lite
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
////////////////////////////////////////////////////////////////////////////////

module led8_axi_lite_slave_tb;

    parameter DELAY    = 10;

    // Inputs
    wire ACLK;
    wire ARESETN;
    wire [31:0] S_AXI_AWADDR;
    wire [2:0] S_AXI_AWPROT;
    wire S_AXI_AWVALID;
    wire [31:0] S_AXI_WDATA;
    wire [3:0] S_AXI_WSTRB;
    wire S_AXI_WVALID;
    wire S_AXI_BREADY;
    wire [31:0] S_AXI_ARADDR;
    wire [2:0] S_AXI_ARPROT;
    wire S_AXI_ARVALID;
    wire S_AXI_RREADY;

    // Outputs
    wire S_AXI_AWREADY;
    wire S_AXI_WREADY;
    wire [1:0] S_AXI_BRESP;
    wire S_AXI_BVALID;
    wire S_AXI_ARREADY;
    wire [31:0] S_AXI_RDATA;
    wire [1:0] S_AXI_RRESP;
    wire S_AXI_RVALID;
    wire [7:0] LED8bit;

    // Instantiate the Unit Under Test (UUT)
    led8_axi_lite_slave uut (
        .ACLK(ACLK),
        .ARESETN(ARESETN),
        .S_AXI_AWADDR(S_AXI_AWADDR),
        .S_AXI_AWPROT(S_AXI_AWPROT),
        .S_AXI_AWVALID(S_AXI_AWVALID),
        .S_AXI_AWREADY(S_AXI_AWREADY),
        .S_AXI_WDATA(S_AXI_WDATA),
        .S_AXI_WSTRB(S_AXI_WSTRB),
        .S_AXI_WVALID(S_AXI_WVALID),
        .S_AXI_WREADY(S_AXI_WREADY),
        .S_AXI_BRESP(S_AXI_BRESP),
        .S_AXI_BVALID(S_AXI_BVALID),
        .S_AXI_BREADY(S_AXI_BREADY),
        .S_AXI_ARADDR(S_AXI_ARADDR),
        .S_AXI_ARPROT(S_AXI_ARPROT),
        .S_AXI_ARVALID(S_AXI_ARVALID),
        .S_AXI_ARREADY(S_AXI_ARREADY),
        .S_AXI_RDATA(S_AXI_RDATA),
        .S_AXI_RRESP(S_AXI_RRESP),
        .S_AXI_RVALID(S_AXI_RVALID),
        .S_AXI_RREADY(S_AXI_RREADY),
        .LED8bit(LED8bit)
    );

    // AXI4_Lite_Master_BFM
    AXI4_Lite_Master_BFM #(.DELAY(DELAY)) LMBFMi(
        .ACLK(ACLK),
        .S_AXI_AWADDR(S_AXI_AWADDR),
        .S_AXI_AWPROT(S_AXI_AWPROT),
        .S_AXI_AWVALID(S_AXI_AWVALID),
        .S_AXI_AWREADY(S_AXI_AWREADY),
        .S_AXI_WDATA(S_AXI_WDATA),
        .S_AXI_WSTRB(S_AXI_WSTRB),
        .S_AXI_WVALID(S_AXI_WVALID),
        .S_AXI_WREADY(S_AXI_WREADY),
        .S_AXI_BRESP(S_AXI_BRESP),
        .S_AXI_BVALID(S_AXI_BVALID),
        .S_AXI_BREADY(S_AXI_BREADY),
        .S_AXI_ARADDR(S_AXI_ARADDR),
        .S_AXI_ARPROT(S_AXI_ARPROT),
        .S_AXI_ARVALID(S_AXI_ARVALID),
        .S_AXI_ARREADY(S_AXI_ARREADY),
        .S_AXI_RDATA(S_AXI_RDATA),
        .S_AXI_RRESP(S_AXI_RRESP),
        .S_AXI_RVALID(S_AXI_RVALID),
        .S_AXI_RREADY(S_AXI_RREADY)
    );

    // test
    initial begin
        // Initialize Inputs

        // Wait 100 ns for global reset to finish
        #1000;

        // Add stimulus here
        @(posedge ACLK);    // 次のクロックへ
        #DELAY;

        LMBFMi.AXI_LiteM_1Seq_Write(32'h4, 32'hAA, 0, 0);    // LED8bit = AA, wait_clk_bready=0, wmax_wait=0
        LMBFMi.AXI_LiteM_1Seq_Write(32'hC, 32'h8, 1, 2);    // 8クロックでLEDが+1される, wait_clk_bready=1, wmax_wait=2
        LMBFMi.AXI_LiteM_1Seq_Write(32'h0, 32'h1, 2, 3);    // LED incriment Enable, wait_clk_bready=2, wmax_wait=3

        #1000;    // Wait 100 ns
        @(posedge ACLK);    // 次のクロックへ
        #DELAY;
        LMBFMi.AXI_LiteM_1Seq_Read(32'h0, 0);    // Command Register, rmax_wait=0
        LMBFMi.AXI_LiteM_1Seq_Read(32'h4, 1);    // LED Counter Load Register, rmax_wait=1
        LMBFMi.AXI_LiteM_1Seq_Read(32'h8, 2);    // LED Monitor Register, rmax_wait=2
        LMBFMi.AXI_LiteM_1Seq_Read(32'hC, 3);    // LED Interval Register, rmax_wait=3
    end

    // ACLK
    clk_gen #(
        .CLK_PERIOD(100),    // 10nsec, 100MHz
        .CLK_DUTY_CYCLE(0.5),
        .CLK_OFFSET(0),
        .START_STATE(1'b0)
    ) ACLKi (
        .clk_out(ACLK)
    );

    // reset_gen
    reset_gen #(
        .RESET_STATE(1'b0),
        .RESET_TIME(1000)    // 100nsec
    ) RESETi (
        .reset_out(ARESETN)
    );

endmodule

module clk_gen #(
    parameter         CLK_PERIOD = 100,
    parameter real    CLK_DUTY_CYCLE = 0.5,
    parameter        CLK_OFFSET = 0,
    parameter        START_STATE    = 1'b0 )
(
    output    reg        clk_out
);
    begin
        initial begin
            #CLK_OFFSET;
            forever
            begin
                clk_out = START_STATE;
                #(CLK_PERIOD-(CLK_PERIOD*CLK_DUTY_CYCLE)) clk_out = ~START_STATE;
                #(CLK_PERIOD*CLK_DUTY_CYCLE);
            end
        end
    end
endmodule

module reset_gen #(
    parameter    RESET_STATE = 1'b1,
    parameter    RESET_TIME = 100 )
(
    output    reg        reset_out
);
    begin
        initial begin
            reset_out = RESET_STATE;
            #RESET_TIME;
            reset_out = ~RESET_STATE;
        end
    end
endmodule

`default_nettype wire

  1. 2013年12月15日 03:51 |
  2. AXI4バスの演習資料
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
https://marsee101.blog.fc2.com/tb.php/2672-e90692ed
この記事にトラックバックする(FC2ブログユーザー)