cuter

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

0
阅读(25487)

基于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