目录
1. PYNQ 简介
PYNQ 是 Zynq 开发的超级助手
- PYNQ 是 Zynq 开发的超级助手,可以用 Python 语言和 Jupyter Notebook 来编写和运行程序,通过浏览器界面来交互和可视化结果。
- PYNQ 可以轻松地控制 PL 侧逻辑,只需要加载不同的 overlay 库,就可以像调用函数一样使用 FPGA 的功能和外设。
- 可以用 Python 来编写 PL 逻辑,事实上,要想充分利用 Zynq 的潜力,开发 PL 侧逻辑才是关键,因为所谓的“加速”,就是通过 PL 逻辑来实现的。
- PYNQ 可以帮助快速地验证和测试 PL 设计,也可以在 PS 侧使用 Python 的丰富库和工具,来处理和分析数据。
- PYNQ 是一个适合各种应用场景的框架,无论是图像处理、人工智能、数据科学、物联网、机器人等,都可以在 PYNQ 上找到合适的解决方案。
- PYNQ 让 Zynq 开发变得更简单、更有趣、更有创意。
2. 构建 PYNQ
2.1 PYNQ 基础知识
进入PYNQ官网(http://www.pynq.io/home.html),可以了解基本知识。
进入Boards页面,可以查看官方支持的那些板卡。
这些都是官方直接提供支持的板卡,对于自定义板卡,就需要自行配置了,官方也提供说明,请移步:PYNQ SD Card image — Python productivity for Zynq (Pynq)
可以有多种方式实现配置PYNQ:
- 通过petalinux构建带有PYNQ的SD卡启动镜像;
- 通过install.sh直接在ubuntu中直接安装PYNQ包;
第一种适合批量生产,第二种适合象我这样只有少量zynq板卡的开发者。这里介绍第二种方法。
前提条件:已为KV260烧录好ubuntu 22.04镜像。
2.2 为 KV260 构建 PYNQ
点击Kria PYNQ setup后,进入github仓库:
按照官方的操作流程,只需在KV260中执行3行代码,即可实现配置!
git clone <https://github.com/Xilinx/Kria-PYNQ.git>
cd Kria-PYNQ/
sudo bash install.sh -b KV260
现实却很打脸,无数次的失败,我硬着头皮把整个install.sh文件研究了一遍,供遇到同样问题的同学参考:
- 检查权限:代码首先检查是否以root权限运行,如果不是,则显示错误消息并退出。
- 命令行参数处理:代码检查是否接收到了正确数量的命令行参数,以确定要安装的板子类型(board)。
- 检查Ubuntu版本:代码检查当前操作系统的Ubuntu版本,并根据版本决定是否继续安装。
- 安装依赖:安装所需的Debian软件包,包括Python、开发库等。
- 创建虚拟环境:创建PYNQ的虚拟Python环境,其中包括一些必要的配置信息。
- 安装PYNQ库和相关工具:通过Python pip工具安装PYNQ库、PYNQ-Metadata、PYNQ-Utils等相关Python包。
- 安装Jupyter Notebook:安装Jupyter Notebook,并配置相关环境。
- 安装PYNQ的设备树覆盖:编译PYNQ的设备树覆盖,并将其插入到系统中。
- 安装示例Notebooks:根据板子类型安装不同的示例Notebooks,这些Notebooks包含了用于演示和学习的示例代码。
- 配置环境:修改一些配置文件和环境变量,以确保PYNQ的正确运行。
- 启动Jupyter服务:启动Jupyter服务,使用户可以通过Web浏览器访问PYNQ的Notebooks。
- 安装OpenCV:安装OpenCV库及相关依赖。
- 生成自测脚本:生成一个脚本,用于在安装完成后运行一些自测。
- 提供连接信息:输出一条消息,提供了连接到JupyterLab的URL和密码信息。
遇到具体问题,对照上述流程,检查哪一步出错,可能需要修改install.sh文件。举个例子:
[97] git clone <https://github.com/Xilinx/PYNQ.git> --branch v3.0.1 --depth 1 pynq
我们在https://github.com/Xilinx/PYNQ.git中已经找不到--branch v3.0.1这个版本,因为PYNQ仓库已经修改分支名称为images_v3.0.1,因此需要修改后再执行sudo bash install.sh -b KV260。
如果遇到 git clone 失败,可能需要设置 git 代理,请自行设置代理:
git config --global http.proxy [<http://192.168.101.xx>:](<http://192.168.101.37:1082/>)xxxx
git config --global https.proxy [<https://192.168.101.xx>:](<https://192.168.101.37:1082/>)xxxx
安装完毕后:JupyterLab现在可以通过Web浏览器访问,地址为<ip_address>:9090/lab或kria:9090/lab。密码是xilinx。
install.sh会默认安装一些案例,可用于快速入门PYNQ。
3. 配置 XVC
3.1 了解 XVC
解释下什么是 XVC。
Xilinx虚拟电缆(XVC)是一种基于 TCP/IP 的协议,类似于 JTAG 电缆,提供一种无需使用物理电缆即可访问和调试 FPGA 或 SoC 设计的方式。
为什么要用XVC?
方便,不需要额外的 JTAG 设备即可调试 PL 逻辑代码。
3.2 Block Design
在 vivado 中绘制如下 Block Design:
注意:使用 Debug Bridge 时,其时钟频率不宜太低,在 20MHz 时,发现在 HW 中无法识别 ZYNQ 主芯片,配置到50MHz是,便可以识别到。
以上 Block Design 包含两个重要的IP核:
- System ILA
- Debug Bridge
Debug Bridge 中参数 Bride Type 选择:From AXI to BSCAN。此桥接类型适用于通过以太网或其他接口使用 Xilinx 虚拟电缆(XVC)远程调试 FPGA 或 SoC 设备的设计,而无需 JTAG 电缆。在此模式下,调试桥通过 AXI4-Lite 接口接收 XVC 命令。
上图 Block Design 中,Slice 核无关紧要,此 IP 引出一个 pin 用于风扇控制,系统可以自动调节风扇转速,去掉此IP和风扇控制后,风扇会一直运行在最大转速,除了吵一点,没有别的影响。如需使用,fan_en_b 应当分配为 A12 引脚。
通过这个 Block Design,我们可以通过 XVC 观察计数器 Binary Counter 的输出。
配置完毕,生成 bitstream,需要拷贝以下文件备用:
xx.gen\\sources_1\\bd\\design_1\\hw_handoff\\*.hwh
xx.runs\\impl_1\\*.bit
3.3 在 Jupyter 中配置
接下来需要在 JupyterLab 中操作,新建一个 ipynb 文件,并输入以下代码:
# 导入PYNQ的Overlay类,用来加载和管理PL逻辑
from pynq import Overlay
# 导入PYNQ的DebugBridge类,用来在zynq上创建一个XVC服务器
from pynq.lib.debugbridge import DebugBridge
# 创建一个Overlay对象,加载bitstream文件到PL。
base = Overlay("xvc_test.bit")
# 显示Overlay对象中包含的IP核的字典
base.ip_dict
# 创建一个DebugBridge对象,使用Overlay对象中名为"debug_bridge_0"的IP核作为XVC服务器的接口
db = DebugBridge(base.ip_dict['debug_bridge_0'])
# 启动XVC服务器,指定参数来配置服务器的缓冲区长度、地址、端口、重连选项和输出模式
db.start_xvc_server(bufferLen=4096, serverAddress="172.20.10.3", serverPort=2542, reconnect=True, verbose=True)
连接成功后,JupyterLab输出提示:
XVC server started
Connection from : ('172.20.10.2', 52054)
3.4 在 HW 中调用 XVC
需要在vivado hardware中执行的操作:
连接成功后,会出现下图所示结果:
连接成功后,我们就可以使用ILA进行调试了。此处我们随意设个触发条件,计数器到100时触发。设置后,准确触发,如下:
4. 总结
PYNQ已经是我开发PL逻辑不可或缺的工具了,PYNQ极具方便性、灵活性,可以快速验证和测试逻辑设计,也可以利用 Python 的丰富库和工具来处理和分析数据,而不需要使用复杂的测试平台或软件环境。