OV5640上电控制

OV5640上电控制
OV5640上电控制

module power_ctr1    (   //OV5640上电控制


input                  clk                     , // 50MHz
input                  rst_n                   ,

output                ov5640_pwdn             , // ov5640上电使能
output                 ov5640_rst_n            , // ov5640复位
output                 power_done             ,   // power_ctrl全面有效,相当于上电完成信号标志,SCCB可以开始工作

output reg     [18:0]              cnt_6ms                 ,
output reg     [16:0]              cnt_2ms                 ,
output reg     [20:0]              cnt_21ms                //1050000刚好可以用21位二进制表示
);

localparam T2_6MS           = 30_0000 ; // T2>5ms     300000刚好可以用19位二进制表示
localparam T3_2MS           = 10_0000   ; // T3>1ms
localparam T4_21MS          = 105_0000  ; // T4>20ms



//==    ov5640_pwdn         上电使能的设计

always @(posedge clk or negedge rst_n) begin
    if(!rst_n) 
        cnt_6ms <= 0;
    else if(ov5640_pwdn == 1'b1) begin
		      cnt_6ms <= cnt_6ms + 1'b1;
    end
	 else
	    cnt_6ms <= cnt_6ms;
end


assign ov5640_pwdn = (cnt_6ms >= T2_6MS) ? 1'b0 : 1'b1;


//==    ov5640_rst_n    复位信号的设计

always  @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        cnt_2ms <= 'd0;
    end
    else if(ov5640_rst_n == 1'b0 && ov5640_pwdn == 1'b0) begin    //相当于从还没开始复位以及上电使能信号刚来的时候开始进行2ms的计数
        cnt_2ms <= cnt_2ms + 1'b1;
    end
end

assign ov5640_rst_n = (cnt_2ms >= T3_2MS) ? 1'b1 : 1'b0;

//==========================================================================
//==    power_done  上电完成的设计
//==========================================================================
always  @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        cnt_21ms <= 'd0;
    end
    else if(power_done == 1'b0 && ov5640_rst_n == 1'b1) begin    //上电还没完成且没有复位的时候,就开始进行一个21ms的计数
        cnt_21ms <= cnt_21ms + 1'b1;
    end
	 else 
	      cnt_21ms <= cnt_21ms ;
end


assign power_done = (cnt_21ms >= T4_21MS) ? 1'b1 : 1'b0;        //上电完成的标志:如果计数大于或者等于t4,21ms的时候就代表上电完成,否则的话还没完成
	
	endmodule






`timescale 1ns/1ps //时间精度
`define Clock 20 //时间周期
module power_ctr1_tb;

			reg     clk  ; // 50MHz
			reg     rst_n;

		   wire   ov5640_pwdn ; // ov5640上电使能
		   wire    ov5640_rst_n; // ov5640复位
		   wire    power_done ;
		   wire  [18:0]    cnt_6ms;  
         wire   [16:0]    cnt_2ms ;
		   wire      [20:0]   cnt_21ms;
		  
power_ctr1 u1(
         
			.clk(clk),         
			.rst_n(rst_n),       
			.ov5640_pwdn(ov5640_pwdn), 
			.ov5640_rst_n(ov5640_rst_n),
			.power_done (power_done),
			.cnt_6ms(cnt_6ms), 
         .cnt_2ms(cnt_2ms),
         .cnt_21ms(cnt_21ms)
);   
initial		
    clk = 0;
always #(`Clock/2) clk= ~clk;

initial begin
   rst_n=0; #(`Clock*5);
   rst_n=1;
end	

endmodule

OV5640上电控制

上一篇:序列检测的两种实现方式:状态机与移位寄存器


下一篇:日记2