Zynq UltraScale+ MPSoC DMA 详解:从架构到实战,吃透高速数据搬运
1 摘要
在Zynq UltraScale+ MPSoC异构计算平台中,“数据搬运效率”直接决定系统性能天花板——无论是PL可编程逻辑与PS处理系统间的高速交互,还是外设与内存的数据吞吐,DMA直接内存访问都是当之无愧的核心引擎。不同于普通MCU的简易DMA,Zynq UltraScale+ MPSoC的DMA不仅集成度高、通道灵活,还支持多种高级传输模式,适配从低速控制到高速图像处理的全场景需求。很多开发者在使用时,常会陷入配置能跑但跑不满带宽、中断异常、SG模式用不明白的困境,本质是没吃透其底层架构与工作机制。本文跟大家一起扒开Zynq UltraScale+ MPSoC DMA的外衣,从核心概念、架构拆解、实战配置,让数据搬运既高效又稳定。
2 Zynq UltraScale+ MPSoC DMA 核心
首先理解一个核心,Zynq UltraScale+ MPSoC的DMA并非单一模块,而是一套多控制器、多通道、多模式的完整数据传输解决方案,核心作用是解放CPU,让硬件直接完成内存与外设、内存与内存、PL与PS间的数据搬运,无需CPU频繁介入,仅需初始化配置和传输完成后的中断响应。
2.1 Zynq UltraScale+ MPSoC DMA的作用
在Zynq UltraScale+ MPSoC的典型应用中如高清视频采集、高速ADC信号处理、PCIe数据交互,数据量往往达到GB级,若用CPU搬运会存在以下问题。
①CPU占用率飙升,无法兼顾计算、控制等核心任务;
②传输延迟高(CPU需逐字节/逐字操作),无法满足实时性需求;
③带宽瓶颈明显,CPU搬运速度远低于DMA(DMA可接近DDR内存峰值带宽)。
而DMA能完美解决这些问题,其传输效率接近硬件总线极限,且不占用CPU资源,是Zynq UltraScale+ MPSoC实现异构计算高性能的关键支撑——比如在双Zynq MPSoC PCIe互连场景中,通过DMA可实现低延迟高速数据互传,无需额外交换芯片即可搭建点对点高速链路。
2.2 功能与分类
通用直接内存访问(DMA)控制器支持内存到内存以及内存到 I/O 缓冲区的数据传输。该控制器包含两个实例:
(1)LPD DMA(低功耗域 DMA)
(2)FPD DMA(全功能域 DMA)
本文将 FPD DMA 与 LPD DMA 统称为DMA。实际开发中,PL端AXI DMA使用频率很高,大部分场景需要PL与PS协同。PL端AXI DMA软核IP在Vivado中,基于AXI4协议,并支持MM2S内存到、S2MM流到内存双向通道,可灵活配置数据宽度、中断模式,支持SG散射聚集,需占用少量PL逻辑资源。PL与PS间高速数据交互如图像帧、ADC数据采集;PL侧自定义IP与DDR交互等高带宽、连续传输场景。更多源码请关注公众号:搬砖的骡子toonyhe
3 DMA 控制器功能描述
3.1 核心架构总览
AXI DMA IP核的内部结构可概括为控制、通道、引擎,即:
①控控制:寄存器接口模块(Register Interface Module),供CPU配置和监控DMA;
②通道:MM2S通道(Memory Map to Stream,内存到流)和S2MM通道(Stream to Memory Map,流到内存),可独立配置、并行工作;
③引擎:Scatter-Gather(SG)引擎,实现分散-聚集传输,提升大批量、非连续内存传输效率。
此外,还包含FIFO控制器,用于跨时钟域缓冲、抗背压和中断控制器汇总传输事件,生成IRQ信号上报CPU,各模块通过内部总线互联,确保数据高速流转。

3.2 传输与操作模式
DMA 为通用型控制器,覆盖全场景数据传输需求,支持四大传输方向:
①内存到内存(M2M):DDR、片上存储器等存储区域间的数据拷贝;
②内存到 I/O(M2I):从内存向外设(UART、以太网、PL 自定义模块等)发送数据;
③I/O 到内存(I2M):从外设接收数据并写入内存;
④I/O 到 I/O(I2I):外设间直接数据交互,无需经过主内存中转。
DMA 支持多种工作模式,适配不同场景的传输需求,且各模式具备专属特性:
简单寄存器模式:通过配置寄存器直接设定源地址、目的地址、传输长度等参数,无需描述符,适合短距离、单次简单传输;
分散 - 聚集模式(SG DMA):通过描述符链管理多段不连续数据的传输,支持混合描述符,适配复杂、多段数据的批量搬运,提升传输灵活性。
只读模式:仅发起读操作,读取的数据直接丢弃,仅在简单模式下支持,可用于数据校验、地址遍历等场景;
只写模式:不发起读命令,直接将控制寄存器指定的数据写入目的地址,同样仅支持简单模式,适合固定数据批量写入外设或内存。
3.3 DMA 模型(DMA Model)
LPD 和 FPD DMA 控制器各包含 8 个 DMA 通道。每个通道在不同工作模式下的结构如下:
(1)简单 DMA 模式:分为两个功能侧 —— 源端(读)和目的端(写)。
(2)分散 - 聚集(SG)DMA 模式:分为两个队列 —— 源端(读)队列和目的端(写)队列。

图中展示了分散 - 聚集模式下,源端与目的端的缓冲区描述符数组。缓冲区描述符指向各自对应的缓冲区,DMA 负责将数据从源(SRC)缓冲区传输到目的(DST)缓冲区。一个源端描述符可以对应多个目的端描述符,实现一对多的数据分发。
①Scatter-Gather模式与描述符格式
在分散 - 聚集模式下,DMA 传输参数通过内存中的 描述符指定,APB 寄存器中的参数将被忽略。软件配置源(SRC)和目的(DST)描述符,并通过寄存器指向这些描述符在内存中的起始地址,然后使能通道。通道使能后,DMA 从内存中获取 SRC 和 DST 描述符,并依据这些参数执行实际数据传输。
②描述符格式
在 SG 模式下,通道从 SRC 描述符指定的地址读取数据,并写入 DST 描述符指定的地址。DMA 采用混合描述符,支持三种存储格式:
(1)线性(Linear)
(2)链表(Linked-list)
(3)混合(Hybrid):多个线性缓冲区描述符数组以链表形式链接
在源端(SRC)和目的端(DST)的每个描述符中,都设有一个描述符元素类型位(descriptor-element type bit),用于指示当前描述符的类型。这使得软件能够在线性模式和链表模式之间动态切换

4 关键模块详解
4.1 MM2S通道
从DDR到PL的发送通道,其核心作用是将DDR内存中的数据,以AXI4-Stream流的形式发送到PL侧如自定义IP、FPGA逻辑、高速接口,流程如下:
①CPU通过AXI-Lite接口,配置MM2S通道的“源地址”即DDR中数据的起始物理地址、“传输长度”单次传输的字节数;
转载自CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/toonyhe/article/details/157723773



