在上一篇文章里,博者简单讲解了视频流的传输,这篇文章,博者将介绍vdma这个IP核。
在上一篇文章中,视频流的传输,我们使用到了vdma,视频的流向是从S_AXIS_S2MM传入,在由M_AXIS_MM2S传出。视频流传入IP时由stream转换为memary map格式,传出时又将格式转换回来,我一度以为这个动作会不会多此一举并且增加了延时。在查找资料后发现并非如此。
先上结论:1、VDMA IP核允许内部子系统独立直接读写内存,而不需要cpu的介入,释放了cpu性能;2、调节了数据传入和传出的频率。
VDMA的作用
VDMA本质上是一个搬运数据的IP核。其数据接口分为读写通道,写通道将AXI_stream类型数据流写入ddr3,经过cpu的相应处理再由VDMA读通道以AXI_stream格式输出。同DMA一样,VDMA这个IP核主要的功能是对ddr进行读写操作,也许你会觉得我们还要经过ddr的数据传输太耗费时间,但是当我们需要大缓存时,ddr就起到了很大的作用,就比如本文前两篇的ov5640的项目,笔者对图像进行处理就需要较大的缓存。
帧存、双缓存和多缓存
简单介绍一下帧存,它是屏幕所显示画面的一个直接映象,帧缓存的每一存储单元对应屏幕上的一个像素,整个帧缓存对应一帧图像。
双缓存及多缓存:假设你要给泳池装满水,只有桶这个工具,使用一个桶时,要在水龙头下等桶装满,再将桶搬过去倒水;如果是两个桶,那么就可以将一个桶装满,换另一个桶装水的同时,将装满的搬到泳池边倒水,节省了水龙头装满水桶的这个时间段;如果我再雇一个帮手,再加一个水桶,那么又节省了搬运的时间。水桶就是后缓冲区(back buffer),屏幕就是水池。而vdma有32个帧存,大大减小了输出图像的频闪、画面的撕裂感等。
VDMA接口类型
1、AXI-LITE:ps通过核接口来配置VDMA;
2、AXI-Memary Map write:映射到存储器写;
3、AXI-Memary Map read:映射到存储器读;
4、S2MM:AXI stream视频流写入图像;
5、MM2S:AXI stream视频流读出图像;
视频同步信号接口
Genlock
同步锁相,可以使一套或多套系统与同一同步源实现同步,即能够使视频的刷新和外部视频源保持一致。当提供了一个适当的信号后,系统就会把它的显示刷新率和这个信号进行锁定 。
VDMA的锁相同步特性正是用于阻止读、写通道同时操作同一个帧存。VDMA的每个通道都可以选择自己的操作类型(同步锁相主/从或者动态同步锁相主/从),利用该特性,禁止主从接口同时访问同一缓存,从而保持同步。
genlock相关信号:
VDMA支持四种模式的锁相同步,分别为:
1、Genlock Master(锁相同步主端):
读通道(MM2S):当配置为Genlock Master时,该通道不会跳过或者重复任一帧数据,并把当前帧的编号输出在mm2s_frame_ptr_out端口; 写通道(S2MM):当配置为Genlock Master时,该通道不会跳过或者重复任一帧数据,并把当前帧的编号输出到s2mm_frame_ptr_out端口。
2、Genlock Slave(锁相同步从端):
读通道(MM2S),当配置为Genlock Slave时,该通道会通过跳过或者重复一些帧的方式,尝试与Genlock Master同步。通道会对mm2s_frame_ptr_in端口进行采样,获取Genlock Master的帧编号。指定通道工作在Genlock Slave模式,必须进行如下操作:
(1)将GenlockEn置1(MM2S_VDMACR[3]=1),使能主、从通道之间的Genlock同步。
(2)将GenlockSrc置1(MM2S_VDMACR[7]=1),使能内部Genlock模式。如果在Vivado IDE中同时使能读、写通道,该位默认置位。当GenlockSRC=1时,VDMA默认支持内部同步锁相总线。这样一来就没有必要在外部对帧指针端口(*frame_ptr_out和*_frame_ptr_in)进行连接了。
(3)根据主从通道的帧率,使用mm2s_frmdly_stride[28:24]设定合适的延迟时间。
写通道(S2MM):当配置为Genlock Slave时,该通道会通过跳过或者重复一些帧的方式,尝试与Genlock Master同步。通道会对s2mm_frame_ptr_in端口进行采样,获取Genlock Master的帧编号。指定通道工作在Genlock Slave模式,必须进行如下操作。
(1)将GenlockEn置1(S2MM_VDMACR[3]=1),使能主、从通道之间的Genlock同步。
(2)将GenlockSrc置1(S2MM_VDMACR[7]=1),使能内部Genlock模式。如果在Vivado IDE中同时使能读、写通道,该位默认置位。当GenlockSRC=1时,VDMA默认支持内部同步锁相总线。这样一来就没有必要在外部对帧指针端口(*frame_ptr_out和*_frame_ptr_in)进行连接了。
(3)根据主从通道的帧率,使用mm2s_frmdly_stride[28:24]设定合适的延迟时间。
3、Dynamic Genlock Master(动态锁相同步主端)
动态Genlock Master与Genlock Master的区别在于,主通道会跳过从通道正在操作的帧。举例而言,对于三帧存而言,动态Genlock Master会按照0,1,2,0,1,2的顺序循环使用帧存,一旦检测到Master即将操作Slave正在操作的帧,就会跳过该帧继续循环。因此,如果Slave通道一直在操作帧存1,那么Master通道就会在帧0和帧2之间来回切换。
4、Dynamic Genlock Slave(动态锁相同步从端)