单片机学习小组
直播中

刘军

8年用户 1480经验值
私信 关注

求大佬分享uart2axi_master_intf程序源码

求大佬分享uart2axi_master_intf程序源码

回帖(1)

徐振方

2022-2-22 11:16:35
uart2axi_master_intf程序源码:

/***************************************************
*        Module Name                :        uart2axi_master_intf         
*        Engineer                :        Huangruigui
*        Target Device        :      
*        Tool versions        :      
*        Create Date                :
*        Revision                :        v1.0
*        Description                :  
**************************************************/
module        uart2axi_master_intf #(
        parameter         M_AXI_ADDR_WIDTH                         = 8'd32,
        parameter        M_AXI_DATA_WIDTH                         = 8'd32,
        parameter        RX_TOTAL_BYTE                                 = 8'd9,                                //        串口接收到9byte数据开始工作      
        parameter        TX_TOTAL_BYTE                                = 8'd4                                //        串口发送4byte数据给上位机
)(
        //        Global Clock Signal
        input        wire                                                        m_axi_aclk,                        //        模块基准时钟,100MHz
        input        wire                                                        m_axi_aresetn,                //        模块复位信号,低电平有效
      
        //        Master Write Addr Interface
        output        reg                                                                 m_axi_awvalid,
        input        wire                                                        m_axi_awready,
        output        wire [M_AXI_ADDR_WIDTH-1:0]                m_axi_awaddr,      
      
        //        Master Write Date Interface
        output        reg                                                                 m_axi_wvalid,
        input        wire                                                        m_axi_wready,
        output        wire [M_AXI_DATA_WIDTH-1:0]                m_axi_wdata,
        output        wire [M_AXI_DATA_WIDTH/8-1:0]        m_axi_wstrb,
      
        //        Master Read Addr Interface
        output        reg                                                                m_axi_arvalid,
        input        wire                                                         m_axi_arready,
        output        wire [M_AXI_ADDR_WIDTH-1:0]                m_axi_araddr,
      
        //        Master Read Date Interface
        output        wire                                                        m_axi_rready,
        input        wire                                                        m_axi_rvalid,
        input        wire [M_AXI_DATA_WIDTH-1:0]                m_axi_rdata,
        input        wire [1:0]                                                m_axi_rresp,
      
        //        Master Response Interface
        output        reg                                                                m_axi_bready,
        input        wire                                                        m_axi_bvalid,
        input        wire [1:0]                                                m_axi_bresp,
      
        input        wire                                                        uart_write,
        input        wire        [M_AXI_ADDR_WIDTH-1:0]        uart_write_addr,
        input        wire        [M_AXI_DATA_WIDTH-1:0]        uart_write_data,
        input        wire                                                        uart_read,
        input        wire        [M_AXI_ADDR_WIDTH-1:0]        uart_read_addr,
        output        reg                                                                uart_tx_en,
        output        reg                [M_AXI_DATA_WIDTH-1:0]        uart_tx_data
);
      
        //parameter define
        localparam        OKAY         = 2'b00,
                                EXOKAY         = 2'b01,
                                SLVERR         = 2'b10,
                                DECERR         = 2'b11;
                              
        assign        m_axi_wstrb         = {(M_AXI_DATA_WIDTH/8){1'b1}};
        assign        m_axi_wdata         = uart_write_data;
        assign        m_axi_awaddr         = uart_write_addr;
        assign        m_axi_araddr         = uart_read_addr;
        assign        m_axi_rready        = 1;
      
        always@(posedge m_axi_aclk or negedge m_axi_aresetn)
        begin
                if(!m_axi_aresetn)
                        m_axi_bready <= 0;
                else if(m_axi_wvalid & m_axi_wready)
                        m_axi_bready <= 1;
                else if(m_axi_bvalid & (m_axi_bresp == OKAY))
                        m_axi_bready <= 0;
        end
      
        always@(posedge m_axi_aclk or negedge m_axi_aresetn)
        begin
                if(!m_axi_aresetn)
                        m_axi_awvalid <= 0;               
                else if(uart_write)
                        m_axi_awvalid <= 1;
                else if(m_axi_awready)
                        m_axi_awvalid  <= 0;
        end
      
        always@(posedge m_axi_aclk or negedge m_axi_aresetn)
        begin
                if(!m_axi_aresetn)
                        m_axi_wvalid <= 0;
                else if(m_axi_awvalid & m_axi_awready)
                        m_axi_wvalid <= 1;
                else if(m_axi_wready)
                        m_axi_wvalid <= 0;
        end
      
        always@(posedge m_axi_aclk or negedge m_axi_aresetn)
        begin
                if(!m_axi_aresetn)
                        m_axi_arvalid <= 0;
                else if(uart_read)
                        m_axi_arvalid <= 1;
                else if(m_axi_arready)
                        m_axi_arvalid <= 0;
        end        
      
        always@(posedge m_axi_aclk or negedge m_axi_aresetn)
        begin
                if(!m_axi_aresetn)
                begin
                        uart_tx_en <= 0;
                        uart_tx_data <= 0;
                end
                else if(m_axi_rvalid & m_axi_rready)
                begin
                        uart_tx_en <= 1;
                        uart_tx_data <= m_axi_rdata;
                end
                else if(uart_write)
                begin
                        uart_tx_en <= 1;
                        uart_tx_data <= uart_write_data;                //        将写数据发送回上位机作为响应
                end
                else
                        uart_tx_en <= 0;
        end
      
endmodule
//*****************文件结束**************************

整个模块测试文件

/***************************************************
*        Module Name                :        uart2axi_master_tb         
*        Engineer                :        Huangruigui
*        Target Device        :      
*        Tool versions        :      
*        Create Date                :
*        Revision                :        v1.0
*        Description                :  
**************************************************/
`timescale 1ns/1ns
module        uart2axi_master_tb;

        //        parameter define
        parameter         M_AXI_ADDR_WIDTH                 = 8'd32;
        parameter        M_AXI_DATA_WIDTH                 = 8'd32;
        parameter        BAUD_SET                                 = 16'd10416;                //        波特率设置,默认9600
        parameter        RX_TOTAL_BYTE                         = 8'd9;                                //        串口接收到9byte数据开始工作      
        parameter        TX_TOTAL_BYTE                        = 8'd4;                                //        串口发送4byte数据给上位机
        parameter        WRITE_BIT                                = 5'd1;                                //        设置最高位1为写操作
        parameter        READ_BIT                                = 5'd2;

        reg                                                                sys_clk;
        reg                                                                sys_rst_n;
        reg                                                                tx_en;
        reg        [7:0]                                                tx_data;
        wire                                                        tx_done        ;
        wire                                                        uart_tx        ;
      
        wire                                                         m_axi_awvalid;
    reg                                                                m_axi_awready;
    wire [M_AXI_ADDR_WIDTH-1:0]                m_axi_awaddr;      
    wire                                                         m_axi_wvalid;
    reg                                                                m_axi_wready;
    wire [M_AXI_DATA_WIDTH-1:0]                m_axi_wdata;
    wire [M_AXI_DATA_WIDTH/8-1:0]        m_axi_wstrb;
    wire                                                        m_axi_arvalid;
    reg                                                                 m_axi_arready;
    wire [M_AXI_ADDR_WIDTH-1:0]                m_axi_araddr;
    wire                                                        m_axi_rready;
    reg                                                                m_axi_rvalid;
    reg         [M_AXI_DATA_WIDTH-1:0]                m_axi_rdata;
    reg [1:0]                                                m_axi_rresp;
    wire                                                        m_axi_bready;
    reg                                                                m_axi_bvalid;
        reg         [1:0]                                                m_axi_bresp;


        initial sys_clk = 1;
        always #5 sys_clk = ~sys_clk;
      
        initial begin
                sys_rst_n = 0;
                tx_en = 0;
                tx_data = 0;
                m_axi_awready = 1;
                m_axi_wready = 1;
                m_axi_arready = 1;
                m_axi_rresp = 2'b00;
                m_axi_rvalid = 0;
                m_axi_rdata = 0;
                m_axi_bvalid = 1;
                m_axi_bresp = 2'b00;
                #201;
                sys_rst_n = 1;
                #20;
                @(posedge sys_clk)
                #100;
                tx_data = 0;                                //        测试写操作
                repeat(9)
                begin
                        tx_en = 1;
                        tx_data = tx_data + 1;
                        #10;
                        tx_en = 0;
                        wait(tx_done);
                        #100;
                end
                #100;
                if((m_axi_awaddr == 32'h02030405) & (m_axi_wdata == 32'h06070809))
                        $display("test success");
                else
                        $display("test fail");
                #1000;
               
                tx_data = 1;                                //        测试读操作
                repeat(9)
                begin
                        tx_en = 1;
                        tx_data = tx_data + 1;
                        #10;
                        tx_en = 0;
                        wait(tx_done);
                        #100;
                end
                if(m_axi_araddr == 32'h03040506)
                        $display("test success");
                else
                        $display("test fail");
                #100;
               
                m_axi_rvalid = 1;                        //        测试串口发送
                m_axi_rdata = 32'h12345678;
                #10;
                m_axi_rvalid = 0;      
                wait(uart2axi_master.uart2axi_master_logic.byte_matching.tx_conduct.uart_tx_done);
                #1000;
               
                $stop;
        end

uart_tx_logic #(
        .BAUD_SET                        (        BAUD_SET                )
)uart_tx_logic(      
        .sys_clk                        (        sys_clk                        ),
        .sys_rst_n                        (        sys_rst_n                ),
        .tx_en                                (        tx_en                        ),
        .tx_data                        (        tx_data                        ),
        .tx_done                        (        tx_done                        ),               
        .uart_tx                        (        uart_tx                        )
);

uart2axi_master #(
        .M_AXI_ADDR_WIDTH        (        M_AXI_ADDR_WIDTH),
        .M_AXI_DATA_WIDTH        (        M_AXI_DATA_WIDTH),
        .RX_TOTAL_BYTE                (        RX_TOTAL_BYTE        ),
        .TX_TOTAL_BYTE                (        TX_TOTAL_BYTE        )
)uart2axi_master(
        .m_axi_aclk                        (        sys_clk                        ),
        .m_axi_aresetn                (        sys_rst_n                ),
        .m_axi_awvalid                (        m_axi_awvalid        ),
        .m_axi_awready                (        m_axi_awready        ),
        .m_axi_awaddr                (        m_axi_awaddr        ),
        .m_axi_wvalid                (        m_axi_wvalid        ),
        .m_axi_wready                (        m_axi_wready        ),
        .m_axi_wdata                (        m_axi_wdata                ),
        .m_axi_wstrb                (        m_axi_wstrb                ),
        .m_axi_arvalid                (        m_axi_arvalid        ),
        .m_axi_arready                (        m_axi_arready        ),
        .m_axi_araddr                (        m_axi_araddr        ),
        .m_axi_rready                (        m_axi_rready        ),
        .m_axi_rvalid                (        m_axi_rvalid        ),
        .m_axi_rdata                (        m_axi_rdata                ),
        .m_axi_rresp                (        m_axi_rresp                ),
        .m_axi_bready                (        m_axi_bready        ),
        .m_axi_bvalid                (        m_axi_bvalid        ),
        .m_axi_bresp                (        m_axi_bresp                ),
        .UART_RX            (   uart_tx         ),
        .UART_TX            (                           )
);

endmodule
//*****************文件结束*************************
举报

更多回帖

发帖
×
20
完善资料,
赚取积分