按键抖动检测及控制灯翻转功能
			 2025-03-10
			  23
			 0
			
			
			通过状态机S1~S2,在S2状态时key_cap输出高电平
module key (
input clk_i,
input key_i,
output key_cap
);
begin
    //10ms时钟分频
    always @(posedge clk_i)begin
        if(cnt10ms < CNT_10MS)
            cnt10ms <= cnt10ms + 1'b1;
        else
            cnt10ms <= 25'd0;
    end
    assign en_10ms = (cnt10ms == CNT_10MS);
    //是否按下,按下为0
    //10ms检测一次
    always @(posedge clk_i)begin
        if(en_10ms)begin
            case(key_s)
                KEY_S0:begin
                    if(!key_i)//按下
                        key_s <= KEY_S1;
                    end
                KEY_S1:begin
                    if(!key_i)//按下
                        key_s <= KEY_S2;
                    else
                        key_s <= KEY_S0;
                    end
                KEY_S2:begin
                    if(key_i) //抬起,如果不抬起,继续为S2
                        key_s <= KEY_S3;
                    end
                KEY_S3:begin
                    if(key_i)//抬起
                        key_s <= KEY_S0;
                    else
                        key_s <= KEY_S2;
                    end
            endcase
        end
    end
    always @(posedge clk_i)begin
        key_s_r <= key_s;
    end
    //当到达KEY_S2时,输出一次高电平
    //保持一个时钟周期
    assign key_cap = (key_s==KEY_S2)&&(key_s_r==KEY_S1);
    //高电平的时间就是KEY2的保持的时长
    assign key_cap = (key_s==KEY_S2);
end
上面作为通用模块,供下面模块调用,调用上面的模块
增加一键控制一灯功能
module Key_Jitter(
input clk_i,
input rst_n_i,
input key_i,
output [3:0] led_o
);
    always @(posedge clk_i) 
    begin
        if(!rst_n_i) begin
            led_o <= 4'b0000;
        end
        else if(key_cap)begin
            led_o <= ~led_o;
        end
    end
    key0
    (
    .clk_i(clk_i),
    .key_i(key_i),
    .key_cap(key_cap)
    );
end module
 FPGA入门练习
			FPGA入门练习
			




