跳转到主要内容

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

judy 提交于

本文转载自:<span id="profileBt"><a href="https://blog.csdn.net/u010580016/article/details/116278923">亦梦云烟的博客</a>…;

一. Vitis硬件平台简介
Xilinx提供了一些基础的开发板平台内嵌在Vitis IDE中,用户可以直接从这些platform创建应用程序。但如果是自定义的板卡或者想要部署更多加速器IP、配置不同的性能,我们就需要创建完全自定义的硬件平台。本文介绍创建Vitis AI硬件平台的基本步骤。

硬件平台创建简介

创建一个Vitis嵌入式平台通常有三步:创建硬件接口、创建软件组件和打包平台。当然每一步也都需要进行相应的准备工作和测试。整个流程如下图所示:
<center><img src="http://xilinx.eetrend.com/files/2021-09/%E5%8D%9A%E5%AE%A2/100553606-22…; alt=""></center>

各阶段简要描述如下:
<img src="http://xilinx.eetrend.com/files/2021-09/%E5%8D%9A%E5%AE%A2/100553606-22…; alt="">

二. DPU IP集成
2.1 添加时钟
DPU IP中有三种时钟域:寄存器配置、数据控制和计算单元。这三种时钟可以根据需要进行独立配置,因此相应的输入时钟和复位必须配置正确。
<center><img src="http://xilinx.eetrend.com/files/2021-09/%E5%8D%9A%E5%AE%A2/100553606-22…; alt=""></center>

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配置为下图所示的方式:
<center><img src="http://xilinx.eetrend.com/files/2021-09/%E5%8D%9A%E5%AE%A2/100553606-22…; alt=""></center>

2.2 添加DPU IP
2.2.1 DPU IP配置

从第三方库添加DPU IP,下载地址:<a href="https://www.xilinx.com/member/forms/download/design-license-xef.html?fi…;,在system_desgin中添加好Clocking Wizard和DPU之后,进行接口连接。

时钟需要连接到对应的DPU端口,连接完成后如下图所示。
<center><img src="http://xilinx.eetrend.com/files/2021-09/%E5%8D%9A%E5%AE%A2/100553606-22…; alt=""></center>

设置DPU的参数:
<img src="http://xilinx.eetrend.com/files/2021-09/%E5%8D%9A%E5%AE%A2/100553606-22…; alt="">

注意,ElementWise Multiply不能使能,因为ZYNQ没有DSP48E2,如果选择了ElementWise Multiply,可能会出现编译错误。另外Arch of DPU只能选择B1024以下的规格,否则资源不够。

2.2.2 分配寄存器
DPU最少需要分配16MB内存空间,DPU的从机接口可以连接到任意可以分配地址的CPU主机接口。

注意:DPU的起始地址必须在16MB地址空间之内,并且linux驱动和device tree中的配置与vivado中的保持一致

分配完地址的DPU如下图所示:
<center><img src="http://xilinx.eetrend.com/files/2021-09/%E5%8D%9A%E5%AE%A2/100553606-22…; alt=""></center>

编译完成后,导出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在系统中的位置如下图所示。
<center><img src="http://xilinx.eetrend.com/files/2021-09/%E5%8D%9A%E5%AE%A2/100553606-22…; alt=""></center>

下载XRT代码:https://gitee.com/mirrors_Xilinx/XRT?_from=gitee_search

Step 1. 安装XRT依赖库

<pre>$ sudo <XRT>/src/runtime_src/tools/scripts/xrtdeps.sh</pre>

Step 2. 编译XRT Runtime
<pre>$ cd build $ ./build.sh</pre>

Step 3. 打包Ubuntu上的DEB
<pre>$ cd build/Release
$ make package
$ cd ../Debug
$ make package</pre>

Step 4. 安装XRT

编译完成后将在Debug/Release目录下生成ubuntu安装包,选择对应的包进行安装。
<center><img src="http://xilinx.eetrend.com/files/2021-09/%E5%8D%9A%E5%AE%A2/100553606-22…; alt=""></center>

<pre>$ sudo dpkg -i xrt_&lt;version&gt;.deb</pre>

安装完成之后输出如下信息:
<pre>depmod................ DKMS:
install completed. Finished DKMS common.postinst Loading new XRT Linux kernel modules Installing MSD / MPD daemons</pre>

3.1 Petalinux构建Linux内核

从Xilinx官网下载PetaLinux,注意版本,本文使用的是<a href="https://china.xilinx.com/member/forms/download/xef.html?filename=petali… linux 2020.2</a>.具体的安装与基本操作可参考PetaLinux学习01-开发环境搭建与PetaLinux的安装.note。

将Vivado导出的硬件描述文件复制到Ubuntu中,这些文件可以在Vitis project的export目录中找到,文件列举如下:
<center><img src="http://xilinx.eetrend.com/files/2021-09/%E5%8D%9A%E5%AE%A2/100553606-22…; alt=""></center>

使用petalinux命令来创建linux相关文件:

step1. 创建Petalinux project
<pre>$ petalinux-create --type project --template zynq --name ZYNQ7020DPU</pre>

step2. 导入硬件信息
<pre>$ cd ZYNQ7020DPU
$ petalinux-config --get-hw-description=../ZYNQ7020Platform/hw</pre>

此时会弹出Linux的kconfig图形配置界面。接下来根据需要进行配置。
<center><img src="http://xilinx.eetrend.com/files/2021-09/%E5%8D%9A%E5%AE%A2/100553606-22…; alt=""></center>

可以使用默认配置。

编译完成之后:
<pre>$ 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 &lt;Path&gt;/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</pre>

step3. 配置文件系统,内核,设备树和u-boot
<center><img src="http://xilinx.eetrend.com/files/2021-09/%E5%8D%9A%E5%AE%A2/100553606-22…; alt=""></center>

运行rootfs的配置:
<pre>$ petalinux-config -c rootfs</pre>

选择User Packages, 选择所有列出的库。
<center><img src="http://xilinx.eetrend.com/files/2021-09/%E5%8D%9A%E5%AE%A2/100553606-22…; alt=""></center>

使能OpenSSH并且关闭dropbear, Dropbear是Vitis嵌入式平台的SSH默认工具,如果使用OpenSSH替代Dropbear,数据传输速度可以提升4倍。还是在rootfs的配置界面,找到顶层的Image Features,关闭ssh-server-dropbear并选择ssh-server-openssh。
<center><img src="http://xilinx.eetrend.com/files/2021-09/%E5%8D%9A%E5%AE%A2/100553606-22…; alt=""></center>

进入到FileSytem Packages -> misc -> packagegroup-core-ssh-dropbear,关闭packagegroup-core-ssh-dropbear.返回上两级目录,进入console -> network -> openssh,选择openssh, open-sftp-server, openssh-sshd, openssh-scp。
<center><img src="http://xilinx.eetrend.com/files/2021-09/%E5%8D%9A%E5%AE%A2/100553606-22…; alt=""></center>

打开包管理:Image Features -> package-management和debug_tweaks
<center><img src="http://xilinx.eetrend.com/files/2021-09/%E5%8D%9A%E5%AE%A2/100553606-22…; alt=""></center>

更新设备树:

在project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi文件中追加以下内容:
<pre>&amba {
zyxclmm_drm {
compatible = "xlnx,zocl";
status = "okay";
interrupt-parent = <&axi_intc_0>;
interrupts = &lt;0 4&gt;, &lt;1 4&gt;, &lt;2 4&gt;, &lt;3 4&gt;,
&lt;4 4&gt;, &lt;5 4&gt;, &lt;6 4&gt;, &lt;7 4&gt;,
&lt;8 4&gt;, &lt;9 4&gt;, &lt;10 4&gt;, &lt;11 4&gt;,
&lt;12 4&gt;, &lt;13 4&gt;, &lt;14 4&gt;, &lt;15 4&gt;,
&lt;16 4&gt;, &lt;17 4&gt;, &lt;18 4&gt;, &lt;19 4&gt;,
&lt;20 4&gt;, &lt;21 4&gt;, &lt;22 4&gt;, &lt;23 4&gt;,
&lt;24 4&gt;, &lt;25 4&gt;, &lt;26 4&gt;, &lt;27 4&gt;,
&lt;28 4&gt;, &lt;29 4&gt;, &lt;30 4&gt;, &lt;31 4&gt;;
};
};

&axi_intc_0 {
xlnx,kind-of-intr = &lt; 0x0&gt;;
xlnx,num-intr-inputs = &lt; 0x20&gt;;
};

&sdhci1 {
no-1-8-v;
disable-wp;
};</pre>

添加EXT4 rootfs支持
<pre>$ petalinux-config</pre>

进入Image Packaging Configuration->Root File System Type, 选择EXT4
<center><img src="http://xilinx.eetrend.com/files/2021-09/%E5%8D%9A%E5%AE%A2/100553606-22…; alt=""></center>

同时需要配置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
<pre>$ petalinux-build</pre>

编译输出文件在工程目录images/linux目录下:
<center><img src="http://xilinx.eetrend.com/files/2021-09/%E5%8D%9A%E5%AE%A2/100553606-22…; alt=""></center>

创建sysroot
<pre>$ petalinux-build --sdk</pre>

生成的sdk.sh在linux/image目录中。

step5. 编译启动文件BOOT.BIN
<pre>$ petalinux-package --boot --format BIN --fsbl images/linux/zynq_fsbl.elf --u-boot images/linux/u-boot.elf --fpga images/linux/system.bit</pre>

经过上面五步之后已经成功编译出可以启动的linux系统镜像。将BOOT.BIN,rootfs.cpio.gz, image.ub, boot.scr, 放在SD卡根目录即可启动。
<center><img src="http://xilinx.eetrend.com/files/2021-09/%E5%8D%9A%E5%AE%A2/100553606-22…; alt=""></center>

默认情况下用户名与密码都是root。如果开发板连接了网线与路由,Linux系统启动后会自动分配IP地址,之后也可以通过SSH登录到开发板中。
<center><img src="http://xilinx.eetrend.com/files/2021-09/%E5%8D%9A%E5%AE%A2/100553606-22…; alt=""></center>