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

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

8.1. 读DMA实例

该实例将3个数据块从PCIe地址空间(系统存储器)移动到Avalon-MM地址空间。

注: 自17.1发布起, Intel® Quartus® Prime Pro Edition软件根据您使用参数编辑器指定的参数动态生成设计实例。因此, Intel® Quartus® Prime Pro Edition安装目录不再为 Intel® Stratix® 10器件提供静态设计实例。静态设计实例适用于较早的器件系列,包括 Intel® Arria® 10 Intel® Cyclone® 10器件。
图 59.  Intel® Stratix® 10 Gen3 x8 Avalon-MM DMA集成Platform Designer

下图说明PCIe和 Avalon® -MM地址空间中数据块的位置和大小,以及描述符列表格式。此实例中,RD_TABLE_SIZE的值为127。

图 60. 使用Read DMA从PCIe传送到Avalon-MM地址空间的数据块。

描述符列表包含128个条目。在存储器中状态列表优先于可变量描述符。Read和Write Status,以及Descriptor Table分别位于Read Descriptor Base RegisterWrite Descriptor Base Register中的指定地址。

图 61.  PCIe* 系统存储器中的描述符列表
  1. 软件为Read Descriptor Status列表和Descriptor列表分配 PCIe* 系统存储器内存。存储器分配需要进行如下计算:
    1. 读状态列表中每个条目为4字节。128个读取条目需512字节内存。
    2. 每个描述符为32字节。3个描述符需96字节内存。
      注: 为避免可能出现上溢的情况,请根据RD_TABLE_SIZE支持的描述符数量而不是描述符的初始数量进行所需内存的分配。
    软件必须为状态和描述符列表分配的总存储大小为608字节。该实例中已分配内存的起始地址是0xF000_0000。将该地址写入Read Descriptor Controller Read Status and Descriptor Base寄存器。
  2. Read Status and Descriptor Base偏移0x200开始烧写Read Descriptor Controller列表。该偏移与图 60中显示的地址相匹配。数据的3个块需要3个描述符。
  3. 根据描述符状态列表中的起始地址烧写Read Descriptor Controller Read Status and Descriptor Base寄存器。
  4. 通过片上描述符列表FIFO的起始地址编写Read Descriptor Controller Read Descriptor FIFO Base。也是Platform Designerrd_dts_slave端口的基地址。本实例中,该地址为0x0100_0000。
    图 62. 片上Read FIFO的地址
  5. 要更新每个描述符的状态,请使用0x1编写Read Descriptor Controller RD_CONTROL寄存器。该步骤为可选。
  6. 使用值3编程Read Descriptor Controller寄存器RD_DMA_LAST_PTR。编程该寄存器会触发Read Descriptor Controller描述符列表取得进程。因而,写该寄存器必须是设置DMA传送的最后一步。
  7. 主机等待MSI中断。完成最后一个描述符后,Read Descriptor Controller将MSI发送到主机。Read Descriptor Controller也会写Update
  8. 如果要移动其他块,请完成下列步骤以设置其他传送。
    1. 从存储器地址0xF000_0200 +(<previous last descriptor pointer> * 0x20)开始编程描述符列表。该情况下,描述符指针为3。
    2. 使用previous_value (3 in this case) + number of new descriptors编程Read Descriptor Controller寄存器RD_DMA_LAST_PTR。编程该寄存器会触发Read Descriptor Controller描述符列表读取进程。因而,编程寄存器必须是设置DMA传送的最后一个步骤。
      注:RD_DMA_LAST_PTR开始处理RD_TABLE_SIZE时,请确保使用等于RD_TABLE_SIZE的值编程RD_DMA_LAST_PTR。这样就可确保第一个描述符在最低偏移出现(本实例中为0xF000_0200)处翻转。请参阅Read DMA Descriptor Controller RegistersRD_DMA_LAST_PTR的说明部分获取更多关于编程RD_DMA_LAST_PTR寄存器的信息。