OV5640上电控制

Posted xianyufpga

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OV5640上电控制相关的知识,希望对你有一定的参考价值。

  OV5640 是一款还不错的摄像头,现在来记录一下它的开发过程。

一、OV5640性能概况

打开它的数据手册,可以看到如下几个信息。

技术图片

技术图片

  OV5640和其他常见的OV7725、OV7670比,其分辨率更高,此外支持自动对焦功能。

 

二、结构和引脚

1、结构

  OV5640内部结构如下所示。注意 MCP/N MDP/N 接口是其他设备使用的,此次设计我们只使用 D[9:0]即可。有些 OV5640 模块支持 10bit 的数据端口(D9~D0),有些只支持 8bit 的数据端口(D7~D0),是因为其只取了(D9~D2),即舍掉了 D1~D0 这低 2 位的数据端口。

技术图片

2、引脚

  OV5640有很多的引脚,但我们只需要关心外部引出来的,用于编程的部分。如下所示:

技术图片

 

三、上电配置时序分析

  OV5640不是说接通电源就直接工作,而是有一段上电时序的,如下所示:

技术图片

  注意 DOVDD 和 AVDD 是 OV5640 器件内部就已经设计好的,不用自己设计。

 

四、上电控制代码编写

  这部分代码编写实在简单,不需要自行设计时序,直接照着上面数据手册的时序图设计即可。为了保险点,时间上都比时序图上标的时间多了1ms。

 1 module power_ctrl
 2 //========================< 端口 >==========================================
 3 (
 4 //system --------------------------------------------
 5 input   wire                clk                     , // 50MHz
 6 input   wire                rst_n                   ,       
 7 //ov5640 --------------------------------------------
 8 output  wire                ov5640_pwdn             , // ov5640上电
 9 output  wire                ov5640_rst_n            , // ov5640复位
10 output  wire                power_done                // power_ctrl全面有效,SCCB可以开始工作
11 );
12 //========================< 参数 >==========================================
13 localparam T2_6MS           = 30_0000               ; // T2>5ms
14 localparam T3_2MS           = 10_0000               ; // T3>1ms
15 localparam T4_21MS          = 105_0000              ; // T4>20ms
16 //========================< 信号 >==========================================
17 reg     [18:0]              cnt_6ms                 ;       
18 reg     [16:0]              cnt_2ms                 ;       
19 reg     [20:0]              cnt_21ms                ;       
20 
21 //==========================================================================
22 //==    ov5640_pwdn
23 //==========================================================================
24 always @(posedge clk or negedge rst_n) begin
25     if(!rst_n) begin
26         cnt_6ms <= d0;
27     end
28     else if(ov5640_pwdn == 1b1) begin
29         cnt_6ms <= cnt_6ms + 1b1;
30     end
31 end
32 
33 assign ov5640_pwdn = (cnt_6ms >= T2_6MS) ? 1b0 : 1b1;
34 
35 //==========================================================================
36 //==    ov5640_rst_n
37 //==========================================================================
38 always  @(posedge clk or negedge rst_n) begin
39     if(!rst_n) begin
40         cnt_2ms <= d0;
41     end
42     else if(ov5640_rst_n == 1b0 && ov5640_pwdn == 1b0) begin
43         cnt_2ms <= cnt_2ms + 1b1;
44     end
45 end
46 
47 assign ov5640_rst_n = (cnt_2ms >= T3_2MS) ? 1b1 : 1b0;
48 
49 //==========================================================================
50 //==    power_done
51 //==========================================================================
52 always  @(posedge clk or negedge rst_n) begin
53     if(!rst_n) begin
54         cnt_21ms <= d0;
55     end
56     else if(power_done == 1b1) begin
57         cnt_21ms <= cnt_21ms;
58     end
59     else if(ov5640_rst_n == 1b1) begin
60         cnt_21ms <= cnt_21ms + 1b1;
61     end
62 end
63 
64 assign power_done = (cnt_21ms >= T4_21MS) ? 1b1 : 1b0;
65 
66 
67 
68 endmodule

  这段代码出自开源骚客《SDRAM那些事儿》,这里面的计数方式还是我第一次见,感觉就是很简洁且很神奇,值得学习并掌握。

 

五、仿真验证

  仿真部分,直接提供时钟和复位即可,Modelsim 仿真结果如下所示:

技术图片

  仿真结果的时序图和上面数据手册时序图别无二致,此模块设计成功!

 

 

参考资料:[1]开源骚客《SDRAM那些事儿》

 

以上是关于OV5640上电控制的主要内容,如果未能解决你的问题,请参考以下文章

OV5640摄像头的数据处理配置流程

I.MX6 ov5640 camera

FPGA驱动OV5640用VGA显示画面上有很多彩色条纹

调试OV5640的驱动,那个急啊,可为啥会出现这样的画面

ZYNQSDK开发OV5640的HDMI显示

FPGA配置OV5640摄像头及RGB图像数据采集