距离上次pynq的基础设置一文已经过去蛮久了,难得还有人催我更新233那么今天就再来把玩一番。今天要做的事情是用pynq来搭一个数字识别的工程。

在正式开始介绍工程之前,让我花一点篇幅简单说下pynq的内容结构以及数字识别的原理。

1.pynq结构简介。

pynq这个板子的结构大概是介个样子的,我们知道普通的zynq是只有PS(即ARM)和PL(即FPGA)的,PYNQ就比较厉害了,在PS和PL的基础上自带一个linux,linux里面装好了python3.6、jupyter以及Overlay,jupyter就是一个python的编写软件,Overlay就理解成一个自动化的软件好了,他的作用就是根据tcl文件是指示来把FPGA内部的电路连成我们要的样子,就是个自动烧录代码和连电路的工具。

我光这么说可能大家不好理解,下面我以一个简单的加法器来演示一下在pynq上是怎么建工程并且运行的。先让大家有个直观的感受。

以上是我在学校做演示时用的PPT,首先我们在HLS软件里面将一个c语言的加法器代码adder.cpp打包成ip核,然后在vivado中新建一个工程,加入zynq和我们的ip核,接着就是仿真->综合->实现->生成bitstream文件。这样的流程完成之后,我们所得到的vivado工程的文件夹会变得比较大,因为里面包含了很多中间文件,我们只要记住一件事,就是一个工程跑完generate bitstream之后,pynq需要的只有两个东西,一个是tcl文件,一个是bit文件。我们只要把他们从vivado工程里面取出来,然后把他们命名成同样的名字,然后丢到pynq里面随便什么位置就可以了,如下图所示。

然后,我们可以在网页打开pynq的jupyter(具体过程上次的文章讲得很详细了,不记得就回去看看),在jupyter中输入

from pynq import Overlay

这话的意思相当于是把Overlay加载起来了,这就跟我们在电脑上点开一个软件一样的意思。

overlay=Overlay("我们在pynq中存放.bit文件的位置")

这话的意思就是让overlay这个软件按照.bit文件所描述的电路把FPGA连好,pynq在看到这话之后会自动在同一个路径下搜索tcl文件,tcl文件也找到了才能正确连电路,这也就是为什么我们需要把tcl和bit文件改成一样的名字的原因了。

2.图像识别简介。

本文意不在介绍图像识别,这里只非常简单地过一下。

卷积神经网络做图像识别主要分成四步,就是上图最上方写的那四步(1.生成卷积核 2.卷积 3.池化 4.全连接),上图中下方的那四点是这四步实际上分别对应的数学运算本质,本质来讲并不是特别复杂的运算,就是运算量大而已。

需要指出的是:

第一步,第四步运算是需要一些事先确定的参数的,确定这些参数的方法是机器学习,笼统而言是用TensorFlow之类的软件写好python程序,再丢给程序一堆图片,然后找一部显卡性能比较好的电脑上或者服务器上跑这个程序,跑个几天几夜就可以得到我们第一步和第四步所需要的参数。

第二步,第三步运算是根据已经得到的参数来进行两种运算,这两步是需要我们在pynq上通过连PFGA电路的方式来实现的,最终要得到的效果是我们在电脑上弄一张图片,在上头写一个数字,用python脚本来指挥FPGA跑一遍运算电路,就可以得到对这个数字识别的结果。

下面是一个讲解卷积神经网络的视频,有兴趣就看看,可以说是讲得很清晰明了了。

https://www.youtube.com/watch?v=FmpDIaiMIeA​www.youtube.com

3.搭建工程的过程。

(一)

首先要指出一点,我这个练习是买了moore8上蔡宇杰大佬的教学视频和代码来弄的,代码并不是我原创的,我只是在这里点一下用pynq开发工程的流程,一者是为了自己记录一下学习过程,二来也算是自发给蔡大佬打个广告吧233,为了保护他人的劳动成果,具体代码我是不会展示出来的。

1首先是开一个空文件夹,把h,cpp,testbench文件放进去,然后在HLS中新建一个工程,在向导中往工程加入cpp文件和testbench文件,不要忘了在向导中将cpp文件设置成TOP文件。只要h文件也在这个文件夹里,h文件会自动添加进来。

另外要说一下,我HLS综合卷积和池化函数用的都是20ns的周期,在向导中用系统默认的10ns池化函数是会出现时序违例的。

2对于我们要用电路实现的函数,我们希望可以把他的输入输出参数挂载到axi总线上,axi总线首先是一个总线,就像uart,i2c,spi那样。不了解硬件的孩子就把这玩意当做软件的fifo好了。

挂载的方法是点击函数代码右方的directive,这上头就会显示出函数的各个参数,右击这些参数,在上面可以选择insert directive,然后在弹出的界面先选类型是interface,接着就可以指定我们要把一个参数指定成axi的master端还是slave端,master端就是说这个参数是往外传的,slave端就是说这个参数是从外面传进这个函数的。

3接着在HLS中点击solution的export rtl就可以导出ip核了。

导出了之后,将来在vivado中只要在添加ip核的地方把我们这个hls工程所在的文件夹添加进来,vivado就会自动识别这个我们的ip核了。如果是用zedboard板子来搭项目,那么懂得刚才那些步骤就可以了。但是对于pynq的开发我们还需要知道一点,就是将来为了写python脚本,我们需要知道HLS将c++函数转成verilog的电路描述后,各个函数的参数被分配的axi上的地址是多少,这个内容是在工程中的这个位置。

现在只是提一下,将来用到会再详细说。

(二)搭建vivado工程

1.新建vivado工程。

在工程向导里面什么文件都不用加,直接一路ok到向导的最后一步,上一个文章我讲过怎么添加pynq的信息包到vivado里了,添加过后这里的最后一步就可以直接选择pynq板子。

2.添加block design需要的组件

点击左边的create block design选项。

可以看到右边一片空白的窗口,在窗口中点击+号,弹出的搜索框搜zynq processing system,这就是一个ARM核,添加进来就可以了。

添加了之后点击窗口的auto connection。由于之前在向导那里vivado已经知道pynq板子的信息了,所以这时候它就会自动把DDR3,IO口都连好,连好后窗口中是下面这个样子的。

接下来把我们生产的ip核添加到工程里来

3.设置PS端

由于我们在3.4中加入的arm核默认情况下是没有打开axi总线的master口的,所以我们需要手动打开master口。双击arm核,在如下界面这么选,就阔以了。

在这个界面下还要修改的是下面这个紫色框的位置,vivado跟hls一样,软件默认的时钟周期都是10ns,而在咱们这个例子中10ns是会时序违例的,所以要在这个地方将时序改成20ns,也就是紫框中的数字从原来是100改成50,意思是50Mhz,也就是20ns。当然这步在第一次做的时候肯定是不知道要改的,正常情况是做到后面综合或实现那一步,发现时序违例了才会回来这里改的。

4.连接block design的组件

接下来是再次点击窗口冒出来的自动连线。

5.create HDL wrapper

刚才相当于是在草稿纸上把一个房子的草稿纸画好了,vivado表示这个草稿纸要进行再稍微未加工一下它才能看懂并往下进行施工,这一步就是create HDL wrapper,所幸这个步骤是可以自动化的,主要点击一个按钮就可以了,如下图所示。

6.生成bit和tcl文件

如果对代码和电路都比较有信心,那么在create HDL wrapper后就可以直接点击软件左下角的generate bitstream来生成最后的结果了。vivado就会从综合->实现->生成这样一路跑下来。

跑完我们就得到了bit文件,它在vivado工程中的位置如下所示。

但别忘了,之前说过,pynq需要两个文件,bit和tcl文件,bit有了,tcl哪来呢?看下图。

tcl文件在vivado文件夹中的位置:

得到tcl和bit文件,咱们把这俩拷贝一下,名字改成一样的,先找个地方把它们放起来,以后会用到。比如像下面这样,以后写好python脚本之后把脚本,这俩文件一块丢到pynq的一个文件夹下就可以运行了。

这个工程中硬件部分到上面就算是完成了,接下来还有写python脚本,以及在pynq的terminal中运行脚本的操作。

(三)python脚本的编写和运行

由于这个代码是蔡大大写的,我想了想,觉得讲别人的东西不好,简单提下原理吧,以后有空自己再搞个工程写了python脚本再来细说吧。

之前在HLS那一步不是说了我们需要用到hwh文件吗,它就是下图中的最左边的代码,它里面记录了中间那个HLS自动生成的硬件层面的c代码用到的各个参数所存放的地址,我们需要做的就是根据左边的地址文件,中间的c代码文件来写出右边的python脚本,具体内容就是在指定我们例化的函数的参数要从哪个地址上读或者存数据。

当然脚本里不止是翻译一下c代码这么简单,还有设置参数(),读取图像(用pynq自带的python cv库函数),烧录程序(这个部分怎么写我在前面自己加法器的例子里面讲了)

最后运行的效果

matlab编写识别手写数字_使用PYNQ搭建手写数字识别工程小白级说明(完整版)相关推荐

  1. 手写字体识别用python实现_利用贝叶斯算法实现手写体识别(Python)

    #!/usr/bin/python#-*- coding: utf-8 -*-##########################################Bayes : 用来描述两个条件概率之 ...

  2. 小白兔写话_一年级小白兔看图写话

    2016-06-27 回答 看图写话怎么写 •1.看图先观察 •首先对于我们已经展示在眼前的看图写话,不要求立马就开始动笔书写.如果看到就开始书写,多半会写到中间就会停笔再观察的,所以我们在动笔之前, ...

  3. c++ascii码转换为数字_在C++中将字符串转换为数字

    有许多情况需要将数字转换为字符串或将字符串转换为数字.本文中提到了一些实现此任务的方法. 将字符串转换为数字 方法1:使用stringstream类或sscanf() 方法2:使用stoi()或ato ...

  4. redis和mysql双写一致_缓存与库双写一致,这种“老大难”怎么给它制服?

    日常生产场景中,为了避免大量请求同时打在数据库上导致故障,数据库+缓存的方式已经成了日常标配. 对于读取的部分,大家都很熟悉.但是对于写的部分,到底是先写库还是先写缓存,这点可能困扰着很多人. 旁路缓 ...

  5. 后缀转中缀表达式_中缀转后缀表达式代码实现(下)及计算器完整版

    南故笙烟:中缀表达式转为后缀表达式​zhuanlan.zhihu.com 思路分析 1.初始化两个栈:运算符栈s1和储存中间结果的栈s2 2.从左至右扫描中缀表达式 3.遇到操作数时,将其压入s2 4 ...

  6. 联想笔记本那些有手写功能_联想笔记本那些有手写功能_Windows 8 下笔记本如何实现手写输入...

    知识点分析: 在Yoga 笔记本的超级本上带了一个触控的键盘,同时具备手写的输入功能.这时在触控屏的使用中就可以使用手写输入了. 对于没有触控屏功能电脑,Win8系统的手写输入功能也可使用,可以借助鼠 ...

  7. vue 手写签名_用 Mac 制作手写签名,没打印机也能搞事

    得益于基础设施进步,现在想搞点事,比以前快捷便利多了,线下能办的事儿一部分转到了线上,一人一机,操纵于千里. 开展业务,很多地方都会要求你提供签字授权,比如想给网站做个备案,或者想快速走个线上合同, ...

  8. python点阵显示数字_程序点滴001_Python模拟点阵数字

    尝试过很多编程语言,写过不少程序(当然,基本上都是些自娱自乐或给自己用的工具类的小玩意儿),逐渐认识到编写程序是一个不断完善.不断优化的过程--编程首先要有一个想法(目标),围绕这个目标形成最基本的功 ...

  9. 用python和pygame写游戏_用Python和Pygame写游戏-从入门到精通(6)

    掌握了小小的像素,我们可以使用更加复杂一点的东西了,对,就是图像,无数的像素的集合~还记得上次我们为了生成的一张图片,花了无数时间,还好一般游戏不会在游戏的过程中动态生成图像,都是将画好的作为资源封装 ...

最新文章

  1. 你向 Mysql 数据库插入 100w 条数据用了多久?
  2. 51单片机好学嘛?学完51单片机学什么?
  3. 对于C#里面的this与base
  4. jquery正则匹配URL地址
  5. Ubuntu 14.04 安装SSH
  6. ICCV 2021 oral 重构+预测,双管齐下提升视频异常检测性能
  7. 让猫给人打工,猫咖是一门好生意吗?
  8. Leecode 953. Verifying an Alien Dictionary[Easy]
  9. 数据库三大范式及五大约束
  10. 查看centos操作系统、java_jdk、hadoop位数
  11. 笨方法学Python-1
  12. c51流水灯实验报告汇编语言,51单片机流水灯实验报告.doc
  13. bandicom录屏音画不同步_bandicam录屏工具
  14. 动态IP和静态IP地址
  15. 今天开始学Convex Optimization:第3章 Convex Sets and Convex functions
  16. 5-1 厘米换算英尺英寸 (15分)
  17. 美团人的写作基本功是如何练成的
  18. 技术不够硬?90%的程序员都错了!
  19. 教你九招防电脑辐射的方法!
  20. 2021中职组网络空间安全国赛CD模块分组混战镜像*

热门文章

  1. python tableview绑定字典_在QTableView中使用各种自定义委托
  2. 决策树 随机森林 xgboost_一文看懂随机森林-RandomForest(附4个构造步骤+4种实现方式评测+10个优缺点)...
  3. 运行VINS-mono:/home/tony-ws1/output/pose_graph/ not exists, trying to create it /home/tony-ws1/ou错误解决
  4. staticextension 上提供值时引发了异常_牛!一张图整理出了 Python 所有内置异常
  5. python从csv中读取数据打印到屏幕上-从Python中的CSV文件读取数据
  6. php学习去哪,php可以从哪里学习
  7. python对日期型数据排序_如何对日期执行数学运算并用Python对它们进行排序?
  8. android车载娱乐系统场景,智能汽车、家庭娱乐系统、工业自动化场景中接口应用设计...
  9. 图解TCPIP-HTTP
  10. 网站如何和服务器匹配,匹配服务器