本人在学习PYNQ,想用自己的理解来解释零基础学习过程中的一些坑,同时采用非官方语言来介绍如何使用PYNQ。大家有什么问题可以给我留言。也可以关注微信公众号一起讨论,在文章末尾。
简介:PYNQ是“python productivity for zynq”的缩写,它是一块开发板,是赛灵思公司出品,能用python来简化开发赛灵思公司的zynq的芯片的。通常FPGA开发都是采用硬件描述语言的(如verilog)的。pynq实现了用python纯软件编程。片上系统SOC包含两部分,PS和PL端(是什么不知道,先记住),用Python编程,主要是对PS端的简化。
day 0
搭建硬件
其实就是利用win32磁盘工具给SD卡烧录一个镜像,也即linx系统。然后将SD卡插到PYNQ-Z2里面。最后上电看一看灯的闪烁是否符合要求就行。
注意:1.通过读卡器给TF卡烧录系统后,会弹出不可用,是否格式化的窗口。点否即可。
2。供电模式要设置正确,如果使用电源适配器给PYNQ供电,要更改跳线。(USB供电的模式电流小)
3.可以直接用网线连接电脑和PYNQ,也可以通过路由器连接。通过路由器连接,PYNQ就可以上网。电脑连WIFI,电脑通过网线和PYNQ连接,PYNQ也可以上网!
day 1
搭建软件环境
就是说,不能直接在pynq上编程,要在计算机上编。大概有3种方式:
1.计算机和PYNQ网线直连,进入jupyter,然后编程,把程序下载到pynq里
2.在文件管理器打开pynq的文件列表,把编号的程序拖进去
3.通过串口连接,最快,适用于没网的情况。设备里出现usb serial convert A和usb serial convert B而没有出现端口号时,可以下载个360驱动试一试。看端口下是COM几,我这次是COM10。打开串口终端,可以发送指令。可以ping一下
注意:1.使用串口时,要使用专用可传输数据的USB线,不能用仅可充电的USB线,线在PYNQ那里要确认插入进去
2.搭建软件环境指的是在自己笔记本电脑上登陆upyter页面,这样就可以利用python在电脑上给pynq编程了。
3.如果在打开设备管理器时,找不到com口,可以点击查看,再点击显示隐藏设备,灰色的口是没有连接的,黑色的就是正确的。
串口和路由器这两种连接方式是可以共存的
day 2
今天,用day1的第一种方法中的jupyter来给pynq的板子点亮第一个LED灯。
led灯直接连接到了PYNQ的PL端,为了通过python控制led,我们要先导入overlay。私以为,通过路由器连接是最好最安全的方法。是在线编程
代码如下:
from pynq.overlays.base import BaseOverlay
base_overlay = BaseOverlay("base.bit")
base_overlay.leds[0].on()
import time
while True:
#base_overlay.leds[0].on()
#time.sleep(0.5)
#base_overlay.leds[0].off()
#time.sleep(0.5)
for i in range(0,8):
base_overlay.rgbleds[4].write(i)
time.sleep(0.1)
先插入overlay,再令灯闪灭。给大家介绍一些英文文档供大家学习:
https://pynq.readthedocs.io/en/latest/index.html
https://pynq.readthedocs.io/en/latest/pynq_package/pynq.lib/pynq.lib.led.html
https://pynq.readthedocs.io/en/latest/pynq_package/pynq.lib/pynq.lib.rgbled.html
day 3
今天来学习使用拨码以及按键,会一些python语法,然后查阅文档,是很好的学习方法。该代码段功能主要是通过读取按键与拨码的值来控制灯的闪灭
from pynq.overlays.base import BaseOverlay
base_overlay = BaseOverlay("base.bit")
if (base_overlay.switches[0].read()==0 and base_overlay.switches[1].read()==0) :
base_overlay.leds[0].on()
elif (base_overlay.switches[0].read()==0 and base_overlay.switches[1].read()==1) :
base_overlay.leds[1].on()
elif (base_overlay.switches[0].read()==1 and base_overlay.switches[1].read()==0) :
base_overlay.leds[2].on()
elif (base_overlay.switches[0].read()==1 and base_overlay.switches[1].read()==1) :
base_overlay.leds[3].on()#注意python的elif和and和C语言不一样
#btn = base_overlay.buttons[0].read()#按键
#print(btn)
#sw = base_overlay.switches[0].read()
#print(sw)
#base_overlay.switches[0].wait_for_value(1)#等待拨码值为1才执行下一句
#print("switch on")
#base_overlay.buttons[0].wait_for_value(1)#等待按键值为1才执行下一句
#print("btn pressed")
import time
while 1:
if base_overlay.buttons[0].read() == 1 :#按键
for i in range(0,8):
base_overlay.rgbleds[4].write(i)
time.sleep(0.1)
day 4
用串口shell指令,直面linux系统。用putty打开后的界面,在里面输入sudo apt-get install vim安装vim(需笔记本联网)
输入密码的时候,xilinx不显示,输入完成后直接回车即可
然后新建一个源码文件:sudo vim test.py
输入xilinx密码
就可以进入编译环境辣!
进入编译环境,先点击i进入编辑模式,默认是指令模式
最后保存,也可以下载到pynq中运行编写的代码
day 5
我们还可以参与pynq社区里的项目
从github上安装BNN社区项目出现这种情况是因为你的PYNQ没有连接路由器(也可能其他原因,反正是玄学,同样的情况第二次就不行了)。
解决方法是在通过串口连接板子的同时,电脑连路由器LAN口,PYNQ连另一个LAN口
成功界面:
以上步骤是将项目下载到pynq板子上,之后我们就可以从jupyter上运行代码辣!
day 7
今天基于vivado在PL端操作,之前是基于PS端。
在安装好vivado之后,需要先导入板层文件,这样开发就会变得快多了。
在创建好vivado工程之后,编程之前,加载 XDC 约束文件,控制引脚分配。
创建工程的时候,有Boards和Parts,要确认选择了Boards后选择PYNQ-Z2
用vivado的供电方式如下:
## 微信公众号
欢迎大家关注我的个人公众号,现阶段主要总结Robomaster相关的计算机视觉知识:Qt,C++,CMake,OpenCV等等
公众号名称:三丰杂货铺