很多人用zynq平台做视频图像开发,但是对vdma了解比较少,上手起来稍微有些困难,我针对这一现象,做了一个基于vivado和modelsim的仿真和应用测试工程,并写篇文章做些介绍,希望能对大家有帮助。 
一:xilinx vdma IP例化以及接口介绍 

上面图片就是在vivado2015.4中例化vdma的界面,首先对参数做些介绍: 
Frame Buffers :选择vdma缓存几帧图像,这里默认是写通道和读通道都设置相同的缓存帧数,具体设置多少帧合适一般根据应用来定,比如读写带宽相同,想用ddr作为一个乒乓buffer,那就可以设置成2帧,写第一个地址,读第二个地址,写第二个地址,读第一个地址。这里面设置几帧,就要在vdma寄存器配置的时候设置几个帧起始地址。 
Memory Map Data Width:代表数据到达AXI4总线上的位宽,比如这里设置成64,那就代表M_AXI_XX总线上的数据位宽是64bit,这时候如果stream上的数据是32bit,那vdma内部会有一个带宽转换模块,把数据拼成64bit。 
Burst Size : AXI总线上突发传输的长度,一般设置为16 
Stream Data Width:vdma与pl逻辑部分通过axi stream协议交互数据,这里代表stream数据位宽 
Line Buffer Depth:vdma内部会有一个行缓存fifo,stream数据会先写入fifo,然后AXI总线逻辑会读出到总线上,这个深度就代表fifo的深度。设置原则(个人理解):如果AXI总线数据带宽是stream总线数据带宽的1.5倍以上,这个fifo深度可以设置的小一点,如果AXI总线带宽小于1.5倍的stream总线带宽,那fifo的深度至少要是图像一个有效行的一半。 
Advanced : 这里面只说一下Fsync Options,这个信号是什么意思呢,就是告诉vdma什么时候开始运行,一般s2mm通道选择tuser,就是说在tuser 拉高的时候开始传输。mm2s通道,可以选择none,也可以选择 mm2s_fsync,这里介绍一下这两个的区别。 
none : 就是没有同步信号,但这并不是说没有开始信号,而是只要mm2s_stream通道tready拉高,就开始传输,相当于free模式 
mm2s_fsync:当这个信号发生一个下降沿的时候开始传输,如果没有这个下降沿,即使mm2s_stream通道tready拉高也不会传输 
下面是接口介绍: 
M_AXI_XX : axi4总线接口,用来与ddr交互数据 
M_AXIS_XX , S_AXIS_XX : axi stream接口,用来与pl交互数据 
S_AXI_LITE :控制总线,接到ps的gp口或者写一个axilite master总线去配置 
其他接口不做介绍 
二:下面开始一步步的详解如何搭建一个vdma的仿真工程 
FPGA的开发,离不开仿真,很少有人能直接写好代码上板就成功的,仿真必不可少。但是有些应用要用到vdma,vdma又要和ddr做数据交互,这样做起来就很麻烦了,我这里就实现了一个简单的方法,可以测试vdma,又不用去例化MIG搞什么ddr。下面开始! 
系统框图: 

(1)因为是要仿真vdma,vdma顾名思义就是video dma,那肯定要先做一个视频模块,注意,我这里除了vdma和fifo用xilinx的ip。其他的都不用ip,这样更通用性。 
我这里就把这个视频发生模块叫做sensor,可以理解为xilin的tpg模块,sensor模块的接口如下:

eg1:

我这里构建了一个图像传感器,总像素数是600*800,有效像素是 480*640,水平有效像素开始位置是80,垂直有效像素开始位置是60,这个模块会读取一个本地图像数据,rgb格式,这里为了测试方便,直接把像素输出位宽设置为32bit。 
(2)video转axis模块,相当于 xilinx的vid in to stream模块,接口如下:

eg2:

这个模块主要用到一个fifo来做数据缓存,只要注意一下stream协议的握手操作即可,由于stream协议比较简单,这里就不多说了。至此,video数据就转换到了stream数据。 
(3)axis转video模块,接口如下:

eg3:

这个模块相当于xilinx的vid out模块,我这里是简化版的,xilinx的ip写的太复杂了,而且不容易用起来,其实也就是用一个fifo做数据缓存,然后根据外部video时序从fifo读出到输出。 
(4)video timing gen模块,接口如下:

eg4:

此模块产生视频时序,提供给 axis2video模块,相当于xilinx的vtc模块。 
(5) axi slave模块,接口如下:

eg5:

这块模块是根据xilinx官方提供的参考设计基础上修改而来的(xapp1168),协议部分完全没有改动,这里拿他当做ddr,具体修改是这样的, 
reg [31:0] mem [32’h01000000:0]; 
用寄存器组来模拟ddr 
此模块会根据axi master的时序来计算出要读写的地址 
assign write_mem_address = axi_awv_awr_flag ? axi_awaddr: 0; 
assign read_mem_address = axi_arv_arr_flag ? axi_araddr: 0; 
写操作:mem[write_mem_address>>2] <= #1 S_AXI_WDATA; 
读操作:mem_data_out <= mem[read_mem_address>>2]; 
做此修改以后,这个模块就可以当做ddr来用,为仿真提供了很大的方便 
(6)vdma模块,这个就用xilinx的vdma ip,注意,我这里不是在block design里面例化,所以端口需要自己在hdl里面做连接的。 
这里还有一个模块是 axi lite master模块,作用是用来配置vdma的寄存器,这个模块也是xilinx提供的,只需要做小量修改即可

eg6:

我这里是把ddr作为一个乒乓buffer,所以vdma缓存帧数选择2帧,寄存器配置里面就配置两个传输地址。这样就完成了对vdma的寄存器配置。 
编写test bench top文件,把这些模块连接起来,至此,仿真工程就全部写好了。 
三:仿真 
(1)vdma工作流程介绍 
第一步,对vdma寄存器进行配置,并打开使能,这时候vdma处于待命状态,什么时候开始传输呢,下面详细介绍 
对于S2MM通道:之前在讲vdma配置的时候有一个Advanced选项,里面有Fsync Options选项,可选none,s2mm_fsync,s2mm_tuer,三种同步模式。 
none就是只要vdma就绪,就立马准备接收数据,不需要同步信号。 
s2mm_fsync,当选择此模式时,vdma 模块会有一个s2mm_fsync引脚,一般情况下是把视频帧同步信号连到这上面,当检测到s2mm_fsync引脚有一个下降沿的时候,vdma正式进入传输状态。 
s2mm_tuer,这个信号和s2mm_fsync这个信号类似,但他是在stream协议里面的,vdma检测到s2mm_tuer拉高以后(tuser只在一帧数据的第一个像素位置拉高),正式进入传输状态 
对于MM2S通道,同样在vdma配置的Advanced选项里面有 none,mm2s_fsync两种选择模式。 
none不需要同步信号,只要axis_mm2s通道的tready拉高,就开始从ddr读取数据进行传输,选择这种模式一般主要是把ddr里面的数据读到pl里面进行处理,而不是转成视频 
mm2s_fsync,选择此同步模式,一般是把ddr的数据转成视频数据,注意,这里重点讲这个同步模式,当vdma的读通道选择此同步模式的时候,vdma模块会有一个mm2s_fsync信号,这个信号在读操作中非常重要。当vdma寄存器配置完成并开启传输,mm2s通道进入等待过程,一直等到mm2s引脚信号出现一个下降沿,这时候vdma启动读操作,会从ddr预读一些数据到内部linebuffer,等到axis_mm2s通道的tready信号拉高,数据就开始传输,进入axis2video模块的fifo,当axis2video内部fifo满了以后,会拉低tready,这时候就会反馈到vdma,暂停读操作,一直等到axis2video模块的视频时序输入数据有效信号,这时候视频开始输出,axis2video内部fifo数据减少,axis_mm2s通道开始恢复传输,继续从vdma读出数据,vdma再通过axi总线从ddr读取数据,如此反复,完成ddr数据到video数据的转换 
(2)仿真实践 
首先在vivado平台例化一个vdma ip,然后添加进上述的各个模块,代码层级如下:

eg7:

四:总结 
通过对vdma的仿真,可以更深入的了解vdma的工作原理,工作流程,给实际应用做好准备工作。同时,这么做也有更多的意义,对于一些需要DDR缓存才能完成的图像算法,比如视频3D降噪,运动物体检测帧差法,HDR图像合成等等,完全可以在此基础上进行仿真,能更大程度的模拟FPGA实际工作状况,提高算法移植效率

72.xilinx vivado zynq vdma仿真及应用详解(一)的更多相关文章

  1. Xilinx Vivado的使用详细介绍(1):创建工程、编写代码、行为仿真

    Xilinx Vivado的使用详细介绍(1):创建工程.编写代码.行为仿真 Author:zhangxianhe 新建工程 打开Vivado软件,直接在欢迎界面点击Create New Projec ...

  2. xilinx Vivado的使用详细介绍(2):创建工程、添加文件、综合、实现、管脚约束、产生比特流文件、烧写程序、硬件验证

    xilinx Vivado的使用详细介绍(2):创建工程.添加文件.综合.实现.管脚约束.产生比特流文件.烧写程序.硬件验证 Author:zhangxianhe 新建工程 打开Vivado软件,直接 ...

  3. Vivado级联Modelsim仿真Re-launch问题

    前两天在群里看到有朋友说Vivado级联Modelsim仿真出现修改设计代码后重新run do文件,波形没有随着代码修改而改变,这个问题博主之前没有注意到,因为把Vivado和Modelsim级联好后 ...

  4. Xilinx与modelsim的仿真联调

    关于Xilinx与modelsim的仿真联调,尤其是仿真环境的搭建,网上的信息都比较零散,我当初在联调的时候遇到比较多的问题,也是折腾了两天才弄好,下面的步骤我总结得非常详细,可以帮助大家少走弯路. ...

  5. 一阶RC高通滤波器详解(仿真+matlab+C语言实现)

    文章目录 预备知识 关于电容 HPF的推导 simulink 仿真 simulink 运行结果 matlab 实现 matlab 运行结果 C语言实现 如果本文帮到了你,帮忙点个赞: 如果本文帮到了你 ...

  6. 一阶RC低通滤波器详解(仿真+matlab+C语言实现)

    文章目录 1 预备知识 2 simulink 仿真 3 simulink 运行结果 4 matlab实现 5 matlab运行结果 6 C语言实现 7 C语言运行结果 如果本文帮到了你,帮忙点个赞: ...

  7. Xilinx Vivado的使用详细介绍(5):调用用户自定义封装的IP核

    Zedboard OLED Display Controller IP v1 介绍 Author:zhangxianhe 本文档提供了快速添加,连接和使用ZedboardOLED v1.0 IP内核的 ...

  8. Xilinx Vivado的使用详细介绍(4):Zedboard+vivado之流水灯(加SDK)

    Vivado+zedboard之初学流水灯 Author:zhangxianhe 环境:vivado 2016.3(已验证适用于2015.4) 开发板:Zedboard version xc7z020 ...

  9. VIVADO 入门之仿真与逻辑分析仪使用

    多路分频器设计 在第七节的学习中,笔者带大家通过一个入门必学的流水灯实验实现,快速掌握了VIVADO基于FPGA开发板的基本流程.考虑到很多初学者并没有掌握好Vivado 下FPGA的开发流程,本章开 ...

随机推荐

  1. IE 之 userData 模拟 localStorage

    引 chrome,  safari, firefox, ie 9都支持 localStorage.  但可恶的是,中国 ie 6 占有最大的比例. 使用 cookie 不但容量有限,而且给我们增加了不 ...

  2. JMeter脚本强化之检查点

    上一篇讲述了对脚本做参数化的两种方法,并对参数化设置结果做了简单的验证,就是通过添加断言.本篇将详细一点介绍怎么使用断言做文本检查,或者叫做设置检查点. 首先来看看下面的三个图,这三个图是用查看结果树 ...

  3. 第162天:canvas中Konva库的使用方法

    本篇接着上一篇:第157天:canvas基础知识详解  继续来写. 五.Konva的使用快速上手 5.1 Konva的整体理念 Stage | +------+------+ |            ...

  4. QoS专题-第4期-QoS实现之限速

    QoS实现之限速 通过前面几篇介绍,大家都知道了MQC是实现QoS的技术,优先级映射是实现QoS的前提条件.读完之后也许无法直观感觉到QoS是如何提升网络服务质量.今天小编给大家介绍限速,通过实验,可 ...

  5. P4551 最长异或路径

    题目描述 给定一棵 nnn 个点的带权树,结点下标从 111 开始到 NNN .寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有边权的异或. 输入输出格式 输入格式 ...

  6. [JSOI2007]字符加密 后缀数组

    题面:洛谷 题解: 我们考虑,如果可以将环上每个长度为len的串都提取出来,再做个排序,那这题我们就做出来了! 但是提取$n^2$,怎么办? 考虑破环成链,再扩充为原来的2倍. 然后直接做后缀排序,把 ...

  7. 【CF600E】Lomsat gelral(dsu on tree)

    [CF600E]Lomsat gelral(dsu on tree) 题面 洛谷 CF题面自己去找找吧. 题解 \(dsu\ on\ tree\)板子题 其实就是做子树询问的一个较快的方法. 对于子树 ...

  8. Unity3D for VR 学习(6): 再次温故知新-3D数学

    一年前,系统学习过3D数学,并记录了一篇博客<C#程序员整理的Unity 3D笔记(十):Unity3D的位移.旋转的3D数学模型>. 一年后,再次温习之. 坐标系:Unity3D使用左手 ...

  9. 洛谷 P1171 售货员的难题 【状压dp】

    题目描述 某乡有n个村庄(1<n<20),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0<s<1000)是已知的,且A村到B村与B村到A村的路大多不同.为了提高效率 ...

  10. open_basedir restriction in effect的错误及其解决办法

    问题是出现在了PHP.INI上面了   原因是php.ini里设置了     opendir=/var/web/w0895/:/tmp:/usr/lib/php  解答: 其实open_basedir ...