下面一段是用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
对于按钮使用除了物理的抖动,还可能出现人按压按钮是手颤动,为了预防手颤动或按压时间过长的问题,也需要对按压动作取值控制一定的时间间隔。在计算物理抖动时,必须是没有取值的状态。按钮下压值为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_rst 1110
~key_rst 0001
key_rst_r 1110
key_an= 0010
对准来看结果就这样
我写了个四个位宽的解释,三个位宽同理
一周热门 更多>