Verilog-按键消抖

#学习记录#

1  按键消抖

  普通的按键在按下或者松开时均会产生额外的物理抖动,物理抖动便会产生电平抖动,并且抖动的次数和间隔时间都是不可预期的。我们需要消除抖动来减少对外部设备的影响。一般的抖动的总时间会在20ms以内,因此需要一个计数器对电平的状态进行计时。把电平持续时间小于20ms的状态认为是抖动,而把电平持续时间大于20ms认为是电平的稳定状态。

2  按键消抖的Verilog描述

2.1  代码

`timescale 1ns / 1ps
//
// Company: 
// Engineer: Mr-pn-junction
// 
// Create Date: 2023/12/05 08:29:08
// Design Name: 
// Module Name: key_filter
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//
module key_filter
 #(cnt_max = 20'd999_999)
(
    input clk,
    input rst_n,
    input key_in,
    output reg key_flag

);
    reg [19:0] cnt;
always @(posedge clk or negedge rst_n)begin
    if(!rst_n)
        cnt <= 20'd0;
    else if (key_in)
        cnt <= 20'd0;
    else if(cnt == cnt_max)
        cnt <= cnt_max;
    else
        cnt <= cnt +20'd1;
end
always @(posedge clk or negedge rst_n) begin
    if(!rst_n)
        key_flag <= 1'b0;
    else if (cnt ==(cnt_max - 20'd1))
        key_flag <= 1'b1;
    else
        key_flag <= 1'b0;
end
    
        
endmodule

2.2  testbench

`timescale 1ns / 1ps
//
// Company: 
// Engineer: Mr-pn-junction
// 
// Create Date: 2023/12/05 08:40:43
// Design Name: 
// Module Name: key_filter_tb
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//
module key_filter_tb ();
    reg clk;
    reg rst_n;
    reg key_in;
    reg [7:0] cnt_tb;
    wire key_flag;
key_filter
#(.cnt_max(20'd50))
 test(
    .clk(clk),
    .rst_n(rst_n),
    .key_in(key_in),
    .key_flag(key_flag)

);
initial begin
    clk = 1'b1;
    rst_n = 1'b0;
    #15
    rst_n = 1'b1;
    #5000
    $stop;
end
always #10 clk = ~clk;
always @(posedge clk or negedge rst_n) begin
    if(!rst_n)
        cnt_tb <= 8'd0;
    else if(cnt_tb == 8'd255)
        cnt_tb <= 8'd0;
    else 
        cnt_tb <= cnt_tb +2'd1;
end
always @(posedge clk or negedge rst_n) begin
    if(!rst_n)
        key_in <= 1'b1;
    else if((cnt_tb <= 8'd19)||(cnt_tb >=8'd169))
        key_in <= 1'b1;
    else if ((cnt_tb>=8'd19)&&(cnt_tb<= 8'd49)||(cnt_tb>= 8'd149)&&(cnt_tb<=169))
        key_in <= {$random}%2;
    else
        key_in <= 1'b0;

end
endmodule

2.3  仿真结果

图1  按键消抖仿真结果 

参考文献

[1] 按键消抖(verilog&vivado).按键消抖(Verilog&Vivado)_c语言按键消抖-CSDN博客

[2] 按键消抖verilog.按键消抖Verilog_按键消抖verilog代码-CSDN博客 

  • 21
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Verilog实现按键消抖的方法是通过添加适当的延迟和边沿检测技术来实现的。 首先,按键消抖的基本原理是通过适当的延迟来判断按键是否被按下或释放。这个延迟可以使得按键抖动部分不会被检测到,从而滤除掉抖动的影响,实现按键消抖。延迟时间通常很短,例如10毫秒,这样可以避免漏检真实按下或释放按键的情况。 其次,按键消抖的关键技术之一是边沿检测。边沿检测是通过检测延迟前后按键输出电平值的变化来判断按键是否发生了边沿信号。边沿检测可以分为上升沿检测和下降沿检测。当按键从低电平变为高电平时,称为上升沿;当按键从高电平变为低电平时,称为下降沿。通过检测这些边沿信号,可以确定按键的按下和释放动作。 因此,在Verilog实现按键消抖的关键步骤包括: 1. 添加合适的延迟,通常为几毫秒的时间。这可以通过使用计数器或者延时模块来实现。 2. 在延迟前后对按键的输出电平进行检测,判断边沿信号的变化。 3. 根据边沿信号的变化来确定按键的按下和释放动作,进而实现按键消抖。 综上所述,Verilog实现按键消抖的方法包括添加适当的延迟和使用边沿检测技术来判断按键的按下和释放动作。这样可以有效地滤除按键抖动,保证按键信号的稳定性和可靠性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Verilog按键消抖检测的实现](https://blog.csdn.net/CLL_caicai/article/details/105159165)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值