基于PYNQ的Overlay与AXI开发——PYNQ-z2试用报告3
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板的电源管理起了很大的兴趣。在查阅原理图时,很开心学习到了这种控制方式。


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卡。
电路板设置:

为电路板供电,一旦启动,我们就可以使用浏览器连接到PYNQ板。
在新的浏览器窗口中输入地址http://pynq:9090/
进入登录页面,输入用户名Xilinx。从那里将看到Juypter笔记本的欢迎页面:

从Juypter Notebooks中运行Python程序。通过单击大多数Notebooks页面上的“running”选项卡,可以看到当前在PYNQ上运行的程序。
因为最初我没有在Notebooks运行,所以现在点击会显示没有正在运行的笔记本电脑。

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

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


将文本标记为Code,Markdown,Heading或Raw NBConvert
输入代码:print(“hello world”),并点击播放按钮来运行这个非常短的程序。

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存储库。

下载后,除了解压之外,要在Vivado中重新创建项目。(必须使用Vivado的正确版本)
当前版本的PYNQ基础overlay是使用Vivado 2018.2版本创建的,因此我重新从Xilinx官网下载了Vivado 2018.2。安装了正确的Vivado版本后,打开base目录:

在此目录中,具有从命令shell运行的make文件,这个make文件是PYNQ板的overlay设计的基础。
因为我使用的是Linux,使用此命令打开:
->vivado -mode batch -source $ {PYNQ_ROOT} /Pynq-Z2/base/base.tcl
->make -f makefile
这将重建Vivado项目,这里参照了 Xilinx用户指南UG1198,其中介绍了如何在系统上配置Make。
完成后,将看到基本叠加层

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


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

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

从IP生成的4个寄存器

2、调用加法器IP


添加我们的IP核

“Run Connection Automation”


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

可以看到基地址是0x43C00000。我将在通过SDK访问寄存器时使用此值。
3、设计创建HDL包装并生成bit流文件。

4、 启动SDK
File -> New -> Application Project.

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

5、在硬件上运行代码
Run -> Run -> launch on hardware (GDB) -> OK
总结
这次试用,我最大的收获就是学习到了PYNQ的开源社区开发和共享overlays。这些都可通过GitHub获得,非常方便。
不足:对GitHub的使用,我发现了自己只会使用,不会创建。对python的不了解,制约了更近一步的应用,在Jupyter上开发也让我了解到新的环境与挑战,这些都疯狂的催促着我要充电,以后我也会多多学习我们双杰老师的课程和摩尔吧的课程,多多充电。
--end--
声明:本文章由网友投稿作为教育分享用途,如有侵权原作者可通过邮件及时和我们联系删除:freemanzk@qq.com