一. 模块功能与应用场景
模块功能:AXI4-Lite协议主机,从FWFT FIFO(首字直通FIFO)中读取地址和数据,实现将数据写入到设定的地址中的操作。
二. 模块框图与使用说明
2.1 模块框图
![](https://i-blog.csdnimg.cn/blog_migrate/ae9b5ad0fcab1153025e790f635b3bca.png)
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接口封装完成后框图如下:
![](https://i-blog.csdnimg.cn/blog_migrate/8b90d0aa68993a5746e8a52e81872d6e.png)
模块IP参数配置界面:
![](https://i-blog.csdnimg.cn/blog_migrate/f316e30e345f6312ccd261ca7d5dbfc3.png)
2.4 使用说明
当FIFO非空时,此模块会读取FIFO中的数据,数据位宽必须等于 = 设置的地址位宽 + 设置的数据位宽。高位存地址,低位存数据。此AXI模块会将接收到的数据写入设置的地址中。如果使能了读检查使能(Rd Check En),此AXI模块会在写入完成后再读取相同地址,并比较写入数据和读出数据,不同则报错。
三. 模块代码
太长,见六. 工程分享。
四. testbench
/*
* @Author : Xu Dakang
* @Email : XudaKang_up@qq.com
* @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如下图:
仿真波形:写数据和读数据没有问题。
![](https://i-blog.csdnimg.cn/blog_migrate/285f77a0b30ef97a8dc0eb44f2ee9478.png)
六. 工程分享
AXI4LiteMaster_singleRW_useFIFO_Vivado2021.2工程分享:
欢迎大家关注我的公众号:徐晓康的博客,回复以下代码获取。
7632
建议复制过去不会码错字!
![](https://picgo-dakang.oss-cn-hangzhou.aliyuncs.com/img/徐晓康的博客水印.png#pic_center)
徐晓康的博客持续分享高质量硬件、FPGA与嵌入式知识,软件,工具等内容,欢迎大家关注。