文章摘要:
本文主要描述了基于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