L-tile和H-tile Avalon® 存储器映射 Intel® FPGA IP PCI Express* 用户指南

ID 683667
日期 11/11/2021
Public
文档目录

8.3. 同时间读写DMA的软件编程

按以下步骤编程实现DMA同时传送:

  1. 为Read和Write DMA描述符列表分配 PCIe* 系统存储大小。例如,每个列表最多支持128个,8-DWORD描述符和128个,1-DWORD状态条目,总共1152个DWORD。则用于Read和Write DMA描述符列表的总存储大小为2304个DWORD。
  2. 分配 PCIe* 系统存储并通过Read Data Mover要读取的数据将其初始化。
  3. 为Write Data Mover分配 PCIe* 系统存储以写入。
  4. 为读DMA描述符列表创建所有描述符。逐步分配DMA Descriptor ID,从0开始,最多到127。对于读DMA来说,源地址是步骤2中分配的存储器空间。目的地址是Read Data Mover写入的Avalon‑MM地址。以DWORD为单位指定DMA长度。每个描述符传送相邻存储内容。假设用于Read DMA的基地址为0,以下约束说明一个读描述符的构成:
    1. RD_LOW_SRC_ADDR = 0x0000(PCIe系统存储器中读描述符列表的基地址。)
    2. RD_HIGH_SRC_ADDR = 0x0004
    3. RD_CTRL_LOW_DEST_ADDR 0x0008
    4. RD_CTRL_HIGH_DEST_ADDR = 0x000C
    5. RD_DMA_LAST_PTR = 0x0010
    RD_DMA_LAST_PTR寄存器开始操作。
  5. 关于Write DMA,源地址是Write Data Mover模块应读取的Avalon‑MM地址。目的地址是步骤3中所分配的 PCIe* 系统存储空间。以DWORD为单位指定DMA大小。假设用于Write Data Mover的基址为0x100,以下约束说明写描述符的构成:
    1. RD_LOW_SRC_ADDR = 0x0100 PCIe* 系统存储器中读描述符列表的基地址)
    2. WD_HIGH_SRC_ADDR = 0x0104
    3. WD_CTRL_LOW_DEST_ADDR 0x0108
    4. WD_CTRL_HIGH_DEST_ADDR = 0x010C
    5. WD_DMA_LAST_PTR = 0x0110
    WD_DMA_LAST_PTR寄存器开始操作。
  6. 为提高吞吐量,Read DMA模块在操作开始之前就将描述符列表复制到Avalon-MM存储器。通过写Descriptor Table Base (Low)(High)寄存器指定存储器地址。
  7. 为每个WD_DMA_LAST_PTRRD_DMA_LAST_PTR完成发送一个MSI中断。这些完成会对Update位进行更新。然后主机软件可通过读Update位来确定已完成的DMA操作。
注: 如果读DMA的传送大于最大读请求,则Read DMA创建多个读请求。例如,若最大读请求为512字节,Read Data Mover会将一个4 KB读请求分成8个不同标记的8个请求。读完成(Read Completion)可以任意顺序返回。Read Data Mover的Avalon-MM主端口将读完成中的已接收数据,按照完成过程中的接收顺序写入 Avalon® -MM存储器中正确位置。该顺序不一定增加地址顺序。因为数据mover中没有内部重排序缓冲器。如果系统允许无序读完成,则最后一个条目仅在编号上为最新,但时间顺序上可能早于其他完成。