1. Zynq平台概述:从架构到开发环境
各位同学,欢迎来到《Zynq平台FPGA加速算法优化与调试与故障定位实战》的第一章。我是你们这门课的主讲。
在正式开始之前,我想先聊聊我自己的经历。十年前我第一次接触Zynq,当时心里直犯嘀咕:这到底是ARM还是FPGA?后来踩了不少坑才明白——它俩是“一家人”。今天我们就从架构、选型到环境搭建,把Zynq这个平台彻底说透。
1.1 Zynq-7000系列架构解析
Zynq-7000系列,说白了就是一颗芯片里同时住着ARM处理器(PS)和FPGA逻辑(PL)。它们通过内部高速总线通信,协同工作。
核心概念:PS(Processing System)负责控制、调度、操作系统;PL(Programmable Logic)负责高速并行计算、自定义接口。两者不是“主从关系”,而是“搭档关系”。
我习惯把Zynq比作一个“双核大脑”:PS是左脑,擅长逻辑决策;PL是右脑,擅长图像处理、信号处理这类并行任务。它们通过AXI总线交换数据,延迟极低。
1.2 PS与PL协同工作原理
PS和PL怎么配合?我举个例子:你做一个实时视频处理系统。
- PS 负责:读取摄像头驱动、网络协议栈、用户界面、任务调度
- PL 负责:视频帧的滤波、边缘检测、色彩空间转换——这些并行计算
数据流通常是:PS从DDR读取一帧图像 → 通过AXI_HP口送到PL → PL处理完再写回DDR → PS取走显示或存储。
我的经验:AXI_HP口是PL访问DDR的“高速公路”,带宽高达1200MB/s。如果你做视频处理,一定要用HP口,别走GP口——GP口只有600MB/s,容易成为瓶颈。
PS和PL之间还有中断机制。PL处理完一帧数据,可以触发中断通知PS。PS收到中断后,再发起下一帧传输。这种“乒乓操作”能大幅提升吞吐量。
1.3 Zynq开发板选型指南
选开发板,我建议你从“够用”和“扩展性”两个角度考虑。下面这张表是我个人整理的对比,帮你快速决策。
| 型号 | PS 核心 | PL 资源 | 典型应用 | 参考价格 |
|---|---|---|---|---|
| Zynq-7010 | 单核 A9 | 28K LUT | 入门学习、简单控制 | ¥500-800 |
| Zynq-7020 | 双核 A9 | 53K LUT | 图像处理、电机控制 | ¥800-1500 |
| Zynq-7030 | 双核 A9 | 125K LUT | 视频编解码、雷达信号 | ¥2000-3500 |
| Zynq-7045 | 双核 A9 | 350K LUT | 高速数据采集、AI推理 | ¥4000-8000 |
避坑指南:我曾经选过一块Zynq-7010做视频处理,结果LUT不够用,硬生生把算法拆成两轮跑。后来换了7020,一次搞定。所以——先评估你的算法资源需求,再选型,别贪便宜。
选型时还要注意:
- DDR容量:至少512MB,推荐1GB以上
- 外设接口:HDMI、以太网、USB是标配
- 调试接口:JTAG必须带,最好有UART转USB
1.4 Vivado与Vitis开发环境搭建与配置
环境搭建是很多新手的第一道坎。我见过有人装了两天还没跑通。别急,按我的步骤来。
1.4.1 下载与安装
- Vivado:去Xilinx官网下载Vivado HLx版本。建议选“Vivado HL WebPACK”或“Vivado HL Design Edition”。
- Vitis:Vitis是统一的开发平台,取代了老的SDK。下载Vitis统一安装包即可。
- 安装路径:不要有中文、不要有空格。我习惯装到
C:\Xilinx\Vivado\2023.1这种路径。
我的习惯:安装时勾选“Zynq-7000”器件支持,其他用不到的可以不勾,省空间。Vivado完整安装要60GB+,你想想看。
1.4.2 环境变量配置
安装完后,需要配置环境变量。Windows用户:
# 添加系统变量
VIVADO_HOME = C:\Xilinx\Vivado\2023.1
PATH = %VIVADO_HOME%\bin;%PATH%
# 验证安装
vivado -version
Linux用户:
# 编辑 ~/.bashrc
export XILINX_VIVADO=/tools/Xilinx/Vivado/2023.1
export PATH=$XILINX_VIVADO/bin:$PATH
# 生效
source ~/.bashrc
vivado -version
1.4.3 第一个工程:Hello World
搭建完环境,我们来跑第一个工程。打开Vivado:
- 点击 Create Project → 选择 RTL Project
- 选择器件:比如 xc7z020clg484-1(Zynq-7020)
- 添加一个简单的Verilog模块:
module led_blink(
input wire clk,
input wire rst_n,
output reg led
);
reg [24:0] counter;
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
counter <= 0;
else
counter <= counter + 1;
end
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
led <= 0;
else if (counter == 25'd24_999_999)
led <= ~led;
end
endmodule
- 综合、实现、生成比特流
- 下载到开发板,LED应该以1Hz频率闪烁
关键点:Vivado负责硬件设计(PL部分),Vitis负责软件设计(PS部分)。两者通过XSA(硬件描述文件)对接。你可以在Vivado里导出XSA,然后在Vitis里导入,开始写C代码。
1.4.4 Vitis软件工程
在Vitis里创建应用工程:
# 导入XSA文件
File → New → Application Project
选择硬件平台(导入XSA)
选择模板:Hello World
# 编写代码
#include <stdio.h>
#include "platform.h"
int main() {
init_platform();
print("Hello from Zynq!\n\r");
cleanup_platform();
return 0;
}
编译、下载、运行。如果串口打印出“Hello from Zynq!”,恭喜你,环境搭建成功。
我曾经踩过的坑:Vivado和Vitis版本必须匹配。比如Vivado 2023.1配Vitis 2023.1,混用会导致XSA导入失败。还有,JTAG驱动一定要装好,否则下载器识别不到。
好了,第一章的内容就到这里。从架构到选型,再到环境搭建,我们走了一遍完整的流程。你想想看,Zynq其实没那么复杂——PS管控制,PL管加速,中间AXI总线一接,齐活。