创作不易,转载请注明出处:https://blog.csdn.net/csdn_gddf102384398/article/details/143926217
上图中,在FPGA PCIE卡示意图内,有2个AXI Master设备,即:PCIE到AXI4-Full-Master桥、AXI CDMA IP;有3个AXI Slave设备,即:AXIPCIE寄存器块、AXI4-Full-Slave到PCIE桥、CDMA寄存器块;每个AXI Master可以访问3个AXI Slave,所以3个AXI Slave设备构成了一个AXI总线地址空间。AXIPCIE寄存器块包含了PCI设备配置空间(其中包含PCIE:BARs寄存器)和PCIE扩展配置空间的所有寄存器,还包括了AXI:BARs寄存器。DMA是指外设直接读写Host PC的系统主存,而不经过CPU的干预。上图中,PCIE到AXI4-Full-Master桥用于Host PC主动访问FPGA PCIE设备,而AXI4-Full-Slave到PCIE桥用于FPGA PCIE设备主动访问Host PC的系统主存。从AXI的角度看,PCIE到AXI4-Full-Master桥可以访问AXI4-Full-Slave到PCIE桥,即AXI Master访问AXI Slave,但这在上图看来本质上相当于Host PC通过PCIE设备访问自身主存了,没有意义。AXI CDMA IP可以通过自己的AXI4-Full-Master接口和AXI互联IP来主动访问AXI4-Full-Slave到PCIE桥,即进行DMA。如果将3个AXI Slave构成的AXI总线地址空间用一个PCIE:BAR来映射,比如PCIE:BAR0,则Host PC可以通过PCIE:BAR0访问AXI总线上的所有AXI Slave设备(包括AXI4-Full-Slave到PCIE桥,但这相当于Host PC通过PCIE设备访问自身主存,没有意义)。Host PC可以在系统主存中分配一段物理内存,将这段内存的起始地址转换为PCIE总线地址,然后在PCIE配置空间中的PCIEBAR_n寄存器(0<=n<=2,因为AXI PCIE IP有3个PCIE:BARs)中的基地址内容的帮助下将这个PCIE总线地址写到AXIPCIE寄存器块中的AXIBAR2PCIEBAR_n寄存器中(0<=n<=5,因为AXI PCIE IP有6个这样的寄存器),PCIE地址到AXI地址的转换公式为:
AXI地址=PCIE地址-PCIEBAR_n+PCIEBAR2AXIBAR_n,其中0<=n<=2,PCIEBAR_n为AXIPCIE寄存器块中的寄存器,而PCIEBAR2AXIBAR_n为Verilog语言中的参数。
这样做后,当AXI CDMA IP向AXI4-Full-Slave到PCIE桥发了一个AXI地址后,AXI4-Full-Slave到PCIE桥会将这个AXI地址转换为PCIE总线地址,转换公式为:
PCIE地址=AXI地址-AXIBAR_n+AXIBAR2PCIEBAR_n,其中0<=n<=5,AXIBAR_n为Verilog语言中的参数。
由于AXI4-Full-Slave到PCIE桥和AXIPCIE寄存器块位于同一个IP中,所以AXI4-Full-Slave到PCIE桥可以很轻松访问AXIPCIE寄存器块中的寄存器而不用任何通信协议。
如果在上图中的AXI互联IP上再连接一个带AXI Slave接口的BRAM控制器,这个BRAM控制器连接一个BRAM,Host PC在系统主存中分配了一些不连续的内存,Host PC可以将这些内存段的起始地址(当然要先转为PCIE总线地址)写到AXI总线上的BRAM中,这样AXI CDMA读取BRAM,将读取到的PCIE总线基地址写到AXIPCIE寄存器块中的AXIBAR2PCIEBAR_n寄存器中,这样就实现了SG DMA。实际上AXI CDMA自带独立的M_AXI_SG接口,AXI CDMA就是通过该接口访问SG列表,从而实现SG DMA。
对于多通道DMA,Xilinx提供了AXI MCDMA IP。通过动态改变AXIBAR2PCIEBAR_n寄存器的值,可以实现多通道DMA。