08fdma数据通路加入sobel算法IP方案

发布时间 2023-12-30 12:21:09作者: 米联客(milianke)

软件版本:vitis2021.1(vivado2021.1)

操作系统:WIN10 64bit

硬件平台:适用XILINX A7/K7/Z7/ZU/KU系列FPGA

登录"米联客"FPGA社区-www.uisrc.com视频课程、答疑解惑!

8.1概述    

本文实验目的:

1:掌握2个uifdma_dbuf IP的同时使用,以及读写通道之间的同步设计

2:实现1路数据实时显示,1路数据实时sobel计算通过uifdma_dbuf+fdma3.1保持到内存中。

3:掌握uifdma_dbuf IP stride参数的设置,实现一个屏幕实时显示当前摄像头视频以及实时计算的sobel视频

4:掌握图像处理中多通道读写的多缓存机制

8.2系统框图

本系统中通过milianke uifdma_dbuf ip的写通道将摄像头采集到的数据通过AXI intercomment 写入DDR3,同时使用milianke uifdma_dbuf ip的读通道读取DDR3中的视频数据通过HDMI接口输出至显示屏。

为2个输入图像在一个显示器输出,而不出现撕裂,关键就是在于uifdmadbuf的同步机制,这里让uifdmadbuf1的wbuf_sync_o作为同步信号,分别给uifdmadbuf1的读和写通道,以及uifdmadbuf2的写通道使用。uifdmadbuf2的读通道没有使用。

将其中一路数据进行soble计算,为了完成sobel计算,RGB565 to RGB888输出的de信号不是连续的,需要通过uirgbfifo转换成连续的de信号。

8.3硬件电路分析

1:CEP扩展接口

摄像头扩展卡安装在CEP上,在硬件的PCB上有丝印标注。下图为F9底板的CEP连接器定义,这里主要用到了摄像头接口的定义,默认核心板BANK电压为3.3V。

HDMI底板原理图如下。

8.3.2fpga_pin.xdc摄像头和HDMI输出IO约束

 

set_property PACKAGE_PIN V4 [get_ports I_sysclk]

set_property IOSTANDARD SSTL135 [get_ports I_sysclk]

 

set_property PACKAGE_PIN C18 [get_ports hdmi_tx_tmds_clk_p]

set_property PACKAGE_PIN B15 [get_ports {hdmi_tx_tmds_data_p[0]}]

set_property PACKAGE_PIN B21 [get_ports {hdmi_tx_tmds_data_p[1]}]

set_property PACKAGE_PIN C22 [get_ports {hdmi_tx_tmds_data_p[2]}]

 

set_property IOSTANDARD TMDS_33 [get_ports hdmi_tx_tmds_clk_p]

set_property IOSTANDARD TMDS_33 [get_ports {hdmi_tx_tmds_data_p[2]}]

set_property IOSTANDARD TMDS_33 [get_ports {hdmi_tx_tmds_data_p[1]}]

set_property IOSTANDARD TMDS_33 [get_ports {hdmi_tx_tmds_data_p[0]}]

 

 

#---------------------------sensor---------------------------

set_property PACKAGE_PIN D17 [get_ports I_cmos_pclk]

set_property PACKAGE_PIN D20 [get_ports I_cmos_vsync]

set_property PACKAGE_PIN C20 [get_ports I_cmos_href]

set_property PACKAGE_PIN C17 [get_ports O_cmos_xclk]

set_property PACKAGE_PIN A19 [get_ports {I_cmos_data[0]}]

set_property PACKAGE_PIN A18 [get_ports {I_cmos_data[1]}]

set_property PACKAGE_PIN D19 [get_ports {I_cmos_data[2]}]

set_property PACKAGE_PIN E19 [get_ports {I_cmos_data[3]}]

set_property PACKAGE_PIN A20 [get_ports {I_cmos_data[4]}]

set_property PACKAGE_PIN B20 [get_ports {I_cmos_data[5]}]

set_property PACKAGE_PIN F20 [get_ports {I_cmos_data[6]}]

set_property PACKAGE_PIN F19 [get_ports {I_cmos_data[7]}]

set_property PACKAGE_PIN G21 [get_ports O_cam_scl]

set_property PACKAGE_PIN G22 [get_ports IO_cam_sda]

 

set_property IOSTANDARD LVCMOS33 [get_ports I_cmos_pclk]

set_property IOSTANDARD LVCMOS33 [get_ports I_cmos_vsync]

set_property IOSTANDARD LVCMOS33 [get_ports I_cmos_href]

set_property IOSTANDARD LVCMOS33 [get_ports O_cmos_xclk]

set_property IOSTANDARD LVCMOS33 [get_ports {I_cmos_data[7]}]

set_property IOSTANDARD LVCMOS33 [get_ports {I_cmos_data[6]}]

set_property IOSTANDARD LVCMOS33 [get_ports {I_cmos_data[5]}]

set_property IOSTANDARD LVCMOS33 [get_ports {I_cmos_data[4]}]

set_property IOSTANDARD LVCMOS33 [get_ports {I_cmos_data[3]}]

set_property IOSTANDARD LVCMOS33 [get_ports {I_cmos_data[2]}]

set_property IOSTANDARD LVCMOS33 [get_ports {I_cmos_data[1]}]

set_property IOSTANDARD LVCMOS33 [get_ports {I_cmos_data[0]}]

set_property IOSTANDARD LVCMOS33 [get_ports O_cam_scl]

set_property IOSTANDARD LVCMOS33 [get_ports IO_cam_sda]

set_property PULLUP true [get_ports O_cam_scl]

set_property PULLUP true [get_ports IO_cam_sda]

 

#bit compress

set_property CFGBVS VCCO [current_design]

set_property CONFIG_VOLTAGE 3.3 [current_design]

set_property BITSTREAM.GENERAL.COMPRESS true [current_design]

set_property BITSTREAM.CONFIG.CONFIGRATE 50 [current_design]

set_property BITSTREAM.CONFIG.SPI_BUSWIDTH 4 [current_design]

set_property BITSTREAM.CONFIG.SPI_FALL_EDGE Yes [current_design]

 

8.4基于图形化的逻辑设计

1:帧同步设计

对于多路视频传输的场合,需要正确设置同步。 uifdma_dbuf0的写通道输出帧同步计数器直接接入

uifdma_dbuf0,uifdma_dbuf1的写通道同步计数输入。uifdma_dbuf0的读通道,延迟1帧于uifdma_dbuf0的写通道帧计数器。

2:多路视频的同屏显示原理

    

以把2个摄像头CAM0和CAM1输出到同一个显示器上为列,为了把2个图像显示到1个显示器,首先得搞清楚以下关系:

hsize:每1行图像实际在内存中占用的有效空间,以32bit表示一个像素的时候占用内存大小为hsize*4

hstride:用于设置每行图像第一个像素的地址,以32bit 表示一个像素的时候v_cnt* hstride*4

vsize:有效的行

 

因此很容易得出cam0的每行第一个像素的地址也是v_cnt* hstride*4

同理如果我们需要把cam1在hsize和vsize空间的任何位置显示,我们只要关心cam1每一行图像第一个像素的地址,可以用以下公式v_cnt* hstride*4+offset

 

这里2个通道的640*480分辨率视频,在同一个1280*720的视频输出显示。VIDEO1没有进行soble计算的原始图像在左上角,VIDEO2是计算后的图像在右下角。

uifdma_dbuf支持stride参数设置,stride参数可以设置输入数据X(hsize)方向每一行数据的第一个像素到下一个起始像素的间隔地址,利用stride参数可以非常方便地摆放输入视频到内存中的排列方式。

VIDEO1的start addr1=0x10000000(第一个图像的起始地址对于PL DDR可以从0地址开始,低于PS DDR建议偏移20MB)

VIDEO2的start addr1=0x10000000+(640-480)*1280*4+(1280-640)*4

下面重点看下uifdma_dbuf的设置。

3:uifdma_dbuf_0的配置

4:uifdma_dbuf_1的配置

这里是把摄像头的输出分辨率设置为640*480,并且把相同的摄像头数据分别输入到uifdma_dbuf0和uifdma_dbuf1的写通道。输出到显示器的分辨率为1280*720

5:地址空间分配

8.5硬件连接

8.6实验结果