在成功实现ZCU106开发板的PYNQ镜像生成后(见ZCU106的PYNQ移植),开发板的结构可抽象为下图所示:
我们可以通过在开发板的OS中架设TCP服务器,在上位机PC端进行TCP客户端访问来实现上位机到开发板的文件/数据传输。为了能够实现开发板PS侧和PL侧的高速传输,我们可以在开发板上构建DMA传输。(DMA介绍见DMA IP核学习笔记)本文分别从DMA传输的BD构建和PYNQ运行,以及传输速度测试两部分进行说明。
首先附上BD图(2018.3版本)
只做DMA数据传输速度测试,将S_AXIS_S2MM直接连接M_AXIA_MM2S构成传输回环。
DMA IP具体设置如下,关闭SG mode
ZYNQ核关闭interrupt,开一个HP口
之后按流程进行比特流生成,提取文件夹中的.bit,.hwh及bd.tcl文件为PYNQ运行做准备。
.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')
笔者多次测试结果如下:
np.savetxt('input.txt',input_buffer)
np.savetxt('output.txt',output_buffer)
Fin