











按键消抖方法:
2个状态:0-未按下;1-按下。
仿真结果:

代码逻辑:
if(!rst_n) begin state <= 0; cnt <= 0; key_out <= 1; //按键未按下 end else begin case(state) 0: begin if(!key_in) // 按下 begin if(cnt < T - 1) // < 10ms begin cnt <= cnt+1; //延时计数 state <= 0; //状态保持没按下 key_out <= 1; end else //按下持续达到10ms begin cnt <= 0; state <= 1; //进入按下状态 key_out <= 0; end end else //没按下 begin cnt <= 0; state <= 0; key_out <= 1; end end 1: begin if(key_in) // 松开 begin if(cnt < T - 1) //延时判断 begin cnt <= cnt+1; state <= 1; //不够10ms延时,状态不变 key_out <= 0; end else // 延时足够,状态转换,按键拉高 begin cnt <= 0; state <= 0; key_out <= 1; end end else //按键按住不松 begin cnt <= 0; state <= 1; key_out <= 0; end end default: state <= 0; endcase
defparam dut.T = 50; key_filter dut( .clk(clk), .rst_n(rst_n), .key_in(key_in), .key_out(key_out) ); initial begin clk = 0; rst_n = 0; key_in = 1; #200.1 rst_n = 1; #487 key_in = 0; #487 key_in = 1; #487 key_in = 0; #487 key_in = 1; #487 key_in = 0; #487 key_in = 1; #487 key_in = 0; #487 key_in = 1; #487 key_in = 0; #2000 key_in = 1; #487 key_in = 0; #487 key_in = 1; #487 key_in = 0; #487 key_in = 1; #487 key_in = 0; #487 key_in = 1; #487 key_in = 0; #487 key_in = 1; #487 key_in = 0; #487 key_in = 1; #2000 $stop; end always #10 clk = ~clk;
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。