FPGA按键防抖动程序_Verilog

本文介绍了一个使用Verilog HDL实现的模块化设计,用于处理按键输入并驱动LED显示。通过设置标志位、计数器和状态存储器,系统能够识别按键按下状态,并在20ms后根据按键输入驱动相应的LED灯。此设计适用于需要响应用户输入并提供直观反馈的应用场景。
 

module fangdoudong( clk,reset,key_in_1,key_in_2,key_in_3,led_1,led_2,led_3 );
input clk ;  //50MHz
input reset;  //高电平有效
input  key_in_1,key_in_2,key_in_3;   //开关key_in_1 对应led_1,以此类推
output reg led_1,led_2,led_3 ;     //高电平时,led亮
reg [2:0] flag,key_1,key_2 ;  //flag代表标志位,key_1代表当前按键的状态,key_2存储key_1的状态
reg [19:0] count ;      //计数功能,延时20ms

always @(posedge clk)   //reset低电平时,复位
  begin
    if ( reset == 0 )
       begin
         flag <= 3'b000;
         count <= 3'b000;
         led_1 <= 0;
         led_2 <= 0;
         led_3 <= 0;
         key_1 <= 0;
         key_2 <= 0;
       end
  end
always @(posedge clk)   //key_1代表当前按键的状态
  begin
    if ( reset == 1 )
       key_1 <= {key_in_1,key_in_2,key_in_3} ;
  end
always @(posedge clk)   //key_2存储key_1的状态
  begin
    if ( reset == 1 )
       key_2 <= key_1 ;
  end
always @(posedge clk)
  begin
    if ( reset == 1 )
       begin
           flag <= key_1 ^ key_2;  //key_2与key_1的值不同,说明按键按下或是处于开关抖动状态,立即开始计时
        if ( flag  )
         begin
           count <= count + 1 ;
            if ( count == 20'hfffff )   //计时满,立即用开关的稳定状态驱动LED
             led_1 <= key_in_1 ;
             led_2 <= key_in_2;
             led_3 <= key_in_3;
         end
        if ( flag == 0 && count != 0 )    //在判断key_2与key_1的值是否相同时。若处在抖动期很可能相同,使flag=0,
                                               但是也要继续计数,以满足延时20ms的目的
         begin
           count <= count + 1 ;
            if ( count == 20'hfffff )
             led_1 <= key_in_1 ;
             led_2 <= key_in_2;
             led_3 <= key_in_3;
         end
       end
  end          

endmodule

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值