是否可以使用altera在Qsys(夸脱14.0)中提供的IP核"Cyclone V Avalon MM for PCIe"进行DMA传输?
Altera提供了一个名为"Cyclone V Avalon MM DMA for PCIe"的ip核来进行DMA传输。但此ip核不支持具有1x通道的PCIe Gen1。
«Cyclone V Avalon MM for PCIe»的演示(ep_g1x1)设计包括一个连接在PCIe ip核的Avalon MM TX总线上的DMA块。
然后我想知道是否可以将数据从这个DMA块写入根复合体(主机)?因为我不知道该怎么做。
根据我对材料的简要浏览,应该可以使用您感兴趣的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>_o
和RXMBurstCount_<n>_o
进行解码并将其传递给某个粘合逻辑,该逻辑将从FPGA的内存中获取所请求的数据。一旦准备好发送回数据,就为发送的每个有效字断言RXMReadDataValid_<n>_i
。
我猜您提到的«Cyclone V Avalon MM DMA for PCIe»核心可以处理我为您提到的"粘合"逻辑,并允许您直接连接到Qsys总线上的SDRAM控制器。Altera通常不会加密他们的超级功能代码,所以如果你的系统verilog很强,那么可能值得仔细研究他们生成的文件,看看你是否可以以某种方式重用这部分代码。
至于核心设置,我看到的唯一需要注意的是确保Single DW Completer设置关闭。否则,核心将中止其接收到的长度大于1 DWORD的任何请求。
希望这能有所帮助。
我终于用«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,然后我必须将页面大小为4k的PCIe硬盘的"地址转换设置"配置为一致。
完成后,我只需在PCIe IP的TX avalon MM从属端口上连接Qsys提供的DMA控制器。告诉DMA在该端口上写入数据将自动从FPGA生成TLP以写入i.MX6 ram。