pynq库基本使用
Overlay
什么叫做Overlay
Overlay可以说是PYNQ的核心,其目的就是把写好的硬件设计加载到FPGA上。一般Overlay需要包含一下几个部分:
- 比特流文件:配置FPGA的基本结构
- HWH文件:确定VIVADO中可用的IP
- Python API:公开的python可以使用的API
操作方法
- Overlay设计文件:最基本的操作方式就是直接使用
Overlay函数加载比特流,同时会解析HWH文件:
1 | |
- 查询设计相关信息:可以直接使用
help来查看已经Overlay的对象,将会输出设计中各个对象和结构
1 | |
- 查询并控制相关对象:有了整个硬件设计的对象,可以直接操控子内容:
1 | |
IP字典调用
- 通过上面得到的整个设计的对象,一般我们是进行IP的相关操作,可以使用更加方便的方式得到所有的IP:
1 | |
- 然后可以直接通过上面打印的IP得到对应的操作对象
1 | |
allocate内存分配
allocate的功能
- 在硬件设计中或者干脆说DMA的数据读取是按照连续内存地址进行相应的数据读取的,因此在PS端的python控制代码中,相应数据的分配也就应该分配到连续内存地址上
- python中通常用于内存地址分配的是numpy,但是计算机会进行虚拟内存分配,不符合我们的要求
- 于是,必须使用
allocate创建buffer进行内存地址的分配
任何需要给 DMA 发送或从 DMA 接收数据的
buffer,必须使用pynq.allocate创建
使用方法
1 | |
参数确定
shape:与Numpy中shape完全相同,表示分配的内存缓冲区的形状shape=(100,):创建一个一维数组(向量),包含 100 个元素。shape=(10, 5):创建一个二维数组(矩阵),包含 10 行 5 列,总共 50 个元素。
dtype:必须匹配硬件PL端的位宽,在DMA中就是必须匹配TDATA的位宽。PL端是以内存地址进行数据的读入,则每个地址的数据必须是DMA读取数据的数据位宽TDATA是 64 位:dtype=np.uint64TDATA是 32 位:dtype=np.uint32
allocate中的dtype必须与你 Vivado 设计中 AXI-Stream 接口的TDATA宽度严格匹配。
将数据读入缓冲区
- 数据格式处理:数据的读取不会自动处理格式,那么必须事先把数据格式处理成需要的样式
- 数据填充:把处理好的数据填充进分配的
buffer中
1 | |
⚠️从txt中读取的数据必须是8位有符号二进制数,或者是通过各种方式转换为这种形式
⚠️给到内存的数据需要进行数据位宽的匹配,在上面就进行了数据打包
DMA

✅DMA的工作就是进行数据的转发,在python中的控制方式十分简单,就只是发送与接收两种
如果dma就是Overlay得到的相应IP,则有:
dma.sendchannel:这是“发件”通道 (PS -> PL)。dma.recvchannel:这是“收件”通道 (PL -> PS)。
这两个通道的控制进行数据的发送和接收:
dma.sendchannel.transfer(input_buffer):让 DMA 控制器现在开始从input_buffer这块内存中读取数据,并把它们流式传输 (stream) 到 PL 硬件。并且python不会等待这个过程,而是直接开始下一个代码任务dma.recvchannel.transfer(output_buffer):告诉 DMA 控制器,现在开始监听来自 PL 硬件的数据流,一旦有数据过来,就把它们写入到output_buffer这块内存里。同样也不会进行等待而是直接开始下一个任务wait():一个阻塞过程,等待相应的任务完成
1 | |
recv.transfer要在send.transfer之前防止死锁
pynq库基本使用
https://mingzaitown.github.io/2025/11/27/pynq库基本使用/