目前市场上的摄像头产品采用的 CMOS 品牌较多,主流的要有 Hynix(海力士)、 Micron(镁光)、 OmniVision(豪威)、 PIXART(原相科技), Sansung(三星)、格科(Gcoreinc) Cisco(思科)、等, 其中前四家的市场占有率达到 90%。 使用 Micron、 OmniVision、 Gcoreinc 的 CMOS Sensor, 这三者在成本、成像效果,以及噪声、 感光度、 帧率等特性上各有差异, 但总体上开发流程一致,只需要通过寄存器的配置,就能通过捕获, 得到配置参数的视频图像数据。 OV5640的实物见图2 13,该摄像头主要由镜头、图像传感器、板载电路及下方的信号引脚组成。
OV5640模组带有自动对焦功能,引脚的定义见下图。
信号引脚功能介绍如下,介绍如下表。
OV5640功能框图如下:
标号①处的是OV5640的控制寄存器,它根据这些寄存器配置的参数来运行,而这些参数是由外部控制器通过SIO_C和SIO_D引脚写入的,SIO_C与SIO_D使用的通讯协议跟I2C十分类似,在FPGA中我们完全可以直接IO模拟硬件外设来控制。 控制OV5640涉及到它很多的寄存器,可直接查询《ov5640datasheet》了解,通过这些寄存器的配置,可以控制它输出图像的分辨率大小、图像格式及图像方向等。要注意的是OV5640寄存器地址为16位。 官方还提供了一个《OV5640_自动对焦照相模组应用指南(DVP_接口)__R2.13C.pdf》的文档,它针对不同的配置需求,提供了配置范例。 标号②处包含了OV5640的通信、控制信号及外部时钟,其中PCLK、HREF及VSYNC分别是像素同步时钟、行同步信号以及帧同步信号,这与液晶屏控制中的信号是很类似的。RESETB引脚为低电平时,用于复位整个传感器芯片,PWDN用于控制芯片进入低功耗模式。注意最后的一个XCLK引脚,它跟PCLK是完全不同的,XCLK是用于驱动整个传感器芯片的时钟信号,是外部输入到OV5640的信号;而PCLK是OV5640输出数据时的同步信号,它是由OV5640输出的信号。XCLK可以外接晶振或由外部控制器提供,若要类比XCLK之于OV5640就相当于HSE时钟输入引脚与STM32芯片的关系,PCLK引脚可类比STM32的I2C外设的SCL引脚。 标号③处的是感光矩阵,光信号在这里转化成电信号,经过各种处理,这些信号存储成由一个个像素点表示的数字图像。 标号④处包含了DSP处理单元,它会根据控制寄存器的配置做一些基本的图像处理运算。这部分还包含了图像格式转换单元及压缩单元,转换出的数据最终通过Y0-Y9引脚输出,一般来说我们使用8根据数据线来传输,这时仅使用Y2-Y9引脚,OV5640与外部器件的连接方式见下图。
标号⑤处为VCM处理单元,他会通过图像分析来实现图像的自动对焦功能。要实现自动对焦还需要下载自动对焦固件到模组,后面摄像头实验详细介绍这个功能。
为了让 OV5640 上电后能正常工作, OV5640 癿程序讴计中需要考虑 OV5640 的上电时序的要求。OV5640 癿上电步骤如下: 步骤 1 : ResetB 拉低,复位 OV5640。PWDN 引脚拉高。 步骤 2 : DOVDD 和 AVDD 两路最好同时上电, 返在模组癿电源讴计中实现。 步骤 3 : 等电源稳定 5 毫秒后,拉低 PWDN。 步骤 4 : PWDN 置低 1 毫秒后, 拉高 ResetB。 步骤 5 : 20 毫秒后, 初始化 OV5640 的SCCB 寄存器设置。
关于详细的寄存器设置,可以参考《从零开始走进OV7670世界.pdf》《OV5640_datasheet.pdf》
根据协议对寄存器的配置,输出视频流大小为1024x768,每一个像素点是16位,所以,生成如下大小的双端口BRAM。
根据写有效信号驱动写地址变化 代码2 1
1. always @(posedge cam_pclk,negedge rst_n) begin
2. if(~rst_n) begin
3. addra<=0;
4. end else begin
5. if(wr_en) begin
6. addra<=addra+1;
7. if(addra==20'hc0000-1) addra<=0;
8. end
9. end
10. end
读地址同理实现 代码2 2
1. always @(posedge clk_65m,negedge rst_n) begin
2. if(~rst_n) begin
3. addrb<=0;
4. end else begin
5. if(rd_en) begin
6. addrb<=addrb+1;
7. if(addrb==20'hc0000-1) addrb<=0;
8. end
9. end
10. end
更为详细的代码,大家可以参考源码,这部分代码主要是为了验证OV5640的寄存器设计的正确性。
链接: https://pan.baidu.com/s/1Ad0s3vuwda0h2xive5vwrg 提取码: mq3i