cuter

基于Zynq的图像视频处理、显示平台

0
阅读(16025) 评论(25)

基于Zynq的图像视频处理、显示平台

1、             概述

首先,我们来看一下Xilinx Application Note中经常出现的一副结构图,图1所示,当然不可能所有图都一样,在结构上大同小异吧。这是一个比较典型的图像、视频处理平台的结构图。

1.1、捕获

视频通过HDMI接口进来,然后经Video Input模块做格式变换,送入VDMA,该VDMA的作用是把数据送入在DDR3中所开辟的帧存中去。

另一种是通过摄像头等设备获取视频源,经PS/PL将数据送入DDR3。就我目前的水平而言,个人感觉从PL部分将视频流送入DDR3最简单的方法是通过VDMAaxi4-stream接口,换句话说,将视频流转换为axi4-stream会降低处理难度,这种转换和Video Input模块的工作是类似的。

1.2、处理

该部分包含两个VDMA和一个视频处理模块,一个VDMA负责从帧存中取数据,然后交给处理模块,处理完毕的结果经另一个VDMA送回帧存

1.3、显示

主要是显示控制模块,负责将数据按照标准时序输出送至显示器。


1 视频处理、显示平台架构

从图1可以看出,整个架构的核心是VDMA这个IP,所以搭建平台的关键是掌握VDMA的使用。

2、             VDMA的使用

2.1、基本情况

我们来看一下VDMA的结构框图,了解一下VDMA的基本情况。

2 VDMA框图

如图2所示,VDMA的主要接口有3个,分别为AXI4 Memory MapAXI4-LiteAXI4-Stream

AXI4-Lite

这个接口详细是最常用的接口了,用于读写VDMA内部寄存器,从而实现对VDMA的控制和状态获取。

AXI4-Stream

写通道(s2mm)VDMA获取来自axis接口的数据并将之写入帧存

读通道(mm2s)VDMA从帧存读取数据,然后送至axis接口输出

AXI4 Memory Map

这个接口手册没有讲具体作用,其实这个接口是用于操作DDR的,通过互联模块连接至ZynqHP接口。

2.2、使用方法:

这部分有点像废话,和其他IP一样用就是了。

i、               新建工程

ii、             新建block design

iii、            打开IP Catalog,输入关键字检索到VDMA,或者按类别找到IP

iv、           双击VDMA IP,添加IPblock design

v、             如有需要,再对IP进行参数配置。

2.3VDMA的配置

关于VDMA的详细参数配置,请参考pg020Product Guide,这里把我认为比较重要的地方说一下。

i、               GenLock mode

genlock模式有4中选择,分别为:MasterSlaveDynamic MasterDynamic Slave。选择不同的模式对模块的端口连接有不同的要求,所以这里要注意,改变模式,端口连接也要修改,如图3、图4所示。

3

4

ii、             Line Buffer Depth

Line Buffer设置不合理的话,会影响显示效果,甚至会造成无显示。

iii、            关于时钟

刚开始上手时,建议把AXI4-LiteAXI4AXI-Stream这三个接口的时钟统一为像素时钟。上手之后,可以尝试三个接口使用不同的时钟。要注意AXI4接口时钟一定要大于等于AXI-Stream接口的时钟,否则会造成数据丢失。

2.4VDMA初始化流程

1. Write control information to the channel VDMACR register (Offset 0x00 for MM2S and

0x30 for S2MM) to set interrupt enables if desired, and set VDMACR.RS=1 to start the

AXI VDMA channel running.

2. Write valid video frame buffer start address to the channel START_ADDRESS register 1 to

N where N equals Frame Buffers (Offset 0x5Cup to 0x98for MM2S and 0xACup to

0xE8for S2MM). Set the REG_INDEX register if required.

3. Write a valid Frame Delay (valid only for Genlock Slave) and Stride to the channel

FRMDLY_STRIDE register (Offset 0x58for MM2S and 0xA8for S2MM).

4. Write a valid Horizontal Size to the channel HSIZE register (Offset 0x54for MM2S and

0xA4for S2MM).

5. Write a valid Vertical Size to the channel VSIZE register (Offset 0x50for MM2S and

0xA0for S2MM). This starts the channel transferring video data.

上述寄存器的作用在图5中可以找到,某个寄存器每个bit的功能,请参考pg020VDMAProduct Guide,第2 Product SpecificationRegister Space小节。

5 VDMA寄存器偏移地址及作用

3、             设计举例

3.1、逻辑设计

有了上文所做的铺垫,相信搭建出一个显示平台就不是非常难了,下面,我给出一个具体的框图,如图6所示。(本来想用顶层的block design截图,发现IP布局、连线比较乱,看不清楚)。另外,大家还可以参考xapp792,大同小异,我之前的博客也提过如何搭建HDMI的显示平台,不过最近还是有网友提问如何搭建平台。其实,官网给出的资料往往是很具参考价值的,大家可以多多留意。

6 逻辑设计举例

这是一个图形绘制和显示平台,不是视频处理平台,视频处理平台稍有不同,一般而言,视频处理用到genlock和我这里不一样。图中所有信号和连接情况都和实际设计一样,能够体现出设计思路。

vdmaaxis2voutvtc这三个IPVivado都是提供的,当然也可以自己设计,难度不大,这里就不说了。

3.2、软件设计

软件流程图如下:

7 软件流程图

从流程图可以看出软件部分是很简单,这是由于显示是PL负责的,两者的交集在帧存,读写不发生冲突就可以了。当前PL读取的显示画面,总是PS绘制的上一帧内容。如想减少PS负担,可以将清帧存的任务交由PL完成。

测试画面忘记了,晚上补上吧~


版权声明:

本文由博主“cuter”发布。欢迎转载,但不得擅自更改博文内容,也不得用于任何盈利目的。转载时不得删除作者简介和版权声明。如有盗用而不说明出处引起的版权纠纷,由盗用者自负。

博客官方地址:

ChinaAET:http://blog.chinaaet.com/cuter521

EDN China: http://bbs.ednchina.com/BLOG_cuter521_356737.HTM

  1. @sty9366   

    谢谢博主的解答。我的写通道fsync采用的s2mm2 tuser信号,是video转axis模块给的。我在arm中想做一帧图像的处理,目前找不到每帧结束的标志。想用中断做,不知道博主对vdma中断有没有了解,我想达到的效果是不是必须要用中断了?

    您好,请问解决了这个问题吗?我现在也在困惑用中断怎么实现,VDMA文档里貌似只有错误中断输出?

  2. @cuter   

    有个fsync信号,可以触发一帧的读写。完成了一帧数据的写入,如何检测,协议里应该有个tlast之类的信号,你找找看

    你既然想做额外的处理,帧率肯定是要改变的了,不过帧率慢、你处理速度快的话,也不会丢帧,所以可以考虑用别的信号作为fsync,而不是用tuser信号。vdma的中断我好像没用过。你参考我这篇文章的架构,自己做个vtc,弄个fsync信号出来,应该能满足你的需求,以前我做过视频和作图的叠加,就是这个架构

  3. @cuter   

    有个fsync信号,可以触发一帧的读写。完成了一帧数据的写入,如何检测,协议里应该有个tlast之类的信号,你找找看

    谢谢博主的解答。我的写通道fsync采用的s2mm2 tuser信号,是video转axis模块给的。我在arm中想做一帧图像的处理,目前找不到每帧结束的标志。想用中断做,不知道博主对vdma中断有没有了解,我想达到的效果是不是必须要用中断了?

  4. @sty9366   

    我最近也在接触用VDMA,网上找了个ZYNQ7000的视频传输例程。但是我在学习过程中遇到了问题。我想在软件部分对存入的一帧数据进行处理后再读出去,但是VDMA它一直自动得进行写入和读取,请问我在ARM中如何能知道VDMA完成了一帧的写入呢?@cuter

    有个fsync信号,可以触发一帧的读写。完成了一帧数据的写入,如何检测,协议里应该有个tlast之类的信号,你找找看

  5. 我最近也在接触用VDMA,网上找了个ZYNQ7000的视频传输例程。但是我在学习过程中遇到了问题。我想在软件部分对存入的一帧数据进行处理后再读出去,但是VDMA它一直自动得进行写入和读取,请问我在ARM中如何能知道VDMA完成了一帧的写入呢?@cuter

  6. @fengjing214   

    你这问题我没遇到过……不过你说的边界上下移动没太明白,画面上下抖动?内部结构可以参考我们已发表的论文:《基于Zynq的图形生成电路设计与实现》,下载页面:http://yjyxs.com/CN/abstract/abstract9774.shtml


    谢谢回复与分享。不是抖动,显示出来的画面视觉上看是整个画面移位了,类似于一幅完整的画从中间分开,然后原来在上面的部分在下面,原来在下面的部分在上面。但整个屏幕看起来仍旧是一幅图像。博主能否告知您在该工程中的时钟设置,对于VDMA的相关时钟域和软硬件配置参数。


    看样子三两句也说不清楚,我看能不能让管理员把你加到我们的Zynq交流群里

  7. @cuter   


    你这问题我没遇到过……不过你说的边界上下移动没太明白,画面上下抖动?内部结构可以参考我们已发表的论文:《基于Zynq的图形生成电路设计与实现》,下载页面:http://yjyxs.com/CN/abstract/abstract9774.shtml


    谢谢回复与分享。不是抖动,显示出来的画面视觉上看是整个画面移位了,类似于一幅完整的画从中间分开,然后原来在上面的部分在下面,原来在下面的部分在上面。但整个屏幕看起来仍旧是一幅图像。博主能否告知您在该工程中的时钟设置,对于VDMA的相关时钟域和软硬件配置参数。


  8. @fengjing214   
    你好,很受用。跟着博主做的,视频画面经过VDMA后,在显示器上出现画面边界上下移动的现象。能否加QQ交流下,QQ282520676


    你这问题我没遇到过……不过你说的边界上下移动没太明白,画面上下抖动?内部结构可以参考我们已发表的论文:《基于Zynq的图形生成电路设计与实现》,下载页面:http://yjyxs.com/CN/abstract/abstract9774.shtml

  9. @nickhu2   

    您的问题解决了吗?我也一样,为什么复位一开始就显示有错误?

    是VDMA后面接的IP的相关接口和配置不对,影响了VDMA正常工作,如果VDMA设置没有问题的话检查下后面的IP,一个一个排查。希望能帮上你。


  10. @nickhu2   

    您的问题解决了吗?我也一样,为什么复位一开始就显示有错误?

    是VDMA后面接的IP的相关接口和配置不对,影响了VDMA正常工作,如果VDMA设置没有问题的话检查下后面的IP,一个一个排查。希望能帮上你。


  11. @cuter   
    你好,很受用。跟着博主做的,视频画面经过VDMA后,在显示器上出现画面边界上下移动的现象。能否加QQ交流下,QQ282520676


  12. @狂羁青马   

    恳请博主上硬件连线电路图,我等小白有点费劲,或者帮忙给我发一份,我的邮箱985494202@qq.com  。博主做了USB摄像头读取视频,经vdma传送至hls做的sobel处理,做硬件加速,实时显示  吗??还请指教。

    另外博主写的东西很受教,大赞一下

    抱歉,我没有做过USB采集视频、处理、显示的系统。

    硬件连线电路图也不方便透露,我手头的是上家公司的资料,根据保密条例,是不能共享的,写博客只是思路上的指导,让后来者少走弯路,并不是要把公司的项目资料公开。


  13. 恳请博主上硬件连线电路图,我等小白有点费劲,或者帮忙给我发一份,我的邮箱985494202@qq.com  。博主做了USB摄像头读取视频,经vdma传送至hls做的sobel处理,做硬件加速,实时显示  吗??还请指教。

    另外博主写的东西很受教,大赞一下



  14. @fengjing214   

    @cuter521

    你好,最近在用zedboard做xapp1205的例子,现在检测觉得错误在VDMA那里,VDMA控制寄存器reset后,去读他的status register,读出来的结果显示VDMA有错误,这种情况该怎么去解决?这块是zynq_gp0(axi)+tpg+vmda+(axi)zynq_hp0。求交流指导

    您的问题解决了吗?我也一样,为什么复位一开始就显示有错误?

  15. @fengjing214   

    @cuter521

    你好,最近在用zedboard做xapp1205的例子,现在检测觉得错误在VDMA那里,VDMA控制寄存器reset后,去读他的status register,读出来的结果显示VDMA有错误,这种情况该怎么去解决?这块是zynq_gp0(axi)+tpg+vmda+(axi)zynq_hp0。求交流指导

    您的问题解决了吗?我也一样,为什么复位一开始就显示有错误?