软件版本:vitis2020.2(vivado2020.2) 操作系统:WIN10 64bit 硬件平台:适用XILINX A7/K7/Z7/ZU/KU系列FPGA(米联客(milianke)MZU07A-EG硬件开发平台) 登录"米联客"FPGA社区-www.uisrc.com视频课程、答疑解惑! 8.1概述基于FDMA可以完成很多数据读写存储类的应用,本文将展示通过FDMA读写AXI-BRAM 本文实验目的: 1:掌握基于uiFDMA3.0的FPGA工程设计 2:利用uiFDMA3.0提供的接口,编写BRAM测试程序 3:对AXI-BRAM读写仿真和测试 8.2搭建FPGA图形化工程8.2.1创建Block Design并且命名为system如下图所示,图形化system就是一个代码容器,接着我们要添加一些图像化的IP
8.2.2添加图形化FPGA IP首先设置自定义IP的路径,这里读者可以把我们配套工程根路径下的uisrc文件夹复制到目前的工程根路径,单击Settings在弹出的Settings窗口选择IP->Repository 设置如下路径 添加+号添加IP 比如输入关键词FDMA就可以搜索到我们米联客uiFDMA IP(注意最新版本是3.0版本) 用类似的方法添加必要的IP如下图所示: 8.2.3完成IP之间的信号自动这种简单的工程可以先让软件先自动化线,然后根据结果手动一些调整 可以看到连线结果 8.2.4调整IP参数1:BRAM参数设置首先把IP的配置参数修改下,双击需要设置的IP可以进行参数设置 FDMA设置数据位宽128bit 可以访问内存地址位宽32bit 其他默认 BRAM设置,使用BRAM Controller 为真双口RAM 2:BRAM Controller参数设置AXI BRAM Controller设置axi4协议,数据位宽128bit 读延迟1个时钟 3:Clocking Wizard参数设置4:AXI Interconnect IP设置双击AXI Interconnect IP 进行设置 设置AXI Interconnect IP的性能参数,其中Enable Register Slice 用于改善时序,Enable Data FIFO用于增加FIFO大小,增加数据传输效率 8.2.5引出FPGA接口信号
分别右击下图2个IP,然后选择Make External,把需要引出到顶层的FPGA信号引出
为了引出时钟需先右击信号PIN脚断开连接,然后Make External,之后重新连接
修改后重新连接时钟 8.2.6修改信号名字默认的时钟名字不是很好,可以自己修改下
8.2.7连线最后的遗漏软件还在提示我们有线没有连接,这种提示是建立在XILINX自带的IP,软件可以识别一部分比如复位时钟等,不是可以识别所有的信号,一般再最后我们如果看到还有这种提示说明还有未完成的连线 这里是ext_reset_in没有连接,也是接到Clocking Wizard的Locked 8.2.8视图优化右击空白处,弹出菜单选择Regenerate Layout优化下视图 8.2.9地址分配
AXI总线必须分配地址,设置uiFDMA的地址空间分配,起始地址可以任意设置,我们设置从0x0000_0000开始,大小64KB 8.2.10自动校验保存工程 单击下图中的控件可以对图形化编程进行校验 8.2.11自动产生顶层文件右击system,在弹出的菜单中选择Create HDL Wrapper
8.3编写FDMA的BRAM测试代码刚刚以上自动产生的顶层文件,只是引出的信号接口,并不能完成对FDMA的控制,所以我们需要自定义一个顶层文件,可以复制刚才产生的文件,修改,这样可以省一些编写调用接口的时间。 为了方便文件的管理,我们新建一个fdma_bram_test.v文件,并且复制以上代码,到这个文件夹。 右击删除刚刚自动产生的文件 添加fdma_bram_test.v文件 fdma_bram_test.v文件
8.4RTL仿真8.4.1仿真tb文件编写仿真tb文件,fdma_bram_test_tb.v,非常简单,只需要给一个时钟
添加fdma_bram_test_tb.v到工程中 8.4.2仿真测试进行RTL行为仿真 放大后观察数据 我们也可以继续深入看FDMA源码里面的信号工作情况,这个读者可以自己区分析下,我们米联客计划出一份专门讲解AXI总线部分的教程,里面详细分析FDMA的设计过程,以及信号仿真。本章节主要是侧重FDMA的应用,只要会熟练应用可以了! 8.5编译测试添加ila IP CORE 和fpga pin定义 ila的设置如下
编译产生bit 下载程序到开发板测试,通过在线逻辑分析仪观察
8.6程序分析8.6.1FDMA的写时序fdma_wready设置为1,当fdma_wbusy=0的时候代表FDMA的总线非忙,可以进行一次新的FDMA传输,这个时候可以设置fdma_wreq=1,同时设置fdma burst的起始地址和fdma_wsize本次需要传输的数据大小(以bytes为单位)。当fdma_wvalid=1的时候需要给出有效的数据,写入AXI总线。当最后一个数写完后,fdma_wvalid和fdma_wbusy变为0。 8.6.2FDMA的读时序fdma_rready设置为1,当fdma_rbusy=0的时候代表FDMA的总线非忙,可以进行一次新的FDMA传输,这个时候可以设置fdma_rreq=1,同时设置fdma burst的起始地址和fdma_rsize本次需要传输的数据大小(以bytes为单位)。当fdma_rvalid=1的时候需要给出有效的数据,写入AXI总线。当最后一个数写完后,fdma_rvalid和fdma_rbusy变为0。 8.6.3读写状态机 |
说点什么...