ZYNQ中的AXI DMA

1.DMA简介

  • DMA(Direct Memory Access,直接存储器访问)是一种内存访问技术。它允许某些计算机内部的硬件子系统可以独立地直接读写系统内存,而不需中央处理器( CPU)介入处理。
  • 允许不同速度的硬件设备进行沟通,而不需要依于中央处理器的大量中断负载。否则,中央处理器需要从来源把每一片段的数据复制到寄存器,然后把它们再次写回到新的地方。在这个时间里,中央处理器就无法执行其它的任务。
  • DMA 是一种快速的数据传送方式, 通常用来传送数据量较多的数据块,很多硬件系统会使用 DMA,包括硬盘控制器、绘图显卡、网卡和声卡,在使用高速 AD/DA 时使用 DMA 也是不错的选择。
  • DMA 是用硬件实现存储器与存储器之间存储器与 I/O 设备之间直接进行高速数据传输。 使用 DMA时, CPU 向 DMA 控制器发出一个存储传输请求, 这样当 DMA 控制器在传输的时候, CPU 执行其它操作,传输操作完成时 DMA 以中断的方式通知 CPU。对于zynq,这种交互通常发生在stream流和DDR3之间。
  • 为了发起传输事务, DMA 控制器必须得到以下数据:
    • 源地址 — 数据被读出的地址
    • 目的地址 — 数据被写入的地址
    • 传输长度 — 应被传输的字节数

2.ZYNQ中的DMA

  • ZYNQ 提供了两种 DMA,一种是集成在 PS 中的硬核 DMA,另一种是 PL 中使用的软核 AXI DMA IP。

2.1 PS 中的硬核 DMA

  • 在 ARM CPU 设计的过程中,已经考虑到了大量数据搬移的情况,因此在 CPU 中自带了一个 DMA 控制器 DAMC,这个 DAMC 驻留在 PS 内,而且必须通过驻留在内存中的 DMA 指令编程,这些程序往往由CPU 准备,因此需要部分的 CPU 参与。 DMAC 支持高达 8 个通道,所以多个 DMA 结构的核可以挂在单个DMAC 上。 DAMC 与 PL 的连接是通过 AXI_GP 接口,这个接口最高支持到 32 位宽度,这也限制了这种模式下的传输速率,理论最高速率为 600MB/s。这种模式不占用 PL 资源,但需要对 DMA 指令编程,会增加软件的复杂性。

2.2 PL 中的软核 DMA

  • 为了获取更高的传输速率,可以以空间换时间,在 PL 中添加 AXI DMA IP 核,并利用AXI_HP 接口完成高速的数据传输。AXI DMA为AXI4存储器和AXI4-stream外设(如以太网口)之间提供了高带宽的直接内存访问。其可选的S/G功能可以将CPU从数据搬运任务中解放。通过 PL 的 DMA 和 AXI_HP 接口的传输适用于大块数据的高性能传输,带宽高。该种传输方式的拓扑图如下:
    在这里插入图片描述

  • 可以看到 DMA 的数据传输经 S_AXI_HP 接口(以下简称 HP 接口)。 ZYNQ 拥有 4 个 HP 接口,提供了 ZYNQ 内最大的总带宽。每一个 HP 接口都包含控制和数据 FIFO。这些 FIFO 为大数据量突发传输提供缓冲,让 HP 接口成为理想的高速数据传输接口。对 DMA 的控制或配置通过 M_AXI_GP 接口,传输状态通过中断传达到 PS 的中断控制器。

  • 该AXI DMA IP核在 AXI4 内存映射和 AXI4-Stream IP 接口之间提供高带宽直接储存访问。其可选的 scatter gather 功能还可以从基于处理器的系统中的中央处理单元( CPU)卸载数据移动任务。初始化、 状态和管理寄存器通过 AXI4-Lite 从接口访问。核心的功能组成如下图所示(图中的读写都是对内存的):
    在这里插入图片描述

  • 其中最上面的 AXI4 memory map read是从内存中读数据,即从DDR3中读取数据,经过Datamove走向了AXI4 Stream Master(MM2S),通过AXI4-FULL接口完成了存储器映射到IO外设的转换。最下面的 AXI4 memory map write过程与之相反。

  • 右侧中间三组接口:AXI4 Control Stream(MM2S)、AXI4 memory map read/write、AXI4 Stream(S2MM)都是在S/G模式下才会用到的,MM2S和S2MM可以连接到IO外设,通过stream数据流做数据交互;AXI4 memory map read/write经过AXI互联逻辑连接到DDR3控制器中。

  • 当最上/下AXI4 memory map read/write传输完成后,会发出中断给CPU。

2.2.1 软核AXI DMA 的三种总线

  • AXI4-Lite 用于对寄存器进行配置,也可以读出寄存器的状态。处理器需要对DMA IP进行配置(DDR3起始地址,读写长度等等,以便开启DMA数据传输)、命令传输(读写使能),都是经过该总线。
  • AXI4 Memory Map 用于与内存交互,又分为 AXI4 Memory Map Read 和 AXI4 Memory Map Write 两个接口,一个是读一个是写。
  • AXI4 Stream 接口用于对外设的读写,其中 AXI4 Stream Master( MM2S, Memory Map to Stream)用于对外设写, AXI4-Stream Slave(S2MM, Stream to Memory Map)用于对外设读。
  • 总之,AXI_MM2S 和AXI_S2MM 是存储器端映射的 AXI4 总线,提供对存储器( DDR3)的访问。 AXIS_MM2S 和 AXIS_S2MM是 AXI4-stream总线,可以发送和接收连续的数据流,无需地址。

2.2.2 软核AXI DMA 三种工作模式

AXI DMA 提供 3 种模式,分别是 Direct Register 模式、 Scatter/Gather 模式和 Cyclic DMA 模式,这里我们简单的介绍下常用的 Direct Register 模式和 Scatter/Gather 模式。

  • Direct Register DMA 模式也就是 Simple DMA。 Direct Register 模式提供了一种配置,用于在 MM2S 和S2MM 通道上执行简单的 DMA 传输,这需要更少的 FPGA 资源。 通过访问DMACR(DMA控制寄存器)、源地址或者目的地址和传输数据长度寄存器(长度必须最后设置)发起DMA传输。传输完成后若使能产生中断输出,那么DMASR(DMA状态寄存器)相关的通道中断标志位有效。Simple DMA 允许应用程序在 DMA 和Device 之间定义单个事务。它有两个通道:一个从 DMA 到 Device,另一个从 Device 到 DMA。应用程序必须设置缓冲区地址和长度字段以启动相应通道中的传输。MM2S 步骤如下(S2MM步骤类似):
    • 1、开始使能MM2S通道
    • 2、使能中断(可选)
    • 3、写一个有效的源地址到MM2S_SA寄存器。若没有使能DRE功能,在指定起始地址时需要注意字节地址对齐,取决于Stream流的数据位宽
    • 4、写传输的字节数到MM2S_LENGTH寄存器,长度为0无效,非零值将决定存储器映射到Stream流的数据个数。必须最后一个配置MM2S_LENGTH寄存器。
    • Simple DMA一次配置完成后只能进行连续的地址空间的读写,向不同地址搬运则需要重新配置。Scatter/Gather DMA 模式解决了这一问题。
  • Scatter/Gather DMA 模式将传输的基本参数(起始地址、传输长度等)存在内存中,被称为buffer descriptor(BD),在工作时通过SG接口加载和更新BD中的状态。允许在单个 DMA 事务中将数据传输到多个存储区域或从多个存储区域传输数据。它相当于将多个 Simple DMA 请求链接在一起。 SGDMA 允许应用程序在内存中定义事务列表,硬件将在应用程序没有进一步干预的情况下处理这些事务。在此期间,应用程序可以继续添加更多工作以保持硬件工作。用户可以通过轮询或中断来检查事务是否完成。 SGDMA 处理整个数据包( 被定义为表示消息的一系列数据字节)并允许将数据包分解为一个或多个事务。例如,采用以太网 IP 数据包,该数据包由 14 字节的报头后跟 1 个或多个字节的有效负载组成。使用 SGDMA,应用程序可以将 BD( Buffer Descriptor, 用于描述事务的对象) 指向报头,将另一个 BD 指向有效负载,然后将它们作为单个消息传输。这种策略可以使TCP / IP 堆栈更有效,它允许将数据包标头和数据保存在不同的内存区域,而不是将数据包组装成连续的内存块。
    • 在简单的设计中,不需要使用 scatter gather DMA 模式,因为可以使用 DMA 的更简单的寄存器直接模式充分实现系统, 从而避免实现 scatter gather 功能带来的面积成本。在系统需要对 DMA 进行相对复杂的软件控制时, 可以使用 scatter gather 模式。

3.各种接口方式的比较

在这里插入图片描述

4. 不同Xilinx芯片AXI DMA IP时钟频率

在这里插入图片描述
参考:pg021_axi_dma

猜你喜欢

转载自blog.csdn.net/qq_43445577/article/details/113398916
DMA