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

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

5.11.4. 读DMA实例

本实例将3个数据块从系统存储器移动到Avalon-MM address space. 地址空间。在嵌入式CPU上运行的主机软件分配存储器并在系统存储器中创建描述符列表。

本实例使用的地址位于 <install_dir>/ ip/altera/altera_pcie/altera_pcie_<dev>_ed/example_design/<dev>目录的Qsys设计实例,ep_g3x8_avmm256_integrated.qsys中。

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

图 29. 通过读DMA,把数据块从PCIe地址空间传输到Avalon-MM地址空间。

假设描述符列表包含128个条目。 状态列表优先于存储器中各种数量的描述符。读和写状态,以及描述符列表分别位于RC Read Descriptor Base RegisterRC Write Descriptor Base Register指定的地址。

图 30. 描述符列表格式
  1. 计算所需的存储器分配:
    1. 状态列表中每个条目是4 bytes。128个条目需要存储器的512 bytes。
    2. 每个描述符是32 bytes。3个描述符需要存储器的96 bytes。
    状态和描述符列表共需分配存储器608 bytes。
  2. 在PCI Express地址空间中分配存储器的608 bytes。
    此实例中所分配的存储器起始地址为0xF000_0000。将此地址编程到根复合读状态以及描述符基地址寄存器中。
  3. 在PCI Express地址空间创建描述符列表。由于状态列表先于描述符被储存,于是首个描述符被储存在:0xF000_0000 + 0x200 = 0xF000_0200。
    1. 编程0x0000_0000到描述符0的源地址0xF000_0204中。
      这是源地址的上32 bits。
    2. 编程 0x1000_0000到描述符0的源地址0xF000_0200中。
      这是源地址的下32 bits。
    3. 编程0x0000_0000到描述符0的目的地址0xF000_020C中。
      这是目的地址的上32 bits。
    4. 编程0x5000_0000到描述符0的目的地址0xF000_0208中。
      这是目的地址的下32 bits。
      通过这四个步骤把存储器64KB块的Avalon-MM目的地址编程到描述符列表。
    5. 编程0x0000_4000到0xF000_0210以传输描述符ID 0数据的16K dword (64 KB)。
  4. 为第二数据块重复此流程:
    1. 编程0x0000_0000到源地址0xF000_0224。
    2. 编程0x2000_0000到源地址0xF000_0220。
    3. 编程0x0000_0000到目的地址0xF000_022C。
    4. 编程0x0001_0000到目的地址0xF000_0228。
    5. 编程0x0004_2000到0xF000_0230以传输描述符ID 1数据的8K dword (32 KB)。
  5. 为第三数据块重复此流程:
    1. 编程0x0000_0001到源地址0xF000_0244。
    2. 编程0x2000_0000到源地址0xF000_0240。
    3. 编程0x0000_0000到目的地址0xF000_024C。
    4. 编程0x1000_00 00到目的地址0xF000_0248。
    5. 编程0x0008_1000到0xF000_0250以传输描述符ID 2数据的4K dword (16 KB)。
    下图显示了完成编程后描述符列表中的值。
    图 31. 描述符列表格式
  6. 使用PCI Express系统存储器地址空间状态地址和描述符列表地址编程DMA描述符控制器。如果是内部DMA描述符,就通过组合BAR0和BAR1访问这些寄存器,因为此实例使用64-bit地址。DMA读控制寄存器起始于偏移0x0000。写DMA控制寄存器起始于偏移0x0100。
    1. 编程0x0000_0000到偏移0x0000_0004。
      此为存储状态和描述符列表的PCIe系统存储器的上32 bits。
    2. 编程0xF000_0000到偏移0x0000_0000。
      此为存储状态和描述符列表的PCIe存储器地址的下32 bits。读DMA自动添加一个0x200的偏移到该值,以开启基于存储器状态列表的描述符副本。
  7. 通过片上FIFO地址编程DMA描述符控制器。描述符控制器将从该地址复制状态和描述符列表。
    1. 编程0x0000_0000到偏移0x0000_000C
      此为 Avalon-MM地址域中片上FIFO地址的上32 bits。
    2. 编程0x0100_0000到偏移0x0000_0008。
      此为片上FIFO地址的下32位。它是内部片上FIFO的地址,同时也是透过RX Master所见到描述符控制器的一部分。
      图 32. 片上FIFO的地址
  8. 编程描述符控制器RD_DMA_LAST_PTR寄存器。
    由此步骤开启DMA。完成3个描述符后也由它指定需要被更新的状态dword。
    • – 将最后一个描述符单独更新为done位,并编程0x2到偏移0x0000_0010。描述符控制器处理完全部3个描述符并在状态列表中的0xF000_0008写done位。

    • – 要把全部3个描述符更新为 done 位,使用值0,1,2三次编程地址0x0000_0010 RD_DMA_LAST_PTR。描述符控制器为地址0xF000_0000, 0xF000_0004,及0xF000_0008设置done 位。如果系统支持无序读完成,则描述符控制器可能会无序完成描述符。在这样的系统中,您必须采用这样的方法为每个描述符请求done 状态。软件必须查看每个描述符的done状态。