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