module debounce #(
parameter INIT=10*1000*1000
parameter OVF=10*1000*1000
)(input clk , i ,
output reg o );
reg [31:0]init;
reg [31:0] c;
always @(posedge clk) if (init != INIT) init<=init + 1 ;
always @(posedge clk) o <= ( init == (OVF -1 )) || ( c == (OVF -1 ) ) ;
always @(posedge clk) if ( i==0 ) c<=0; else if ( c != OVF ) c <= c + 1;
endmodule
分析上述代码:
1,i=1时候标示有按钮按下。i接按钮高有效,o接rst高有效。
2,一开始上电,init=0,经历了ovf个周期后o输出1,表达了自动产生一个周期的rst信号。
3,如果按下按钮,并保持ovf个周期以上,产生一个周期的rst信号,之后停止计数,直到为i=0;
4,如果按下按钮,没有保持ovf个周期,则不会产生rst信号。
5,此代码实现了上电复位和key复位。
module delay_reset#(
parameter DELAY=10*1000*1000
)(
input clk ,
input key,
output reg rst ,
output reg rst_n
);
reg [31:0]init;
reg keyr;always @(posedge clk) keyr<=key;
always @(posedge clk) if ({keyr,key} == 2'b01) init<=0;else if (init != DELAY ) init<=init + 1 ;
always @(posedge clk) rst <= init == (DELAY -1 ) ;
always @(posedge clk) rst_n <= ~ rst ;
endmodule
1,如果一个按钮按下KEY=1,则rst生效。
2,如果RST 继续保持则在DELAY 周期后继续产生一个RST信号,循环往复。
3,这是一个纯粹消抖动的应用。