FPGA课设-基于verilog按键消抖设计源代码

/说明:当三个独立按键的某一个被按下后,相应的LED被点亮;
//        再次按下后,LED熄灭,按键控制LED亮灭

module sw_debounce(
            clk,rst_n,
            sw_in,sw1_n,sw2_n,sw3_n,sw4_n,
               led_d3,led_d4,led_d5,led_d6
            );

input   clk;    //主时钟信号,50MHz
input   rst_n;    //复位信号,低有效
input   sw1_n,sw2_n,sw3_n,sw4_n;     //三个独立按键,低表示按下
output  led_d3,led_d4,led_d5,led_d6;    //发光二极管,分别由按键控制
output sw_in;
assign sw_in = 1'b1;

//---------------------------------------------------------------------------
reg[3:0] key_rst;  

always @(posedge clk  or negedge rst_n)
    if (!rst_n) key_rst <= 4'b1111;
    else key_rst <= {sw4_n,sw3_n,sw2_n,sw1_n};

reg[3:0] key_rst_r;       //每个时钟周期的上升沿将low_sw信号锁存到low_sw_r中

always @ ( posedge clk  or negedge rst_n )
    if (!rst_n) key_rst_r <= 4'b1111;
    else key_rst_r <= key_rst;
   
//当寄存器key_rst由1变为0时,led_an的值变为高,维持一个时钟周期 
wire[3:0] key_an = key_rst_r & ( ~key_rst);

//---------------------------------------------------------------------------
reg[19:0]  cnt;    //计数寄存器

always @ (posedge clk  or negedge rst_n)
    if (!rst_n) cnt <= 20'd0;    //异步复位
    else if(key_an) cnt <=20'd0;
    else cnt <= cnt + 1'b1;
  
reg[3:0] low_sw;

always @(posedge clk  or negedge rst_n)
    if (!rst_n) low_sw <= 4'b1111;
    else if (cnt == 20'hfffff)     //满20ms,将按键值锁存到寄存器low_sw中     cnt == 20'hfffff
      low_sw <= {sw4_n,sw3_n,sw2_n,sw1_n};
      
//---------------------------------------------------------------------------
reg  [3:0] low_sw_r;       //每个时钟周期的上升沿将low_sw信号锁存到low_sw_r中

always @ ( posedge clk  or negedge rst_n )
    if (!rst_n) low_sw_r <= 4'b1111;
    else low_sw_r <= low_sw;
   
//当寄存器low_sw由1变为0时,led_ctrl的值变为高,维持一个时钟周期 
wire[3:0] led_ctrl = low_sw_r[3:0] & ( ~low_sw[3:0]);

reg d1;
reg d2;
reg d3;
reg d4;
  
always @ (posedge clk or negedge rst_n)
    if (!rst_n) begin
        d1 <= 1'b0;
        d2 <= 1'b0;
        d3 <= 1'b0;
        d4 <= 1'b0;
      end
    else begin        //某个按键值变化时,LED将做亮灭翻转
        if ( led_ctrl[0] ) d1 <= ~d1;    
        if ( led_ctrl[1] ) d2 <= ~d2;
        if ( led_ctrl[2] ) d3 <= ~d3;
        if ( led_ctrl[3] ) d4 <= ~d4;
      end
assign led_d6 = d4 ? 1'b1 : 1'b0;
assign led_d5 = d3 ? 1'b1 : 1'b0;        //LED翻转输出
assign led_d3 = d2 ? 1'b1 : 1'b0;
assign led_d4 = d1 ? 1'b1 : 1'b0;

  
endmodule
 

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GJZGRB

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值