Vitis AI修炼秘籍(4)——DPU IP的系统集成

本文转载自:亦梦云烟的博客

一. 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登录到开发板中。

最新文章

最新文章