1 概述
本文是关于FDMA ip的使用详解,主要从ip的设置与使用两方面介绍。
FDMA 是 MSXBO(米联客的)基于 AXI4 总线协议定制的一个 DMA 控制器。 有了这个 IP 我们可以统一实现用 FPGA 代码直接读写 PL 的 DDR 或者 ZYNQ PS 的 DDR。
通过这个 IP 我们可以方便地进行 AXI4 FULL MASTER 的操作,比如我们经常要读写 DDR,那么只要挂到 AXI4 总线上就可以利用这个 IP 实现。
2 参考文档
《02_Artix FPGA DDR控制器MIG使用(AXI4)(MA703FA-35T)20190401》
3 FDMA的BD工程搭建
使用FDMA时一般都是需要调用DDR时,这是DDR使用AXI4接口生成。而都是使用AXI4接口时,工程使用Block Design(简称BD)方式搭建。
当设置好DDR IP,FMDA IP后点击”run connection automation”则可自动生成rst_mig_*,axi_interconnect_*的IP,并帮助连接。如下图所示:
图 1 FDMA与DDR的BD工程示例
3.1 DDR IP的设置简介
DDR3的设置相信一般会使用DDR的工程师都了解,笔者这里就不做详细说明,只是讲解几页比较重要的位置,具体请往下看。
图 2 DDR的型号、时钟、位宽设置页
上图中的时钟是DDR的内核时钟,位宽是DDR的数据位宽与器件直接相关。按上图设置,则DDR的数据速率为:400x2x16=1600MByte/s。
而用户侧使用的时钟与PHY to Controller Clock Ratio直接相关,如上图中的设置,则ui_clk = 400/4 =100MHZ。
图 3 DDR的AXI数据参数设置页
上图中的data width是MIG AXI4最大支持的位宽,这个设置按能设置的最大位宽设置,才能最好的使用DDR的带宽。
结合图 2中得出的用户时钟ui_clk,则可以算出用户侧的数据速率为:100M*128bit=1600MByte/s,即用户侧的带宽与DDR的实际速率相同。
图 4 DDR的输入时钟设置页
上图中的input clock perild是输入给DDR 参考时钟,相当于DDR器件的系统时钟。
其他设置页都是些常规设置,笔者在这里就不做说明了,相信读者自己能够理解。
3.2 FDMA的设置
FDMA是米联客编写的IP,非xilinx官方IP,则在使用时应当首先加入到vivado的ip系统中。添加方式如下图所示:
图 5 自制IP的添加到vivado的示例
图 6 FDMA的界面设置
FDMA的设置如上图 6所示:
-
BURST LEN:是AXI一次突发的数据个数,这个根据读者需要自行设置;
-
AXI ID WIDTH:是AXI的标识符位宽,这个一般不用关心,默认即可。
-
DATA WIDTH:这个是AXI的数据位宽,设置时需要与DDR IP的设置保持一致;
3.3 FDMA的信号定义
表 1 信号定义
序号 | 信号 | I/O | 说明 |
---|---|---|---|
1 | A00_AXI | X | 与DDR IP连接的AXI信号 |
2 | M00_axi_aresetn | I | ip复位信号,低有效 |
3 | pkg_wr_areq | I | 写数据请求信号,一个脉冲有效 |
4 | pkg_wr_en | O | 写数据有效指示信号, |
5 | pkg_wr_last | O | 写一包数据写完指示信号 |
6 | pkg_wr_addr | I | 写数据地址 |
7 | pkg_wr_data | I | 写数据 |
8 | pkg_wr_size | I | 写一包数据个数指示信号 |
9 | pkg_rd_areq | I | 读请求信号,一个脉冲有效 |
10 | pkg_rd_en | O | 读数据有效指示信号 |
11 | pkg_rd_last | O | 读一包数据读完指示信号 |
12 | pkg_rd_addr | I | 读地址 |
13 | pkg_rd_data | O | 读数据 |
14 | pkg_rd_size | I | 读一包数据的大小指示信号 |
上面信号中需要注意的有:
-
pkg_*_size:设置的大小需要为BURST LEN的整数倍,这样才能保证一包数据能够完整传输;
-
pkg_wr_en:这个写使能是IP输出的,而写数据是需要输入给IP,方向不一致,则建议使能与数据采用组合逻辑响应,不要延时。
4 上板测试示例
FDMA按照图 6设置,且pkg_wr_size设置为0D256,则一包突发的数据为256128bit=4096Byte。上板验证也是256个时钟的128bit数据即一次发送256128bit=4Kbyte数据,如下图所示:
图 7 FDMA的上板写验证
由上图中可知FDMA输入数据的时序为:当数据准备好后,发起一拍pkg_wr_areq,然后等待pkg_wr_en,看到pkg_wr_en拉高的同时输入数据pkg_wr_data,直到pkg_wr_last拉高结束一组数据的写入。然后就可发起下一次pkg_wr_areq。
读时序与写时序基本一致,只是数据和使能都由FDMA输出罢了,这里就不详细说明了。