VERILOG代码用于FPGA上的DEBOUNCING按钮

此帖子是为FPGA上的按钮提供简单的Debouncing Verilog代码。 

机械的 开关/ 纽扣 在切换时导致信号中不可预测的反弹。有各种方法可以在FPGA上为按钮实施脱位电路。在该项目中,实施简单的脱嘴电路 verilog. 在FPGA上按下按钮时,仅生成单个脉冲。 

verilog.代码按钮Debouncing

用于按钮的脱扣电路 FPGA.

如下图所示,按钮时 FPGA. 按下并释放,按钮信号中存在许多意外的上下反弹。脱位电路仅在我们预期的情况下产生慢速时钟的单个脉冲,而不会弹跳。 

verilog.代码按钮Debouncing

来自Debouning电路的预期波形

verilog. 按钮代码Debouncing FPGA.  (额外的FF避免第1 FF的亚稳性):

//yl315.net
//  FPGA.  projects, verilog. projects, VHDL projects
// FPGA上的按钮的Verilog代码
// debouncing module 
模块 debounce(输入  pb_1,clk,输出 pb_out);
wire slow_clk;
wire Q1,Q2,Q2_bar,Q0;
clock_div u1(clk,slow_clk);
my_dff d0(slow_clk, pb_1,Q0 );
my_dff d1(slow_clk,q0,Q1 ); my_dff d2(slow_clk, Q1,Q2 ); 分配Q2_Bar.= ~Q2; 分配 pb_out. = Q1 & Q2_bar; 终点 //慢腾出的时钟 模块 clock_div(输入 clk_100m, 输出 reg slow_clk ); reg [26:0]柜台=0; 总是 @(提出 Clk_100M) 开始 counter <= (counter>=249999)?0:柜台+1; slow_clk <= (柜台 < 125000)?1'b0:1'b1; 结尾 终点 // D-FLIP-FLOP for Debouncing模块 模块 my_dff(输入 dff_clock., D, 输出 reg Q ); 总是 @ (提出 dff_clock.) 开始 Q <= D; 结尾 终点

仿真波形按钮Devouncing(2FFS):

verilog.代码按钮Debouncing
如波形所示,当按下并释放预期时,仅产生单个脉冲。
注意,此代码即将在设计中创建另一个时钟,因此在时钟树综合期间需要执行额外的内部生成时钟所需的FPGA工具,这可能导致FPGA定时问题,因为它不会产生 专用FPGA时钟发电机 (PLL / DCM /等)。另外,你也必须照顾好 多时钟域问题 在设计诸如不同时钟域之间的接口信号(所需的同步器等)。我们可以通过设计,而不是在设计中创建另一个慢速时钟 生成时钟使能信号 驾驶Debouncing触发器。 

更好的Verilog代码用于在FPGA上进行衰减按钮而不创建另一个时钟域:

//yl315.net: FPGA projects, Verilog projects, VHDL projects
// FPGA上的按钮的Verilog代码
// debouncing module without creating another clock domain
// by using clock enable signal 
模块 debounce_better_version(输入  pb_1,clk,输出 pb_out);
wire slow_clk_en;
wire Q1,Q2,Q2_bar,Q0;
clock_enable u1(clk,slow_clk_en);
my_dff_en d0(clk,slow_clk_en,pb_1,Q0 ); 
my_dff_en d1(clk,slow_clk_en,q0,Q1 ); my_dff_en d2(clk,slow_clk_en,Q1,Q2 ); 分配Q2_Bar.= ~Q2; 分配 pb_out. = Q1 & Q2_bar; 终点 //慢钟使能DEBOUNCing按钮启用 模块 clock_enable(输入 Clk_100M,输出 slow_clk_en); reg [26:0]柜台=0; 总是 @(提出 Clk_100M) 开始 counter <= (counter>=249999)?0:柜台+1; 结尾
    分配 slow_clk_en = (柜台 == 249999)?1'b1:1'b0;
终点
// D-flip-flop with clock enable signal for debouncing module 
模块 my_dff_en(输入  dff_clock., clock_enable,D, 输出   reg   Q=0 ); 
    总是 @ (提出 dff_clock.) 开始
  if(clock_enable==1) 
           Q <= D;
     结尾 
终点 

DEARCENCING按钮的TESTBENCH VERILOG代码:

`timescale 1ns / 1ps
// testbench verilog code for debouncing button without creating another clock
模块 tb_button;
 // Inputs
   reg   pb_1;
   reg   clk;
 // Outputs
 wire pb_out;
 // Instantiate the debouncing Verilog code
 debounce_better_version uut (
  .pb_1(pb_1), 
  .clk(clk), 
  .pb_out(pb_out)
 );
 initial 开始
  clk = 0;
  forever #10 clk = ~clk;
  结尾 
 initial 开始
  pb_1 = 0;
  #10;
  pb_1=1;
  #20;
  pb_1 = 0;
  #10;
  pb_1=1;
  #30; 
  pb_1 = 0;
  #10;
  pb_1=1;
  #40;
  pb_1 = 0;
  #10;
  pb_1=1;
  #30; 
  pb_1 = 0;
  #10;
  pb_1=1; 
  #1000; 
  pb_1 = 0;
  #10;
  pb_1=1;
  #20;
  pb_1 = 0;
  #10;
  pb_1=1;
  #30; 
  pb_1 = 0;
  #10;
  pb_1=1;
  #40;
  pb_1 = 0; 
  结尾  
      
终点
verilog.代码的仿真波形 脱扣纽扣:
用于FPGA上的Debouncing按钮的简单Verilog代码
如模拟波形所示,当按下按钮时,仅产生具有慢时钟使能信号的时段的脉冲,并且按预期释放并释放。请注意,9的除数用于更快的模拟。如果您希望生成时钟输入时段的单个脉冲,只需修改输出分配“分配pb_out = q1& Q2_bar & slow_clk_en;".
VHDL代码用于FPGA上的Debouncing按钮
推荐的 Verilog projects:
2. FIFO记忆的Verilog代码
3. 16位单循环MIPS处理器的Verilog代码
4. verilog. HDL中的可编程数字延迟计时器
5. 数字电路中基本逻辑组件的Verilog代码
6. 32位无符号分频器的Verilog代码
7. 用于固定点矩阵乘法的Verilog代码
8. 在Verilog HDL中的板牌识别
9. 携带外观前方乘法器的Verilog代码
10。  微控制器的Verilog代码
11.  4x4乘法器的Verilog代码
12.  停车系统的Verilog代码
13。  使用Verilog HDL对FPGA的图像处理
14。  如何使用Verilog HDL将文本文件加载到FPGA中
15.  交通灯控制器的Verilog代码
16。   FPGA. 闹钟的Verilog代码
17。  比较器设计的Verilog代码
18。  VERILOG代码D触发器
19。  完整加法器的Verilog代码
20。  与测试台的计数器的Verilog代码
21。  16位RISC处理器的Verilog代码
22。   FPGA. 上的按钮的Verilog代码
23。  如何为双向/ inout端口编写Verilog TestBench
28。  解码器的Verilog代码
29。  多路复用器的Verilog代码
30。   Verilog中的n位加法器设计
31。  verilog. vs vhdl.:通过示例解释
32。   FPGA. 时钟分频器的Verilog代码
33。  如何在Verilog中生成时钟使能信号
34。  PWM生成器的Verilog代码
35。  verilog.编码VS软件编程
36。  Moore FSM序列检测器的Verilog代码
37。  Basys 3 FPGA上的7段显示控制器的Verilog代码
 FPGA.  Verilog VHDL课程

6评论:

  1. 谁能发布8位奇偶校验检查的代码?

    回复 删除
  2. 没有得到第二个版本的相同波形。计数器从未达到249999,导致时钟使得始终为0,导致DFF始终输出零。

    回复 删除
    答案
    1. 对于仿真,时钟使能中的较小的除数值用于更快的模拟。

      删除
  3. 我有一个关于改进版本的问题:慢速_CLK_EN仅在按下按钮时,触发D1将如何返回零?我的意思是,它会没有注册第二个完整按钮?还是我错过了什么?

    回复 删除
    答案
    1. 是的。谢谢。你说的对。有一个错误。现在已经更新并验证了模拟和FPGA的代码。

      删除

趋势FPGA项目