如何从 PCIe Verilog 内核实现 DMA?

How could I achieve DMA from a PCIe Verilog core?

我有一个 PCIe 生成的核心/端点,带有用于开发板上 spartan6 fpga 的 xilinx 核心生成器工具,我对其进行了一些修改以启用 MSI 并每隔几秒发送一次。

另外,我在插入开发板的 linux 桌面上做了​​一个简单的 C 内核模块。这注册设备,分配内存,为设备启用总线控制并处理中断等

我现在要做的是从板子到PC的一些DMA传输,完成后会发送一个中断,这样cpu就可以去读取了。我不是 Verilog 专家,而且我的代码似乎不具备任何 DMA 功能。

我在网上找不到任何相关资料,所以这是我最后的希望。

以上评论原文:
您是否在生成的 PCIe 内核之上实现了事务层?如果您的 HDL 技能不是那么高,为什么不使用免费的 PCIe 内核? PCIe是个很大的东西....

是的,Xilinx IPCore 生成器在 link 层之上添加了一个非常简单的 PIO 接口来处理简单的 PIO 事务。注意:PIO 事务已过时,不允许用于新设备。

目前我知道两个比较好的IPCore:

  1. XILLYBUS

    • 免费教育许可证
    • 在线为您的 FPGA 设备创建 IPCore 并下载网表
    • 免费 linux 和 windows drivers(linux driver 将包含在标准内核中)
    • 8 位和 32 位 FIFO 接口和一个内存接口
    • linux-driver 将 FPGA 映射到 /dev/xillybus_read /dev/xillybus_write 设备
  2. RIFFA

    • 我不确定这个核心是否还在维护
    • 免费driver
    • 它有一个奇怪的接口,最多有 12 个 FIFO 通道
    • 免费 HDL 资源

所有这些内核都需要 Xilinx Core Generator 为您的 device/board 生成 PCIe 内核。核心本身提供事务处理,...