1)实验平台:正点原子新起点V2开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609758951113 3)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-300792-1-1.html 4)对正点原子FPGA感兴趣的同学可以加群讨论:994244016 5)关注正点原子公众号,获取最新资料更新
双目摄像头是在一个模组上集成了两个摄像头,实现双通道图像采集的功能。双目摄像头一般应用于安防监控、立体视觉测距、三维重建等领域。本试验只做最基础的工作,把双目OV5640摄像头实时采集到的图像分左右两半显示在LCD屏幕上。 本章包括以下几个部分:
1.1 简介1.2 实验任务 1.3 硬件设计 1.4 程序设计 1.5 下载验证 1.1 简介 摄像头在日常生活中非常常见,一般分为单目摄像头、双目摄像头和多目摄像头。单目摄像头目前使用最为广泛;双目摄像头主要应用于单目摄像头无法胜任的场合,如测距领域,根据两个摄像头的视差,辅以一定的算法,人们可以计算物体的距离;当然针对一些特殊的应用,目前市场上也出现了多目摄像头,以应对更加复杂的场景。在“OV5640摄像头LCD显示实验”中对OV5640的视频传输时序、SCCB协议以及寄存器的配置信息等内容作了详细的介绍,如果大家对这部分内容不是很熟悉的话,请参考之前的实验。本次实验将在前面单目OV5640摄像头的基础上学习双目摄像头的LCD显示。
1.2 实验任务本章实验任务是利用双目OV5640摄像头采集图像,将采集到的图像实时显示在LCD屏幕上,两幅图像分别占据LCD屏的左右半边。
1.3 硬件设计新起点开发板上有两个扩展口,分别是P6和P7。新起点开发板的P6扩展口与LCD屏的管脚复用,故本次实验采用P7扩展口来连接双目OV5640摄像头。P7扩展口原理图如图 55.3.1所示:
图 55.3.1 P7扩展接口原理图 ATK-Dual-OV5640是正点原子推出的一款双目OV5640摄像头模块,其硬件原理图如下图所示:
图 55.3.2 ATK-Dual-OV5640原理图 该模块通过2*20排母(2.54mm间距)同外部连接,连接时将双目摄像头的排母直接插在开发板上的P7扩展口即可,模块实物连接图如图 55.3.3所示:
图 55.3.3 双目摄像头模块实物连接图 由于LCD接口和SDRAM引脚数目较多且在前面相应的章节中已经给出它们的管脚列表,这里只列出双目摄像头相关管脚分配,如下表所示:
双目摄像头TCL约束文件如下:
set_location_assignment PIN_L7 -to cam0_data[7]
set_location_assignment PIN_L6 -to cam0_data[5]
set_location_assignment PIN_K5 -to cam0_data[3]
set_location_assignment PIN_K6 -to cam0_data[1]
set_location_assignment PIN_F3 -to cam0_rst_n
set_location_assignment PIN_G5 -to cam0_href
set_location_assignment PIN_M6 -to cam0_vsync
set_location_assignment PIN_N3 -to cam0_pclk
set_location_assignment PIN_L3 -to cam0_data[6]
set_location_assignment PIN_L4 -to cam0_data[4]
set_location_assignment PIN_K8 -to cam0_data[2]
set_location_assignment PIN_G1 -to cam0_data[0]
set_location_assignment PIN_J6 -to cam0_sda
set_location_assignment PIN_F1 -to cam0_scl
set_location_assignment PIN_J1 -to cam0_pwdn
set_location_assignment PIN_A2 -to cam1_pwdn
set_location_assignment PIN_B5 -to cam1_data[7]
set_location_assignment PIN_B6 -to cam1_data[5]
set_location_assignment PIN_B7 -to cam1_data[3]
set_location_assignment PIN_A4 -to cam1_data[1]
set_location_assignment PIN_D3 -to cam1_rst_n
set_location_assignment PIN_C6 -to cam1_href
set_location_assignment PIN_E5 -to cam1_vsync
set_location_assignment PIN_A3 -to cam1_pclk
set_location_assignment PIN_A5 -to cam1_data[6]
set_location_assignment PIN_A6 -to cam1_data[4]
set_location_assignment PIN_B3 -to cam1_data[2]
set_location_assignment PIN_B4 -to cam1_data[0]
set_location_assignment PIN_F5 -to cam1_sda
set_location_assignment PIN_D6 -to cam1_scl
1.4 程序设计
根据实验任务,首先设计如图 55.4.1所示的系统框图,本章实验的系统框架延续了“OV5640摄像头LCD显示实验”的整体架构,但是做出了一定的修改,在本节实验中我们将寄存器配置模块、IIC驱动模块以及图像采集模块封装成了一个模块(OV5640驱动模块),并且对OV5640驱动模块例化了两次(因为是双目摄像头,所以需要例化两次来分别驱动两个摄像头)。整个工程包含以下5个模块:时钟模块、图像分辨率设置模块、SDRAM控制器模块、摄像头驱动模块(例化两次)和LCD顶层模块。其中时钟模块、图像分辨率设置模块和摄像头驱动模块没有做任何修改,这些模块在单目OV5640摄像头LCD显示实验中已经说明过,这里不再详述,本次实验对SDRAM控制模块和LCD顶层模块做了修改。
图 55.4.1 顶层系统框图 时钟模块(pll):时钟模块通过调用锁相环 IP核实现,共输出3路时钟,分别是SDRAM参考时钟(100Mhz)、SDRAM相位偏移时钟(100Mhz偏移120度,这个偏移角度可以适当调整。)和LCD驱动时钟(50Mhz)。其中SDRAM参考时钟不仅仅用来驱动SDRAM顶层模块还作为摄像头驱动模块的工作时钟来用。 图像分辨率设置模块(picture_size):图像尺寸配置模块用于配置摄像头输出图像尺寸的大小,此外还完成了SDRAM的读写结束地址设置。有关图像分辨率设置模块的详细介绍请大家参考单目OV5640摄像头LCD显示实验章节。 LCD顶层模块(lcd_rgb_top):LCD顶层模块负责驱动LCD屏的驱动信号的输出,同时为其他模块提供屏体参数、场同步信号和数据请求信号。 摄像头驱动模块(ov5640_dri):本模块由原先的IIC驱动模块、OV5640 寄存器配置模块和摄像头图像采集模块封装而成,这样做是为了减少顶层模块的代码量,增强可读性,同时有利于代码的维护和管理。由于本次实验连接了两个相同的摄像头,因此我们会对摄像头驱动模块例化两次,将两个驱动模块输出的数据和数据有效使能全部连接到SDRAM控制模块。有关摄像头驱动模块的详细介绍请大家参考单目OV5640摄像头LCD显示实验章节。 SDRAM控制模块(sdram_top):SDRAM读写控制器模块负责驱动SDRAM片外存储器,缓存图像传感器输出的图像数据。该模块将SDRAM复杂的读写操作封装成类似FIFO的用户接口,非常方便用户的使用。 下面是顶层模块的原理图:
图 55.4.2 顶层模块原理图 本次实验是在单目OV5640摄像头LCD显示实验的基础上作修改的,主要修改了SDRAM控制模块和LCD顶层模块,而其余模块基本相同,因此接下来只介绍修改部分的内容。前面的实验,使用读写各一个FIFO,并在SDRAM中开辟了两个缓冲区,而本实验有两个摄像头,所以读写需要各增加一个FIFO,总共四个,同时在SDRAM中再开辟两个缓冲区,达到四个缓冲区,而满足两组摄像头数据的处理需要。 下面我们就一起来看看本节实验在单目OV5640摄像头LCD显示实验的基础上作了哪些修改。首先我们先看下顶层模块, 顶层模块最大的改变就是摄像头驱动模块了,代码如下(只贴出修改部分):
125 //OV5640 0摄像头驱动
126 ov5640_dri u0_ov5640_dri(
127 .clk (clk_100m),
128 .rst_n (rst_n),
129
130 .cam_pclk (cam0_pclk ),
131 .cam_vsync (cam0_vsync),
132 .cam_href (cam0_href ),
133 .cam_data (cam0_data ),
134 .cam_rst_n (cam0_rst_n),
135 .cam_pwdn (cam0_pwdn ),
136 .cam_scl (cam0_scl ),
137 .cam_sda (cam0_sda ),
138
139 .capture_start (sdram_init_done),
140 .cmos_h_pixel (cmos_h_pixel[12:1]),
141 .cmos_v_pixel (cmos_v_pixel),
142 .total_h_pixel (total_h_pixel),
143 .total_v_pixel (total_v_pixel),
144 .cam_init_done (cam_init_done_0),
145
146 .cmos_frame_vsync (),
147 .cmos_frame_href (),
148 .cmos_frame_valid (wr0_en),
149 .cmos_frame_data (wr0_data)
150 );
摄像头驱动模块将原本的IIC驱动模块、OV5640 寄存器配置模块和摄像头图像采集模块封装成一个模块,这部分内容没什么好讲的,无非就是把端口封装一下用一个顶层模块去调用三个子模块而已。这里需要注意的是代码第140行,cmos_h_pixel是指LCD显示屏的行分辨率,在前面单目OV5640摄像头LCD显示实验中它是直接作为ov5640摄像头的行分辨率配置参数,但是本节实验不行,因为本节实验是双目,两个摄像头两幅画面需要显示在一个屏幕上,因此一个摄像头所占有的行分辨率只能是LCD显示屏行分辨率的一半,所以cmos_h_pixel这个参数需要除以2作为摄像头的行分辨率配置参数(cmos_h_pixel[12:1]这种写法相当于除以2)。 接下来我们再继续看看SDRAM控制器修改的内容。SDRAM控制器主要是修改了sdram_fifo_ctrl模块,这个模块是控制着整个SDRAM的读和写。在前面单目OV5640摄像头LCD显示实验中我们的读写原理是在SDRAM中开辟两个存储空间,一个空间正在缓存数据另一个空间就可以往外读出数据,这样交替使用。但是本节实验使用的是双目摄像头,有两个数据源,因此原本的两个存储空间肯定是不够用的,所以我们在原本的基础上将两个存储空间都扩大成四个存储空间,这样就可以容纳两个摄像头的数据了代码如下:
199 //sdram写地址0产生模块
200 always @(posedge clk_ref or negedge rst_n) begin
201 if(!rst_n)begin
202 sdram_wr_addr0
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?