前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于OV5640的FPGA-RAM HDMI显示

基于OV5640的FPGA-RAM HDMI显示

作者头像
碎碎思
发布2020-06-30 11:11:48
1.6K0
发布2020-06-30 11:11:48
举报
文章被收录于专栏:OpenFPGA

2.2.1 OV5640 Sensor简介

  目前市场上的摄像头产品采用的 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处理单元,他会通过图像分析来实现图像的自动对焦功能。要实现自动对焦还需要下载自动对焦固件到模组,后面摄像头实验详细介绍这个功能。

2.2.2 OV5640 Sensor寄存器设置

OV5640 的上电要求

  为了让 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》

2.3 FPGA实现

  根据协议对寄存器的配置,输出视频流大小为1024x768,每一个像素点是16位,所以,生成如下大小的双端口BRAM。

根据写有效信号驱动写地址变化 代码2 1

代码语言:javascript
复制
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

代码语言:javascript
复制
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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-12-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 OpenFPGA 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2.2.1 OV5640 Sensor简介
  • 2.2.2 OV5640 Sensor寄存器设置
    • OV5640 的上电要求
    • 2.3 FPGA实现
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档