FC2カウンター FPGAの部屋 ビットマップ・ディスプレイ・コントローラをAXI4-Stream対応にする4(ソースコードの公開)

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

FPGAの部屋

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

ビットマップ・ディスプレイ・コントローラをAXI4-Stream対応にする4(ソースコードの公開)

ビットマップ・ディスプレイ・コントローラをAXI4-Stream対応にする3(シミュレーション)”の続き。

前回は、シミュレーションを行って、テストベンチのVerilog HDLのソースコードを貼った。今回は、それ以外のVerilog HDLのソースコードを貼っておく。

最初に、bitmap_disp_cont_axis.v から貼っておく。

// bitmap_disp_cont_axis.v
//
// by marsee
//
// Read Only IP, 64 bit bus
//
// 2012/06/28
// 2012/11/22 : HDMI出力を追加
// 2014/07/23 : ZYBO 用に変更
// 2014/09/18 : Frame Buffer のスタートアドレスを設定するためにAXI4 Lite Slave インターフェースを追加
// 2016/08/08 : AXI4 Master から AXI4-Stream インターフェースに変更、AXI4 Lite Slave インターフェースはダミーライトに変更
//                ダミーライトするとディスプレイ・コントローラがスタートする
//

`default_nettype none

module bitmap_disp_cont_axis #
  (
        // AXI4 Lite Slave Interface
        parameter integer C_S_AXI_LITE_ADDR_WIDTH        = 9,
        parameter integer C_S_AXI_LITE_DATA_WIDTH        = 32,

        // AXI4-Stream Interface
        parameter integer C_M_AXIS_DATA_WIDTH            = 32,

        parameter [31:0]    C_DISPLAY_START_ADDRESS        = 32'h17800000,    // フレームバッファのスタートアドレス

        // video resolution : "VGA", "SVGA", "XGA", "SXGA", "HD"
        parameter [80*8:1] RESOLUTION                    ="SVGA"  // SVGA
    )
    (
        // Clocks and Reset
        input wire          s_axi_lite_aclk,
        input wire           AXIS_ACLK,
        input wire           ARESETN,

        ///////////////////////////////
        // AXI4 Lite Slave Interface //
        ///////////////////////////////
        // AXI Lite Write Address Channel
        input    wire    s_axi_lite_awvalid,
        output    wire    s_axi_lite_awready,
        input    wire    [C_S_AXI_LITE_ADDR_WIDTH-1:0]    s_axi_lite_awaddr,

        // AXI Lite Write Data Channel
        input    wire    s_axi_lite_wvalid,
        output    wire    s_axi_lite_wready,
        input    wire    [C_S_AXI_LITE_DATA_WIDTH-1:0] s_axi_lite_wdata,

        // AXI Lite Write Response Channel
        output    wire    [1:0]    s_axi_lite_bresp,
        output    wire    s_axi_lite_bvalid,
        input    wire    s_axi_lite_bready,

        // AXI Lite Read Address Channel
        input    wire    s_axi_lite_arvalid,
        output    wire    s_axi_lite_arready,
        input    wire    [C_S_AXI_LITE_ADDR_WIDTH-1:0]    s_axi_lite_araddr,

        // AXI Lite Read Data Channel
        output    wire    s_axi_lite_rvalid,
        input    wire    s_axi_lite_rready,
        output    wire    [C_S_AXI_LITE_DATA_WIDTH-1:0] s_axi_lite_rdata,
        output    wire    [1:0]    s_axi_lite_rresp,

        /////////////////////////////////
        // AXI4-Stream Slave Interface //
        /////////////////////////////////
        input  wire [C_M_AXIS_DATA_WIDTH-1:0]        s_axis_tdata,
        input  wire [(C_M_AXIS_DATA_WIDTH/8)-1:0]   s_axis_tstrb,
        input  wire                                     s_axis_tvalid,
        output wire                                   s_axis_tready,
        input  wire                                   s_axis_tlast,
        input  wire                                    s_axis_tuser,

        // User Ports
        input    wire    pixclk,

        (* IOB = "FORCE" *) output    reg     [4:0]    vga_red,
        (* IOB = "FORCE" *) output    reg     [5:0]    vga_green,
        (* IOB = "FORCE" *) output    reg     [4:0]    vga_blue,
        (* IOB = "FORCE" *) output    reg        vga_hsync,
        (* IOB = "FORCE" *) output    reg        vga_vsync,

        output  wire [23:0] vid_pData,
        output  wire        vid_pVDE,
        output  wire        vid_pHSync,
        output  wire        vid_pVSync
    );

     wire    [7:0]    red, green, blue;
    wire    hsyncx, vsyncx;
    wire    display_enable;
    reg        reset_disp_2b = 1'b1, reset_disp_1b = 1'b1;
    wire    reset_disp;
    wire    afifo_overflow, afifo_underflow;
    wire    reset_out;
    wire    init_done;

    bm_disp_cntrler_axi_lite_slave #(
        .C_S_AXI_LITE_ADDR_WIDTH(C_S_AXI_LITE_ADDR_WIDTH),
        .C_S_AXI_LITE_DATA_WIDTH(C_S_AXI_LITE_DATA_WIDTH),
        .C_DISPLAY_START_ADDRESS(C_DISPLAY_START_ADDRESS)
    ) bm_disp_cntrler_axi_lite_slave_i
    (
        .s_axi_lite_aclk(s_axi_lite_aclk),
        .axi_resetn(ARESETN),
        .s_axi_lite_awvalid(s_axi_lite_awvalid),
        .s_axi_lite_awready(s_axi_lite_awready),
        .s_axi_lite_awaddr(s_axi_lite_awaddr),
        .s_axi_lite_wvalid(s_axi_lite_wvalid),
        .s_axi_lite_wready(s_axi_lite_wready),
        .s_axi_lite_wdata(s_axi_lite_wdata),
        .s_axi_lite_bresp(s_axi_lite_bresp),
        .s_axi_lite_bvalid(s_axi_lite_bvalid),
        .s_axi_lite_bready(s_axi_lite_bready),
        .s_axi_lite_arvalid(s_axi_lite_arvalid),
        .s_axi_lite_arready(s_axi_lite_arready),
        .s_axi_lite_araddr(s_axi_lite_araddr),
        .s_axi_lite_rvalid(s_axi_lite_rvalid),
        .s_axi_lite_rready(s_axi_lite_rready),
        .s_axi_lite_rdata(s_axi_lite_rdata),
        .s_axi_lite_rresp(s_axi_lite_rresp),
        .fb_start_address(),
        .init_done(init_done)
    );

    bitmap_disp_engine #(
        .RESOLUTION(RESOLUTION)
    ) bitmap_disp_eng_inst (
        .clk_disp(pixclk),
        .clk_axi(AXIS_ACLK),
        .reset_disp(reset_disp),
        .reset_axi(~ARESETN),
        .s_axis_tdata(s_axis_tdata),
        .s_axis_tstrb(s_axis_tstrb),
        .s_axis_tvalid(s_axis_tvalid),
        .s_axis_tready(s_axis_tready),
        .s_axis_tlast(s_axis_tlast),
        .s_axis_tuser(s_axis_tuser),
        .red_out(red),
        .green_out(green),
        .blue_out(blue),
        .hsyncx(hsyncx),
        .vsyncx(vsyncx),
        .display_enable(display_enable),
        .ddr_cont_init_done(init_done),
        .afifo_overflow(afifo_overflow),
        .afifo_underflow(afifo_underflow)
    );

    always @(posedge pixclk) begin
        if (reset_disp) begin
            vga_red <= 5'd0;
            vga_green <= 6'd0;
            vga_blue <= 5'd0;
            vga_hsync <= 1'b1;
            vga_vsync <= 1'b1;
        end else begin
            vga_red <= red[7:3];
            vga_green <= green[7:2];
            vga_blue <= blue[7:3];
            vga_hsync <= hsyncx;
            vga_vsync <= vsyncx;
        end
    end

    always @(posedge pixclk) begin
        reset_disp_2b <= ~ARESETN;
        reset_disp_1b <= reset_disp_2b;
    end
    assign reset_disp = reset_disp_1b;

    assign vid_pData = {red, blue, green};
    assign vid_pVDE = display_enable;
    assign vid_pHSync = hsyncx;
    assign vid_pVSync = vsyncx;

endmodule

`default_nettype wire


次に、bitmap_disp_engine.v を示す。

// BitMap Display Controller
// bitmap_disp_engine.v
// AXI4バス用 by marsee
//
// 2014/07/26 : video_timing_param.vh を使用
// 2014/09/18 : フレームバッファのスタートアドレス入力を追加
// 2016/03/04 : display_enable の出力期間のバグをフィックスした
// 2016/08/08 : AXI4 Master から AXI4-Stream インターフェースに変更
//

`default_nettype none

// synthesis translate_off
// `include "std_ovl_defines.h"
// synthesis translate_on

module bitmap_disp_engine #(
        // AXI4-Stream Interface
        parameter integer C_M_AXIS_DATA_WIDTH            = 32,
        // video resolution : "VGA", "SVGA", "XGA", "SXGA", "HD"
        parameter [80*8:1] RESOLUTION                    ="SVGA"  // SVGA
) (
    input    wire    clk_disp,            // ディスプレイ表示用クロック
    input    wire    clk_axi,            // AXI4バスクロック
    input    wire    reset_disp,            // clk_disp 用リセット
    input    wire    reset_axi,            // clk_axi 用リセット

    input    wire [C_M_AXIS_DATA_WIDTH-1:0]        s_axis_tdata,
    input    wire [(C_M_AXIS_DATA_WIDTH/8)-1:0]    s_axis_tstrb,
    input    wire                                s_axis_tvalid,
    output    wire                                   s_axis_tready,
    input     wire                                   s_axis_tlast,
    input    wire                                s_axis_tuser,

    output    reg        [7:0]    red_out,
    output    reg        [7:0]    green_out,
    output    reg      [7:0]    blue_out,
    (*S="TRUE"*) output    reg     hsyncx,
    (*S="TRUE"*) output    reg     vsyncx,
    output    wire    display_enable,
    input    wire    ddr_cont_init_done,    // DDR2 SDRAMコントローラの初期化終了
    output    wire    afifo_overflow, // 非同期FIFO のオーバーフロー・エラー
    output    wire    afifo_underflow    // 非同期FIFO のアンダーフロー・エラー
);
    `include "./video_timing_param.vh"

    parameter [2:0]    idle_rdg=            3'b001,
                    wait_half_full=        3'b010,
                    display_mode=        3'b100;
    reg    [2:0] cs_rdg;

    reg afifo_rd_en;
    wire afifo_wr_en;
    wire [31:0] afifo_dout;
    wire afifo_full;
    wire afifo_empty;
    wire [9:0] wr_data_count;
    reg [15:0] h_count;
    reg [15:0] v_count;
    reg [7:0] red_node, green_node, blue_node;
    reg hsyncx_node, vsyncx_node;
    reg vsync_axi, vsync_axi_b1;
    reg vsync_axi_1d;
    reg vsyncx_rise_pulse;
    reg de, de_b1, de_b2;
    wire disp_mode_ena;
    reg disp_mode_ena_d0, disp_mode_ena_d1;
    reg init_done_d0 = 1'b0;
    reg init_done_d1 = 1'b0;

    // synthesis translate_off
    // wire [`OVL_FIRE_WIDTH-1:0] fire_overflow, fire_underflow;
    // synthesis translate_on

    // RGB保存用非同期FIFO, FWFT Wirte側64ビット幅512深度、Read側32ビット512深度とする
    bitmap_afifo bitmap_afifo_inst (
        .wr_rst(reset_axi),
        .wr_clk(clk_axi),
        .rd_clk(clk_disp),
        .rd_rst(reset_disp),
        //.din(data_in), // Bus [63 : 0]
        .din(s_axis_tdata), // Bus [31 : 0]
        .wr_en(afifo_wr_en),
        .rd_en(afifo_rd_en),
        .dout(afifo_dout), // Bus [31 : 0]
        .full(afifo_full),
        .overflow(afifo_overflow),
        .empty(afifo_empty),
        .underflow(afifo_underflow),
        .wr_data_count(wr_data_count)  // [9 : 0] wr_data_count
    );
    assign afifo_wr_en = s_axis_tvalid & ~afifo_full;
    // afifo_wr_en が 1 になるときは、tuserが1の時か、cs_rdgがidle_rdgでなく、tvalidが1で、FIFOがFULLでない時
    assign s_axis_tready = ~afifo_full; 

    // ddr_cont_init_done を clk_axi で同期化する
    always @(posedge clk_axi) begin
        init_done_d0 <= ddr_cont_init_done;
        init_done_d1 <= init_done_d0;
    end

    // Readデータ処理モジュール用ステートマシン
    always @(posedge clk_axi) begin
        if (reset_axi | ~init_done_d1)
            cs_rdg <= idle_rdg;
        else begin
            case (cs_rdg)
                idle_rdg :
                    if (s_axis_tuser & afifo_wr_en)
                        cs_rdg <= wait_half_full;
                wait_half_full : // 最初にFIFO が half_full になるのを待ってスタートする
                    if (wr_data_count[8])
                        cs_rdg <= display_mode;
                display_mode : // 画面表示モード
                    ;
            endcase
        end
    end
    assign disp_mode_ena = (cs_rdg==display_mode) ? 1'b1 : 1'b0;

    // ビットマップVGAコントローラのclk_disp 動作部

    // h_count、v_count用にclk_axi 動作のcs_rdg の値を使用するので2回clk_disp 動作のFFでラッチする
    always @(posedge clk_disp) begin
        if (reset_disp) begin
            disp_mode_ena_d0 <= 0;
        end else begin
            disp_mode_ena_d0 <= disp_mode_ena;
            disp_mode_ena_d1 <= disp_mode_ena_d0;
        end
    end

    // h_countの実装(水平カウンタ)
    always @(posedge clk_disp) begin
        if (reset_disp==1'b1 || disp_mode_ena_d1==1'b0)
            h_count <= 0;
        else if (h_count>=(H_SUM-1)) // h_count がH_SUM-1よりも大きければ0に戻す(mod H_SUM)
            h_count <= 0;
        else
            h_count <= h_count + 1;
    end

    // v_countの実装(垂直カウンタ)
    always @(posedge clk_disp) begin
        if (reset_disp==1'b1 || disp_mode_ena_d1==1'b0)
            v_count <= 0;
        else if (h_count>=(H_SUM-1)) begin // 水平カウンタがクリアされるとき
            if (v_count>=(V_SUM-1)) // v_count がV_SUM-1よりも大きければ0に戻す(mode V_SUM)
                v_count <= 0;
            else
                v_count <= v_count + 1;
        end
    end

    // Red, Green, Blue出力
    always @(posedge clk_disp) begin
        if (reset_disp) begin
            red_node <= 0;
            green_node <= 0;
            blue_node <= 0;
        end else begin
            if (disp_mode_ena_d1==1'b0) begin // 最初にpixel_async_fifo がフルになるまで画像データを出力しない。
                red_node <= 0;
                green_node <= 0;
                blue_node <= 0;
            end else if (h_count<=H_ACTIVE_VIDEO && v_count<V_ACTIVE_VIDEO) begin
                red_node <= afifo_dout[23:16];
                green_node <= afifo_dout[15:8];
                blue_node <= afifo_dout[7:0];
            end else begin
                red_node <= 0;
                green_node <= 0;
                blue_node <= 0;
            end
        end
    end
    always @(posedge clk_disp) begin
        if (reset_disp) begin
            red_out <= 0;
            green_out <= 0;
            blue_out <= 0;
        end else begin
            red_out <= red_node;
            green_out <= green_node;
            blue_out <= blue_node;
        end
    end

    // hsyncx 出力(水平同期信号)
    always @(posedge clk_disp) begin
        if (reset_disp | ~disp_mode_ena_d1)
            hsyncx_node <= 1'b1;
        else
            if (h_count>(H_ACTIVE_VIDEO + H_FRONT_PORCH-1) && h_count<=(H_ACTIVE_VIDEO + H_FRONT_PORCH + H_SYNC_PULSE-1)) // 水平同期期間
                hsyncx_node <= 1'b0;
            else
                hsyncx_node <= 1'b1;
    end
    always @(posedge clk_disp) begin
        if (reset_disp)
            hsyncx <= 1'b1;
        else
            hsyncx <= hsyncx_node;
    end

    // vsyncx 出力(水平同期信号)
    always @(posedge clk_disp) begin
        if (reset_disp | ~disp_mode_ena_d1)
            vsyncx_node <= 1'b1;
        else
            if (v_count>(V_ACTIVE_VIDEO + V_FRONT_PORCH-1) && v_count<=(V_ACTIVE_VIDEO + V_FRONT_PORCH + V_SYNC_PULSE-1)) // 垂直同期期間
                vsyncx_node <= 1'b0;
            else
                vsyncx_node <= 1'b1;
    end
    always @(posedge clk_disp) begin
        if (reset_disp)
            vsyncx <= 1'b1;
        else
            vsyncx <= vsyncx_node;
    end

    // vsync をclk_axi で同期化
    always @(posedge clk_axi) begin
        if (reset_axi) begin
            vsync_axi        <= 1'b0;
            vsync_axi_b1    <= 1'b0;
            vsync_axi_1d    <= 1'b0;
        end else begin
            vsync_axi_b1     <= ~vsyncx_node;
            vsync_axi         <= vsync_axi_b1;
            vsync_axi_1d    <= vsync_axi;
        end
    end

    // vsyncx_rise_pulse の処理。vsyncx の立ち上がり時に1パルス出力する
    always @(posedge clk_axi) begin
        if (reset_axi)
            vsyncx_rise_pulse <= 1'b0;
        else begin
            if (vsync_axi==1'b0 && vsync_axi_1d==1'b1)
                vsyncx_rise_pulse <= 1'b1;
            else
                vsyncx_rise_pulse <= 1'b0;
        end
    end

    // display_enable 出力
    always @(posedge clk_disp) begin
        if (reset_disp | ~disp_mode_ena_d1)
            de <= 1'b0;
        else begin
            if (h_count<H_ACTIVE_VIDEO && v_count<V_ACTIVE_VIDEO)
                de <= 1'b1;
            else
                de <= 1'b0;
        end
    end
    always @(posedge clk_disp) begin
        if(reset_disp | ~disp_mode_ena_d1) begin
            de_b1 <= 1'b0;
            de_b2 <= 1'b0;
        end else begin
            de_b1 <= de;
            de_b2 <= de_b1;
        end
    end
    assign display_enable = de_b2;

    // afifo_rd_en の処理
    always @(posedge clk_disp) begin
        if (reset_disp)
            afifo_rd_en <= 1'b0;
        else begin
            if (~disp_mode_ena_d1) // 初期化中
                afifo_rd_en <= 1'b0;
            else if (h_count<H_ACTIVE_VIDEO && v_count<V_ACTIVE_VIDEO) // 表示期間
                afifo_rd_en <= 1'b1;
            else
                afifo_rd_en <= 1'b0;
        end
    end
endmodule

`default_nettype wire



最後に、bm_disp_cntrler_axi_lite_slave.v を示す。

// bm_disp_cntrler_axi_lite_slave.v
// bitmap_disp_cntrler_axi_master のAXI Lite Slave モジュール。Frame Buffer のスタートアドレス・レジスタを持つ。
//
// Addr 0x0 - frame buffer start address
//

`default_nettype none

module bm_disp_cntrler_axi_lite_slave # (
    parameter integer C_S_AXI_LITE_ADDR_WIDTH = 9, // Address width of the AXI Lite Interface
    parameter integer C_S_AXI_LITE_DATA_WIDTH = 32, // Data width of the AXI Lite Interface

    parameter [31:0] C_DISPLAY_START_ADDRESS = 32'h1A00_0000
)(
    input    wire                                    s_axi_lite_aclk,
    input    wire                                    axi_resetn,

    // AXI Lite Write Address Channel
    input    wire                                    s_axi_lite_awvalid,
    output    wire                                    s_axi_lite_awready,
    input    wire    [C_S_AXI_LITE_ADDR_WIDTH-1: 0]    s_axi_lite_awaddr,

    // AXI Lite Write Data Channel
    input    wire                                    s_axi_lite_wvalid,
    output    wire                                    s_axi_lite_wready,
    input    wire    [C_S_AXI_LITE_DATA_WIDTH-1: 0]    s_axi_lite_wdata,

    // AXI Lite Write Response Channel
    output    wire    [1:0]                            s_axi_lite_bresp,
    output    wire                                    s_axi_lite_bvalid,
    input    wire                                    s_axi_lite_bready,

    // AXI Lite Read Address Channel
    input    wire                                    s_axi_lite_arvalid,
    output    wire                                    s_axi_lite_arready,
    input    wire    [C_S_AXI_LITE_ADDR_WIDTH-1: 0]    s_axi_lite_araddr,

    // AXI Lite Read Data Channel
    output    wire                                    s_axi_lite_rvalid,
    input    wire                                    s_axi_lite_rready,
    output    wire    [C_S_AXI_LITE_DATA_WIDTH-1: 0]    s_axi_lite_rdata,
    output    wire    [1:0]                            s_axi_lite_rresp,

    output    wire    [31:0]                            fb_start_address,    // Frame Buffer のスタートアドレス
    output    reg                                        init_done            // PS部の初期化終了
);

    // RESP の値の定義
    parameter    RESP_OKAY =        2'b00;
    parameter    RESP_EXOKAY =    2'b01;
    parameter    RESP_SLVERR =     2'b10;
    parameter    RESP_DECERR =    2'b11;

    parameter    IDLE_WR =            2'b00,    // for wrt_cs
                DATA_WRITE_HOLD =    2'b01,
                BREADY_ASSERT =        2'b11;

    parameter    IDLE_RD    =        1'b0,            //  for rdt_cs
                AR_DATA_WAIT =    1'b1;

    reg        [1:0]    wrt_cs = IDLE_WR;

    reg        [31:0]    fb_start_addr_reg = C_DISPLAY_START_ADDRESS;

    reg        rdt_cs = IDLE_RD;

    reg        reset_1d = 1'b0;
    reg        reset = 1'b0;
    reg        awready = 1'b1;
    reg        bvalid = 1'b0;
    reg        arready = 1'b1;
    reg        rvalid = 1'b0;
    wire    aclk;

    assign aclk = s_axi_lite_aclk;
    // Synchronization of axi_resetn
    always @(posedge aclk) begin
        reset_1d <= ~axi_resetn;
        reset <= reset_1d;
    end

    // AXI4 Lite Slave Write Transaction State Machine
    always @(posedge aclk) begin
        if (reset) begin
            wrt_cs <= IDLE_WR;
            awready <= 1'b1;
            bvalid <= 1'b0;
        end else begin
            case (wrt_cs)
                IDLE_WR :
                    if (s_axi_lite_awvalid & ~s_axi_lite_wvalid) begin    // Write Transaction Start
                        wrt_cs <= DATA_WRITE_HOLD;
                        awready <= 1'b0;
                    end else if (s_axi_lite_awvalid & s_axi_lite_wvalid) begin    // Write Transaction Start with data
                        wrt_cs <= BREADY_ASSERT;
                        awready <= 1'b0;
                        bvalid <= 1'b1;
                    end
                DATA_WRITE_HOLD :
                    if (s_axi_lite_wvalid) begin    // Write data just valid
                        wrt_cs <= BREADY_ASSERT;
                        bvalid <= 1'b1;
                    end
                BREADY_ASSERT :
                    if (s_axi_lite_bready) begin    // The write transaction was terminated.
                        wrt_cs <= IDLE_WR;
                        bvalid <= 1'b0;
                        awready <= 1'b1;
                    end
            endcase
        end
    end
    assign s_axi_lite_awready = awready;
    assign s_axi_lite_bvalid = bvalid;
    assign s_axi_lite_wready = 1'b1;
    assign s_axi_lite_bresp = RESP_OKAY;

    // AXI4 Lite Slave Read Transaction State Machine
    always @(posedge aclk) begin
        if (reset) begin
            rdt_cs <= IDLE_RD;
            arready <= 1'b1;
            rvalid <= 1'b0;
        end else begin
            case (rdt_cs)
                IDLE_RD :
                    if (s_axi_lite_arvalid) begin
                        rdt_cs <= AR_DATA_WAIT;
                        arready <= 1'b0;
                        rvalid <= 1'b1;
                    end
                AR_DATA_WAIT :
                    if (s_axi_lite_rready) begin
                        rdt_cs <= IDLE_RD;
                        arready <= 1'b1;
                        rvalid <= 1'b0;
                    end
            endcase
        end
    end
    assign s_axi_lite_arready = arready;
    assign s_axi_lite_rvalid = rvalid;
    assign s_axi_lite_rresp = RESP_OKAY;

    // fb_start_addr_reg
    always @(posedge aclk) begin
        if (reset)
            fb_start_addr_reg <= C_DISPLAY_START_ADDRESS;
        else
            if (s_axi_lite_wvalid)
                fb_start_addr_reg <= s_axi_lite_wdata;
    end
    assign fb_start_address = fb_start_addr_reg;
    assign s_axi_lite_rdata = fb_start_addr_reg;

    // generated init_done
    always @(posedge aclk) begin
        if(reset) begin
            init_done <= 1'b0;
        end else if(wrt_cs==BREADY_ASSERT) begin
            init_done <= 1'b1;
        end
    end
endmodule

`default_nettype wire

  1. 2016年08月17日 05:14 |
  2. IP
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

トラックバック URL
http://marsee101.blog19.fc2.com/tb.php/3546-a51c57f0
この記事にトラックバックする(FC2ブログユーザー)