FPGA检测按键长按检测
原理
和按键按下正常检测不一样,检测按键长按要计数。 使用的basys3,时钟100MHZ,所以一秒的计数就要计数到,99_999_999。 由于这个模块本来要计数,所以加不加延时消抖对工程实现的结果影响是不大的,只会造成按下设置的时间不一样。
代码
代码就直接使用不加消抖了,直接用。
module key_test2(
clk, //时钟信号100Mhz
rst, //按键复位
key, //用户按键
out
);
//端口定义
input clk;
input rst;
input key;
output reg out;
reg[31:0] count;
reg last_key; //旧扫描按键电平
wire flag_up; //上升沿检测标志\\
wire flag_down; //上升沿检测标志\\
// wire keys_deb;
//btn_deb btn_deb2
//(
// . clk(clk), //100MHz
// . btn_in(key),
// . btn_deb(keys_deb)
//);
/*
** 按键状态保存一个时钟周期
*/
always @(posedge clk)
begin
last_key <= key;
end
assign flag_up = (~last_key) & key; //检测按键松的上升沿
assign flag_down = (~key) & last_key; //检测按键松的下降沿
/*
** count计数,测量按键按下时间长度
*/
always @(posedge clk or negedge rst)
begin
if (!rst)
count <= 32d0;
else if (key == 1)
count <= count +1b1;
else if (flag_down == 1) begin
count <= 32d0;
end
end
/*
** 根据按键按下时间的长短进行相应的动作
*/
always @(posedge clk or negedge rst)
begin
if (!rst)
out <= 0;
else if (count >= 32d99999_999)//1s
out <= 1b1;
else if (count <= 32d99999_999)
out <= 1b0;
end
endmodule
上一篇:
IDEA上Java项目控制台中文乱码
