【作业要求】
1、按键消抖有几种方式,分别是什么?
1. 延时采样法:检测到按键状态变化后,延时 10~20ms 再读一次,若状态一致则确认。
2. 定时扫描 + 计数确认法:定时器每隔几毫秒扫描一次按键,连续 N 次(如 3~5 次)读到相同状态才确认。
3. 状态机法:定义状态:空闲、消抖按下、按下稳定、消抖释放、释放稳定等,每个状态用计数器定时。
4. 积分/滤波法:用移位寄存器或累加器对多次采样结果进行多数表决或积分,超过阈值才确认。
5. 中断 + 定时器法:按键触发中断,启动定时器,定时到后再读按键状态。
2、在按键消抖模块中,计时器为什么计到最大时是保持而不是清零?
如果计时器计到最大值时清0,而按键按下了很长时间(超过10ms),那么此时就会重复计时,重复产生flag信号,达不到按键消抖的目的。
代码下载
`timescale 1ns / 1ps
//按键消抖模块(存在机械按键中,拨码开关不需要消抖)
module key(
input sysclk ,//时钟
input rst_n ,//复位
input key ,//按键
output key_flag //按键有效信号(按下按键,消抖完成)
);
parameter delay=50_000_0 ;//消抖所需时间10ms
reg [18:0] cnt ;//计数器
//按键消抖
always@(posedge sysclk)
if(!rst_n)
cnt<=0;
else if(key==0)begin//按下按键
if(cnt==delay-1)//cnt计数器计满
cnt<=cnt;//保持(如果cnt=0,会出现反复消抖的情况)
else
cnt<=cnt+1;//cnt自加
end else
cnt<=0;//未计数,未按按键
//输出key_flag
//[尖峰脉冲信号(一个周期结束)(使能)(短)]key_flag输出高低电平,如果cnt-1,就会一直保持,短信号变为长信号一直拉高
assign key_flag=(cnt==delay-2)?1:0;
endmodule【我的做法】
【结果/时序图/实验现象(可视频)】
评论 0