4、Vitis统一软件平台入门:Vitis IDE安装与工作空间设置、创建Hello World应用工程、编译与下载运行

好,咱们进入第4章。从这一章开始,你就要真正动手了。前面几章我们把Zynq的硬件架构、开发流程捋了一遍,算是纸上谈兵。现在,我们要把Vitis这个武器装好,然后跑通第一个程序。

Vitis是什么?说白了,它就是Xilinx新一代的统一软件开发平台。以前我们做Zynq开发,要装SDK(Software Development Kit),后来升级到Vitis。它把嵌入式软件开发、FPGA逻辑开发、AI推理加速全揉到一起了。我个人觉得,Vitis最大的变化是编辑器换成了基于Eclipse的IDE,调试功能更强,而且支持用C/C++直接开发PL端的加速器。

嗯,咱们这一章的目标很明确:装好Vitis,建个Hello World工程,下载到板子上跑起来。别小看这一步,这是你整个嵌入式开发流程的“点火”动作。

本章核心知识点:
  • Vitis IDE的安装与许可配置
  • 工作空间(Workspace)的概念与设置
  • 基于板级支持包(BSP)创建Hello World工程
  • 编译、链接与生成可执行文件
  • 通过JTAG下载并运行在Zynq的ARM Cortex-A9上
Vitis Hello World 开发流程 Vitis Hello World 开发流程 安装Vitis IDE 含驱动与许可 设置Workspace 指定工程目录 创建Hello World 选择BSP模板 编译工程 生成.elf文件 连接开发板 JTAG/USB供电 下载并运行 串口看打印 💡 说明: Vitis工程依赖硬件平台文件(.xsa),由Vivado生成。本章假设你已有现成的.xsa文件。 如果没有,可以先使用Vitis自带的“空模板”做纯软件仿真。

4.1 安装Vitis IDE——别踩这些坑

安装Vitis其实不复杂,但有几个地方容易出问题。我先把步骤列出来,然后说几个我踩过的坑。

步骤 操作内容 注意事项
1 从Xilinx官网下载Vitis Unified Software Platform安装包 建议下载“All OS”单文件安装包,约20GB+
2 运行安装程序,选择“Vitis”组件 不要只选“Vivado”,Vitis是独立选项
3 选择安装目录(建议纯英文路径) 路径中不要有空格或中文
4 安装USB驱动(Windows需要) 用于JTAG调试器(如Digilent Cable)
5 配置FlexLM许可证 可以申请免费Node-Locked License
⚠️ 我曾经踩过的坑:
  • 路径问题:我第一次安装时把Vitis放在了“Program Files (x86)”下,结果编译时老是报路径解析错误。后来改成“C:\Xilinx\Vitis”就没事了。
  • 驱动问题:Windows 10/11需要手动安装“Cable Drivers”,否则JTAG连不上。安装程序里有个“Install Cable Drivers”的勾选框,千万别漏掉。
  • 许可证问题:Vitis需要单独的Vitis许可证,Vivado的许可证不通用。去Xilinx官网申请一个“Vitis Core Development Kit”的免费Node-Locked License就行。

4.2 工作空间(Workspace)——你的工程大本营

启动Vitis后,第一个弹窗就是选择Workspace。Workspace说白了就是一个文件夹,用来存放你的所有工程、编译产物和设置。我个人习惯把Workspace放在一个独立的、空间充足的盘符下,比如“D:\Zynq_Workspace”。

为什么要单独设置?你想想看,Vitis每次编译都会生成大量中间文件,如果放在C盘,用不了多久就会爆满。而且,不同项目最好用不同的Workspace,避免工程文件互相干扰。

💡 我的建议:
  • 每个大项目建一个独立的Workspace
  • Workspace路径不要有中文和空格
  • 勾选“Use this as the default and do not ask again”可以跳过下次弹窗
  • 如果Workspace里的工程太多,启动会变慢,定期清理不用的工程

4.3 创建Hello World应用工程

好,现在开始动手。假设你已经有了Vivado导出的硬件平台文件(.xsa),或者直接用Vitis自带的模板。我们一步步来。

  1. 启动Vitis,选择或新建一个Workspace。
  2. 点击菜单栏 File → New → Application Project。
  3. 在弹出的对话框中:
    • 输入工程名:hello_world
    • 点击 Next
  4. 选择硬件平台:
    • 如果已有.xsa文件,点击 Browse 选择它
    • 如果没有,可以选择 Create a new platform from hardware (XSA) 或者使用空模板
  5. 选择模板:在模板列表中选择 Hello World,然后点击 Finish。

Vitis会自动生成工程结构,包括BSP(板级支持包)、链接脚本和main.c文件。你打开 src/helloworld.c,会看到类似这样的代码:

#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"

int main()
{
    init_platform();

    print("Hello World\n\r");
    xil_printf("Hello from Vitis!\n\r");

    cleanup_platform();
    return 0;
}

嗯,这里要注意:print() 和 xil_printf() 都是Xilinx提供的轻量级打印函数,它们通过UART输出。如果你的板子没有接串口,或者串口驱动没配好,是看不到打印信息的。我在项目中就遇到过这个问题,折腾了半天才发现是串口线没插紧。

4.4 编译工程——生成.elf文件

代码写好了,接下来要编译。Vitis的编译操作很简单:

  • 在工程上右键 → Build Project
  • 或者直接按快捷键 Ctrl+B

编译过程会依次执行:

  1. 编译BSP库(驱动、板级初始化代码)
  2. 编译用户代码(main.c等)
  3. 链接生成可执行文件(.elf)

编译完成后,你可以在 hello_world/Debug/ 目录下找到 hello_world.elf 文件。这就是我们要下载到板子上的二进制文件。

常见编译错误及解决:
错误信息 原因 解决方法
undefined reference to `init_platform' BSP未正确生成或未链接 右键BSP工程 → Regenerate BSP Sources
cannot find -lxil 库路径错误 检查BSP的链接设置,确保libxil.a存在
multiple definition of `main' 工程中有多个main函数 检查源文件,只保留一个main

4.5 下载与运行——看到Hello World

编译通过后,就可以下载到板子上运行了。前提是你的开发板已经通过JTAG(比如Digilent JTAG-HS3)连接到电脑,并且上电。

  1. 在工程上右键 → Run As → Launch on Hardware (Single Application Debug)
  2. Vitis会自动连接开发板,下载.elf文件到DDR中
  3. 程序开始运行,输出会显示在Vitis的 Console 窗口中

如果你连接了串口(UART),也可以用串口助手(如Putty、MobaXterm)查看输出。波特率通常为115200。

💡 调试小技巧:
  • 如果下载失败,检查JTAG驱动是否安装,以及板子是否上电
  • 可以在 main() 中加个延时循环,方便观察
  • 使用 Debug As → Launch on Hardware 可以单步调试,设置断点

当你看到Console里打印出“Hello World”和“Hello from Vitis!”时,恭喜你,你的第一个Zynq嵌入式程序跑通了!

总结一下这一章的关键点:

  • Vitis安装时注意路径、驱动和许可证
  • Workspace是工程容器,建议独立存放
  • Hello World工程依赖BSP,BSP由硬件平台文件生成
  • 编译生成.elf,通过JTAG下载到板子运行
  • 串口输出是验证程序运行的最直接方式

嗯,这一章的内容就到这里。你可能会觉得,折腾半天就为了看个“Hello World”,是不是太简单了?其实不然。这个流程涵盖了从工程创建、编译、下载到运行的全链路,后面所有复杂的项目都是在这个基础上搭建的。把这个流程跑通,后面的路就好走了。