一、按键消抖
消抖可以分为硬件消抖和软件消抖。
我这里使用的开发板,只能进行软件消抖。硬件消抖需要加电容或者RS触发器。
为什么要进行按键消抖呢?因为使用的开关为机械弹性开关,当按下或者松开按键时,由于弹片物理特性,无法立即闭合或断开,会在该时刻短时间内产生机械抖动,使我们采集到错误的按键状态。按键消抖的示例代码如下;、
//按键消抖
module key_filter(
input wire sys_clk ,
input wire rst_n ,
input wire key_in ,
output reg key_flag
);
reg [19:0] cnt_20ms ;
parameter cnt_max = 20'd999_999;
always@(posedge sys_clk or negedge rst_n)
if(!rst_n)
cnt_20ms <= 0;
else if (key_in == 1)
cnt_20ms <= 0;
else if (cnt_20ms == cnt_max)
cnt_20ms <= cnt_max;
else
cnt_20ms <= cnt_20ms + 1 ;
always@(posedge sys_clk or negedge rst_n)
if(!rst_n)
key_flag <= 0;
else if(cnt_20ms == (cnt_max - 1 ))
key_flag <= 1;
else
key_flag <= 0;
endmodule
这里我延时20ms进行软件消抖。
二、画visio图
三、写代码
根据visio图可以定义出输入和输出变量,再加入按键消抖,就可以写出按键点亮LED灯的代码。示例代码如下:
module key_filter(
input wire sys_clk ,
input wire rst_n ,
input wire key_in ,
output wire led
);
reg [19:0] cnt_20ms ;
reg key_flag ;
parameter cnt_max = 20'd999_999;
always@(posedge sys_clk or negedge rst_n)
if(!rst_n)
cnt_20ms <= 0;
else if (key_in == 1)
cnt_20ms <= 0;
else if (cnt_20ms == cnt_max)
cnt_20ms <= cnt_max;
else
cnt_20ms <= cnt_20ms + 1 ;
always@(posedge sys_clk or negedge rst_n)
if(!rst_n)
key_flag <= 0;
else if(cnt_20ms == (cnt_max - 1 ))
key_flag <= ~key_flag;
else
key_flag <= key_flag;
assign led = key_flag;
endmodule
我这里是设置的按键按下就会改变LED灯的状态。大家可以根据这些代码改一些参数,使得按键松开LED灯的状态才会改变。
这些就是按键点亮LED灯的笔记了。