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总线交换数据,延迟极低。

Zynq-7000 架构简图 PS (Processing System) ARM Cortex-A9 双核 / 单核 DDR 控制器 L2 Cache 外设接口 UART / SPI / I2C DMA 引擎 高速数据搬运 PL (Programmable Logic) 逻辑单元 LUT / FF / DSP Block RAM 片上存储 高速收发器 GTP / GTX 自定义加速器 你的算法 AXI 总线 互联 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 下载与安装

  1. Vivado:去Xilinx官网下载Vivado HLx版本。建议选“Vivado HL WebPACK”或“Vivado HL Design Edition”。
  2. Vitis:Vitis是统一的开发平台,取代了老的SDK。下载Vitis统一安装包即可。
  3. 安装路径:不要有中文、不要有空格。我习惯装到 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:

  1. 点击 Create Project → 选择 RTL Project
  2. 选择器件:比如 xc7z020clg484-1(Zynq-7020)
  3. 添加一个简单的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
  1. 综合、实现、生成比特流
  2. 下载到开发板,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总线一接,齐活。