2. 开发环境搭建:Vivado与Vitis安装配置、SDK环境初始化、硬件平台构建流程

说实话,很多初学者一上来就急着写代码,结果卡在环境搭建上好几个星期。我见过太多人把时间浪费在版本不匹配、license失效、路径带中文这些坑里。这一章,咱们就把Zynq开发环境从头捋一遍。

你想想看,Zynq开发跟普通单片机不一样。它既要管PS(处理器系统)的软件,又要管PL(可编程逻辑)的硬件。所以工具链也分两套:Vivado管硬件,Vitis管软件。这两兄弟得配合好才行。

核心原则: Vivado版本必须与Vitis版本严格对应。比如Vivado 2020.1配Vitis 2020.1,混搭会出各种诡异问题。

2.1 Vivado安装与配置

Vivado是Xilinx的统一设计套件。它负责硬件设计、综合、布局布线、生成比特流。我个人习惯用WebPACK版本,免费且够用。除非你要用Vivado HLS或者System Generator,那才需要付费版。

安装步骤:

  1. 下载安装包 – 从Xilinx官网下载Vivado HLx安装程序。注意选对操作系统,Windows和Linux的包不一样。
  2. 运行安装向导 – 选择“Vivado HL WebPACK”或“Vivado HL Design Edition”。我建议选WebPACK,省空间。
  3. 选择组件 – 必须勾选“Vivado”和“Vitis”。其他如“DocNav”可选,但“Xilinx SDK”已经合并到Vitis里了,不用单独装。
  4. 设置安装路径 – 路径不能有中文!不能有空格! 我见过有人装在“D:\开发工具\Vivado”下,结果综合报错找不到库。改成“D:\Xilinx\Vivado”就好了。
  5. 获取License – 申请免费WebPACK license,或者用node-locked license。把.lic文件放到“C:\Xilinx\licenses”下。
避坑指南: 安装时关闭杀毒软件。Vivado安装包里有大量脚本和可执行文件,杀毒软件会误删或拦截,导致安装失败。我曾经被卡在“Generating installed device list”这一步整整两小时,最后发现是360在搞鬼。

2.2 Vitis统一软件平台

Vitis是Xilinx在2019年推出的统一软件平台。它替代了老旧的SDK。说白了,Vitis = SDK + 一些新功能。它支持C/C++开发,也支持Python和OpenCL。

Vitis安装要点:

  • Vitis通常随Vivado一起安装。如果你单独装Vitis,记得版本号要跟Vivado一致。
  • 安装后需要设置环境变量。Windows下一般自动配好,Linux下要手动source settings脚本。
  • Vitis工作空间(workspace)路径也不能有中文。我习惯用“D:\Zynq_Workspace”。
组件 功能 备注
Vivado 硬件设计、综合、布局布线 生成.xsa硬件描述文件
Vitis 软件编译、调试、裸机/Linux应用 替代老SDK,支持多语言
DocNav 文档浏览器 可选,但查手册方便

2.3 SDK环境初始化

虽然Vitis替代了SDK,但很多人还是习惯叫“SDK环境”。其实就是Vitis里新建一个平台工程(Platform Project),然后导入硬件描述文件(.xsa)。

初始化流程:

  1. 启动Vitis – 选择工作空间路径。我建议每个项目单独一个workspace,方便管理。
  2. 创建平台工程 – File → New → Platform Project。输入名字,比如“zynq_platform”。
  3. 导入硬件描述 – 在Platform Settings里,点击“Import from XSA”,选择Vivado导出的.xsa文件。
  4. 选择处理器 – 如果是Zynq-7000,选“ps7_cortexa9_0”。如果是Zynq UltraScale+,选“psu_cortexa53_0”。
  5. 生成BSP – Board Support Package。Vitis会自动生成驱动库和链接脚本。
小技巧: 第一次生成BSP会比较慢,因为要下载器件库。建议用有线网络,WiFi容易断。如果卡在“Downloading device data”,可以手动从Xilinx官网下载离线包。

2.4 硬件平台构建流程

硬件平台构建是Zynq开发的核心。它决定了PS和PL怎么连接、外设怎么配置、中断怎么路由。我画了一张流程图,帮你理清整体脉络。

Zynq硬件平台构建流程 1. 创建Vivado工程 2. 添加Zynq IP核 3. 配置PS与PL接口 4. 综合、布局布线 5. 导出硬件(.xsa) 关键配置项 • DDR控制器参数 • AXI总线位宽 • 中断号分配 • MIO/EMIO引脚 输出产物 • 比特流(.bit) • 硬件描述(.xsa) • 约束文件(.xdc)

嗯,这张图把流程串起来了。下面我拆开细说每个步骤。

2.4.1 创建Vivado工程

打开Vivado,点击“Create Project”。选择RTL Project,勾选“Do not specify sources at this time”。这样会生成一个空工程,后面再添加IP。我习惯把工程放在“D:\Zynq_Projects\”下,路径短好找。

2.4.2 添加Zynq IP核

在IP Integrator里,点击“Add IP”,搜索“Zynq”。选择“Zynq-7000 Processing System”。双击打开配置界面。这里要设置DDR型号、时钟频率、外设使能等。如果你用的是官方开发板,可以直接加载板级预设(Board Preset)。

经验之谈: 板级预设能省很多事。比如ZedBoard、Pynq-Z2都有现成的预设。但如果是自己画的板子,就得手动配DDR参数。我建议先查DDR芯片的数据手册,把时序参数填对,否则跑起来会随机死机。

2.4.3 配置PS与PL接口

这是最关键的步骤。你需要决定PS和PL之间怎么通信。常用的接口有:

  • AXI_GP – 通用目的接口,32位数据位宽,适合控制类通信。
  • AXI_HP – 高性能接口,64位数据位宽,适合大数据量传输。
  • AXI_ACP – 加速器一致性端口,可以缓存一致性。
  • EMIO – 扩展MIO,把PS的引脚扩展到PL。

我一般把控制通路走AXI_GP,数据通路走AXI_HP。这样不会互相干扰。

2.4.4 综合、布局布线

配置完成后,右键点击Block Design,选择“Generate Output Products”。然后“Create HDL Wrapper”。最后点击“Generate Bitstream”。这个过程根据工程复杂度,可能几分钟到几小时不等。

注意: 如果综合报错“Timing violation”,先检查时钟约束是否正确。我曾经在Zynq上跑200MHz的AXI总线,结果布局布线后时序不满足。后来发现是时钟源选错了,改回100MHz就过了。

2.4.5 导出硬件描述

比特流生成成功后,点击“File → Export → Export Hardware”。勾选“Include bitstream”。这样会生成一个.xsa文件。这个文件包含了硬件配置信息,Vitis要靠它来生成BSP和驱动。

导出后,你就可以关闭Vivado,打开Vitis开始写软件了。不过别急着关,有时候硬件需要微调,来回切换是常态。

2.5 环境验证:跑一个Hello World

环境搭没搭好,跑个Hello World就知道了。在Vitis里新建一个Application Project,选择“Hello World”模板。编译下载到开发板,串口能看到打印信息,说明环境OK。

// 简单的Hello World验证代码
#include <stdio.h>
#include "platform.h"

int main() {
    init_platform();
    print("Hello Zynq!\n\r");
    print("Environment setup successful!\n\r");
    cleanup_platform();
    return 0;
}

如果串口没输出,先检查波特率对不对(通常是115200),再检查MIO配置是否正确。我遇到过好几次,都是因为MIO引脚没配成UART功能。

总结一下: 环境搭建是Zynq开发的第一步,也是最容易踩坑的一步。记住三点:版本匹配、路径无中文、硬件配置仔细。这三条做到了,后面就顺了。