FPGA入门练习
+ -

按键抖动检测及控制灯翻转功能

2025-03-10 0 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

0 篇笔记 写笔记

关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!