实验原理
按键做为基本的人机输入接口,在很多电子设计中都能见到,由于机械特性,在按键按下或 松开的时候,按键输入值是有抖动的,无论按下去是多平稳,都难以消除抖动,按键消抖方式有 很多,本实验主要是通过 FPGA 计时来消抖。实验中设计了一个计数器,当按键输入有变化时, 计时器清零,否则就累加,直到加到一个预定值(例如 10ms),就认为按键稳定,输出按键值, 这样就得到以后没有抖动的按键值。由于在很多地方需要用到按键下降沿或上升沿的检测,按键 消抖模块直接集成了上升沿和下降沿检测的功能。
程序设计 如下图所示,通过按键消抖后,在按键按下时,十进制计数器加 1,通过数码管译码扫描后 显示出来。
按键消抖部分的原理在上节已经讲过,按键消抖部分代码写的非常精炼,阅读起来稍显费解, 建议结合仿真波形去读代码。在提供的例程文件下的 sim 文件夹中同时提供了仿真文件,可以通 过添加仿真文件来进行仿真观察代码中信号的变化。
仿真
这里我们添加了一个串口接收的激励程序 key_debounce_tb.v 文件,用来仿真按键 key 的输入。 仿真的结果如下,我们看到按键一共有 5 次被按下,但是因为前面 4 次按键按下的低电平保持时 间都小于 20ms, 这 4 次的按下都被程序判断为抖动,只有第 5 次的按键按下时间大于了 20ms, 才 判断为按键有按下,这时 button_negedge 信号产生了一个脉冲。
module count_m10(
input clk,
input rst_n,
input en, //Counter enable
input clr, //Counter synchronous reset
output reg[3:0]data, //counter value
output reg t // carry enable signal
);
always@(posedge clk or negedge rst_n)
begin
if(rst_n==0)
begin
data <= 4'd0;
t <= 1'd0;
end
else if(clr)
begin
data <= 4'd0;
t <= 1'd0;
end
else if(en)
begin
if(data==4'd9)
begin
t<= 1'b1; //Counter to 9 to generate carry
data <= 4'd0;//Counter to 9 reset
end
else
begin
t <= 1'b0;
dat