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

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

一:Vivado下DMA BD逻辑构建

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

二:PYNQ下DMA回环测试运行

.bit,.hwh及bd.tcl文件复制至\PYNQ\xilinx下备用
PYNQ下的DMA传输实现及速度测试_第5张图片
运行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
PYNQ下的DMA传输实现及速度测试_第6张图片
对输入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数据:PYNQ下的DMA传输实现及速度测试_第7张图片

  2. 1MB数据:
    PYNQ下的DMA传输实现及速度测试_第8张图片

  3. 10MB数据:
    PYNQ下的DMA传输实现及速度测试_第9张图片

  4. 25MB数据:
    PYNQ下的DMA传输实现及速度测试_第10张图片
    另可将输入输出buffer中的数据保存为txt文件对比检查传输正确性

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

PYNQ下的DMA传输实现及速度测试_第11张图片

Fin

你可能感兴趣的:(PYNQ下的DMA传输实现及速度测试)