3. AXI总线与PS-PL数据通路

在 Zynq 的软硬件协同设计中,PS(Processing System)与 PL(Programmable Logic)之间的数据通路决定了系统能否把算法加速器的算力真正“喂饱”。AXI 是这条通路的统一语言,但它并不是一种协议,而是一族协议:AXI4 面向高带宽存储映射访问,AXI4-Lite 面向低速寄存器访问,AXI4-Stream 面向无地址的连续数据流。理解三者的差异,并据此选择接口与 DMA 机制,是性能优化的第一步。

三种 AXI 协议的本质差异

AXI4 是完整的存储映射协议,支持突发传输(burst),一次事务可携带最多 256 个数据节拍,地址由 AW/AR 通道给出,数据经 W/R 通道返回,并配有独立的 B 通道响应。它适合大数据块搬运,例如把一帧图像从 DDR 读入 PL 的加速器。AXI4-Lite 是 AXI4 的简化子集,每次事务只传一个数据,没有突发,逻辑资源占用小,典型用途是配置加速器的控制寄存器、读取状态寄存器。AXI4-Stream 则完全抛弃地址概念,只有 TVALID、TREADY、TDATA、TLAST 等握手信号,数据像流水一样单向流动,天然适合视频像素流、ADC 采样流这类连续数据。

三者的关键参数对比如下:

协议地址突发典型位宽典型用途
AXI4有支持,最多256拍32/64/128/512DDR↔PL 大块数据
AXI4-Lite有不支持32寄存器配置与状态读取
AXI4-Stream无不适用8~512视频、采样、流水线数据

PS-PL 数据通路的物理结构

PS 侧通过多个 AXI 端口与 PL 相连。GP(General Purpose)端口包括 M_AXI_GP0/1 和 S_AXI_GP0/1,位宽通常为 32 位,适合控制类访问;HP(High Performance)端口 M_AXI_HP0~3 直连 DDR 控制器,位宽可达 64 或 128 位,是加速器读写大块数据的主通道;ACP(Accelerator Coherency Port)端口则让 PL 访问与 CPU 保持缓存一致性的内存区域。理解这些端口的带宽上限,是接口选择的基础。

Zynq PS-PL AXI 数据通路与带宽匹配 PS (Processing System) ARM Cortex-A9 双核 DDR 控制器 L2 Cache / OCM 中断控制器 GIC 中央互联 (Central Interconnect) PL (Programmable Logic) 算法加速器 (卷积/FFT/矩阵运算) AXI DMA / CDMA (MM2S / S2MM) AXI4-Stream 数据流 (视频/采样流水线) AXI4-Lite 寄存器组 (控制/状态) M_AXI_GP0 (32bit, 控制) M_AXI_HP0 (64/128bit, 高带宽) ACP (缓存一致) AXI4-Stream (无地址) 带宽匹配:HP端口 ≈ 1.2~2.4 GB/s,需与加速器吞吐对齐

DMA 机制:让数据自己流动

如果让 CPU 逐字搬运数据,性能会被彻底拖垮。DMA 的价值在于把搬运任务交给专用引擎。在 Zynq 中常见两类:AXI DMA 和 AXI CDMA。AXI DMA 提供 MM2S(Memory-Mapped to Stream)和 S2MM(Stream to Memory-Mapped)两个方向,一端接 AXI4 存储映射,另一端接 AXI4-Stream,非常适合“DDR→加速器→DDR”的流水线。AXI CDMA 则用于存储到存储的搬运,两端都是 AXI4 存储映射。

以 AXI DMA 为例,一次典型传输的配置流程是:先写 S2MM_DMACR 的 RS 位启动接收通道,再写 S2MM_DA 设置目标地址,然后写 S2MM_LENGTH 写入传输字节数并触发传输;发送方向类似,写 MM2S_DMACR 启动,写 MM2S_SA 设置源地址,写 MM2S_LENGTH 触发。传输完成后,DMA 通过中断或状态寄存器通知 CPU。这里的关键参数是传输长度和地址对齐:长度必须是数据位宽的整数倍,地址通常要求 4 字节或更高对齐,否则会触发错误。

接口选择与带宽匹配

接口选择的核心问题是:这条数据通路需要多大带宽?以 128 位 HP 端口、100 MHz 时钟为例,理论峰值带宽为 128 bit × 100 MHz = 12.8 Gbit/s = 1.6 GB/s。如果加速器每周期处理 8 个像素、每个像素 4 字节,工作频率 150 MHz,则吞吐需求为 8 × 4 × 150M = 4.8 GB/s,已经超过单个 HP 端口上限,必须使用两个 HP 端口或提高位宽。这就是带宽匹配的实际含义:不是“能连上就行”,而是要让数据供给速率与计算消耗速率对齐。

选择接口时可按以下顺序判断:控制寄存器用 AXI4-Lite;大块存储映射数据用 AXI4 + HP 端口;连续流数据用 AXI4-Stream + DMA;需要与 CPU 缓存保持一致时考虑 ACP。带宽估算时,先算加速器吞吐,再对照端口理论带宽,留出 20%~30% 余量。

一个可参考的配置示例

假设一个图像卷积加速器,输入 1920×1080 灰度图,每像素 1 字节,目标帧率 60 fps。数据率为 1920 × 1080 × 60 ≈ 124.4 MB/s,这个量级用单个 HP 端口绰绰有余。但如果换成 RGB 三通道、每像素 3 字节,数据率变为 373 MB/s,仍可满足。若加速器内部并行度提高,每周期处理 4 个像素,则需重新核算。配置时,DMA 的传输长度可设为一行像素的字节数,例如 1920 字节,通过多次传输完成一帧,配合 TLAST 信号标识行结束。

// 示例:AXI DMA S2MM 接收配置(伪代码)
Xil_Out32(DMA_BASE + S2MM_DMACR, 0x00004001); // 启动接收通道
Xil_Out32(DMA_BASE + S2MM_DA,   DEST_ADDR);    // 目标地址
Xil_Out32(DMA_BASE + S2MM_LENGTH, 1920);       // 传输长度(字节)
// 等待 S2MM_DMASR 的 Idle 位或中断
while (!(Xil_In32(DMA_BASE + S2MM_DMASR) & 0x00000002));

这段配置中,0x00004001 的 bit0 是 RS 启动位,bit14 是 IOC_IrqEn 中断使能位。实际使用时需根据具体 IP 版本核对寄存器偏移。传输完成后,通过读取 S2MM_LENGTH 寄存器可确认实际传输字节数,若与预期不符,应检查地址对齐和 TLAST 是否正确产生。

常见错误:把 AXI4-Lite 用于大数据传输,导致每拍只能传 4 字节,带宽极低;或者 DMA 传输长度未按位宽对齐,触发 DMA_SR 的错误位。排查时先看 DMA 状态寄存器的错误标志,再检查地址和长度。

总结来看,AXI4、AXI4-Lite、AXI4-Stream 分别对应“大块存储映射”“低速控制”“连续流”三类需求,DMA 是连接存储映射与流的桥梁,而接口选择与带宽匹配则要求设计者从加速器吞吐出发,反向核算端口能力。只有把这条数据通路打通并匹配好,PL 的算力才不会饿死。