XILINX DMA/Bridge Subsystem for PCI Express (XDMA)笔记2(基于VU9P FPGA)

XILINX DMA/Bridge Subsystem for PCI Express (XDMA)笔记1(基于VU250 board)https://blog.csdn.net/linpeng_9527/article/details/105448871

XILINX DMA/Bridge Subsystem for PCI Express (XDMA)笔记2(基于VU9P FPGA)https://blog.csdn.net/linpeng_9527/article/details/105595721

一句话:使用以下配置,保证你的IP直接上板能work,不用仿真!!!欢迎点赞

FPGA型号:Xilinx vu9p-flgb2104-2l-e

IP版本:V4.1

数据手册:https://www.xilinx.com/support/documentation/ip_documentation/xdma/v4_1/pg195-pcie-dma.pdf

XDMA驱动下载:https://github.com/Xilinx/dma_ip_drivers

先附上IP外围的连接拓扑(注意时钟连接)详细的设计拓扑参见https://blog.csdn.net/linpeng_9527/article/details/105451043

XILINX DMA/Bridge Subsystem for PCI Express (XDMA)笔记2(基于VU9P FPGA)

1、Basic页面:

functional mode:DMA(此处还有另一种AXI Bridge模式后期再讲);

mode:basic(advanced很多都是保持默认设置);

device/port type:EP(DMA模式下,只能为EP);

pcie block location:选择对应的PCIe块,这个是由硬件电路原理图决定的,不能乱选,否则布局布线不通过,时序差,上板不能work等等(在FPGA board(非FPGA芯片)建模的情况下默认不可更改)

lane width:设置lane数;

max link speed:2.5/5.0/8.0GT/s 分别对应PCIe1.0/PCIe2.0/PCIe3.0,此处选择PCIe3.0(别问为什么,由FPGA芯片决定);

reference clock:选择100MHz;

axi interface:按照实际需要配置即可,地址位宽,数据位宽等等;

dma interface option: 选择 AXI(AXI4 Stream后期再讲);

AXI-Lite Slave interface:不使能,XDMA的所有寄存器都由host配置,fpga用户逻辑这边不做任何操作;

其他选项保持默认即可;

XILINX DMA/Bridge Subsystem for PCI Express (XDMA)笔记2(基于VU9P FPGA)

2、PCIe ID页面

所有参数保持默认即可,至于参数的意义参考PCIe相关知识;

XILINX DMA/Bridge Subsystem for PCI Express (XDMA)笔记2(基于VU9P FPGA)

3、PCIe BARs页面

总共3个bar,我这里全用了,大概说一下:

PCIe to AXI Lite Master Interface:bar0:用来访问用户逻辑,比如配置寄存器的值;可以按照实际需要设置该bar(指PCIe bar,也就是PCIe侧)的位宽(32bit or 64bit,不使能64bit即选择32bit)、是否预取、bar的大小和PCIe2AXI传输的base address;

PCIe to DMA Interface:bar1:该接口必选,一般用来访问FPGA内存(即连接Xilinx MIG IP读写DDR);啥?你说你不想用该接口?那不行,人家名字就是XDMA IP核的DMA mode,必选但可以不用,are you明白?

PCIE to DMA Bypass Interface:bar2:这个接口很好用,即可以用来访问用户逻辑,比如配置寄存器的值;也可以用来访问FPGA内存(即连接Xilinx MIG IP读写DDR),但是是非DMA方式访问;啥?你问我和bar1有啥区别,一个是DMA访问,一个是非DMA访问啊,查DMA定义去;

XILINX DMA/Bridge Subsystem for PCI Express (XDMA)笔记2(基于VU9P FPGA)

最后,再额外说一下PCIe2AXI传输的base address:

 主机侧 PCIE BAR 地址与用户逻辑侧地址是不一样的, 这个设置就是进行 BAR 地址到 AXI 地址的转换, 开机的时候主机会对PCI上的设备进行枚举,检测到XILINX的FPGA板卡申请了三个大小的bar空间,那么host就会给FPGA板卡分配相应的bar空间及地址大小,通过“lspci -v”命令可以查看具体细节:
XILINX DMA/Bridge Subsystem for PCI Express (XDMA)笔记2(基于VU9P FPGA)

拿一张图凑合一下,三个bar以及各自的地址空间:

比如主机一侧 BAR0地址为 0x1f_4000_0000, IP 里面转换设置为 0xFE00_0000, 则主机访问 BAR0 地址 0x1f_4000_0000 转换到 AXI LIte 总线地址就是 0xFE00_0000,通过命令“devmem2 0x1f_4000_0000 w 0x1”则往AXI Lite总线的0xFE00_0000地址写了1;

BAR2的映射关系和BAR0完全一样;至于BAR1由于是DMA方式传输,控制方式有所不同。

此外,还需注意使用“devmem2”命令时的地址对齐要求(64bit or 32bit)。

4、PCIe MISC页面

User Interrupts: 用户中断, XDMA 最多提供 16 条中断线给用户逻辑(注意usr_irq_req和usr_irq_ack是一一对应的);

MSI/MSI-X capabilities:可以选择msi中断还是msi-x中断,用一个就可以了,好像msi-x等级要高一点;

其余参数配置保持默认;

XILINX DMA/Bridge Subsystem for PCI Express (XDMA)笔记2(基于VU9P FPGA)

6、PCIe DMA页面

Number of DMA Read Channel(H2C)/ Number of DMA Write Channel(C2H):选择最大4即可;

Number of Request IDs for Read channel/Number of Request IDs for Write channel:每个通道设置允许最大的outstanding 数量, 默认即可;

AXI ID Width:按照需要设置;

其余参数配置保持默认;
XILINX DMA/Bridge Subsystem for PCI Express (XDMA)笔记2(基于VU9P FPGA)

7、提示一个深坑:不要将usr_lnk_up信号用作任何全局复位!!!连接Processor System Reset也不行!!!you can try