按键消抖的Verilog实现

按键消抖

当按键被按下时,由于机械开关的局限性,其对应的电平不会马上稳定,而是会在一段时间内发生抖动。为了正确的识别按键信息,我们必须进行按键消抖的处理。

代码实现

用两个寄存器对输入进行打拍,当这两个寄存器的值不同时(抖动),对计数器进行复位。否则,计数器每个周期加1,当计数器的值达到某个给定的值时,若寄存器的值有效,则说明检测到按键被按下。
若按键被按下后值为1,则代码如下:

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2022/07/22 16:43:50
// Design Name: 
// Module Name: bit_count
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module debounce(
input logic clk,
input logic rst,
input logic key_in,
output logic key_flag);

parameter CNT=1000;
logic key_d1;
logic key_d2;
logic [31:0] cnt;
//key_d2,1
always@(posedge clk,posedge rst)
if(rst)
   {key_d2,key_d1}<=2'b00;
else
   {key_d2,key_d1}<={key_d1,key_in};
//cnt
always@(posedge clk,posedge rst)
if(rst)
   cnt<=0;
else if(key_d1^key_d2)              //还在抖动
   cnt<=0;
else if(cnt==CNT)
   cnt<=cnt;
else
   cnt<=cnt+1;
//key_flag
always@(posedge clk,posedge rst)
if(rst)
   key_flag<=0;
else if(cnt==CNT-1&&key_d2==1'b1)                 //持续时间足够长且为按下
   key_flag<=1;
else
   key_flag<=0;
endmodule

测试代码

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2022/07/23 21:03:12
// Design Name: 
// Module Name: key_tb
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module key_tb(

    );
reg clk;
reg rst;
reg key_in;
wire key_flag;
//clk
initial
begin
   clk=0;
   forever
      #5 clk=~clk;
end
//rst
initial
begin
   rst=1;
   #100
   rst=0;
end
//key_in
initial
begin
   key_in=0;
   wait(rst==1'b0);
   @(posedge clk);
   //
   key_in<=1;
   @(posedge clk);
   repeat(100)
   begin
       key_in<=$random;
	   @(posedge clk);
   end
   //
   key_in<=1;
   repeat(1000)
      @(posedge clk);
   //
   key_in<=0;
   repeat(100)
   begin
      key_in<=$random;
	  @(posedge clk);
   end
   @(posedge clk);
   key_in<=0;
end


//inst
debounce U(
.*
/*
input logic clk,
input logic rst,
input logic key_in,
output logic key_flag
*/
);

endmodule

仿真结果

按键消抖的Verilog实现_第1张图片

你可能感兴趣的:(数字IC设计,fpga开发)