其他分享
首页 > 其他分享> > OV5640(1)上电控制

OV5640(1)上电控制

作者:互联网

  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 == 1'b1) begin
29         cnt_6ms <= cnt_6ms + 1'b1;
30     end
31 end
32 
33 assign ov5640_pwdn = (cnt_6ms >= T2_6MS) ? 1'b0 : 1'b1;
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 == 1'b0 && ov5640_pwdn == 1'b0) begin
43         cnt_2ms <= cnt_2ms + 1'b1;
44     end
45 end
46 
47 assign ov5640_rst_n = (cnt_2ms >= T3_2MS) ? 1'b1 : 1'b0;
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 == 1'b1) begin
57         cnt_21ms <= cnt_21ms;
58     end
59     else if(ov5640_rst_n == 1'b1) begin
60         cnt_21ms <= cnt_21ms + 1'b1;
61     end
62 end
63 
64 assign power_done = (cnt_21ms >= T4_21MS) ? 1'b1 : 1'b0;
65 
66 
67 
68 endmodule

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

 

五、仿真验证

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

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

 

 

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

 

标签:ov5640,cnt,控制,上电,begin,时序,rst,OV5640
来源: https://www.cnblogs.com/xianyufpga/p/12267675.html