0

Is it possible to do DMA transferts with the IP core «Cyclone V Avalon-MM for PCIe» provided by altera in Qsys (quartus 14.0) ?

Altera provide an ip-core named «Cyclone V Avalon-MM DMA for PCIe» to do dma transfert. But this ip-core does not support PCIe Gen1 with 1x lane.

The demo (ep_g1x1) design for «Cyclone V Avalon-MM for PCIe» include a DMA block that is connected on Avalon-mm TX bus of PCIe ip-core.

Then I'm wondering if it's possible to write data from this DMA block to the root-complex (host) ? Because I can't find how to do that.

4

2 回答 2

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信号会变高,表明请求的开始。此时,您必须解码并将 and 传递RxmAddress_<n>_oRXMBurstCount_<n>_o一些胶合逻辑,该逻辑将从 FPGA 的内存中获取请求的数据。准备好发回数据后,RXMReadDataValid_<n>_i为每个发送的有效字断言。

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

至于核心设置,我看到您唯一需要注意的是确保Single DW Completer设置已关闭。否则,核心将中止它收到的长度大于 1 DWORD 的任何请求。

希望有所帮助。

于 2015-02-16T04:53:47.573 回答
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。

于 2015-06-04T09:35:52.810 回答