Verilog中按键消抖检测的实现

Verilog按键消抖是FPGA学习时的一个入门教程,为避免眼高手低,还是再次分析与记录一下。此处着重介绍按键消抖的基本原理,对按键消抖与检测的关键技术进行分析,并进行功能仿真。

一、按键消抖基本原理

1、按键消抖必要性

物理按键释放与按下时均会出现抖动,抖动时间约为5-10ms。这就意味着,在按键按下以及释放的5-10ms内,按键的输出为高电平还是低电平是不断抖动的,在0-1之间频繁切换。

如果不进行按键消抖操作,会出现异常触发。比如按键按下一次,但是检测电路将m次抖动也检测进去,会造成输出异常。

2、按键消抖原理

按键消抖原理简单,即通过适当延迟,通过检测延迟前后按键输出电平值,判断按键是否被按下或是释放。延迟使得按键抖动部分不会被检测到,滤除掉抖动的影响,实现了按键消抖。而不必担心因为按键消抖延迟时间的存在,导致真实按下或释放按键被漏检。(因为检测延迟时间极短为10ms,试想,要出现漏检至少应该100下/s,这是不可能的)

二、按键消抖检测关键技术

边沿检测

按键检测实际为边沿检测,在不同电路设计下按键按下与释放对应于不同的输出电压,但是无非就是按下为0释放为1,或者按下为1释放为0的区别。

上升沿检测:检测信号从0-1的变化,检测形式为  ~a_r & a(a为信号当前值,a_r为信号上次采样值)

下降沿检测:检测信号从1-0的变化,检测形式为  a_r & ~a (a为信号当前值,a_r为信号上次采样值)

三、仿真相关

假设按键key0-3,按下输出为0,释放输出为1,按键抖动为10ms,要求检测按键出现按下操作。

实现代码如下:

`timescale 1ns / 1ps
//
// Company: 
// Engineer: CLL
// 
// Create Date: 2020/03/28 13:06:39
// Design Name: 
// Module Name: key_scan
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: key_scan 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module key_scan(
    input [3:0]key,
    input clk,
    input rst_n,
    output [3:0]flag
    );
parameter CNT_10MS = 4'b0011;//假设延时4个时钟周期对应10ms(易于功能仿真实现)
// internal signal
reg [3:0]key_n;
reg [3:0]key_r;
reg [3:0]cnt;
// delay module
always@(posedge clk or negedge rst_n)
begin
    if(!rst_n)
        begin
            cnt <= 1'b0;
        end
    else if(cnt == CNT_10MS)
        begin
            cnt <= 1'b0;
        end
    else
        begin
            cnt <= cnt + 1'b1;
        end
end
// key input module
always@(posedge clk or negedge rst_n)
begin
    if(!rst_n)
        begin
            key_n <= 4'b1111;
            key_r <= 4'b1111;
        end
    else if(cnt == CNT_10MS)
        begin
            key_n <= key;
            key_r <= key_n;
        end
end
// key scan module
assign flag = ~key_n & key_r;
//always@(posedge clk or negedge rst_n)
//begin
//    if(!rst_n)
//        begin
//            flag <= 4'b0000;
//        end
//    else 
//        begin
//            flag <= ~key_n & key_r;
//        end
//end
endmodule

为保证输出及时,flag边沿判断部分最好是组合逻辑;

测试文件如下:

以输入key值短时间内频繁反转模拟按键抖动;延迟4个时钟周期模拟实际的10ms延迟;

`timescale 1ns / 1ps
//
// Company: 
// Engineer: CLL
// 
// Create Date: 2020/03/29 10:00:24
// Design Name: 
// Module Name: key_scan_tsb
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module key_scan_tsb(

    );
// port
reg clk;
reg rst_n;
reg [3:0]key;
wire [3:0] flag;
// clk
initial
begin
    clk = 0;
    forever #5 clk = ~clk;
end
// rst_n
initial
begin
    rst_n = 1;
    #10 rst_n = 0;
    #10 rst_n = 1;
end
// 
initial
begin
    key = 4'b1111;
    #20
    repeat(9) #2 key[0] = ~key[0];//模拟抖动
    key[0] = 0;
    #100
    repeat(9) #2 key[1] = ~key[1];//模拟抖动
    key[1] = 0;
    #100
    repeat(9) #2 key[2] = ~key[2];//模拟抖动
    key[2] = 0;
    #100
    repeat(9) #2 key[3] = ~key[3];//模拟抖动
    key[3] = 0;
end
// inst
key_scan minst(
    .clk(clk),
    .rst_n(rst_n),
    .key(key),
    .flag(flag)
);
endmodule

仿真结果如下:

可以看出,电路按照10ms延迟检测按键值,一旦出现1-0情况,即输出按键检测到信号,即flag对应位置1;

  • 4
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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 ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值