Verilog功能模块——AXI4-Lite协议主机-单次写-使用FIFO

一. 模块功能与应用场景

模块功能:AXI4-Lite协议主机,从FWFT FIFO(首字直通FIFO)中读取地址和数据,实现将数据写入到设定的地址中的操作。

二. 模块框图与使用说明

2.1 模块框图

2.2 参数与接口信号

参数列表:

参数名 说明
ADDR_WIDTH 地址宽度,可设置为任意正数
DATA_WIDTH 数据宽度,可选32/64
RD_CHECK_EN 读检查使能,1打开使能,0关闭使能

接口列表:

接口名 说明
m_axi_xxx 以m_axi_开头的表示axi-Lite协议主机的接口信号
fwft_fifo_xxx 共三个,组成首字直通FIFO的读接口
single_burst_wr_finish 单次突发完成
error_flag error_flag为错误指示信号,用来指示有错误发生
write_resp_error 写响应错误
read_resp_error 读响应错误
rdata_notequal_wdata_error 读数据不等于写数据的错误

2.3 模块IP框图

m_axi接口与FIFO READ接口封装完成后框图如下:

Verilog功能模块——AXI4-Lite协议主机-单次写-使用FIFO_第1张图片

模块IP参数配置界面:

Verilog功能模块——AXI4-Lite协议主机-单次写-使用FIFO_第2张图片

2.4 使用说明

当FIFO非空时,此模块会读取FIFO中的数据,数据位宽必须等于 = 设置的地址位宽 + 设置的数据位宽。高位存地址,低位存数据。此AXI模块会将接收到的数据写入设置的地址中。如果使能了读检查使能(Rd Check En),此AXI模块会在写入完成后再读取相同地址,并比较写入数据和读出数据,不同则报错。

三. 模块代码

太长,见六. 工程分享。

四. testbench

/*
 * @Author       : Xu Dakang
 * @Email        : [email protected]
 * @Date         : 2021-12-09 19:46:44
 * @LastEditors  : Xu Dakang
 * @LastEditTime : 2021-12-11 13:48:25
 * @Filename     :
 * @Description  :
*/


module AXI4Lite_singleRW_tb ();

timeunit 1ns;
timeprecision 1ps;

localparam ADDR_WIDTH = 13;
localparam DIN_WIDTH = 32;

logic FIFO_WRITE_full;
logic [ADDR_WIDTH + DIN_WIDTH-1 : 0] FIFO_WRITE_wr_data;
logic FIFO_WRITE_wr_en;
logic error_flag;
logic m_axi_aclk;
logic m_axi_aresetn;
logic rdata_notequal_wdata_error;
logic read_resp_error;
logic single_burst_wr_finish;
logic write_resp_error;

AXI4Lite_singleRW_sys_wrapper AXI4Lite_singleRW_sys_wrapper_inst (.*);


// 生成时钟
localparam CLKT = 2;
initial begin
  m_axi_aclk = 0;
  forever #(CLKT / 2) m_axi_aclk = ~m_axi_aclk;
end


// 导入输入波形文件 路径需要修改
string din_path = "F:/Onedrive/VivadoPrj/AXI4LiteMaster_singleRW_useFIFO/myAXI4LiteMasterV1.srcs/sim_1/new/sin.txt";

localparam DATA_NUM = 10000; // 数据量, 也就是txt文件的行数, 如果此参数大于数据行数, 读取到的内容为不定态
logic [DIN_WIDTH-1 : 0] din_wave_data [DATA_NUM]; // 读取输入波形数据
initial begin
  $readmemb(din_path, din_wave_data, 0, DATA_NUM-1); // vivado读取txt文件
end



// 写使能
logic start;
logic [ADDR_WIDTH-1 : 0] addr;
always_ff @(posedge m_axi_aclk) begin
  if (~m_axi_aresetn)
    FIFO_WRITE_wr_en <= 1'b0;
  else if (start || single_burst_wr_finish)
    FIFO_WRITE_wr_en <= 1'b1;
  else
    FIFO_WRITE_wr_en <= 1'b0;
end


// 写地址
always_ff @(posedge m_axi_aclk) begin
  if (~m_axi_aresetn)
    addr <= '0;
  else if (start || single_burst_wr_finish)
    addr <= addr + 1'b1;
  else
    addr <= addr;
end


// 写数据
always_ff @(posedge m_axi_aclk) begin
  if (~m_axi_aresetn)
    FIFO_WRITE_wr_data <= '0;
  else if (start || single_burst_wr_finish)
    FIFO_WRITE_wr_data <= {addr, din_wave_data[addr]};
  else
    FIFO_WRITE_wr_data <= FIFO_WRITE_wr_data;
end


// 控制复位,仿真开始,仿真结束信号
initial begin
  m_axi_aresetn = 0;
  #(CLKT * 10)  m_axi_aresetn = 1;

  wait(FIFO_WRITE_full == 0)
  start = 1;
  #(CLKT) start = 0;
  wait (addr == 5000);

  #(CLKT * 1000) $stop;
end


endmodule

五. 仿真验证

仿真工具:Vivado 2021.2 Simulator。

Block Design如下图:

Verilog功能模块——AXI4-Lite协议主机-单次写-使用FIFO_第3张图片

仿真波形:写数据和读数据没有问题。

Verilog功能模块——AXI4-Lite协议主机-单次写-使用FIFO_第4张图片

六. 工程分享

AXI4LiteMaster_singleRW_useFIFO_Vivado2021.2工程分享:

链接:https://pan.baidu.com/s/1pMLVXw1URcthGT2Uv9QHxw
提取码:dcq6

注意,需要修改testbench中的sin文件路径才能得到正确的仿真结果。

你可能感兴趣的:(Verilog,fpga开发,Verilog,功能模块,AXI4-Lite,FIFO)