基于PYNQ的Overlay与AXI开发——PYNQ-z2试用报告3

网友投稿 2019-03-14 11:36

2018年11月我购买了《神经网络的快速搭建训练到FPGA实现》的课程,很幸运,我获得了试用PYNQ-z2开发板使用的机会。

这个相当令人兴奋的基于Zynq的主板,它结合了Zynq的功能和Python,以及它采用了相当鲜艳的粉红色真是让人心动不已。

了解PYNQ和获取PYNQ的开发板资料

PYNQ的python生产力

https://pynq.readthedocs.io/en/latest/index.html

TUL PYNQ-Z2产品公告(PDF)

http://www.tul.com.tw/download/PYNQ-Z2_PA_v3.pdf

PYNQ-Z2用户手册(PDF)

https://d2m32eurp10079.cloudfront.net/Download/pynqz2_user_manual_v1_0.pdf

原理图(PDF)

http://www.tul.com.tw/download/TUL_PYNQ%20Schematic_R12.pdf

在刚刚开始试用时,我时常会犯一个错误:每次将外部12V电源接上(本开发板电源支持USB或者7V-15V的外接电源,),忘记将跳线跳到REG上。这让我对PYNQ板的电源管理起了很大的兴趣。在查阅原理图时,很开心学习到了这种控制方式。

https://cdn.china-scratch.com/timg/190316/1136355945-0.jpghttps://cdn.china-scratch.com/timg/190316/1136351357-1.jpg

PYNQ开发板开发流程

1、PYNQ是一个开源项目,旨在适用于任何计算平台和操作系统。可以采用开源Jupyter笔记本基础架构,直接在Zynq设备的ARM处理器上运行Interactive Python(IPython)内核和Web服务器。Web服务器代理通过一套基于浏览器的工具访问内核,这些工具提供仪表板,bash终端,代码编辑器和Jupyter笔记本。

2、同时,硬件方面,PYNQ采用板载Xilinx Zynq Z-7020 SoC,对于Zynq芯片的开发流程也要了解。由于Zynq将cpu与FPGA集成在了一起,需要设计ARM的操作系统应用程序和设备的驱动程序,又需要设计FPGA部分的硬件逻辑设计。

具体流程如下:

  • 在 Vivado.上新建工程,增加一个嵌入式的源文件;

  • 添加和配置PS和PL部分基本的外设,或需要添加自定义的外设;

  • 生成顶层HDL文件,并添加约束文件。再编译生成比特流文件( *.bit 24);

  • 导出硬件信息到 SDK软件开发环境,在SDK环境里可以编写一些调试软件验证硬件和软件,结合比特流文件单独调试ZYNQ系统;

  • 在SDK里生成FSBL文件;

  • 在VMware虚拟机里生成u-boot.elf、bootloader 镜像;

  • 在SDK里通过FSBL文件,比特流文件system.bit和u-boot.elf文件生成一个BOOT.bin文件;

  • 在VMware里生成Ubuntu的内核镜像文件Zimage和Ubuntu的根文件系统。另外还需要要对FPGA自定义的IP编写驱动;

  • 把BOOT、内核、设备树、根文件系统文件放入到SD卡中,启动开发板电源, Linux操作系统会从SD卡里启动。

采用开源Jupyter Notebooks基础架构完成“hello world”

在提供的软件环境中,Pynq软件包支持PYNQ硬件和接口。该软件包可以使用Python语言驱动PYNQ的GPIO,视频和音频接口以及各种PMOD板。

我将会使用Jupyter Notebooks开发和记录的代码中使用此包。

Jupyter Notebooks服务器在运行在PYNQ的Zynq SoC上的Linux内核中运行。可以使用这个接口来开发我的PYNQ应用程序。

JupyterNotebooks和overlay是PYNQ开发方法的核心,我将会为电路板供电并让第一个“hello world”程序运行起来。

首先是配置一张带有最新内核映像的SD卡,下载地址如下:

https://files.digilent.com/Products/PYNQ/pynq_z1_image_2016_09_14.zip

首先是配置一张带有最新内核映像的SD卡,下载地址如下:

https://files.digilent.com/Products/PYNQ/pynq_z1_image_2016_09_14.zip

下载后,使用Win Disk Imager将映像写入SD卡。

电路板设置:

https://cdn.china-scratch.com/timg/190316/11363B5P-2.jpg

为电路板供电,一旦启动,我们就可以使用浏览器连接到PYNQ板。

在新的浏览器窗口中输入地址http://pynq:9090/

进入登录页面,输入用户名Xilinx。从那里将看到Juypter笔记本的欢迎页面:

https://cdn.china-scratch.com/timg/190316/1136361193-3.jpg

从Juypter Notebooks中运行Python程序。通过单击大多数Notebooks页面上的“running”选项卡,可以看到当前在PYNQ上运行的程序。

因为最初我没有在Notebooks运行,所以现在点击会显示没有正在运行的笔记本电脑。

https://cdn.china-scratch.com/timg/190316/11363C3I-4.jpg

单击示例页面,然后单击“new”。从右侧的图标中选择“notebooks Python 3”:

https://cdn.china-scratch.com/timg/190316/1136364U2-5.jpg

创建一个名为untitled的新Notebook,点击它即可完成任意名称的更改。

https://cdn.china-scratch.com/timg/190316/11363C0L-6.jpghttps://cdn.china-scratch.com/timg/190316/1136363Z3-7.jpg

将文本标记为Code,Markdown,Heading或Raw NBConvert

输入代码:print(“hello world”),并点击播放按钮来运行这个非常短的程序。

https://cdn.china-scratch.com/timg/190316/11363L453-8.jpg

PYNQ的硬件overlay

overlay是一种加载到Zynq SoC可编程逻辑(PL)中的设计。可以为加速可编程逻辑中的功能提供设计或使用PL提供接口连接。

了解overlay的重要之处在于,没有涉及到Python-to-PL高级综合过程。相反,我们使用标准的Xilinx设计方法(SDSoC,Vivado或Vivado HLS)开发overlay。一旦我们为overlay创建了bit流文件,我们就会将其集成到Pynq架构中,并使用Python建立所需的参数用来通信。就像迄今为止看过的所有Zynq SoC一样,这很简单。

可以使用Vivado构建提供的位文件和其他文件轻松地与Python环境集成。使用Python MMIO类来实现这一点,它允许我们通过内存映射读取和写入与PL中的设计进行交互。PL中当前叠加的存储器映射是我们所需要的。当然,我们可以随时改变PL的内容,因为我们的应用程序需要加速PL中的功能。

我选择创建PYNQ硬件overlay的方法是使用现有的Vivado设计基础overlay作为起点,因此需要重新创建。

在初始overlay上建立新overlay的原因是因为提供的overlay预定义了Zynq SoC PS所需的所有配置并定义了PS-PL接口。

我们需要做的第一件事是从PYNQ GitHub页面下载设计文件。我们可以从存储库的顶层轻松下载或克隆GitHub存储库。

https://cdn.china-scratch.com/timg/190316/11363M5V-9.jpg

下载后,除了解压之外,要在Vivado中重新创建项目。(必须使用Vivado的正确版本)

当前版本的PYNQ基础overlay是使用Vivado 2018.2版本创建的,因此我重新从Xilinx官网下载了Vivado 2018.2。安装了正确的Vivado版本后,打开base目录:

https://cdn.china-scratch.com/timg/190316/11363M5C-10.jpg

在此目录中,具有从命令shell运行的make文件,这个make文件是PYNQ板的overlay设计的基础。

因为我使用的是Linux,使用此命令打开:

->vivado -mode batch -source $ {PYNQ_ROOT} /Pynq-Z2/base/base.tcl

->make -f makefile

这将重建Vivado项目,这里参照了 Xilinx用户指南UG1198,其中介绍了如何在系统上配置Make。

完成后,将看到基本叠加层

https://cdn.china-scratch.com/timg/190316/11363J9B-11.jpg

Overlay创建好后,我进行了AXI接口实现与互连。

在最简单的层面上,Zynq SoC的高性能AXI互连用于需要DMA将数据传输到DDR存储器或从DDR存储器传输数据的接口。对于PYNQ overlay,这些互连用于Arduino和PMOD端口以及视频流的跟踪缓冲区。

主通用AXI接口用于控制和配置设计中的其余块。最有趣的是,这些端口用于动态配置MicroBlaze BRAM。MicroBlaze处理器与PMODS和Arduino屏蔽端口通信,提供无缝接

在Vivado中重建了PYNQ的Zynq Z-7000 SoC集成硬件overlay,接下来就可以在Python编程环境中轻松使用它们。并且使用Python的C外部函数接口(CFFI)与其连接。

ZYNQ PS-PL AXI 加法器

Zynq PS-PL通信,即将操作数写入寄存器,可编程逻辑(PL)将执行求和操作,并将结果写入第三个寄存器,然后处理系统(PS)访问它们。

Vivado:2018.2

操作系统:Ubuntu 18.04

1、创建加法器IP

tools->create and package new IP -> Create a new AXI4 peripheral

https://cdn.china-scratch.com/timg/190316/11363R648-12.jpghttps://cdn.china-scratch.com/timg/190316/11363WA4-13.jpg

这将使IP具有4个寄存器,每个寄存器32位。我们只需要三个用于我们的目的,因为我们需要两个寄存器作为求和的操作数,第三个寄存器用于存储结果。

https://cdn.china-scratch.com/timg/190316/11363Q9E-14.jpg

单击完成后,将打开一个新的vivado窗口,其中包含您刚创建的IP的不同项目,并且即将进行一些调整。

打开所选文件进行编辑。

https://cdn.china-scratch.com/timg/190316/1136394O3-15.jpg

从IP生成的4个寄存器

https://cdn.china-scratch.com/timg/190316/113639BN-16.jpg

2、调用加法器IP

https://cdn.china-scratch.com/timg/190316/11363a242-17.jpghttps://cdn.china-scratch.com/timg/190316/1136393124-18.jpg

添加我们的IP核

https://cdn.china-scratch.com/timg/190316/113639A62-19.jpg

“Run Connection Automation”

https://cdn.china-scratch.com/timg/190316/1136393440-20.jpghttps://cdn.china-scratch.com/timg/190316/1136402246-21.jpg

转到地址编辑器选项卡以查看如何访问IP中的寄存器

https://cdn.china-scratch.com/timg/190316/1136401327-22.jpg

可以看到基地址是0x43C00000。我将在通过SDK访问寄存器时使用此值。

3、设计创建HDL包装并生成bit流文件。

https://cdn.china-scratch.com/timg/190316/1136404109-23.jpg

4、 启动SDK

File -> New -> Application Project.

https://cdn.china-scratch.com/timg/190316/113640D91-24.jpg

在项目资源管理器中,转到add_axi -> src ->右键单击以创建一个新的c文件(命名为testing.c)。

https://cdn.china-scratch.com/timg/190316/1136416039-25.jpg

5、在硬件上运行代码

Run -> Run -> launch on hardware (GDB) -> OK

总结

这次试用,我最大的收获就是学习到了PYNQ的开源社区开发和共享overlays。这些都可通过GitHub获得,非常方便。

不足:对GitHub的使用,我发现了自己只会使用,不会创建。对python的不了解,制约了更近一步的应用,在Jupyter上开发也让我了解到新的环境与挑战,这些都疯狂的催促着我要充电,以后我也会多多学习我们双杰老师的课程和摩尔吧的课程,多多充电。

--end--

声明:本文章由网友投稿作为教育分享用途,如有侵权原作者可通过邮件及时和我们联系删除:freemanzk@qq.com