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

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

8.2. 写DMA实例

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

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

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

图 64. 使用Write DMA从Avalon-MM传送到PCIe系统存储器的数据块。

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

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