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_flagerror_flag为错误指示信号,用来指示有错误发生
write_resp_error写响应错误
read_resp_error读响应错误
rdata_notequal_wdata_error读数据不等于写数据的错误

2.3 模块IP框图

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

模块IP参数配置界面:

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如下图:

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


六. 工程分享

AXI4LiteMaster_singleRW_useFIFO_Vivado2021.2工程分享:

欢迎大家关注我的公众号:徐晓康的博客,回复以下代码获取。

7632

建议复制过去不会码错字!


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

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值