本文主要介绍了如何将 PYNQ 官方给出的 ZCU104 相关配置修改并重新制作 ZCU106 的 PYNQ 的启动镜像。
0. 系统配置和硬件信息
- 操作系统:Ubuntu 18.04.6 LTS、Windows 11(用来烧写制作好的镜像)
- 硬件:Xilinx ZCU106
- PYNQ 版本:v2.7.0
- 软件:Linux -(Vivado 2020.2、Vitis 2020.2、PetaLinux 2020.2、Xilinx HDMI License);Win -(Win32DiskManager)
1. 下载必需软件
访问 Xilinx 官方下载网站,下载 2020.2 版本的 Vitis、PetaLinux Tools、ZCU106 BSP 文件(在 PetaLinux Tools 的页面下)。
访问 PYNQ 官方网站,下载 v2.7.0 的 rootfs(aarch64、arm),用来制作镜像。
2. 制作启动镜像(最好科学上网)
# 拉取 PYNQ 官方 repo 并切换至 2.7 版本
git clone https://github.com/Xilinx/PYNQ.git
cd PYNQ
git checkout image\_v2.7
# 检查相关环境
cd ./sdbuild/scripts
./setup_host.sh
# 将 ZCU104 的相关文件文件复制一份到 ZCU106 文件夹中
cd ../..
cp -rf ./boards/ZCU104 ./boards/ZCU106
rm -rf ./boards/ZCU106/petalinux_bsp/
mv ./boards/ZCU106/ZCU104.spec ./boards/ZCU106/ZCU106.spec
接下来更改 ZCU106.spec 文件,修改后的内容如下:
ARCH_ZCU106 := aarch64 # 更改为想要烧写的架构 aarch64 or arm
BSP_ZCU106 := xilinx-zcu106-v2020.2-final.bsp # 更改为 106 的 bsp 文件
FPGA_MANAGER_ZCU106 := 1 # 该值为 1 则表示为不会在启动前就配置比特流,反之则为 0
# 所需要的 package,博主使用了下面四个 package,其中 sensorconf 主要提供了更多的 power rails 用于 PS/PL 的功耗测量,其他三个比较有必要(主要支持了自动配置 ip 地址,运行自己的 ip 核等)。
STAGE4_PACKAGES_ZCU106 := xrt pynq ethernet sensorconf
接下来准备好之前下载过的文件,source 环境变量:
# 把之前下载好的 bsp 文件和 rootfs 文件放到对应的文件夹下
cp ~/xilinx-zcu102-v2020.2-final.bsp ./boards/ZCU106/
mkdir ./sdbuild/prebuilt
cp ~/focal.aarch64.2.7.0_2021_11_17.tar.gz ./sdbuild/prebuilt
# 配置相关环境变量
PATH=/opt/qemu/bin:/opt/crosstool-ng/bin:$PATH
source $Your_Xilinx_Path/Xilinx/Vitis/2020.2/settings64.sh
source $Your_Xilinx_Path/Xilinx/Vivado/2020.2/settings64.sh
source $Your_Xilinx_Path/Xilinx/petalinux/2020.2/settings.sh
然后编译镜像(其中综合 IP 的时间较长,耐心等待):
cd ./sdbuild/
make boot_files BOARDS=ZCU106
make images BOARDS=ZCU106 PREBUILT=./prebuilt/focal.aarch64.2.7.0_2021_11_17.tar.gz
3. 中途可能出现的问题
(1) Vivado 生成 IP 的问题(Error: Failed to generate IP......)
下载 Xilinx 官方补丁 (注意:补丁里的 python 文件在运行的时候要和其 README 中所说的路径相同,不然补丁会找不到相关的 tcl 文件而导致运行失败)
(2) Xilinx HDMI IP License 的问题:
在综合 HDMI 相关 IP 时,如果没有成功导入 License 会报错,需要访问官方 HDMI IP License 网站获取 License,把 .lic 文件导入 Xilinx License Manager 中。
(3) HDMI IP 在 make 时出现了如下的类似错误:
make PYNQ_BUILD_ARCH=aarch64 -C pynq/lib/_pynq/_displayport/
make[1]: Entering directory '/tmp/pip-req-build-qwdx2lh8/pynq/lib/_pynq/_displayport'
/usr/lib/ccache/g++ -fPIC -I/usr/include/libdrm -c -g -std=c++11 displayport.cpp
/usr/lib/ccache/g++ -shared -fPIC -rdynamic displayport.o -ldrm -o libdisplayport.so
rm *.o
make[1]: Leaving directory '/tmp/pip-req-build-qwdx2lh8/pynq/lib/_pynq/_displayport'
copying pynq/lib/_pynq/_displayport/libdisplayport.so -> build/lib/pynq/lib/video
make PYNQ_BUILD_ARCH=aarch64 -C pynq/lib/_pynq/_xhdmi/
make[1]: Entering directory '/tmp/pip-req-build-qwdx2lh8/pynq/lib/_pynq/_xhdmi'
make -C .. -f embeddedsw_lib.mk
make[2]: Entering directory '/tmp/pip-req-build-qwdx2lh8/pynq/lib/_pynq'
make[2]: *** No rule to make target 'embeddedsw', needed by '_xhdmi/libxhdmi.so'. Stop.
make[2]: Leaving directory '/tmp/pip-req-build-qwdx2lh8/pynq/lib/_pynq'
make[1]: *** [Makefile:7: all] Error 2
make[1]: Leaving directory '/tmp/pip-req-build-qwdx2lh8/pynq/lib/_pynq/_xhdmi'
error: command 'make' failed with exit status 2
解决方法:make clean,尝试重新 make。
4. 镜像烧写
镜像制作完成后,可以在 sdbuild/output 下的文件找到 .img 文件,将镜像文件通过 Win32DiskManager 写入进需要插进 ZCU106 的 SD 卡中即可。