很多人用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实际工作状况,提高算法移植效率

AXI VDMA使用相关推荐

  1. 基于AXI VDMA的图像采集系统及VDMA使用总结

    AXI Stream协议及视频流格式 AXI Stream关键的只有两根信号线,及tvalid核tready.tvalid是主设备驱动的信号,表示Stream上的数据是有效的,tready由从设备驱动 ...

  2. AXI VDMA回环测试

    Block Design 搭建如下图所示的硬件系统: 该硬件系统的数据流向为: DDR–>AXI VDMA–>AXI DATA FIFO–>AXI VDMA–>DDR 即将一幅 ...

  3. [转]基于AXI VDMA的图像采集系统

    本文来自:http://blog.csdn.net/qq_36373500/article/details/70230663 本课程将对Xilinx提供的一款IP核--AXI VDMA(Video D ...

  4. 基于AXI VDMA的图像采集系统

    本课程将对Xilinx提供的一款IP核--AXI VDMA(Video Direct Memory Access) 进行详细讲解,为后续的学习和开发做好准备.内容安排如下:首先分析为什么要使用VDMA ...

  5. 米联客 ZYNQ/SOC 精品教程 S02-CH24 利用AXI VDMA 实现MT9V034摄像头采集

    软件版本:VIVADO2017.4 操作系统:WIN10 64bit 硬件平台:适用米联客 ZYNQ系列开发板 米联客(MSXBO)论坛:www.osrc.cn答疑解惑专栏开通,欢迎大家给我提问!! ...

  6. ZYNQ学习之旅--PS_AXI_VDMA(利用VDMA实现将PS端的数据显示在PL端的HDMI上)

    目录标题 简介 帧缓存 同步锁相(Genlock ) Genlock Master Genlock Slave Dynamic Genlock Master Dynamic Genlock Slave ...

  7. Xilinx VDMA寄存器笔记

    以下内容均参考Xilinx官方文档pg020 AXI VDMA章节. 目录 MM2S_VDMACR (MM2S VDMA Control Register - Offset 00h) MM2S_VDM ...

  8. Zynq-PS-SDK(9) 之 VDMA

    目录 0.Prepare 1.Preview 2.VDMA 2.1.Features 2.2.Channels defines 2.2.1.Write Channel(S2MM) 2.2.2.Read ...

  9. VDMA学习(一)pg020总结

    1.概况 1.1 VDMA系统框图 通过AXI4-Lite接口对寄存器进行配置后,控制/状态逻辑模块会向DataMover生成适当的命令以启动写入和读取.Line Buffer则用于将像素数据写出到A ...

最新文章

  1. 如何用最强模型BERT做NLP迁移学习?
  2. 使用C++实现单项选择题标准化考试系统设计
  3. linux vim配置注释,vim自动添加注释
  4. jmeter操作数据库
  5. java运维工程师做什么_网络工程师和网络运维工程师有什么不同?
  6. acm省赛选拔组队赛经验谈
  7. 林业大学计算机专业排名2019,2019北京林业大学专业排名(4页)-原创力文档
  8. 分分钟学会系列:mac地址泛洪攻击实验
  9. jquery系列教程7-自定义jquery插件全解:对象函数、全局函数、选择器
  10. sql server使用的注意点及优化点 自备
  11. linux下688权限,Linux shell脚本笔记
  12. hfss和python接口_python 与HFSS联合仿真的教程讲解
  13. 51单片机贪吃蛇程序
  14. GSMA在G20峰会召开之前就妇女数字融合提出综合性议程
  15. php实现aes ecb模式加密,PHP、Python、Java的AES ECB加密实现-Fun言
  16. 【正点原子FPGA连载】第三十六章 基于OV5640的PL以太网视频传输实验-摘自【正点原子】领航者ZYNQ之FPGA开发指南_V2.0
  17. C++ typename详解
  18. validation检查框架
  19. 卡迈克尔数 Carmichael Numbers(挑战程序设计竞赛)
  20. 杰瑞学Perl之CPAN(1)

热门文章

  1. Zhong Shentong
  2. tomcat启动时错误:Failed to start component [StandardEngine[Catalina].StandardHost[localhost].错误
  3. 购买二手计算机信息询问英语作文,二手商品出现的问题和原因英语作文
  4. 1970年建立的网站?30年前中国的网站?
  5. Error updating changes: error launching git
  6. Android开发之asserts读取文件
  7. BigInteger可以计算超出Integer范围的数
  8. Socket实现聊天室(二)
  9. 00_Oracle mysql学习笔记整理
  10. C语言的基本的输入输出