关于特权同学按键消抖的问题
wire[2:0] key_an = key_rst_r & ( ~key_rst);
else if(key_an) cnt <=20'd0;
key_an不是三位位宽吗,那怎么判断其整体的大小呢?如key_an=110
下面一段是用Verilog写的按钮去抖动,及按住不放间隔取值的描述,会不会对你有帮助?
对于按钮使用除了物理的抖动,还可能出现人按压按钮是手颤动,为了预防手颤动或按压时间过长的问题,也需要对按压动作取值控制一定的时间间隔。在计算物理抖动时,必须是没有取值的状态。按钮下压值为0。这里的设计使我们按住按钮不松手,就可以按照一定的间隔时间(大约1秒),连续取值。这种情况用在浏览按钮使用非常方便。按住左或右浏览按钮不松手,可以连续浏览缓冲区的内容。
always@(posedge clk18)
//去抖动
begin
if ( SW[0]==1 && KEY[0]==0 && kz==0) //有效键按下输入
begin
Co <= Co+1'b1; //有效按下按钮计时
if (Co==10800 ) writ<=1; //越过抖动时间正确取值
else
begin
writ <= 0; //取值延长一个节拍
if (Co[22]==1) //进入连续取值计时
begin
kz<=1; //不准取值标志
coo<=0; //开始间隔计时
end
end
end
else //没有按压按钮的情况:
begin
Co<=0;
writ <= 0;
coo <= coo+1'b1; //为无效按压计时
if (coo[22]==1) kz <= 0; //预备输入按钮按压
end
嗯,非常感谢,这段程序基本上看懂了,不过我对那个还是有些纠结
我也很纠结这个问题,想不明白,求大神解决!
同样的问题!
能判断的按键按下时key_an就只有一位是1,其余位是0
key_rst 1110
~key_rst 0001
key_rst_r 1110
key_an= 0010
对准来看结果就这样
我写了个四个位宽的解释,三个位宽同理
/////////////////////////