zoukankan      html  css  js  c++  java
  • 【紫光同创国产FPGA教程】【第十五章】OV5640摄像头显示例程

    本原创教程由芯驿电子科技(上海)有限公司(ALINX)创作,版权归本公司所有,如需转载,需授权并注明出处()。

    1. 实验简介

    本实验将采用500万像素的OV5640摄像头模组(模块型号:AN5640)为大家显示更高分辨率的视频画面。OV5640摄像头模组最大支持QSXGA (2592x1944)的拍照功能,支持1080P、720P、VGA、QVGA视频图像输出。本实验将OV5640配置为RGB565输出,先将视频数据写入外部存储器,再从外部存储器读取送到VGA、LCD等显示模块。

    2.实验原理

    2.1 OV5640传感器简介

    OV5640摄像头模组采用美国OmniVision(豪威)CMOS芯片图像传感器OV5640,支持自动对焦的功能。OV5640芯片支持DVP 和MIPI 接口,本实验所用 OV5640摄像头模组通过DVP接口和FPGA连接实现图像的传输。

    2.2 OV5640的参数说明

    像素:硬件像素500W;

    感光芯片:OV5640;

    感光尺寸:1/4;

    功能支持:自动对焦, 自动曝光控制(AEC),自动白平衡(AWB);

    图像格式 : RAW RGB, RGB565/555/444, YUV422/420和JPEG压缩;

    捕获画面:QSXGA(2592x1944), 1080p, 1280x960, VGA(640x480), QVGA(320x240);

    工作温度:-30~70℃, 稳定工作温度为0~50℃

    2.3 OV5640的寄存器配置

    OV5640的寄存器配置是通过FPGA的I2C(也称为SCCB接口)接口来配置。用户需要配置正确的寄存器值让OV5640输出我们需要的图像格式,实验中我们把摄像头输出分辨率和显示设备分辨率配置成一样的, OV5640的摄像头输出的数据格式在以下的0x4300的寄存器里配置,在我们的例程中OV5640配置成RGB565的输出格式。

     

     

     

    关于OV5640的寄存器还有很多很多,但很多寄存器用户无需去了解,寄存器的配置用户可以按照OV5640的应用指南来配置就可以了。如果您想了解更多的寄存器的信息,可以参考OV5640的datasheet中的寄存器说明。

    2.4 OV5640的RGB565输出格式

    OV5640在HREF信号为高时输出一行的图像数据,输出数据在PCLK的上升沿的时候有效。因为RGB565显示每个像数为16bit, 但OV5640每个PCLK输出的是8bit,所以每个图像的像数分两次输出,第一个Byte输出为R4~R0和G5~G3, 第二个Byte输出为G2~G0和B4~B0,将前后2个字节拼接起来就是16Bit RGB565数据。

     

     

    3. 程序设计

    前面的实验已经为本实验做了大量的铺垫,包括I2C寄存器的配置、外部存储器的读写,本程序一个比较关键的地方在于视频同时读写,如何做到读写不冲突?在设计帧读写模块时就已经考虑到这点,所以有帧基地址选择,最大4帧选择,每次读视频帧地址和正在写的帧地址是不同的,而是上次写入一帧数据的地址,这样就可以避免读写冲突,避免视频画面裂开错位。

    cmos_8_16bit模块完成摄像头输入的2个8bit数据转换到一个16bit数据(一个像素),数据位宽变成2倍,时钟频率不变,所以16bit数据是隔一个时钟周期有效,并不是每个时钟一直有效。

    信号名称 方向 说明
    rst in 异步复位输入,高复位
    pclk in 传感器像素时钟输入
    pdata_i in 传感器8bit数据输入
    de_i in 数据有效(HREF)
    pdata_o out 16bit数据输出
    hblank out de_i延时一个时钟周期
    de_o out 数据输出有效

    cmos_8_16bit模块端口

    cmos_write_req_gen模块通过判断摄像头的列同步信号cmos_vsync的上升沿,生成ov5640数据写入的请求信号,表示一帧图像开始写入请求。另外生成write_addr_index写地址选择和read_addr_index读地址选择,这里read_addr_index的值会比write_addr_index的值延迟一帧,使得读和写的地址不冲突。

    信号名称 方向 说明
    rst in 异步复位输入,高复位
    pclk in 传感器像素时钟输入
    cmos_vsync in 场同步输入,每一帧视频都会变化一次,可以用于一帧的开始或结束
    write_req out 写数据请求
    write_addr_index out 写帧地址选择
    read_addr_index out 读帧地址选择
    write_req_ack in 写请求应答

    cmos_write_req_gen模块端口

    frame_read_write模块我们已经在前面的例程中使用过,在这里就是把摄像头采集的数据存入写FIFO里,然后产生DDR3的Burst写请求,写入到DDR3中,另外读也是一样,当读FIFO里的数据小于一定值时,产生DDR3的Burst读请求。在这里我们实例化了2个frame_read_write模块,分别对应2路视频的数据存储和读取。这里每路视频的DDR3的存储地址是不一样的。

    第一路视频的存储地址如下:

    第二路视频的存储地址如下:

    video_rect_read_data模块功能跟HDMI字符显示osd_display模块的功能类似,本例程中是把从DDR3里读取的视频图像跟彩条图像叠加,因为ax7035使用的是双目摄像头,所以需要调用2个video_rect_read_data模块。

    信号名称 方向 说明
    video_clk in 视频的像素时钟
    rst in 复位信号
    video_left_offset in 视频显示的水平偏移地址
    video_top_offset in 视频显示的垂直偏移地址
    video_width in 视频的宽度
    video_height in 视频的高度
    read_req out 读一帧图像数据请求
    read_req _ack in 读请求应答
    read_en out 读数据使能
    read_data in 读到的数据
    timing_hs in 输入的行同步信号
    timing_vs in 输入的列同步信号
    timing_de in 输入的数据有效信号
    timing_data in 输入的数据信号
    hs out 输出的行同步信号
    vs out 输出的列同步信号
    de out 输出的数据有效信号
    vout_data out 输出的数据信号

    4. 实验现象

    1)将摄像头模块插入开发板,保证1脚对齐,1脚在焊盘形状和其他引脚是有明显区别的,是方形的。

    AN5640摄像头模块连接开发板连接图

    AN5642摄像头模块连接开发板连接图

    2)如果使用HDMI来显示,连接好HDMI显示器,如果使用液晶屏显示,插入液晶屏模块,连接方法在《HDMI测试实验教程》中已讲述。

    3)下载实验程序,可以看到摄像头模块输出的视频。注意:ov5640模块焦距是可调的,如果焦距不合适,图像会模糊,旋转镜头,可以调节焦距。摄像头模块要轻拿轻放,不要用手触摸元器件

    实验效果图

  • 相关阅读:
    Linux内核网络协议栈优化总纲
    Java实现 蓝桥杯VIP 算法训练 连续正整数的和
    Java实现 蓝桥杯VIP 算法训练 连续正整数的和
    Java实现 蓝桥杯VIP 算法训练 寂寞的数
    Java实现 蓝桥杯VIP 算法训练 寂寞的数
    Java实现 蓝桥杯VIP 算法训练 学做菜
    Java实现 蓝桥杯VIP 算法训练 学做菜
    Java实现 蓝桥杯VIP 算法训练 判断字符位置
    Java实现 蓝桥杯VIP 算法训练 判断字符位置
    Java实现 蓝桥杯VIP 算法训练 链表数据求和操作
  • 原文地址:https://www.cnblogs.com/alinx/p/14416845.html
Copyright © 2011-2022 走看看