智能硬件论坛
直播中

冬冬

1年用户 26经验值
擅长:可编程逻辑 MEMS/传感技术 嵌入式技术 EMC/EMI设计
私信 关注
[经验]

【KV260视觉入门套件试用体验】Zynq超强辅助-PYNQ配置,并使用XVC(Xilinx Virtual Cable)调试FPGA逻辑

前四期测评计划:

一、开箱报告,KV260通过网线共享PC网络

二、Zynq超强辅助-PYNQ配置,并使用XVC(Xilinx Virtual Cable)调试FPGA逻辑

三、硬件加速之—使用PL加速矩阵乘法运算(Vitis HLS)

四、硬件加速之—使用PL加速FFT运算(Vivado)


先来一波主观评价:

  • 我认为 PYNQ 是 Zynq 开发的超级助手,它让我可以用 Python 语言和 Jupyter Notebook 来编写和运行我的程序,通过浏览器界面来交互和可视化我的结果。
  • PYNQ 让我可以轻松地控制我的 PL 侧逻辑,只需要加载不同的 overlay 库,就可以像调用函数一样使用 FPGA 的功能和外设。
  • 这并不意味着我可以用 Python 来编写 PL 逻辑,事实上,要想充分利用 Zynq 的潜力,开发 PL 侧逻辑才是关键,因为所谓的“加速”,就是通过 PL 逻辑来实现的。
  • PYNQ 可以帮助我快速地验证和测试我的 PL 设计,也可以让我在 PS 侧使用 Python 的丰富库和工具,来处理和分析我的数据。
  • PYNQ 是一个适合各种应用场景的框架,无论是图像处理、人工智能、数据科学、物联网、机器人等,都可以在 PYNQ 上找到合适的解决方案。
  • PYNQ 让 Zynq 开发变得更简单、更有趣、更有创意。

第一部分 - 一切从如何在KV260中构建PYNQ讲起:

进入PYNQ官网(http://www.pynq.io/home.html),可以了解基本知识。

进入Boards页面,可以查看官方支持的那些板卡。

这些都是官方直接提供支持的板卡,对于自定义板卡,就需要自行配置了,官方也提供说明,请移步:https://pynq.readthedocs.io/en/latest/pynq_sd_card.html

可以有多种方式实现配置PYNQ:

  • 通过petalinux构建带有PYNQ的SD卡启动镜像;
  • 通过install.sh直接在ubuntu中直接安装PYNQ包;

第一种适合批量生产,第二种适合象我这样只有少量zynq板卡的开发者。这里介绍第二种方法。

前提条件:已为KV260烧录好ubuntu 22.04镜像。

点击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文件研究了一遍,供遇到同样问题的同学参考:

  1. 检查权限:代码首先检查是否以root权限运行,如果不是,则显示错误消息并退出。
  2. 命令行参数处理:代码检查是否接收到了正确数量的命令行参数,以确定要安装的板子类型(board)。
  3. 检查Ubuntu版本:代码检查当前操作系统的Ubuntu版本,并根据版本决定是否继续安装。
  4. 安装依赖:安装所需的Debian软件包,包括Python、开发库等。
  5. 创建虚拟环境:创建PYNQ的虚拟Python环境,其中包括一些必要的配置信息。
  6. 安装PYNQ库和相关工具:通过Python pip工具安装PYNQ库、PYNQ-Metadata、PYNQ-Utils等相关Python包。
  7. 安装Jupyter Notebook:安装Jupyter Notebook,并配置相关环境。
  8. 安装PYNQ的设备树覆盖:编译PYNQ的设备树覆盖,并将其插入到系统中。
  9. 安装示例Notebooks:根据板子类型安装不同的示例Notebooks,这些Notebooks包含了用于演示和学习的示例代码。
  10. 配置环境:修改一些配置文件和环境变量,以确保PYNQ的正确运行。
  11. 启动Jupyter服务:启动Jupyter服务,使用户可以通过Web浏览器访问PYNQ的Notebooks。
  12. 安装OpenCV:安装OpenCV库及相关依赖。
  13. 生成自测脚本:生成一个脚本,用于在安装完成后运行一些自测。
  14. 提供连接信息:输出一条消息,提供了连接到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。

第二部分 - 使用XVC(Xilinx Virtual Cable)调试FPGA逻辑:

解释下什么是XVC。

Xilinx虚拟电缆(XVC)是一种基于TCP/IP的协议,类似于JTAG电缆,提供一种无需使用物理电缆即可访问和调试FPGA或SoC设计的方式。

为什么要用XVC?

方便,不需要额外的JTAG设备即可调试PL逻辑代码。

在 vivado 中绘制如下 Block Design:

以上 Block Design 包含两个重要的IP核:

  • System ILA
  • Debug Bridge

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

接下来需要在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)

需要在vivado hardware中执行的操作:

连接成功后,会出现下图所示结果:

连接成功后,我们就可以使用ILA进行调试了。此处我们随意设个触发条件,计数器到100时触发。设置后,准确触发,如下:

总的来说:

PYNQ已经是我开发PL逻辑不可或缺的工具了,PYNQ极具方便性、灵活性,可以快速验证和测试逻辑设计,也可以利用 Python 的丰富库和工具来处理和分析数据,而不需要使用复杂的测试平台或软件环境。

下期预告:

矩阵乘法是一种常见的数学运算,它可以用于实现各种应用,例如线性代数、图像处理、人工智能等。使用RTL开发周期长,需要花费更多的时间和人力来编写和验证代码,代码可复用性和可移植性较差,需要针对不同的平台和应用进行修改。而使用HLS进行开发,可以快速地验证和测试功能和性能,代码可复用性和可移植性强,可以轻松地适应不同的平台和应用。

更多回帖

发帖
×
20
完善资料,
赚取积分