PYNQ下的DMA传输实现及速度测试

在成功实现ZCU106开发板的PYNQ镜像生成后(见ZCU106的PYNQ移植),开发板的结构可抽象为下图所示:在这里插入图片描述
我们可以通过在开发板的OS中架设TCP服务器,在上位机PC端进行TCP客户端访问来实现上位机到开发板的文件/数据传输。为了能够实现开发板PS侧和PL侧的高速传输,我们可以在开发板上构建DMA传输。(DMA介绍见DMA IP核学习笔记)本文分别从DMA传输的BD构建和PYNQ运行,以及传输速度测试两部分进行说明。

一:Vivado下DMA BD逻辑构建

首先附上BD图(2018.3版本)
在这里插入图片描述
只做DMA数据传输速度测试,将S_AXIS_S2MM直接连接M_AXIA_MM2S构成传输回环。
DMA IP具体设置如下,关闭SG mode
在这里插入图片描述
ZYNQ核关闭interrupt,开一个HP口
在这里插入图片描述
之后按流程进行比特流生成,提取文件夹中的.bit,.hwh及bd.tcl文件为PYNQ运行做准备。

二:PYNQ下DMA回环测试运行

.bit,.hwh及bd.tcl文件复制至\PYNQ\xilinx下备用
在这里插入图片描述
运行jupyter notebook
DMA测试代码如下:
导入bit文件

import numpy as np
from pynq import Xlnk
from pynq import Overlay
import time
ol = Overlay('/home/xilinx/zcu106_dma/dma.bit')
dma = ol.axi_dma_0

构建输入输出buffer

xlnk = Xlnk()
input_buffer = xlnk.cma_array(shape=(6553600,), dtype=np.uint32)
output_buffer = xlnk.cma_array(shape=(6553600,), dtype=np.uint32)

测试下的两个buffer均定为25MB
在这里插入图片描述
对输入buffer进行赋值

for i in range(6553600):
   input_buffer[i] = i

进行DMA传输,并打时间戳便于测速

start = time.time()
dma.sendchannel.transfer(input_buffer)
dma.recvchannel.transfer(output_buffer)
dma.sendchannel.wait()
dma.recvchannel.wait()
end = time.time()

打印传输时间

print('time cost ' + str(round(end - start, 5)) + 's')

计算传输速度

length = 26214400
cost = round(end - start, 5)
speed = round(length/(cost*1048576),5)
print('transfer speed: ' + str(speed) + 'MB/s')

三:DMA传输速度测试

笔者多次测试结果如下:

  1. 64KB数据:在这里插入图片描述

  2. 1MB数据:
    在这里插入图片描述

  3. 10MB数据:
    在这里插入图片描述

  4. 25MB数据:
    在这里插入图片描述
    另可将输入输出buffer中的数据保存为txt文件对比检查传输正确性

np.savetxt('input.txt',input_buffer)
np.savetxt('output.txt',output_buffer)

在这里插入图片描述

Fin

  • 6
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值