目录
- 1. BAR Space Map
- 2. PCIe to AXI Lite Master
- 2.1. BAR Address to AXI Address
- 3. PCIe to DMA Bypass
- 4. AXI4 Memory Mapped
- 4.1. Register Space
- 5. AXI Lite Slave Configuration Interface
- 6. MSI/MSI-X Interrupt
- 6.1. Interrupts Configuration
- 6.2. IRQ Module
- 7. IP Example Design
介绍XDMA IP核的功能及原理。
根据pg195,XDMA IP 具备PCIe to AXI Bridge和PCIe to DMA两种功能,PCIe to AXI Bridge只存在于UltraScale+器件,不支持7系列器件。此处只介绍PCIe to DMA功能。
pg195 《DMA/Bridge Subsystem for PCI Express v4.1Product Guide Vivado Design Suite》
根据XDMA IP设置,有如下几种接口,下面依次介绍这几种接口的功能
XDMA内部构成如下图所示
PCIe协议详解见高速外设互连接口(Peripheral Component Interconnect express, PCIe)
1. BAR Space Map
先看BAR空间映射,XDMA IP包含三大功能:PCIe to AXI Lite Master、DMA、PCIe to DMA Bypass,分别为这三个功能开辟BAR空间,映射如下:
其中PCIe to AXI Lite Master和PCIe to DMA Bypass可以看作是PCIe到两种接口的桥,是直接将PCIe总线域地址转换到AXI总线域地址,因此这两个功能的BAR空间大小取决于FPGA侧寻址空间,可由用户指定。
DMA功能是通过XDMA内部寄存器控制的,所以DMA功能的BAR空间用于寻址XDMA各种寄存器,所以大小是固定256KB。
2. PCIe to AXI Lite Master
这个比较简单,使用AXI Lite接口用于主机访问用户侧的各种寄存器、存储器。XDMA为该接口开启一个BAR空间,通过将PCIe总线域地址映射到FPGA处AXI总线域地址,实现寄存器读写。该接口*addr接口位宽为固定32bit.
IP设置该接口如下,需要指定主机为该BAR空间分配的内存空间大小,以及PCIe到AXI地址转换值。
其中AXI 总线域地址=PCIe总线域地址 偏移+PCIe to AXI Transalation。
手把手教你学会 Xilinx PCIE/XDMA 读写DDR系列(二) ——XDMA详细配置步骤
33.XDMA功能详解2-XDMA概述、功能框图、应用场景
下面介绍XDMA内部是如何通过TLP对用户侧进行访问的。
2.1. BAR Address to AXI Address
以下图FPGA的Block Design为例,XDMA IP 通过AXI SmartConnect连接MIG和BRAM
假设XDMA 的BAR0映射为M_AXI_LITE接口,且满足:PCIe to AXI Transalation==0x4000_0000
假设主机侧为BAR0分配的PCIe域内存空间为0x1000_0000-0x3000_0000(512MB)。
其中MIG为64M×32bit,寻址空间为256MB,主机侧的PCIe域地址空间为0x1000_0000-0x1FFF_FFFF,在FPGA侧的AXI总线域地址设置为0x4000_0000-0x4FFF_FFFF。
其中Block RAM为16K×32bit,寻址空间为64KB,主机侧的PCIe域地址空间为0x2000_0000-0x2000_FFFF,在FPGA侧设置的AXI总线域地址为0x5000_0000-0x5000_FFFF
AXI 总线域地址就是Vivado里Address Editor标签中命名的地址
如果主机要读取Block RAM中0x10的数据步骤如下:
- 先发送Length为0x1、Address为(0x2000_0000+0x40)的MRd TLP至pcie_mgt接口
- XDMA检测到TLP中的Address字段命中BAR0后,就将BAR0转化为AXI总线域地址,通过M_AXI_LITE接口发送读请求,其m_axi_araddr[31:0]=(0x4000_0000+(0x2000_0000+0x40-0x1000_0000))=(0x5000_0000+0x40),m_axi_rdata[31:0]返回数据
- 之后AXI SmartConnect再将AXI总线域地址转化为M01_AXI的地址,即BRAM Controller侧地址,即M01_AXI_araddr[15:0]=0x40、M01_AXI_arlen[7:0] = 8’d3、M01_AXI_arsize[2:0] =3’d2。
- AXI BRAM Controller将BRAM Controller侧地址转化为BRAM的raddr[13:0] = 0x10
3. PCIe to DMA Bypass
DMA旁路接口,并不经过DMA引擎,简单来说这个接口就是将主机发来的MRd/MWr等 TLP转换到AXI送到用户侧,与 PCIe to AXI Lite Master功能类似。主要用于高带宽情景。
4. AXI4 Memory Mapped
AXI4 Memory Mapped接口是XDMA实现SG DMA的接口。主机使用MWr TLP通过XDMA的BAR空间对相关寄存器进行配置,实现DMA控制。
其关键过程在于,启动DMA后,XDMA使用MRd TLP从主存读取descriptors和数据,再通过M_AXI(也可以是H2C Stream、C2H Stream)访问用户侧,当全部数据DMA完毕后,向主机发送MSI/MSI-X中断。
XDMA - AXI4 Memory Mapped
4.1. Register Space
DMA过程涉及多个寄存器,XDMA寄存器空间位于DMA 所在的BAR,XDMA含有如下寄存器组
而对寄存器的寻找,BAR空间偏移地址需要满足如下PCIe to DMA Address Format格式。
例如DMA BAR的基地址为32’h0004_0000,要访问C2H Channel 2第3个寄存器。那么,用户侧AXI Lite Slave 接口中s_axil_a*addr[31:0]应为32’h0000_1208,主机发来的MRd TLP中Address[31:0]应为32’h0004_0000+32’h0000_1208=32’h0004_1208
5. AXI Lite Slave Configuration Interface
FPGA可以对XDMA内部寄存器通过该接口访问。
其s_axil_a*addr[31:0]使用PCIe to DMA address Format格式访问
6. MSI/MSI-X Interrupt
MSI/MSI-X是PCIe协议的两种常用中断机制,详细介绍可见
高速外设互连接口(Peripheral Component Interconnect express, PCIe)- MSI/MSI-X Capability Structures
下面介绍XDMA实现中断的方式
43.XDMA寄存器详解7-MSI-X Vector Table and PBA寄存器组剖析及MSI-X中断详解
6.1. Interrupts Configuration
在IP GUI界面中,可以设置User Interrupts个数,可以将电平信号输入XDMA手动产生中断,并可对Legacy、MSI、MSI-X三种中断进行配置。最大可配置16个用户中断和32个MSI中断向量
主机可以通过MRd TLP配置中断,用户可以通过AXI Lite Slave接口配置中断。相关寄存器如下
IRQ Block寄存器组0x2000-0x20A4
MSI/MSI-X Table and PBA 0x8000-0x8FE0
6.2. IRQ Module
IRQ模块接收若干个用户中断请求,以及每个H2C/C2H Channel的DMA中断请求,通过PCIe协议向主机发出中断。
对于DMA中断而言,每次结束DMA过程后,会自动产生中断,如第4节表述,此处不多赘述。
对于用户中断而言,XDMA有输入接口usr_irq_req[n:0]用于接收用户中断,以及输出接口usr_irq_ack[n:0]表示中断是否被主机处理。这两个信号时序是:usr_irq_req拉高后必须一直保持为高,直到usr_irq_ack拉高。
如下图所示MSI-X的情形
7. IP Example Design
可以对XDMA右键打开官方例程进行仿真。
官方simulation中将XDMA作为EP,只有一个H2C通道和一个C2H通道,通过RP进行控制。架构如下
Xilinx XDMA 例程代码分析与仿真结果