打印
[FPGA]

玩转Zynq连载40——[ex59] 基于Zynq的双目视觉图像采集显示实例

[复制链接]
682|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 ove学习使我快乐 于 2020-2-20 11:02 编辑


1 CMOS摄像头应用背景与驱动原理
CMOS摄像头(CMOS Sensor)是一种采用CMOS图像传感器的摄像头。摄像头主要有两类,CMOS和CCD。CMOS一般应用在普通数码设备中,CCD一般应用在高档数码设备中,它们都是光学成像,但CCD比CMOS单位成像的效果要好。CCD镜头比CMOS的颜色还原更好,并且分辨率更高。
         CCD和CMOS在制造上的主要区别是,CCD是集成在半导体单晶材料上,而CMOS是集成在被称做金属氧化物的半导体材料上,但工作原理没有本质的区别。在成像方面,CCD的成像通透性、明锐度都很不错,色彩还原、曝光可以保证基本准确。而CMOS的产品往往通透性一般,对实物的色彩还原能力偏弱,曝光也都不太好。由于CMOS自身的物理特性,其成像质量和CCD还是有一定距离的。CCD制造工艺较复杂,掌握CCD技术的厂商并不多,采用CCD摄像头的价格相对也比较昂贵。但随着制造工艺的不断改进,目前CMOS和CCD的实际成像效果的差异在逐渐减小。加之CMOS的制造成本和功耗都要比CCD低不少,因此很多摄像头生产厂商更趋向于采用CMOS感光元件。正是由于低廉的价格以及高度的整合性,使得CMOS摄像头得到了更广泛的应用。
CCD是目前比较成熟的成像器件,CMOS被看作未来的成像器件。因为CMOS结构相对简单,与现有的大规模集成电路生产工艺相同,从而生产成本可以大大降低。从原理上看,CMOS的信号是以点为单位的电荷信号,而CCD是以行为单位的电流信号,前者更为敏感,速度也更快,更为省电。现在高级的CMOS并不比一般CCD差,但是CMOS工艺还不是十分成熟,普通的CMOS一般分辨率低而成像较差。
不管CCD还是CMOS,基本上两者都是利用矽感光二极体(photodiode)进行光与电的转换。比较CCD和CMOS的结构,ADC的位置和数量是最大的不同。简单的说,CCD每曝光一次,在快门关闭后进行像素转移处理,将每一行中每一个像素(pixel)的电荷信号依序传入“缓冲器”中,由底端的线路引导输出至CCD旁的放大器进行放大,再串联ADC输出;相应的,CMOS的设计中每个像素旁就直接连着ADC(放大兼类比数字信号转换器),信号直接放大并转换成数字信号。
         我们这个模块中所使用的CMOSSensor的型号为OV5640,其内部功能框图如图1所示。前端有模拟感光模块,经过AD处理后将模拟信号转换为数字信号,后端经过一些处理后输出符合一定协议标准的视频数据流。FPGA器件将根据这个数据流的协议对视频数据进行采集解码,最终显示在720p (1280*720)分辨率的VGA液晶显示器上。
图1 CMOSSensor内部功能框图

2 视频采集系统设计概述
如图2所示,这是整个视频采集系统的原理框图。上电初始,FPGA需要通过IIC接口对CMOS Sensor进行寄存器初始化配置。这些初始化的基本参数,即初始化地址对应的初始化数据都存储在一个预先配置好的FPGA片内ROM中。在初始化配置完成后,CMOS Sensor就能够持续输出标准RGB的视频数据流,FPGA通过对其同步信号,如时钟、行频和场频进行检测,从而从数据总线上实时的采集图像数据。
在FPGA内部,采集到的视频数据先通过一个FIFO,将原本25MHz频率下同步的数据流转换到50MHz的频率下。接着将这个数据再送入写DDR3缓存的异步FIFO中,这个FIFO中的数据一旦达到一定数量,就会被写入DDR3中。与此同时,使用另一个异步FIFO将DDR3缓存的图像数据读出,并依此送往LCD驱动模块进行显示。LCD驱动模块不断的发出读图像数据的请求,并驱动液晶显示器显示视频图像。
本实例的双目,即2个OV5640摄像头的图像采集,实际上是两个完全一样的图像采集模块,它们采集到的数据分别通过Zynq的AXI HP总线HP1和HP2通道写入到DDR3中。然后LCD显示控制端则分别通过AXI HP总线的HP1和HP2读出两个摄像头的视频图像,最终驱动显示器左右两侧分别显示两个摄像头的图像。
图2 视频采集系统功能框图
         如图3所示,这里显示了整个工程的各个模块层次结构。在顶层模块at7.v下面有9个子模块。这9个子模块的功能以及他们所包含的子模块或例化功能描述如表1所示。
图3 视频采集系统工程代码层次结构
表1 工程模块描述
  
模块名称
  
功能描述
Zstar_zynq_ps
该模块是Zynq PS(Processor System) IP核的例化,AXI HP总线的配置引出和系统所需时钟和复位都是来自于这个Zynq PS。
Image_controller
U2和U4都是例化了这个模块。
  
该模块实现IIC接口对OV5640的初始化、OV5640输出图像的采集控制等。这个模块内部例化了3个子模块,I2C_OV5640_Init_RGB565模块实现IIC的接口协议和初始化配置;I2C_OV5640_Init_RGB565模块下面例化的I2C_Controller模块实现IIC协议,用于产生初始配置数据的 LUT模块则是I2C_OV5640_RGB565_Config;image_capture模块实现图像采集功能。
Axi_hp0_wr
U3和U5都是例化了这个模块。
  
该模块内部例化了用于缓存写入DDR3数据的FIFO,并实现了AXI HP总线的写通道时序,完成数据通过AXI  HP总线写入DDR3的操作。
Axi_hp0_rd
U7和U8都是例化了这个模块。
  
该模块内部例化了用于缓存读出DDR3数据的FIFO,并实现了AXI HP总线的读通道时序,完成数据通过AXI  HP总线从DDR3读出的操作。
lcd_driver
该模块驱动LCD,同时产生控制逻辑读取DDR3缓存的2个摄像头实时视频图像。
led_controller
该模块控制LED闪烁,指示工作状态。

3 IIC接口配置模块设计
         如图4所示,Iic_ctrl模块和iic_gene模块是用于产生IIC配置的逻辑。Iic_ctrl模块主要是最底层的IIC协议实现,而iic_gene模块则使用状态机产生一串的CMOSSensor寄存器配置操作,该模块的配置地址和数据是存储在事先设定好的LUT模块I2C_OV5640_RGB565_Config中。
图4 IIC配置产生逻辑功能框图

4 视频流采集设计
         在对CMOS Sensor进行了寄存器的初始化配置后,并行数据总线上便开始持续的输出视频数据流。如图8所示,这是CMOS Sensor输出VGA(640*480分辨率)并行数据视频流协议的时序波形。我们可以看到,场同步信号VSYNC的每一个高脉冲表示新的一场图像(或者说是新的一帧图像)马上要开始传输;行同步信号HREF为高电平时,表示目前的数据总线D[7:0]上的数据是有效的视频流。
图8 并行数据视频流协议
如图9所示,视频时钟PCLK的每个上升沿,有效数据D[7:0]、行同步信号HREF和场同步信号VSYNC被锁存到FPGA中。
图9 并行数据视频流时序
         一个有效的行将传输640*2Bytes的数据,也就是说,一个像素点会有2Bytes即16bits的有效色彩值。对应R、G、B的位数分别为5bits、6bits、5bits。传输的数据总线是8bits,那么一个像素点对应就有2个8bits需要传输。每两个字节中的R、G、B格式定义如图10所示。
图10 RGB 565输出时序框图
         理解了时序波形,我们再来看看代码中是如何对CMOSSensor送来的这组源同步信号进行采集的。如图11所示,这里通过一个异步FIFO来同步CMOS Sensor和FPGA内部逻辑。我们只要把vpclk、vdb、vhref分别作为FIFO的写入时钟、写入数据和写入使能信号。此外,vvsync作为这个FIFO的复位信号,每一帧新图像前FIFO进行一次清空,实际操作中,为了得到稳定有效的复位信号,我们使用内部时钟对这个复位信号打了一拍。这样,我们便把持续不断的视频流有效数据缓存到了FIFO中。在FIFO的读端,判定数据大等于16*16bit时,就连续读出这16个数据,送到ddr_cache模块的DDR3写缓存FIFO中。
图11 image_capture模块功能框图

5 LCD控制器设计
         LCD显示控制部分比较简单,用x_cnt和y_cnt两个计数器,产生一个二维图像的有效显示区域。有效显示区域的图像数据从DDR3中读取,对应的图像就是OV5640采集到的VGA图像。控制接口上,这个模块输出lcd_rfclr信号作为每个图像帧的同步信号,或者称之为复位信号,在每个有效显示图像开始前,这个信号都会拉高一段时间,axi_hp0_rd.v模块可以用这个信号实现FIFO的复位,以及对应的控制信号的复位。读数据请求信号lcd_rfreq1和lcd_rfreq2会产生连续的640*480个时钟周期的高电平,用于读取DDR3中缓存的两个摄像头的图像数据。16位数据总线lcd_rfdb1和lcd_rfdb2则分别在每个读数据请求信号lcd_rfreq1和lcd_rfreq2拉高后有效,对应数据送到显示器进行显示。lcd_rfreq1和lcd_rfreq2信号的拉高则分别在液晶屏的左边半屏和右边半屏。

6 装配说明
         2个OV5640摄像头模块通过ZstarISB底板与Zstar Zynq开发板连接,VGA也是通过Zstar ISB底板与Zstar Zynq开发板连接,VGA板同时需要连接到VGA显示器。连接示意如图12所示。
7板级调试
         本实例对应ex59实例工程,已经制作好的BOOT.bin放置在工程路径“zstar_ex59\zstar.sdk\BOOT”下。也可以参考文档《玩转Zynq-实例篇:[ex51] 制作裸跑程序的启动文件BOOT.bin.pdf》制作包含.bit文件的BOOT.bin文件,将其拷贝到TF卡中,插入Zstar开发板的卡槽中,做好装配连接,上电。视频显示如图所示。
图 双目视频采集效果

40-8.gif (11.96 KB )

40-8.gif

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

59

主题

60

帖子

2

粉丝