Zynq PS 与 PL 数据交互设计与算法加速验证
近期,不少开发者希望了解 PS 与 PL 实际项目交互的应用。本文以某小型项目为例,核心需求是在 PS 端接收两路浮点型 ADC 数据,将数据发送至 PL 端,经特定算法处理后,再将结果传回 PS 端。设计采用 DMA 传输方式实现高效数据搬运,同时部分关键参数与控制指令通过寄存器进行传递。
该系统实现主要涵盖以下关键环节:
- PS 端对 DDR 的读写操作:由 PS 负责完成与 DDR 存储器的数据交互。
- PL 通过 AXI 协议读取 DDR:PL 经由 AXI 总线协议实现对 DDR 中数据的直接访问。
- PS 与 PL 之间的寄存器交互:双方通过寄存器(Reg)进行控制参数与状态信息的传递。
- PS 与 PL 的 GPIO 交互机制:利用 GPIO(通用输入输出)实现简单的信号交互与触发控制。
项目背景
- 平台:Xilinx Zynq-7000 (zynq 7020)
- 目的:实现 ZYNQ 平台 PS 与 PL 之间的数据交互,以及指令交互
- 工具:Vivado 2018.3、Xilinx SDK 2018.3
功能展示
① 通过 PS 端写 2 通道 ADC 数据到 DDR PS 端写入 2 个通道累加数到 DDR,此次写入的数据为 0.1、1.1 ... 8.1、9.1。
② PL 端通过读取 DDR 数据 PL 端从 DDR 中读取由 PS 搬运过来的 ADC 数据。
③ 在 PL 端实现算法运算 PL 内部对输入的浮点型 ADC 数据执行特定算法,实现数据处理与计算。
④ 将运算的结果发送给 PS 端 处理后的结果通过 AXI4 总线写回 DDR3。
⑤ PS 读取运算结果,并进行对比 PS 端应用程序获取结果,并通过脚本进行验证对比。
一、设计思路
在读者已掌握 AXI 总线读写原理的基础上,本文将引导大家深入实战应用。本项目旨在通过 PL 实现特定的算法加速,并重点阐述 PS 与 PL 之间数据交互与控制协同的关键环节。
公式: $$ \sum_{i=1}^{n} (a_i \times b_i) = Result $$
公式说明:
- $a_i$ 和 $b_i$ 分别代表通道 A 和通道 B 的第 i 个浮点数数据。
×是乘法运算。- $\sum_{i=1}^{n}$ 表示对从第 1 个到第 n 个的所有乘积结果进行求和。
Result是最终计算出的标量结果。
该设计基于 Zynq SoC 架构,PS 端负责接收两路浮点型 ADC 数据,并通过 DMA 搬运至 PL 端。PL 内部由 AXI 读模块、算法处理模块、AXI 写模块及寄存器组成,完成数据读取、算法计算和结果回写。最终结果存入 DDR3,由 PS 端应用程序获取使用。系统通过 AXI 总线实现高效数据传输,同时通过寄存器支持参数配置与控制指令交互。
二、整体设计框图
本次设计的总体框图如下所示: 本设计基于 Zynq SoC 平台,系统由 PS(Processing System)端与 PL(Programmable Logic)端协同工作,完成数据接收、算法处理与结果返回的整体流程。
在 PS 端,ARM Cortex-A9 作为核心处理器,负责接收两路浮点型 ADC 数据,并通过 DMA 搬运方式将数据高效传输至 PL 端。同时,PS 端运行用户应用程序(user APP),与 DDR3 存储器交互,用于数据缓存和结果管理。此外,PS 端还通过 M_AXI GP 接口访问寄存器,实现对算法参数的配置与控制指令下发。
在 PL 端,系统主要包含 AXI 读模块、算法处理模块、AXI 写模块、AXI SmartConnect 总线互连及寄存器模块:
- AXI 读模块:从 DDR3 中读取由 PS 搬运过来的 ADC 数据;
- 算法处理模块:对输入的浮点型 ADC 数据执行特定算法,实现数据处理与计算;
- AXI 写模块:将处理后的结果通过 AXI4 总线写回 DDR3;
- AXI SmartConnect:完成 AXI 总线互联,保证数据在各模块间以及 PL 与 PS 之间的高效传输;
- :用于参数配置与控制指令交互,实现灵活可控的算法运行。


