编写AXI4-Lite协议读写BRAM并仿真验证

前面已经详细介绍了AXI4和AXI4-Lite协议,光说不练假把式,要用起来才能知道理解对不对,今天就用AXI4-Lite协议来读写BRAM,看一下协议的读写过程与时序关系。

一. 建立工程

使用Vivado 2018.3,Create Project -> 一路next -> 选择芯片型号xc7z020clg484-2 -> next -> finish,等待工程创建完成。

二. 创建块设计

Flow/Flow Navigator -> Create Block Design -> Design name: bram -> OK

2.1 搭建原理图

2.1.1 添加BRAM并设置

在Diagram中,点击加号+来添加IP,在搜索框输入block,双击选择Block Memory Generator 。

双击Block Menory Generator块设置此IP,在Other Options选项卡最下方取消Enable Safety Circuit的勾选,OK,如下图:发现rsta_busy信号消失了,此信号是用来指示BRAM的工作状态的,我们这个试验不需要关注它。

2.1.2 添加BRAM控制器并设置

添加AXI BRAM Controller,如下图:

双击此IP块进行设置,将AXI Protocol设置为AXILITE,Number of BRAM interfaces设置为1,OK,如下图:

2.1.3 连接IP,引出端口

连线并Make External,如下图所示:

2.1.4 映射存储地址 Assign Address

在Address Editor窗口点击Auto Assign Address按钮,如下图:

2.1.5 生成输出产品 Generate Output Products

在Sources窗口,选中bram后右击选择Generate Output Products,如下图:

2.1.6 添加AXI SmartConnect并设置

添加AXI SmartConnect,将Number of Slave Interfaces设为1,如下图:

2.1.7 连线并验证原理图

全部设置完后连线,最终的原理框图如下图所示:

再映射一遍地址,按F6来验证设计(Validate Design),无报错,按Ctrl+S保存设计,此时一个AXI4-Lite的从机就搭建完成了。后续我们需要对它进行封装以便于测试程序的调用。

2.3 封装原理图

封装需要进行两个步骤:

第一步:生成输出文件 Generate Output Products

在Sources选项卡下,选择bram后右击选择Generate Output Products

综合选项Synthesis Options选择Out of context per IP,点击Generate,等待生成输出文件完成。

第二步: 创建HDL封装

在Sources选项卡下,选择bram后右击选择Create HDL Wrapper。

选择Let Vivado manage wrapper and auto-update,让Vivado管理封装并自动更新,OK,等待封装完成。

细心的朋友应该发现了,我们生成输出产品操作了两次,原因是如果先直接把三个IP添加进去连线的话,生成了M_AXI端口协议是AXI4而非AXI4-Lite,所以我们先将添加了BARM和BRAM控制器生成了输出,来确保M_AXI端口是AXI4-LITE协议,然后再添加AXI SmartConnect,最终封装。不添加AXI SmartConnect时从机不能输出rwready,即无法对BRAM进行写入。

三. 编写testbench

在Sources选项卡中选中sim_1 -> 点击+ -> 选择Add or Create Simulation Sources -> Create File -> File type选择SystemVerilog,File name为bram_tb,OK -> finish -> Yes。

完成后,会在sim_1下生成vivado的仿真文件bram_tb.sv,此文件只是一个框架,内容需要自行编辑。

testbench代码如下:

/*
 * @Author: Xu XiaoKang
 * @Email: xuxiaokang_up@qq.com
 * @Date: 2020-08-01 17:24:27
 * @LastEditors: xu XiaoKang
 * @LastEditTime: 2020-08-03 10:52:08
 * @Filename:
 * @Description: bram AXI Master仿真
 */


module bram_tb ();

timeunit 1ns;
timeprecision 1ps;


logic [12:0] M_AXI_awaddr;
logic [2 :0] M_AXI_awprot;
logic        M_AXI_awvalid;
logic        M_AXI_awready;

logic [31:0] M_AXI_wdata;
logic [3 :0] M_AXI_wstrb;
logic        M_AXI_wvalid;
logic        M_AXI_wready;

logic [1:0]  M_AXI_bresp;
logic        M_AXI_bvalid;
logic        M_AXI_bready;

logic [12:0] M_AXI_araddr;
logic [2 :0] M_AXI_arprot;
logic        M_AXI_arvalid;
logic        M_AXI_arready;


logic [31:0] M_AXI_rdata;
logic [1 :0] M_AXI_rresp;
logic        M_AXI_rvalid;
logic        M_AXI_rready;

logic clk;
logic rstn;


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

initial begin
  rstn = 0;
  #(CLKT * 5)
  rstn = 1;

  M_AXI_awaddr = 13'b0_0000_0000_1000;
  M_AXI_awprot = '0;
  M_AXI_awvalid = 1'b1;
  wait(M_AXI_awready == 1'b1) #(CLKT * 1) M_AXI_awvalid = 1'b0;

  M_AXI_wdata = 32'h0104_15bc;
  M_AXI_wstrb = 4'b1001;
  M_AXI_wvalid = 1'b1;
  wait(M_AXI_wready == 1'b1) #(CLKT * 1) M_AXI_wvalid = 1'b0;

  M_AXI_bready = 1'b1;
  wait(M_AXI_bvalid == 1'b1) #(CLKT * 1) M_AXI_bready = 1'b0;

  M_AXI_araddr = 13'b0_0000_0000_1000;
  M_AXI_arprot = '0;
  M_AXI_arvalid = 1'b1;
  wait(M_AXI_arready == 1'b1) #(CLKT * 1) M_AXI_arvalid = 1'b0;

  M_AXI_rready = 1'b1;
  wait(M_AXI_rvalid == 1'b1) #(CLKT * 1) M_AXI_rready = 1'b0;

  #(CLKT * 10) $stop;
end

bram_wrapper  bram_wrapper_inst_0 (.*);

endmodule

四. 运行仿真

使用vivado 2018.3 和 modelsim 10.6e SE-64 联合仿真,关于如何在vivado中使用modelsim仿真我后续会更新相关博客。

可以看到,写入的数据为32’h0104_15bc,此时写选通wstrb = 4‘b1001,表示最高字节位和最低字节位的数据有效,从同一地址读出的数据为32’h0100_00bc,可见写入与读出是一致的。

完整工程文件:

链接:https://pan.baidu.com/s/1oM-PNC8gOSF_tfbQun-wiQ
提取码:1i3h

五. 总结

实验表明AXI4-Lite如前文介绍的一样工作。AXI4-Lite每次只能写入一个数据,且必须按照先地址后数据的方式,它不支持乱序传输,唯一需要注意的是写选通信号wstrb,通过此信号可控制数据总线上的哪些字节会被写入到指定地址。

  • 13
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: B'axi4-lite总线读写verilog是一种硬件描述语言,用于设计数字电路。它可以用于描述电路的行为、结构和时序特性等方面。在设计复杂的数字电路时,使用Verilog可以方便地进行设计、仿真验证,帮助工程师快速有效地实现设计目标。B'axi4-lite总线是一种高效的接口协议,可以连接处理器、外设和存储器等,Verilog编码可以有效地实现其功能。 ### 回答2: ### 回答3: AXI4-Lite是一种轻量级的总线协议,用于在SoC (System on Chip) 中连接处理器和低带宽周边设备,它是一种简单、高效且易于实现的总线协议。 在Verilog中实现AXI4-Lite总线,首先需要了解AXI4-Lite总线的基本结构和信号: 1.地址信号:有两个地址信号,一个是地址输入信号awaddr,一个是地址输出信号araddr,用于指定读写的起始地址。 2.数据信号:有两个数据信号,一个是读数据输出信号rdata,一个是写数据输入信号wdata,用于传输数据。 3.读/写使能信号:有两个读/写使能信号,一个是读使能信号arvalid,一个是写使能信号awvalid,指示传输方式。 4.应答信号:有两个应答信号,一个是读应答信号rvalid,一个是写应答信号bvalid,用于指示传输是否成功。 在实现时需要编写两个模块:读写控制器和设备模块。 读写控制器模块主要完成读写数据的控制。在读操作中,首先读控制器将传来的地址和读使能信号以及其他必要的信号保存到寄存器中,同时发出读请求。然后等待设备模块响应后,将响应数据传递给CPU。在写操作中,将写数据和地址信息保存到寄存器中,并发出写请求,等待设备模块响应后,将写完成信号传递给CPU。 设备模块主要完成对读写请求的响应,根据传来的地址信息,读取或写入相应的数据,然后将读取或写入的结果封装为响应信号,传递给读写控制器模块。 读写控制器模块和设备模块之间需要进行时序同步,以确保传输正确性及时。建议在模块之间增加FIFO buffer进行同步。 总之,实现AXI4-Lite总线读写需要掌握其基本结构及信号,编写读写控制器和设备模块,并进行时序同步。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值