Arria 10 Avalon-MM DMA接口PCIe解决方案用户指南

ID 683425
日期 10/31/2016
Public
文档目录

5.11.5. 软件编程以同时读和写DMA

按以下步骤编程从而实现按DMA同步传输:

  1. 为读和写DMA描述符列表分配根端口存储器。假设列表包含多达128个, 8-dword描述符和128个, 1-dword状态条目,总共1152个dword。用于读和写DMA描述符列表的存储器总容量为2304 dword。
  2. 分配根端口存储器并通过数据将它初始化以用于读DMA进行读取。
  3. 分配根端口存储器以用于写DMA写入。
  4. 为读 DMA描述符列表创建所有描述符。逐步分配DMA Descriptor ID,从0开始,最多到127。对于读DMA来说,源地址是步骤2中所分配的存储器空间。目的地址是读DMA模块写入的Avalon‑MM地址。以dword为单位指定DMA长度。每个描述符传输相邻的存储器。假设用于读DMA的基地址为0,以下分配说明了一个读描述符的构成:
    1. RD_RC_LOW_SRC_ADDR = 0x0000 (根端口中用于读描述符列表的基地址)
    2. RD_RC_HIGH_SRC_ADDR = 0x0004
    3. RD_CTLR_LOW_DEST_ADDR 0x0008
    4. RD_CTLR_HIGH_DEST_ADDR = 0x000C
    5. RD_DMA_LAST_PTR = 0x0010
    RD_DMA_LAST_PTR寄存器开始操作。
  5. 关于写DMA,源地址是写DMA模块应该读取的Avalon-MM地址。目的地址是步骤3中所分配的根端口存储器空间。以dword为单位指定DMA长度。假设用于写DMA的基地址为0x100,以下分配说明一个写描述符的构成:
    1. RD_RC_LOW_SRC_ADDR = 0x0100 (根端口中用于读描述符列表的基地址)
    2. WD_RC_HIGH_SRC_ADDR = 0x0104
    3. WD_CTLR_LOW_DEST_ADDR 0x0108
    4. WD_CTLR_HIGH_DEST_ADDR = 0x010C
    5. WD_DMA_LAST_PTR = 0x0110
    WD_DMA_LAST_PTR寄存器开始操作。
  6. 为提高吞吐量,读DMA模块在操作开始之前就将描述符列表复制到Avalon-MM存储器。通过写EP Descriptor Table Base (Low)(High)寄存器指定存储器地址。
  7. 为每个WD_DMA_LAST_PTRRD_DMA_LAST_PTR完成发送一个MSI中断。这些完成会引起done状态位的更新。然后主机软件会读状态位以决定哪个DMA操作已被完成。
注: 支持读DMA请求的无序完成。如果读DMA的传输量超过读请求的最大量,则读DMA创建多个读请求。例如,Maximum Read Request Size512 bytes,读DMA把一个4 KB读请求分成8个请求并使用8个不同标签标示。读完成可按任何顺序返回。读DMA Avalon-MM主端口根据标签把读完成写入正确的位置。