一. 模块功能与应用场景
模块功能:AXI4-Lite协议主机,从FWFT FIFO(首字直通FIFO)中不断读取数据,写入到一段地址中。
应用场景:DDR读写,BRAM读写等AXI接口的存储器件读写。
二. 模块框图与使用说明

参数列表:
参数名 | 说明 |
---|---|
TARGET_SLAVE_BASE_ADDR | 目标从机基地址 |
TARGET_SLAVE_MAX_ADDR | 目标从机最大地址 |
ADDR_WIDTH | 地址宽度,根据需要任意设置 |
DATA_WIDTH | 数据宽度,32/64 |
RD_CHECK_EN | 读检查使能,0/1 |
接口列表:
接口名 | 说明 |
---|---|
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 | 读数据不等于写数据 |
将模块封装为IP后,显示的模块IP框图:

模块IP参数配置界面:

三. 模块代码
略。见六.工程分享。
四. testbench
/*
* @Author : Xu Dakang
* @Email : xudaKang_up@qq.com
* @Date : 2021-05-09 11:04:28
* @LastEditors : Xu Dakang
* @LastEditTime : 2021-12-12 15:40:37
* @Filename : TryAXI4Lite_tb.sv
* @Description : testbench of myAXI4LiteMaster
*/
module myAXI4LiteMaster_blockRW_tb ();
timeunit 1ns;
timeprecision 10ps;
localparam DIN_WIDTH = 32;
logic FIFO_WRITE_full;
logic [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_blockRW_sys_wrapper axi4Lite_blockRW_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/myAXI4LiteMaster_blockRW_useFIFO/myAXI4LiteMaster_blockRW_useFIFO.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
//++ 写FIFO ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
int cnt;
always_ff @(posedge m_axi_aclk, negedge m_axi_aresetn) begin
if (~m_axi_aresetn)
cnt <= 0;
else if (single_burst_wr_finish)
cnt <= cnt + 1;
else
cnt <= cnt;
end
logic start;
logic FIFO_WRITE_wr_en_temp;
always_ff @(posedge m_axi_aclk, negedge m_axi_aresetn) begin
if (~m_axi_aresetn)
FIFO_WRITE_wr_en_temp <= 1'b0;
else if (start || single_burst_wr_finish)
FIFO_WRITE_wr_en_temp <= 1'b1;
else
FIFO_WRITE_wr_en_temp <= 1'b0;
end
assign FIFO_WRITE_wr_en = FIFO_WRITE_wr_en_temp && ~FIFO_WRITE_full;
assign FIFO_WRITE_wr_data = din_wave_data[cnt];
//-- 写FIFO ------------------------------------------------------------
// 控制复位,仿真开始和结束
initial begin
m_axi_aresetn = 0;
#(CLKT * 10) m_axi_aresetn = 1;
wait(~FIFO_WRITE_full) start = 1;
#(CLKT) start = 0;
wait(cnt == 5000);
#(CLKT * 10) $stop;
end
endmodule
五. 仿真验证
仿真工具:Vivado 2021.2 Simulator。
Block Design如下图,注意分配BRAM的地址,更加选择的器件,有个最大值,且协议主机模块的地址要与分配的地址保持一致;调试时使能RD_CHECK_EN。

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

六. 工程分享
AXI4LiteMaster_blockRW_useFIFO_Vivado2021.2工程分享:
欢迎大家关注我的公众号:徐晓康的博客,回复以下代码获取。
9245
建议复制过去不会码错字!

徐晓康的博客持续分享高质量硬件、FPGA与嵌入式知识,软件,工具等内容,欢迎大家关注。