本文转载自:亦梦云烟的博客
一. Vitis硬件平台简介
Xilinx提供了一些基础的开发板平台内嵌在Vitis IDE中,用户可以直接从这些platform创建应用程序。但如果是自定义的板卡或者想要部署更多加速器IP、配置不同的性能,我们就需要创建完全自定义的硬件平台。本文介绍创建Vitis AI硬件平台的基本步骤。
硬件平台创建简介
创建一个Vitis嵌入式平台通常有三步:创建硬件接口、创建软件组件和打包平台。当然每一步也都需要进行相应的准备工作和测试。整个流程如下图所示:
各阶段简要描述如下:
二. DPU IP集成
2.1 添加时钟
DPU IP中有三种时钟域:寄存器配置、数据控制和计算单元。这三种时钟可以根据需要进行独立配置,因此相应的输入时钟和复位必须配置正确。
Register Clock
s_axi_clk:用于配置寄存器,通过S_AXI接口接收DPU配置信息,可以与M-AXI时钟共用或配置成独立时钟,DPU配置寄存器的更新频率非常低,通常配置为100MHz。
Data Controller Clock
m_axi_dpu_aclk:DPU IP数据流调度所用的时钟,数据在DPU与外部内存之间发生在数据控制时钟域,所以需要连接到AXI_MM主时钟上。
Computation Clock
dpu_2x_aclk: DSP计算模块的时钟,运行在数据控制模块两倍频的时钟上,这两个时钟也必须边沿对齐。
通过Clock Wizard IP添加时钟配置:
将s_axi_aclk设置为100MHz, m_axi_dpu_aclk设置为200MHz,因此dpu_2x_aclk设置为400MHz。该IP配置为下图所示的方式:
2.2 添加DPU IP
2.2.1 DPU IP配置
从第三方库添加DPU IP,下载地址:zcu102-dpu-trd,在system_desgin中添加好Clocking Wizard和DPU之后,进行接口连接。
时钟需要连接到对应的DPU端口,连接完成后如下图所示。
设置DPU的参数:
注意,ElementWise Multiply不能使能,因为ZYNQ没有DSP48E2,如果选择了ElementWise Multiply,可能会出现编译错误。另外Arch of DPU只能选择B1024以下的规格,否则资源不够。
2.2.2 分配寄存器
DPU最少需要分配16MB内存空间,DPU的从机接口可以连接到任意可以分配地址的CPU主机接口。
注意:DPU的起始地址必须在16MB地址空间之内,并且linux驱动和device tree中的配置与vivado中的保持一致
分配完地址的DPU如下图所示:
编译完成后,导出bit流,在Petalinux中制作Linux系统镜像。
三. Linux驱动与文件系统
XRT提供了Yocto编译Linux文件系统的动态库与设备驱动,在制作Linux镜像之前需要安装Xilinx XRT和PetaLinux。
3.1 XRT环境搭建
Xilinx Runtime library(XRT)是面向FPGA/ACAP设备的开源软件,用户可以使用python, C/C++来编写主机端的代码,通过XRT来调用FPGA/ACAP设备,XRT是Vitis和Alveo解决方案的关键组件。
用户应用程序是由C/C++/OpenCL或者Python编写,设备端代码用C/C++/OpenCL,VHDL或Verilog硬件描述语言编写。XRT在系统中的位置如下图所示。
下载XRT代码:https://gitee.com/mirrors_Xilinx/XRT?_from=gitee_search
Step 1. 安装XRT依赖库
$ sudo/src/runtime_src/tools/scripts/xrtdeps.sh
Step 2. 编译XRT Runtime
$ cd build $ ./build.sh
Step 3. 打包Ubuntu上的DEB
$ cd build/Release $ make package $ cd ../Debug $ make package
Step 4. 安装XRT
编译完成后将在Debug/Release目录下生成ubuntu安装包,选择对应的包进行安装。
$ sudo dpkg -i xrt_<version>.deb
安装完成之后输出如下信息:
depmod................ DKMS: install completed. Finished DKMS common.postinst Loading new XRT Linux kernel modules Installing MSD / MPD daemons
3.1 Petalinux构建Linux内核
从Xilinx官网下载PetaLinux,注意版本,本文使用的是Peta linux 2020.2.具体的安装与基本操作可参考PetaLinux学习01-开发环境搭建与PetaLinux的安装.note。
将Vivado导出的硬件描述文件复制到Ubuntu中,这些文件可以在Vitis project的export目录中找到,文件列举如下:
使用petalinux命令来创建linux相关文件:
step1. 创建Petalinux project
$ petalinux-create --type project --template zynq --name ZYNQ7020DPU
step2. 导入硬件信息
$ cd ZYNQ7020DPU $ petalinux-config --get-hw-description=../ZYNQ7020Platform/hw
此时会弹出Linux的kconfig图形配置界面。接下来根据需要进行配置。
可以使用默认配置。
编译完成之后:
$ petalinux-config --get-hw-description=../ZYNQ7020Platform/hw INFO: Sourcing build tools INFO: Getting hardware description... INFO: Rename zynq7020_design_wrapper.xsa to system.xsa [INFO] Generating Kconfig for project [INFO] Menuconfig project configuration written to <Path>/ZYNQ7020DPU/project-spec/configs/config *** End of the configuration. *** Execute 'make' to start the build or try 'make help'. [INFO] Extracting yocto SDK to components/yocto [INFO] Sourcing build environment [INFO] Generating kconfig for Rootfs [INFO] Silentconfig rootfs [INFO] Generating plnxtool conf [INFO] Adding user layers [INFO] Generating workspace directory
step3. 配置文件系统,内核,设备树和u-boot
运行rootfs的配置:
$ petalinux-config -c rootfs
选择User Packages, 选择所有列出的库。
使能OpenSSH并且关闭dropbear, Dropbear是Vitis嵌入式平台的SSH默认工具,如果使用OpenSSH替代Dropbear,数据传输速度可以提升4倍。还是在rootfs的配置界面,找到顶层的Image Features,关闭ssh-server-dropbear并选择ssh-server-openssh。
进入到FileSytem Packages -> misc -> packagegroup-core-ssh-dropbear,关闭packagegroup-core-ssh-dropbear.返回上两级目录,进入console -> network -> openssh,选择openssh, open-sftp-server, openssh-sshd, openssh-scp。
打开包管理:Image Features -> package-management和debug_tweaks
更新设备树:
在project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi文件中追加以下内容:
&amba { zyxclmm_drm { compatible = "xlnx,zocl"; status = "okay"; interrupt-parent = <&axi_intc_0>; interrupts = <0 4>, <1 4>, <2 4>, <3 4>, <4 4>, <5 4>, <6 4>, <7 4>, <8 4>, <9 4>, <10 4>, <11 4>, <12 4>, <13 4>, <14 4>, <15 4>, <16 4>, <17 4>, <18 4>, <19 4>, <20 4>, <21 4>, <22 4>, <23 4>, <24 4>, <25 4>, <26 4>, <27 4>, <28 4>, <29 4>, <30 4>, <31 4>; }; }; &axi_intc_0 { xlnx,kind-of-intr = < 0x0>; xlnx,num-intr-inputs = < 0x20>; }; &sdhci1 { no-1-8-v; disable-wp; };
添加EXT4 rootfs支持
$ petalinux-config
进入Image Packaging Configuration->Root File System Type, 选择EXT4
同时需要配置bootargs,让uboot挂载EXT4分区。
进入DTG seeting -> Kernel Bootargs -> generate boot args automatically设置成NO,并且选择User Set Kernel Bootargs,输入:
earlycon console=ttyPS0,115200 clk_ignore_unused root=/dev/mmcblk0p2 rw rootwait cma=512M
root=/dev/mmcblk0p2意思是SD卡第二个分区,EXT4格式
step4. 编译petalinux
$ petalinux-build
编译输出文件在工程目录images/linux目录下:
创建sysroot
$ petalinux-build --sdk
生成的sdk.sh在linux/image目录中。
step5. 编译启动文件BOOT.BIN
$ petalinux-package --boot --format BIN --fsbl images/linux/zynq_fsbl.elf --u-boot images/linux/u-boot.elf --fpga images/linux/system.bit
经过上面五步之后已经成功编译出可以启动的linux系统镜像。将BOOT.BIN,rootfs.cpio.gz, image.ub, boot.scr, 放在SD卡根目录即可启动。
默认情况下用户名与密码都是root。如果开发板连接了网线与路由,Linux系统启动后会自动分配IP地址,之后也可以通过SSH登录到开发板中。