用于在FPGA上反跳按钮的Verilog代码

这篇文章将为FPGA上的按钮提供一个简单的防抖Verilog代码。 

机械 开关/ 纽扣 切换时会导致信号发生不可预测的反弹。有多种方法可以为FPGA上的按钮实现去抖电路。在该项目中,实现了一个简单的去抖电路 Verilog 按下FPGA上的按钮时仅产生一个脉冲。 

按钮弹跳的Verilog代码

按钮上的反跳电路 现场可编程门阵列

如下图所示,当一个按钮 现场可编程门阵列 按下并释放时,按钮信号中会出现许多意外的上下反弹。去抖电路仅生成一个具有慢速时钟周期的单个脉冲,而不会像我们预期的那样反弹。 

按钮弹跳的Verilog代码

去抖电路的预期波形

Verilog 按钮反跳的代码 现场可编程门阵列 (额外的FF以避免第一个FF的亚稳定性):

//hzgifts.cn
// 现场可编程门阵列 projects, Verilog projects, VHDL projects
// 用于在FPGA上反跳按钮的Verilog代码
// debouncing 模组 
模组 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) 开始 计数器 <= (计数器>=249999)?0:计数器+1; slow_clk <= (计数器 < 125000)?1'b0:1'b1; 结束 终端模块 // D触发器用于反跳模块 模组 my_dff(输入 DFF_CLOCK, D, 输出 reg Q); 总是 @(摆姿势 DFF_CLOCK) 开始 Q <= D; 结束 终端模块

按钮去抖动(2FF)的仿真波形:

按钮弹跳的Verilog代码
如波形所示,按预期按下和释放按钮时,仅产生一个脉冲。
注意,此代码将在您的设计中创建另一个时钟,因此,在时钟树综合过程中需要使用FPGA工具来照顾额外的内部生成时钟,这可能会导致FPGA时序问题,因为它不是由FPGA生成的。 专用FPGA时钟发生器 (PLL / DCM /等)。此外,您还必须照顾好 多时钟域问题 在设计时,例如在不同时钟域之间连接信号(需要同步器等)。不用在设计中创建另一个慢时钟,我们可以 产生时钟使能信号 驱动去抖触发器。 

更好的Verilog代码,可在不创建另一个时钟域的情况下消除FPGA上的按钮:

//hzgifts.cn: 现场可编程门阵列 projects, Verilog projects, VHDL projects
// 用于在FPGA上反跳按钮的Verilog代码
// debouncing 模组 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; 终端模块 //慢时钟使能去抖按钮 模组 clock_enable(输入 Clk_100M,输出 slow_clk_en); reg [26:0]计数器=0; 总是 @( 摆姿势 Clk_100M) 开始 计数器 <= (计数器>=249999)?0:计数器+1; 结束
    分配 slow_clk_en = (计数器 == 249999)?1'b1:1'b0;
终端模块
// D-flip-flop with clock enable signal for debouncing 模组 
模组 my_dff_en(输入 DFF_CLOCK, clock_enable,D, 输出 reg Q=0);
    总是 @(摆姿势 DFF_CLOCK) 开始
  if(clock_enable==1) 
           Q <= D;
    结束
终端模块 

用于反跳按钮的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上反跳按钮的简单Verilog代码
如仿真波形所示,按预期的那样按下,保持并释放按钮时,只会生成一个周期为慢时钟使能信号的脉冲。注意9的除数用于更快的仿真。如果您希望生成一个具有一定时钟输入周期的脉冲,只需修改输出分配“分配pb_out = Q1& Q2_bar & slow_clk_en;".
VHDL代码,用于反跳FPGA上的按钮
推荐的 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。 现场可编程门阵列上的闹钟的Verilog代码
17。 比较器设计的Verilog代码
18岁 D触发器的Verilog代码
19 Full Adder的Verilog代码
20 带testbench的计数器的Verilog代码
21 16位RISC处理器的Verilog代码
22 用于在FPGA上反跳按钮的Verilog代码
23。 如何为双向/输入端口编写Verilog Testbench
28。 解码器的Verilog代码
29。 复用器的Verilog代码
30岁  Verilog中的N位加法器设计
31。 Verilog和VHDL:通过示例解释
32。 现场可编程门阵列上时钟分频器的Verilog代码
33。 如何在Verilog中生成时钟使能信号
34。 用于PWM发生器的Verilog代码
35岁 Verilog编码与软件编程
36。 Moore FSM序列检测器的Verilog代码
37。 Basys 3 现场可编程门阵列上的7段显示控制器的Verilog代码
现场可编程门阵列 Verilog VHDL课程

6条评论:

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

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

    回复删除
    回覆
    1. 对于仿真,时钟启用中较小的除数用于更快的仿真。

      删除
  3. 我对改进版本有一个疑问:slow_clk_en仅在按下按钮时才激活,如何触发D1归零?我的意思是,它将无法注册第二次全按钮按下吗?还是我错过了什么?

    回复删除
    回覆
    1. 是。谢谢。你是对的。出了错现在,该代码已在仿真和FPGA上进行了更新和验证。

      删除

热门FPGA项目