Verilog功能模块——AXI4-Lite协议主机-连续区间写-使用FIFO

一. 模块功能与应用场景

模块功能: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_flagerror_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与嵌入式知识,软件,工具等内容,欢迎大家关注。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值