使用Cyclone V Avalon-MM的dma传输用于PCIe

时间:2015-02-11 15:56:28

标签: dma intel-fpga pci-e quartus qsys

是否可以在Qsys(quartus 14.0)中使用altera提供的IP核«Cyclone V Avalon-MM for PCIe»进行DMA转移?

Altera提供了一个名为«Cyclone V Avalon-MM DMA for PCIe»的ip-core来进行dma transfert。但是这个ip-core不支持1x通道的PCIe Gen1。

针对PCIe的Cyclone V Avalon-MM的演示(ep_g1x1)设计包括一个连接在PCIe ip-core的Avalon-mm TX总线上的DMA模块。

然后我想知道是否可以将数据从此DMA块写入根复合体(主机)?因为我找不到怎么做。

2 个答案:

答案 0 :(得分:1)

从我对材料的简要介绍中,应该可以使用您感兴趣的IP核从RC向Cyclone V(EP)发出DMA读取或写入。

我已经在Stratix V上完成了DMA读写操作,但是它采用的是非Qsys设计,只使用了PCIe核心HIP模块(自定义TLP编码和解码逻辑)。这个块似乎只是它们的PCIe HIP块的包装器,它也为你处理事务层。

第一步是让你的RC发出PCIe DMA读或写请求。在读取请求的情况下,您将要发送一个内存读取完成,其中包含长度大于1 DWORD的数据(CplD)请求。我建议将整个BAR专用于在FPGA上映射您想要DMA的存储空间,以保持地址定位的简单性。

在FPGA方面,我建议使用Signal Tap并探测核心上的Rxm*接口信号。通过这种方式,您可以看到核心发出的DMA读取请求的确切时间。我的猜测是RXMRead_<n>_o信号会变高,表示请求的开始。此时,您必须解码并将RxmAddress_<n>_oRXMBurstCount_<n>_o传递给某些胶合逻辑,该逻辑将从FPGA内存中获取所请求的数据。准备好发回数据后,为发送的每个有效字断言RXMReadDataValid_<n>_i

我猜你所引用的“Cyclone V Avalon-MM DMA for PCIe”内核负责处理我提到的'胶水'逻辑,并允许你直接连接到Qsys总线上的SDRAM控制器。 Altera通常不加密他们的megafuction代码,所以如果你的系统verilog很强大,那么可能值得挖掘他们生成的文件并看看你是否可以以某种方式重用那段代码。

至于核心设置,我看到的唯一需要注意的是确保单个DW完成程序设置变为关闭。否则,核心将中止任何长度大于1 DWORD的请求。

希望有所帮助。

答案 1 :(得分:0)

我终于设法用«Cyclone V Avalon-MM for PCIe»altera core-ip做出DMA请求。那是的,这是可能的。

在我的Linux系统上,rootcomplex(RC)包含在Linux操作系统的i.MX6下。然后大多数技巧都在Linux方面。

在Linux驱动程序下,必须通过dma_alloc_coherent()调用请求PAGE,并且该页面的地址必须写在名为ADDR_MAP_LO0和ADDR_MAP_HI0的CRA寄存器上。

在我的系统上,内存页面大小为4k,然后我必须配置PCIe硬盘ip的“地址转换设置”,页面为4k才能保持连贯。

完成后,我只需将Qsys提供的DMA控制器连接到PCIe IP的TX avalon-MM从端口。 告诉DMA在此端口上写入数据将自动从FPGA生成TLP以在i.MX6 ram上写入。