FPGA开发--一种简单的按键处理方法
文章摘要:
本文主要描述了基于FPGA的按键处理的另外一种模式,按照单片机的思路,检测到连续一段时间(20ms)的低电平(按下),视做一次有效按键;
硬件平台: EP4CE6F17C8
开发环境: Quartus II 13.1
示例代码:
/*
* 功能描述:按键例程,每一次有效按键反转LED显示
*/
module key_test (
input clk, // 时钟(50MHz)
input switch, // 按键
output light // 显示
);
// 50MHz时钟,1us = 50个计数,20ms = 1_000_000个计数;
parameter KEY_SMP_CNT = 32'd1_000_000;
reg[26:0] keys_cnt; // 计数器用于计算时间
wire keys_flag; // 有效按键标志
// KEY的值为0,且按下的时间超过20ms,为有效按键
assign keys_flag = ~switch & (keys_cnt == KEY_SMP_CNT);
/*
* 按键检测,如果按下20ms则视做有效按键
*/
always @(posedge clk)
begin
if(switch == 1'b1)
begin
keys_cnt <= 0; // 抬起时重新计数
end
else if(keys_cnt <= KEY_SMP_CNT)
begin
// 超出计数后,只再加1就不计数了
keys_cnt <= keys_cnt + 1'b1;
end
end
// 以下是按键逻辑处理 ----------------------------
reg light_status = 0;
always @(posedge clk)
begin
if(keys_flag)
begin
light_status <= ~light_status;
end
end
assign light = light_status; // 更新LED显示
//-------------------------------------------
endmodule