软件版本:vitis2019.2(vivado2019.2) 操作系统:WIN10 64bit 硬件平台:适用XILINX A7/K7/Z7/ZU/KU系列FPGA(本文使用米联客(milianke)MK7160FA开发板) 登录"米联客"FPGA社区-www.uisrc.com视频课程、答疑解惑! 5.1概述图像数据缓存方法说到底最终目的主要还是为了解决图像处理方面的问题,本文修改前往的video2通道数据,并且对video2通道数据完成sobel计算,然后把结果摄像头的实时采集结果和实时处理结果同时显示到显示器上。 本文实验目的: 1:掌握2个uifdma_vbuf IP的同时使用,以及读写通道之间的同步设计 2:实现1路数据实时显示,1路数据实时sobel计算通过uifdma_vbuf+fdma2.0保持到内存中。 3:掌握uifdma_vbuf IP stride参数的设置,实现一个屏幕实时显示当前摄像头视频以及实时计算的sobel视频 4:掌握图像处理中多通道读写的多缓存机制 5.2硬件电路分析5.2.1FEP扩展接口摄像头扩展卡安装在FEP扩展接口上,这里主要用到了摄像头接口的定义,需要注意MK7160默认IO是3.3V的需要匹配3.3V的扩展卡和摄像头。
5.2.2fpga_pin.xdc摄像头和HDMI输出IO约束
5.3硬件连接5.4PL图形化设计5.4.1系统框图为2个输入图像在一个显示器输出,而不出现撕裂,关键就是在于uifdmavbuf的同步机制,这里让uifdmavbuf1的vid_wsync_o作为同步信号,分别给uifdmavbuf1的读和写通道,以及uifdmavbuf2的写通道使用。uifdmavbuf2的读通道没有使用。 为了完成sobel计算,RGB565 to RGB888输出的de信号不是连续的,需要通过uirgbfifo转换成连续的de信号。 5.4.2PL图形化编程5.4.3uifdma_vbuf参数设置这里是把摄像头的输出分辨率设置为640*480,并且把相同的摄像头数据分别输入到uifdma_vbuf0和uifdma_vbuf1的写通道。输出到显示器的分辨率为1280*720
5.5程序分析5.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) 5.5.2多缓存设计原理图上图中uifdma_vbuf0 ip的write channel的帧同步计数器用于uifdma_vbuf0的读写通道同步以及uifmda_vdbuf1的写通道同步。可以看到uifdma_vbuf0的写通道地址和uifdma_vbuf1的写通道地址相同,另外uifdma_vbuf0的读通道地址,晚一帧于uifdma_vbuf0的写通道地址,这样就可以确保视频图像不会出现读写数据缓存冲突而导致的图像撕裂问题了。以下给出帧计数器,以及地址切换部分代码。具体的可以阅读uifdma_vbuf的源码。 写同步计数器:
写地址的切换:
帧延迟控制:
读地址的切换:
5.6实验结果 |