正点原子 发表于 2019-7-22 21:48:33

【正点原子FPGA连载】第三十七章 OV5640摄像头VGA显示实验--摘自【正点原子】开拓者 FPGA 开发指南

本帖最后由 正点原子 于 2020-10-23 16:56 编辑

1)实验平台:正点原子开拓者FPGA开发板
2)平台购买地址:https://item.taobao.com/item.htm?id=579749209820
3)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-281143-1-1.html
4)本实例源码下载:
5)对正点原子FPGA感兴趣的同学可以加群讨论:712557122点击加入:
6)关注正点原子公众号,获取最新资料更新


第三十七章 OV5640摄像头VGA显示实验

OV5640同OV7725一样, 都是OmniVision(豪威科技) 公司生产的CMOS图像传感器。 不同的是, OV5640支持更高的分辨率、 采集速率, 具有更高的图像处理性能, 主要应用在手机、 数码相机、电脑多媒体等领域。本章我们将使用FPGA开发板实现对OV5640的数字图像采集并通过VGA
实时显示。
本章包括以下几个部分:
37.1 OV5640简介
37.2 实验任务
37.3 硬件设计
37.4 程序设计
37.5 下载验证
37.1 OV5640简介
OV5640是一款1/4英寸单芯片图像传感器, 其感光阵列达到2592*1944(即500W像素) , 能实现最快15fps QSXVGA(2592*1944) 或者90fps VGA(640*480) 分辨率的图像采集。 传感器采用OmniVision推出的OmniBSI(背面照度) 技术, 使传感器达到更高的性能, 如高灵敏度、
低串扰和低噪声。 传感器内部集成了图像处理的功能, 包括自动曝光控制(AEC) 、 自动白平衡(AWB) 等。 同时该传感器支持LED补光、 MIPI(移动产业处理器接口) 输出接口和DVP(数字视频并行) 输出接口选择、 ISP(图像信号处理) 以及AFC(自动聚焦控制) 等功能。
OV5640的功能框图如下图所示:


图 37.1.1 OV5640功能框图


由上图可知, 时序发生器(timing generator) 控制着感光阵列(image array) 、 放大器(AMP) 、 AD转换以及输出外部时序信号(VSYNC、 HREF和PCLK) , 外部时钟XVCLK经过PLL锁相环后输出的时钟作为系统的控制时钟; 感光阵列将光信号转化成模拟信号, 经过增益放大
器之后进入10位AD转换器; AD转换器将模拟信号转化成数字信号, 并且经过ISP进行相关图像处理, 最终输出所配置格式的10位视频数据流。 增益放大器控制以及ISP等都可以通过寄存器(registers) 来配置, 配置寄存器的接口就是SCCB接口, 该接口协议兼容IIC协议。
OV5640使用的是两线式SCCB接口总线, 有关SCCB总线的详细介绍可以参考“OV7725摄像头VGA显示实验” 中OV7725简介部分。虽然OV5640和OV7725都是采用SCCB接口总线来配置寄存器,但不同的是, OV7725是用8位(1个字节) 来表示寄存器地址, 而OV5640是用16位(两个字节)
表示寄存器地址。OV5640 SCCB的写传输协议如下图所示:

图 37.1.2 OV5640 SCCB写传输协议

上图中的ID ADDRESS是由7位器件地址和1位读写控制位构成(0: 写 1: 读) , OV5640的器件地址为7’ h3c, 所以在写传输协议中, ID Address(W) = 8’ h78(器件地址左移1位, 低位补0) ; Sub-address(H)为高8位寄存器地址, Sub-address(L)为低8位寄存器地址, 在OV5640
众多寄存器中, 有些寄存器是可改写的, 有些是只读的, 只有可改写的寄存器才能正确写入;Write Data为8位写数据, 每一个寄存器地址对应8位的配置数据。在OV5640正常工作之前, 必须先对传感器进行初始化, 即通过配置寄存器使其工作在预期的工作模式, 以及得到较好画质的图像。 因为SCCB的写传输协议和IIC几乎相同, 因此我们可以直接使用IIC的驱动程序来配置摄像头。 当然这么多寄存器也并非都需要配置, 很多寄存器可以采用默认的值。 OV公司提供了OV5640的软件应用手册(OV5640 Software Application Note,
位 于 开 发 板 所 随 附 的 资 料 “ 7_ 硬 件 资 料 /4_OV5640 资 料/OV5640_camera_module_software_application_notes.pdf” ) , 如果某些寄存器不知道如何配置可以参考此手册, 下表是本程序用到的关键寄存器的配置说明。
表 37.1.1 OV5640关键寄存器配置说明











OV5640的寄存器较多, 对于其它寄存器的描述可以参OV5640的数据手册。 需要注意的是,OV5640的数据手册并没有提供全部的寄存器描述, 而大多数必要的寄存器配置在ov5640的软件应用手册中可以找到, 可以结合这两个手册学习如何对OV5640进行配置。输出图像参数设置
接下来, 我们介绍一下OV5640的ISP输入窗口设置、 预缩放窗口设置和输出大小窗口设置,这几个设置与我们的正常使用密切相关, 有必要了解一下, 它们的设置关系如下图所示:


图 37.1.3 图像窗口设置

ISP输入窗口设置(ISP Input Size) 允许用户设置整个传感器显示区域(physical pixelsize, 2632*1951, 其中2592*1944像素是有效的) , 开窗范围从0*0~2632*1951都可以任意设置。 也就是上图中的X_ADDR_ST(寄存器地址0x3800、 0x3801)、 Y_ADDR_ST(寄存器地址0x3802、
0x3803)、X_ADDR_END(寄存器地址0x3804、0x3805)和Y_ADDR_END(寄存器地址0x3806、0x3807)寄存器。 该窗口设置范围中的像素数据将进入ISP进行图像处理。预缩放窗口设置(pre-scaling size) 允许用户在ISP输入窗口的基础上进行裁剪, 用于设置将进行缩放的窗口大小, 该设置仅在ISP输入窗口内进行X/Y方向的偏移。 可以通过X_OFFSET(寄存器地址0x3810、 0x3811) 和Y_OFFSET(寄存器地址0x3812、 0x3813) 进行配置。输出大小窗口设置(data output size) 是在预缩放窗口的基础上, 经过内部DSP进行缩放处理, 并将处理后的数据输出给外部的图像窗口, 图像窗口控制着最终的图像输出尺寸。 可以通过X_OUTPUT_SIZE(寄存器地址0x3808、 0x3809) 和Y_OUTPUT_SIZE(寄存器地址0x380A、0x380B) 进行配置。 注意: 当输出大小窗口与预缩放窗口比例不一致时, 图像将进行缩放处理(图像变形) , 仅当两者比例一致时, 输出比例才是1:1(正常图像) 。图 37.1.3中, 右侧data output size区域, 才是OV5640输出给外部的图像尺寸, 也就是显示在显示器或者液晶屏上面的图像大小。 输出大小窗口与预缩放窗口比例不一致时, 会进行缩放处理, 在显示器上面看到的图像将会变形。输出像素格式
OV5640支持多种不同的数据像素格式, 包括YUV(亮度参量和色度参量分开表示的像素格式) 、 RGB(其中RGB格式包含RGB565、 RGB555等) 以及RAW(原始图像数据) , 通过寄存器地址0x4300配置成不同的数据像素格式。由于摄像头采集的图像最终要通过VGA接口在显示器上显示, 且开拓者开发板上的VGA接口为RGB565格式(详情请参考“VGA彩条显示实验” 章节) , 因此我们将OV5640摄像头输出的图像像素数据配置成RGB565格式。 由上表(表 37.1.1) 可知, 将寄存器0x4300寄存器的Bit设置成0x6即可。 OV5640支持调节RGB565输出格式中各颜色变量的顺序, 对于我们常见的应用来说, 一般是使用RGB或BGR序列。 我们在“OV7725摄像头VGA显示实验” 的章节中介绍过,OV7725摄像头按照RGB的顺序输出, 本章我们将OV5640输出的RGB565的颜色顺序和OV7725保持一致, 将寄存器0x4300寄存器的Bit设置成0x1。 因此, “OV7725摄像头VGA显示实验” 章节中的图像采集模块可以直接用来采集OV5640输出的图像。彩条测试模式图像传感器配置成彩条测试模式后, 会输出彩色的条纹, 方便测试图像传感器是否正常工作, 通过配置寄存器0x503d的Bit位打开和关闭彩条模式。 当需要打开彩条模式时, 寄存器0x503d配置成0x80, 关闭时配置成0x00, 下图为打开彩条模式后图像输出的条纹。


图 37.1.4 彩条模式下的图像条纹

LED闪光灯
当外界环境光较暗时, 传感器采集图像会受到较大影响, 此时可以通过打开LED补光灯来弥补光照不足所带来的影响, 就像手机在夜晚拍照时也会打开闪光灯来提高图像质量。 通过配置寄存器0x3016=0x02, 0x301c=0x02来使能LED补光灯功能; 配置寄存器0x3019=0x02打开闪光
灯, 0x3019=0x00关闭闪光灯。图像输出时序接下来, 我们介绍一下OV5640的图像数据输出时序, 首先我们简单介绍一些定义。QSXGA, 这里指: 分辨率为2592*1944的输出格式, 类似的还有: QXGA(2048*1536) 、UXGA(1600*1200) 、 SXGA(1280*1024) 、 WXGA(1440*900) 、 WXGA(1280*800) 、 XGA(1024*768)、SVGA(800*600) 、 VGA(640*480) 、 QVGA(320*240) 和QQVGA(160*120)等。PCLK: 像素时钟, 一个PCLK时钟输出一个像素或者半个像素(像素数据的高8位或者低8位) 。
VSYNC: 帧同步信号。HREF/HSYNC: 行同步信号。D: 像素数据, 在RGB565格式中, 只有高8位是有效的。tPclk: 一个时钟周期 。tp: 一个像素点的周期, 在RGB565和YUV422输出格式下, tp=2*tPclk; Raw输出格式下,tp=tPclk。
下图为OV5640输出图像数据的行时序图。


图 37.1.5 OV5640行时序图

从上图可以看出, 传感器在HREF为高电平的时候输出图像数据, 当HREF变高后, 每一个PCLK时钟, 输出一个8位或者10位像素数据。 比如我们采用QSXGA时序, RGB565格式输出,tp=2*tPclk, 每2个字节组成一个像素的颜色, 这样每行总共输出2592*2个PCLK, 也就是2592*2个字节。再来看看帧时序(QSXGA模式, 分辨率2592*1944) , 如下图所示:


图 37.1.6 OV5640 QSXGA帧时序

由上图可知, VSYNC的上升沿作为一帧的开始, 高电平同步脉冲的时间为5688tp, 紧接着等待48276tp时间后, HREF开始拉高, 此时输出有效数据; HREF由2592tp个高电平和252tp个低电平构成; 最后一行图像数据输出完成之后等待14544tp时间, 一帧数据传输结束。 所以输出
一帧图像的时间实际上是tFrame = 5596992tp。从OV5640的行时序图和帧时序图可以发现, 其输出时序和OV7725是非常相似的, 只是时间参数不同而已, 大家可以参考“OV7725摄像头VGA显示实验” 中帧时序的介绍来学习OV5640的输出时序。
37.2 实验任务
本节实验任务是使用开拓者开发板及OV5640摄像头实现图像采集, 并通过VGA显示器实时显示。
37.3 硬件设计
我们的开拓者FPGA开发板上有一个摄像头扩展接口, 该接口可以用来连接OV7725/OV5640等摄像头模块, 摄像头扩展接口原理图如图 37.3.1所示:


图 37.3.1 摄像头扩展接口原理图

ATK-OV5640是ALIENTEK推出的一款高性能500W像素高清摄像头模块。 该模块通过2*9排针(2.54mm间距) 同外部连接, 我们将摄像头的排针直接插在开发板上的摄像头接口即可, 模块外观如图 37.3.2所示:

图 37.3.2 ATK-OV5640摄像头模块

从图 37.3.2可以看出, 模块自带有源晶振, 用于产生24MHz时钟作为0v5640的输入时钟。模块的闪光灯(LEDI&LED2)由0V5640的STROBE引脚控制, 用户可通过SCCB接口总线控制STROBE引脚输出高低电平, 从而控制LED闪光灯的亮灭。 用户在使用LED灯时不建议一直点亮或者点亮
时间太长。 因为LED闪光灯功率较高, 发光强度较强, 模块温度上升会比较快, 会造成器件的可靠性降低, 同时注意避免直接照射人眼。我们在前面说过, OV5640在RGB565模式下只有高8位数据是有效的即D, 而我们的摄像头排针上数据引脚的个数是8位。 实际上, 摄像头排针上的8位数据连接的就是OV5640传感器的D, 所以我们直接使用摄像头排针上的8位数据引脚即可。
由于VGA接口和SDRAM引脚数目较多且在前面相应的章节中已经给出它们的管脚列表, 这里
只列出摄像头相关管脚分配, 如下表所示:
表 37.3.1 OV5640摄像头管脚分配




37.4 程序设计
图 37.4.1是根据本章实验任务画出的系统框图。对比“OV7725摄像头VGA显示实验” 的系统图可以发现, 我们只是把外设OV7725模块替换成了OV5640模块, 其余模块基本相同(PLL时钟模块和IIC配置模块有差异) 。 PLL时钟模块为I2C驱动模块、 VGA驱动模块以及SDRAM控制
器模块提供驱动时钟; I2C驱动模块和I2C配置模块用于初始化OV5640图像传感器; 摄像头采集模块负责采集摄像头图像数据, 并且把图像数据写入SDRAM读写控制模块; SDRAM读写控制模块负责将用户数据写入和读出片外SDRAM存储器; VGA驱动模块负责驱动VGA显示器。
OV5640摄像头VGA显示系统框图如下图所示:


图 37.4.1 OV5640摄像头VGA显示系统框图

顶层模块的原理图如下图所示:


图 37.4.2 顶层模块原理图


由上图可知, I2C配置模块和I2C驱动模块控制着传感器初始化的开始与结束, 传感器初始化完成后图像采集模块将采集到的数据写入SDRAM读写控制模块, VGA驱动模块从SDRAM控制模块中读出数据, 完成了数据的采集、 缓存与显示。 需要注意的是图像数据采集模块是在SDRAM
和传感器都初始化完成之后才开始输出数据的, 避免了在SDRAM初始化过程中向里面写入数据。FPGA顶层模块(ov5640_rgb565_1024x768_vga) 例化了以下六个模块: PLL时钟模块(pll_clk) 、 I2C驱动模块(i2c_dri) 、 I2C配置模块(i2c_ov5640_rgb565_cfg) 、 摄像头
图像采集模块(cmos_capture_data) 、 SDRAM读写控制模块(sdram_top) 和VGA驱动模块(vga_driver) 。PLL时钟模块(pll_clk) : PLL时钟模块通过调用锁相环(PLL) IP核实现, 总共输出3个时钟, 频率分别为100Mhz、 100Mhz(SDRAM相位偏移时钟) 和65Mhz时钟。 100Mhz时钟和100Mhz相位偏移时钟作为SDRAM读写控制模块的驱动时钟, 65Mhz时钟作为I2C驱动模块和VGA驱动模块的驱动时钟。I2C驱动模块(i2c_dri) : I2C驱动模块负责驱动OV5640 SCCB接口总线, 用户可根据该模块提供的用户接口可以很方便的对OV5640的寄存器进行配置, 该模块和“EEPROM读写实验” 章节中用到的I2C驱动模块为同一个模块, 有关该模块的详细介绍请大家参考“EEPROM读写实验”章节。I2C配置模块(i2c_ov5640_rgb565_cfg) : I2C配置模块的驱动时钟是由I2C驱动模块输出的时钟提供的, 这样方便了I2C驱动模块和I2C配置模块之间的数据交互。 该模块寄存需要配置的寄存器地址、 数据以及控制初始化的开始与结束, 同时该模块输出OV5640的寄存器地址和数据以及控制I2C驱动模块开始执行的控制信号, 直接连接到I2C驱动模块的用户接口, 从而完成
对OV5640传感器的初始化。摄像头图像采集模块(cmos_capture_data) : 摄像头图像采集模块在像素时钟的驱动下将传感器输出的场同步信号、行同步信号以及8位数据转换成SDRAM读写控制模块的写使能信号和16位写数据信号,完成对OV5640传感器图像的采集。OV7725和OV5640图像输出时序非常相似,有关该模块的详细介绍请大家参考“OV7725摄像头VGA显示实验” 章节。SDRAM读写控制模块(sdram_top) : SDRAM读写控制器模块负责驱动SDRAM片外存储器, 缓存图像传感器输出的图像数据。 该模块将SDRAM复杂的读写操作封装成类似FIFO的用户接口,
非常方便用户的使用。 在“SDRAM读写测试实验” 的程序中, 读写操作地址都是SDRAM的同一存储空间, 如果只使用一个存储空间缓存图像数据, 那么同一存储空间中会出现两帧图像叠加的情况, 为了避免这一情况, 我们在SDRAM的其它BANK中开辟一个相同大小的存储空间, 使用乒
乓操作的方式来写入和读取数据, 所以本次实验在“SDRAM读写测试实验” 的程序里做了一个小小的改动, 有关该模块的详细介绍请大家参考“SDRAM读写测试实验” 章节, 修改部分请大家参考“OV7725摄像头VGA显示实验” 章节。
VGA驱动模块(vga_driver) : VGA驱动模块负责驱动VGA显示器, 该模块通过读取SDRAM读写控制模块来输出像素数据。 本次实验将模块内部信号data_req(数据请求信号) 输出至端口, 方便从SDRAM控制器中读取数据, 有关VGA驱动模块的详细介绍请大家参考“VGA彩条显示实验” 章节。在“OV7725摄像头VGA显示实验” 中, OV7725输出的图像分辨率为640*480。 我们知道OV5640最大支持2592*1944的图像分辨率, 即500万像素点, 考虑到传感器在高分辨下输出图像的帧率较慢, 并且有些VGA显示器已经不支持这么高的分辨率, 所以本次实验将OV5640输出图像的分辨率调整成1024*768。
顶层模块参数设置代码如下:
51 //parameter define
52 parameter SLAVE_ADDR = 7'h3c ; //OV5640的器件地址7'h3c
53 parameter BIT_CTRL = 1'b1 ; //OV5640的字节地址为16位 0:8位 1:16位
54 parameter CLK_FREQ = 26'd65_000_000; //i2c_dri模块的驱动时钟频率 65MHz
55 parameter I2C_FREQ = 18'd250_000 ; //I2C的SCL时钟频率,不超过400KHz
56 parameter CMOS_H_PIXEL = 24'd1024 ; //CMOS水平方向像素个数,用于设置SDRAM缓存大小
57 parameter CMOS_V_PIXEL = 24'd768 ; //CMOS垂直方向像素个数,用于设置SDRAM缓存大小
在代码的第52行定义了OV5640的器件地址, 其器件地址为7’ h3c; 第53行定义了寄存器地址的位宽, BIT_CTRL=0表示地址位宽为8位, BIT_CTRL=1表示地址位宽为16位。 因为OV5640的地址位宽为16位, 所以BIT_CTRL设置为1。 第56行和第57行分别定义了CMOS输出的水平像素个
数和垂直像素个数, 在这里这两个参数一方面是用于设置在SDRAM中开辟的缓存大小, 另一方面用于设置CMOS传感器输出图像数据的分辨率。我们将CMOS图像传感器的分辨率设置成1024*768, VGA驱动程序输出的图像分辨率也设置成1024*768, 下表为不同分辨率下的VGA时序参数。
表 37.4.1 不同分辨率下的VGA时序参数




由上图可知, VGA在1024x768@60Hz显示模式下, 像素时钟为65Mhz, 所以PLL时钟模块提供给VGA驱动模块的时钟设置为65Mhz。 VGA驱动模块的时序参数也要按照上图中的行时序参数和帧时序参数来设置。 VGA驱动模块参数设置代码如下:
58 //1024*768 60FPS_65MHz
59 parameter H_SYNC = 11'd136; //行同步
60 parameter H_BACK = 11'd160; //行显示后沿
61 parameter H_DISP = 11'd1024; //行有效数据
62 parameter H_FRONT = 11'd24; //行显示前沿
63 parameter H_TOTAL = 11'd1344; //行扫描周期
64
65 parameter V_SYNC = 11'd6; //场同步
66 parameter V_BACK = 11'd29; //场显示后沿
67 parameter V_DISP = 11'd768; //场有效数据
68 parameter V_FRONT = 11'd3; //场显示前沿
69 parameter V_TOTAL = 11'd806; //场扫描周期
OV5640和OV7725的寄存器配置差异较大, 首先是OV5640是用16位数据来表示寄存器地址,而OV7725用8位数据表示寄存器地址。其次是OV5640集成更强大的图像处理功能,为了使OV5640输出比较清晰的图像, 需要配置的寄存器更多。 OV5640的寄存器配置模块部分代码如下:
1 module i2c_ov5640_rgb565_cfg
2 #(
3 parameter CMOS_H_PIXEL = 24'd1024,//CMOS水平方向像素个数
4 parameter CMOS_V_PIXEL = 24'd768 //CMOS垂直方向像素个数
5 )
6 (
7 input clk , //时钟信号
8 input rst_n , //复位信号, 低电平有效
9 1
0 input i2c_done , //I2C寄存器配置完成信号
11 output reg i2c_exec , //I2C触发执行信号
12 output reg i2c_data , //I2C要配置的地址与数据(高16位地址,低8位数据)
13 output reg init_done //初始化完成信号
14 );
15
16 //parameter define
17 localparam REG_NUM = 8'd248 ; //总共需要配置的寄存器个数
18 localparam TOTAL_H_PIXEL = CMOS_H_PIXEL + 13'd1216; //水平总像素大小
19 localparam TOTAL_V_PIXEL = CMOS_V_PIXEL + 13'd504; //垂直总像素大小
20
21 //reg define
22 reg start_init_cnt; //等待延时计数器
23 reg init_reg_cnt ; //寄存器配置个数计数器
24
25 //*****************************************************
26 //** main code
27 //*****************************************************
28
29 //cam_scl配置成250khz,输入的clk为1Mhz,周期为1us,20000*1us = 20ms
30 //OV5640上电到开始配置IIC至少等待20ms
31 always @(posedge clk or negedge rst_n) begin
32 if(!rst_n)
33 start_init_cnt <= 15'b0;
34 else if(start_init_cnt < 15'd20000) begin
35 start_init_cnt <= start_init_cnt + 1'b1;
36 end
37 end
38
39 //寄存器配置个数计数
40 always @(posedge clk or negedge rst_n) begin
41 if(!rst_n)
42 init_reg_cnt <= 8'd0;
43 else if(i2c_exec)
44 init_reg_cnt <= init_reg_cnt + 8'b1;
45 end
46
47 //i2c触发执行信号
48 always @(posedge clk or negedge rst_n) begin
49 if(!rst_n)
50 i2c_exec <= 1'b0;
51 else if(start_init_cnt == 15'd19999)
52 i2c_exec <= 1'b1;
53 else if(i2c_done && (init_reg_cnt < REG_NUM))
54 i2c_exec <= 1'b1;
55 else
56 i2c_exec <= 1'b0;
57 end
58
59 //初始化完成信号
60 always @(posedge clk or negedge rst_n) begin
61 if(!rst_n)
62 init_done <= 1'b0;
63 else if((init_reg_cnt == REG_NUM) && i2c_done)
64 init_done <= 1'b1;
65 end
66
67 //配置寄存器地址与数据
68 always @(posedge clk or negedge rst_n) begin
69 if(!rst_n)
70 i2c_data <= 24'b0;
71 else begin
72 case(init_reg_cnt)
73 //先对寄存器进行软件复位, 使寄存器恢复初始值
74 //寄存器软件复位后, 需要延时1ms才能配置其它寄存器
75 8'd0 : i2c_data <= {16'h3008,8'h82}; //Bit:复位 Bit:电源休眠
76 8'd1 : i2c_data <= {16'h3008,8'h02}; //正常工作模式
77 8'd2 : i2c_data <= {16'h3103,8'h02}; //Bit:1 PLL Clock
配置代码较长, 省略部分源代码……
339 //彩条测试使能
340 8'd243: i2c_data <= {16'h503d,8'h00}; //8'h00:正常模式 8'h80:彩条显示
341 //测试闪光灯功能
342 8'd244: i2c_data <= {16'h3016,8'h02};
343 8'd245: i2c_data <= {16'h301c,8'h02};
344 8'd246: i2c_data <= {16'h3019,8'h02}; //打开闪光灯
345 8'd247: i2c_data <= {16'h3019,8'h00}; //关闭闪光灯
346 //只读存储器,防止在case中没有列举的情况, 之前的寄存器被重复改写
347 default : i2c_data <= {16'h300a,8'h00}; //器件ID高8位
348 endcase
349 end
350 end
351
352 endmodule
I2C配置模块寄存需要配置的寄存器地址、 数据以及控制初始化的开始与结束。 需要注意的是, 由OV5640的数据手册可知, 图像传感器上电后到开始配置寄存器需要延时20ms, 所以程序中定义了一个延时计数器(start_init_cnt) , 用于延时20ms。 当计数器计数到预设值之后,
开始第一次配置传感器即软件复位, 目的是让所有的寄存器复位到默认的状态。 在代码的第17行定义了总共需要配置的寄存器的个数,如果增加或者删减了寄存器的配置,需要修改此参数。我们在前面说过, 本章实验程序设计和“OV7725摄像头VGA显示实验” 相比, 只是把外设
OV7725模块替换成了OV5640模块, 其余模块基本相同(PLL时钟模块和IIC配置模块有差异) 。本章节主要介绍下I2C配置模块, 而其它相同模块的程序设计详情请大家参考“OV7725摄像头VGA显示实验” 章节。
37.5 下载验证
首 先 我 们 打 开 OV5640 摄 像 头 VGA 显 示 实 验 工 程 , 在 工 程 所 在 的 路 径 下 打 开
ov5640_rgb565_1024x768_vga/par文件夹, 在里面找“ov5640_rgb565_1024x768_vga.qpf” 并
双击打开。 注意工程所在的路径名只能由字母、 数字以及下划线组成, 不能出现中文、 空格以
及特殊字符等。 工程打开后如图 37.5.1所示:


图 37.5.1 OV5640摄像头VGA显示实验工程

然后将OV5640摄像头插入开发板上的摄像头扩展接口(注意摄像头镜头朝外) , 将VGA连接线一端连接显示器, 另一端与开发板上的VGA接口连接。 再将下载器一端连电脑, 另一端与开发板上对应端口连接, 最后连接电源线并打开电源开关。


图 37.5.2 实物连接图

接下来我们下载程序, 验证OV5640摄像头VGA实时显示的功能。 工程打开后通过点击工具栏 中 的 “Programmer” 图 标 打 开 下 载 界 面 , 通 过 “Add File” 按 钮 选 择ov5640_rgb565_1024x768_vga/par/output_files 目 录 下 的
“ov5640_rgb565_1024x768_vga.sof” 文件。 开发板电源打开后, 在程序下载界面点击“Hardware Setup” , 在弹出的对话框中选择当前的硬件连接为“USB-Blaster” 。 然后点击“Start” 将工程编译完成后得到的sof文件下载到开发板中, 如图 37.5.3所示:


图 37.5.3 程序下载完成界面

下载完成后观察显示器的显示图像如图 37.5.4所示, 说明OV5640摄像头VGA显示程序下载
验证成功。


图 37.5.4 VGA实时显示图像

lcptw 发表于 2019-7-22 22:37:49

前排占座,{:victory:}

开始学习。

leiyitan 发表于 2019-7-23 08:39:55

学习占座
页: [1]
查看完整版本: 【正点原子FPGA连载】第三十七章 OV5640摄像头VGA显示实验--摘自【正点原子】开拓者 FPGA 开发指南