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

Use dma transfert with Cyclone V Avalon-MM for PCIe

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

A​​ltera 提供了一个名为 «Cyclone V Avalon-MM DMA for PCIe» 的 ip-core 来进行 dma 传输。但是这个 ip-core 不支持 PCIe Gen1 with 1x lane.

«Cyclone V Avalon-MM for PCIe» 的演示 (ep_g1x1) 设计包括一个连接到 PCIe ip-core 的 Avalon-mm TX 总线上的 DMA 块。

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

根据我对 material 的简要浏览,应该可以使用您感兴趣的 IP 核从 RC 向您的 Cyclone V (EP) 发出 DMA 读取或写入。

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

第一步是让您的 RC 发出 PCIe DMA 读取或写入请求。在读取请求的情况下,您需要发送长度大于 1 DWORD 的内存读取完整数据 (CplD) 请求。我建议将整个 BAR 专门用于映射要从 FPGA 上进行 DMA 的内存 space,以保持地址定位简单。

在 FPGA 方面,我建议使用 Signal Tap 并探测内核上的 Rxm* 接口信号。这样您就可以看到从内核发出的 DMA 读取请求的准确时序。我的猜测是 RXMRead_<n>_o 信号会变高,表示请求开始。此时您必须解码 RxmAddress_<n>_oRXMBurstCount_<n>_o 并将其传递给一些胶合逻辑,该胶合逻辑将从 FPGA 的内存中获取请求的数据。一旦您准备好发回数据,请为每个发送的有效单词声明 RXMReadDataValid_<n>_i

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

至于核心设置,我看到您唯一需要注意的是确保 Single DW Completer 设置已 OFF。否则核心将中止它收到的任何长度大于 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,然后我必须配置 PCIe 硬 IP 的“地址转换设置”与 4k 页面一致。

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