湛无双 发表于 2018-6-15 11:36:32

请教关于AXI Memory Mapped to PCIe中DMA传输的问题,既AXI:BARS作用

问题的具体描述是这样的,关于X家的FPGA芯片,我用的是XC7Z100的片子,但是在做PCIe传输的时候遇到了一些问题,想请教下论坛里的大神,开发环境选择的是Vivado2016.4。
根据Vivado提供PCIe的IP核一共有三种,分别是①7 Series Integrated Block for PCI Express ② AXI Memory Mapped to PCI Express ③DMA/Bridge Subsystem for PCI Express(Beta)
其中前两个IP核在之前的版本就有,第三个IP核显示为测试版本,还没有用过,不知道咋用。
============
我对第一个IP核的理解是把PCIe的TLP包转换成AXI Stream信号,然后对TLP包进行解析,从而实现PCIe的通信接口;常用的应用解决方案可以采用移植Riffa,结合Riffa的上位机实现高速数据通信,其中我在板子上实现的PCIe2.0 x8的接口,可以达到大约3GB/s的通信速度。我对这套方案的理解是通信速度快,上位机开发简单,可以直接使用现成的驱动和封装好的接口,同样缺点也有,比如只支持win7系统。另外由于Riffa是将PCIe接口转换成了类似于多个通道的形式,每个通道可以近似理解为FIFO接口,因此我对Riffa的理解是适合于传输大量数据,但是没有地址线的概念,因此如果要添加一些现成的接口,比如AXI协议的IP核,显得十分无力,缺乏相应的灵活性。
============
接着是我对第二个IP核的理解,相比于第一个IP核,这种方法就比较简单,可以做到不写一行代码的方式,实现PCIe的数据传输,通过添加 AXI Memory Mapped to PCI Express,然后再添加BRAM Controller,然后再添加一个单口RAM,在Vivado中点一下自动连接,生成接口,约束下时钟和复位信号,生成比特流文件,下载到板子上就可以发现新设备。然后在上位机上使用WinDriver生成驱动,就可以实现对RAM的读写。我对这种方案的理解是思路简单清晰,由于使用了AXI协议,因此可以使用现成的IP核,但是每次只能读取单个寄存器,我觉得这种通信方式在大数据量的传输上速度无法满足要求,效率不高。因此引出了我的疑问和问题。
============
如果在第二种方式上实现高速数据传输,通过查看相关的文档,我的理解是添加一个AXI接口的DMA控制器,然后通过读写寄存器的方式去配置DMA控制器,包括源地址核目的地址,然后启动DMA控制器。那么问题就来了,如果DMA控制器将BRAM设定为源地址,电脑主机设定为目的地址,那么读取BRAM的操作是可以完成的,但是写入电脑主机的操作是怎样一种形式,我的猜测是AXI Memory Mapped to PCI Express的IP拥有M_AXI核S_AXI,既AXI的主机核从机形式,主机的M_AXI接口对应了IP核配置中的PCIE:BARS,那么从机的S_AXI接口对应了IP核配置中的AXI:BARS。因此如果DMA控制器要实现往电脑主机内存里面写数据,就要由DMA控制器实现主机,通过S_AXI接口实现数据的转移。在这种操作之前,电脑主机的驱动上要申请一片连续的内存空间,并将这片内存的物理地址告诉FPGA中的DMA控制器,然后启动DMA控制器实现数据的转移。
同理,如果要实现电脑主机向FPGA板卡的数据转移,只是将源地址和目的地址切换下即可。
============
我不知道我对这个问题的理解对不对,所以想请教下论坛里的大神,如果要在AXI Memory Mapped to PCI Express的IP核上实现大容量的数据传输,该是怎样的一种原理?如果采用这种原理的话最终又能够实现怎样的一种传输速度?
另外关于第三个IP核DMA/Bridge Subsystem for PCI Express(Beta),是不是就比较适合于大容量的数据传输?
谢谢大家,东西写得比较多,也比较乱,感谢大家观看。

湛无双 发表于 2018-6-15 16:59:12

问题已经解决,采用第二种IP核的方法,确实需要添加一个CDMA的IP核,然后通过AXI总线配置好CDMA的目的地址和源地址,参考Xilinx的XAPP1171,同时参考GitHub上XPDMA的开源代码,就是用的这种方法,然后配置电脑主机的物理地址和板卡的地址,启动CDMA中的SGDMA方式传输,将数据由电脑主机的内存转换到板卡的DDR3存储器中,即可完成数据的传递,实现高速率的传输,采用如下的方式:
PCIe x8
AXI width 128 bit
speed test (1 GB data read and write) Write: ~1050 MB/s Read: ~1170 MB/s
=================
达到的速度已经很客观了,由于AXI Memory Mapped to PCI Express的IP核配置中,PCIe x8只能做到2.5GT/s的连接速度,也就是PCIe1.0的速度,因此如果采用5GT/s的PCIe2.0连接速度,上述所能达到的速率还能够再提升一倍,另外我觉得DDR3的带宽也是一种重要的影响因素,如果发送到片上的BRAM中,将能够实现更高的传输速度。
=================
同时对于第三种IP核的使用进行了验证,搭建了一个测试工程,同样能够发现板卡,也能够实现对片上BRAM的读写操作,根据手册能够读取到DMA的相关信息,但是目前还不知道怎么使用,具体的使用方法还有待进一步研究,可以肯定的是采用第三中IP核方式,是能够实现PCIe x8的5GT/s连接速率,估计着能够达到的速度也在3GB/s左右,还需要后面的继续努力。
=================
最后把XPDMA的工程放上来,供大家参考,原文地址在GitHub的XPDMA上:https://github.com/strezh/XPDMA

dr2001 发表于 2018-6-15 17:41:08

PCIe高速数据传输大体上就两个事儿
1、PCIe的TLP到FPGA内部总线的协议转换谁来做。
2、DMA是主机侧起还是设备侧起。

追求极致性能就是谁发数据谁起DMA,FPGA侧直接处理TLP;缺点就是复杂度最高。

湛无双 发表于 2018-6-16 00:13:31

dr2001 发表于 2018-6-15 17:41
PCIe高速数据传输大体上就两个事儿
1、PCIe的TLP到FPGA内部总线的协议转换谁来做。
2、DMA是主机侧起还是设 ...

看来楼上是个内行,我现在连门都没入,楼上的理解很到位。

dhbighead 发表于 2018-6-30 16:31:36

"可以直接使用现成的驱动和封装好的接口,同样缺点也有,比如只支持win7系统"

Riffa可以支持linux吧

湛无双 发表于 2018-7-2 08:33:26

dhbighead 发表于 2018-6-30 16:31
"可以直接使用现成的驱动和封装好的接口,同样缺点也有,比如只支持win7系统"

Riffa可以支持linux吧 ...

可以支持linux的,不过windows的只能支持win7,多谢指出错误。

mk676910825 发表于 2022-9-13 10:29:02

湛无双 发表于 2018-6-15 16:59
问题已经解决,采用第二种IP核的方法,确实需要添加一个CDMA的IP核,然后通过AXI总线配置好CDMA的目的地址 ...
(引用自2楼)

这个xpdma文件,没看懂这个工程怎么使用的,也不像是fpga端的xpr工程,能交流一下吗?感谢

湛无双 发表于 2022-9-13 19:44:29

本帖最后由 湛无双 于 2022-9-13 19:47 编辑

mk676910825 发表于 2022-9-13 10:29
这个xpdma文件,没看懂这个工程怎么使用的,也不像是fpga端的xpr工程,能交流一下吗?感谢 ...
(引用自7楼)

好的,没问题。Q:三565③柒O91
页: [1]
查看完整版本: 请教关于AXI Memory Mapped to PCIe中DMA传输的问题,既AXI:BARS作用