第二章:开发环境搭建——Vitis统一软件平台安装、XRT配置、目标平台导入与XSA准备
说实话,很多初学者一上来就急着写代码,结果卡在环境搭建上好几个星期。我见过太多人,明明代码逻辑没问题,就是跑不起来——最后发现是XRT版本不对,或者Platform没配好。这一章,咱们就把这些基础打牢。
2.1 Vitis统一软件平台安装
Vitis这个工具,说白了就是Xilinx把以前的SDK、SDAccel、SDSoC全揉到一起了。你装一个Vitis,就等于装了整套开发链。
安装前的准备:
- 至少100GB硬盘空间(我建议留200GB,别问我怎么知道的)
- 16GB以上内存(32GB更稳)
- Linux Ubuntu 18.04/20.04 或 CentOS 7.x/8.x
- 提前装好ncurses、libtinfo5等依赖库
核心要点:Vitis安装包分为在线安装器和离线安装包。我个人习惯用离线包,省得下载到一半断网重来。
安装步骤:
- 从Xilinx官网下载Vitis Unified Software Platform安装包
- 运行安装脚本:
./xsetup - 选择“Vitis”组件(默认会勾选Vivado,建议保留)
- 设置安装路径(不要有中文或空格)
- 等待约1-2小时(取决于你的机器和网络)
小技巧:安装时勾选“Install Cable Drivers”,否则你后面连不上开发板。我曾经因为这个折腾了一下午。
2.2 Xilinx Runtime (XRT) 配置
XRT是什么?它是Vitis和硬件之间的桥梁。你的主机程序通过XRT来加载比特流、管理内存、启动计算单元。没有XRT,你的代码就是一堆废纸。
安装XRT:
# 对于Ubuntu系统
sudo apt install xrt_202410.2.11.0_Ubuntu_20.04-amd64-xrt.deb
# 对于CentOS/RHEL
sudo yum install xrt_202410.2.11.0_CentOS_7.8.2003-xrt.rpm
配置环境变量:
# 添加到 ~/.bashrc
source /opt/xilinx/xrt/setup.sh
export XILINX_XRT=/opt/xilinx/xrt
export LD_LIBRARY_PATH=$XILINX_XRT/lib:$LD_LIBRARY_PATH
注意:XRT版本必须和Vitis版本匹配。我遇到过有人装了Vitis 2023.2却用XRT 2022.1,结果API调用全报错。检查版本用 xbutil examine 命令。
验证安装:
xbutil examine
# 如果看到类似下面的输出,说明XRT工作正常
System Configuration
OS: Ubuntu 20.04
XRT: 2.14.0
XOCL: 2.14.0
2.3 目标平台(Platform)导入
Platform就是你的硬件目标板。它包含了板级描述、内存映射、时钟配置等信息。Vitis官方提供了很多现成的Platform,比如Xilinx Alveo系列、Zynq系列。
获取Platform:
- 官方平台:从Xilinx官网下载(如xilinx_u250_gen3x16_xdma_2_1_202010_1)
- 自定义平台:用Vivado生成(后面章节会讲)
导入Platform到Vitis:
# 方法一:通过Vitis GUI
# 打开Vitis -> Xilinx -> Add Platform -> 选择.xpfm文件
# 方法二:命令行
vitis -platform -add /path/to/your/platform.xpfm
关键点:Platform文件是.xpfm格式。它包含了硬件描述、软件驱动、设备树等。导入后,你可以在Vitis的Platform视图中看到它。
检查Platform是否导入成功:
# 在Vitis终端中
platforminfo /opt/xilinx/platforms/xilinx_u250_gen3x16_xdma_2_1_202010_1
# 输出应该包含:
# Platform: xilinx_u250_gen3x16_xdma_2_1_202010_1
# Software Emulation: Supported
# Hardware Emulation: Supported
# Hardware: Supported
2.4 硬件描述文件(XSA)准备
XSA(Xilinx Shell Archive)是Vivado导出的硬件设计文件。它包含了你的PL端逻辑、PS端配置、时钟、复位、中断等信息。说白了,XSA就是你的硬件“蓝图”。
生成XSA的流程:
- 在Vivado中完成硬件设计(Block Design或RTL)
- 综合、实现、生成比特流
- 导出硬件:File -> Export -> Export Hardware
- 勾选“Include bitstream”
- 保存为.xsa文件
经验之谈:导出XSA时一定要勾选“Include bitstream”。我刚开始做项目时忘了勾,结果Vitis一直报“No bitstream found”,查了半天才发现是这个问题。
XSA文件结构:
my_design.xsa
├── hw_handoff/
│ └── design_1.hwh # 硬件握手文件
├── ps7_init.c # PS初始化代码
├── ps7_init.h
├── ps7_init.tcl
└── xsa.xml # 元数据描述
在Vitis中使用XSA:
# 创建新工程时选择XSA
vitis -workspace ./workspace -create -name my_project -platform xilinx_u250_gen3x16_xdma_2_1_202010_1 -hw ./my_design.xsa
避坑指南:XSA文件路径不要包含中文或特殊字符。我曾经把项目放在“桌面/项目”文件夹下,结果Vitis死活识别不了。改成英文路径就好了。
2.5 环境验证:跑一个Hello World
环境搭好了,咱们来验证一下。写一个最简单的Host程序,看看能不能和硬件通信。
// hello_world.cpp
#include "xrt/xrt_bo.h"
#include "xrt/xrt_device.h"
#include "xrt/xrt_kernel.h"
#include <iostream>
int main() {
// 获取设备
auto device = xrt::device(0);
std::cout << "Device found: " << device.get_info<xrt::info::device::name>() << std::endl;
// 加载XCLBIN
auto uuid = device.load_xclbin("binary_container_1.xclbin");
std::cout << "XCLBIN loaded, UUID: " << uuid.to_string() << std::endl;
// 创建BO(Buffer Object)
auto bo = xrt::bo(device, 1024, xrt::bo::flags::normal, 0);
std::cout << "BO created, size: 1024 bytes" << std::endl;
std::cout << "Environment setup successfully!" << std::endl;
return 0;
}
编译运行:
# 编译
g++ -o hello_world hello_world.cpp -I$XILINX_XRT/include -L$XILINX_XRT/lib -lxrt_coreutil
# 运行
./hello_world
# 预期输出
Device found: xilinx_u250_gen3x16_xdma_2_1_202010_1
XCLBIN loaded, UUID: 12345678-1234-1234-1234-123456789abc
BO created, size: 1024 bytes
Environment setup successfully!
如果报错:检查XRT环境变量是否设置正确,用 echo $XILINX_XRT 查看。如果为空,重新source一下setup.sh。
2.6 本章知识体系
下面这张图帮你理清整个环境搭建的脉络:
这张图展示了整个环境搭建的层次关系。Vitis、XRT、Platform/XSA三者缺一不可。只有全部配置正确,你才能跑通那个Hello World程序。
最后说一句:环境搭建是最枯燥但最重要的一步。我见过太多人跳过这一步直接写代码,结果后面花了两倍时间回来排查环境问题。磨刀不误砍柴工,把这一步走稳了,后面就顺畅了。
可可精品资料库