软件版本:vitis2019.2(vivado2019.2) 操作系统:WIN10 64bit 硬件平台:适用XILINX A7/K7/Z7/ZU/KU系列FPGA(本文使用米联客(milianke)MK7160FA开发板) 登录"米联客"FPGA社区-www.uisrc.com视频课程、答疑解惑! 4.1概述是否还记得刚刚前文中提到的uifdma_vbuf中的stride参数,并没有详细介绍其用途,本文中的重点就是关于stride参数的应用。通过设置stride参数我们可以让一个显示器输出多个通道的画面,并且通过uifdma_vbuf的缓存控制机制可以确保图形不撕裂。 本文实验目的: 1:掌握2个uifdma_vbuf IP的同时使用,以及读写通道之间的同步设计 2:实现1个5640摄像头数据共享给2个uifdma_vbuf的写数据通道 3:掌握uifdma_vbuf IP stride参数的设置,实现一个屏幕显示多个图像的方法 4:掌握图像处理中多通道读写的多缓存机制 4.2硬件电路分析4.2.1FEP扩展接口摄像头扩展卡安装在FEP扩展接口上,这里主要用到了摄像头接口的定义,需要注意MK7160默认IO是3.3V的需要匹配3.3V的扩展卡和摄像头。
4.2.2fpga_pin.xdc摄像头和HDMI输出IO约束
4.3硬件连接4.4PL图形化设计4.4.1系统框图为2个输入图像在一个显示器输出,而不出现撕裂,关键就是在于uifdmavbuf的同步机制,这里让uifdmavbuf1的vid_wsync_o作为同步信号,分别给uifdmavbuf1的读和写通道,以及uifdmavbuf2的写通道使用。uifdmavbuf2的读通道没有使用。 4.4.2PL图形化编程4.4.3uifdma_vbuf参数设置这里是把摄像头的输出分辨率设置为640*480,并且把相同的摄像头数据分别输入到uifdma_vbuf0和uifdma_vbuf1的写通道。输出到显示器的分辨率为1280*720
4.5程序分析4.5.1显示原理设计
为了把2个图像显示到1个显示器,首先得搞清楚以下关系: hsize:每1行图像实际在内存中占用的有效空间,以32bit表示一个像素的时候占用内存大小为hsize*4 hstride:用于设置每行图像第一个像素的地址,以32bit 表示一个像素的时候h_cnt* hstride*4 vsize:有效的行 可以看到以上 video1_hstride= hstride; video2_hstride= hstride; 因此很容易得出video1的每行第一个像素的地址也是h_cnt* hstride*4 同理如果我们需要把video2在hsize和vsize空间的任何位置显示,我们只要关心video2每一行图像第一个像素的地址,可以用以下公式h_cnt* hstride*4+offset 比如我们这里背景输出到显示器的分辨率为1280*720, video2的分辨率是640*480需要移动上图的右下脚,offset=(1280-640)*4*(720-480) 4.5.2多缓存设计原理图上图中uifdma_vbuf0 ip的write channel的帧同步计数器用于uifdma_vbuf0的读写通道同步以及uifmda_vdbuf1的写通道同步。可以看到uifdma_vbuf0的写通道地址和uifdma_vbuf1的写通道地址相同,另外uifdma_vbuf0的读通道地址,晚一帧于uifdma_vbuf0的写通道地址,这样就可以确保视频图像不会出现读写数据缓存冲突而导致的图像撕裂问题了。以下给出帧计数器,以及地址切换部分代码。具体的可以阅读uifdma_vbuf的源码。 写同步计数器:
写地址的切换:
帧延迟控制:
读地址的切换:
4.6实验结果 |