本代码在按键按下和松开情况下均能消抖,消抖延时20ms(时钟频率为100MHz时)。

代码如下

module key3_led2(
//from system input
    input    clk,
    input    rstn,
//from external input to pl
    input    ex_key1,        //按键从PL端输入
//from pl to ps
    output    reg    pl_key1    //处理后的按键信号传给PS端

);

parameter    delay_t=21'd2_00;//0_000;    //时钟100MHz,延时20ms
//按键输入信号异步转同步(消除亚稳态)
reg [1:0]        key1_r;
//捕捉按键跳变沿
wire        key1_change;
//按键消抖延时计数
reg [20:0]        delay_key1_cnt;
//按键状态
wire        key1_state_down;//(按键未按时为1,按下为0)检测按下时的下降沿
wire        key1_state_up;    //检测按键松开时的上升沿。

//key1消抖
//消除亚稳态,单bit信号异步转同步
always@(posedge clk or negedge rstn)
begin
    if(!rstn)
        begin
            key1_r<=1;
        end
    else
        begin
            key1_r<={key1_r[0],ex_key1};
        end
end

//边沿检测上升沿和下降沿

assign key1_change=(~key1_r[1]&key1_r[0]) | (key1_r[1] & ~key1_r[0]);

//延时20ms
always@(posedge clk or negedge rstn)
begin
    if(!rstn)
        begin
            delay_key1_cnt<=0;
        end
    else if(key1_change==1'b1)
        begin
            delay_key1_cnt<=0;    
        end
           else if (delay_key1_cnt == delay_t)
            begin
                delay_key1_cnt<=delay_t;
            end
                  else
            begin
                delay_key1_cnt<=delay_key1_cnt+1'b1;
            end
end
//按键状态输出,key1_state_a假定按键默认状态为1,按下为0;
assign    key1_state_down = ((delay_key1_cnt == delay_t)&&(key1_r[1] == 1'b0))?1'b0:1'b1;
assign    key1_state_up = ((delay_key1_cnt == delay_t)&&(key1_r[1] == 1'b1))?1'b1:1'b0;

always@(posedge clk or negedge rstn)
begin
    if(!rstn)
        begin
            pl_key1<=1'd1;
        end
    else
       if(pl_key1)
            pl_key1<=key1_state_down;
        else
          pl_key1<=key1_state_up;
end
endmodule

用该代码扩展到3个按键,仿真结果如下图,按键信号输入名称ex_key1、ex_key2、ex_key4;按键边沿检测信号key1_change、key2_change、key4_change;消抖后的信号pl_key1、pl_key2、pl_key4。

用verilog编写按键消抖代码相关推荐

  1. Verilog中按键消抖检测的实现

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

  2. verilog之按键消抖的理解

    按键在按下时会产生抖动,释放时也会产生抖动,所以在设计键盘扫描程序时必须考虑按键的消抖,我们一般只考虑按下时的抖动,而放弃对释放时抖动的消抖.抖动时间一般为20ms左右.按下的最终结果是低电平. 按键 ...

  3. Verilog功能模块 —— 按键消抖

    一. 什么是按键消抖 按键消抖_百度百科 (baidu.com) 按键消抖通常的按键所用开关为机械弹性开关,当机械触点断开.闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断 ...

  4. 【Verilog HDL 训练】第 09 天(按键消抖)

    5月7日 按键防抖 1. 用verilog实现按键抖动消除电路,抖动小于15ms,输入时钟12MHz. 在编写Verilog代码之前,先分析下一些前提问题,首先是几个按键(1个,多个),我们以1个和三 ...

  5. c语言实现按键的抖动与消除,【Verilog HDL 训练】第 09 天(按键消抖)

    5月7日 按键防抖 1. 用verilog实现按键抖动消除电路,抖动小于15ms,输入时钟12MHz. 在编写Verilog代码之前,先分析下一些前提问题,首先是几个按键(1个,多个),我们以1个和三 ...

  6. FPGA学习-Verilog实现独立按键消抖

    文章目录 前言 一.独立按键消抖原理 二.按键消抖程序实现(Verilog) 1.按键触发判断 2.计数器模块实现 3.按键状态更新 4.按键控制led亮灭 三.仿真测试文件编写 四.编译结果 前言 ...

  7. 基于verilog按键消抖设计

    关于键盘的基础知识,我就以下面的一点资料带过,因为这个实在是再基础不过的东西了.然后我引两篇我自己的博文,都是关于按键消抖的,代码也正是同目录下project里的.这两篇博文都是ednchina的博客 ...

  8. Verilog实现4位按键消抖,分别控制一个LED

    Verilog实现4位按键消抖,分别控制一个LED 代码思路(完整代码在后) 完整代码 参考:(主要是第一篇,第二篇不严谨) <按键消抖与LED控制>实验的个人思考与总结 Verilog实 ...

  9. Verilog实现独立按键消抖(状态机)

    本文参考小梅哥的独立按键消抖视频 1,实验原理: 这里是黑金开发板教程中的图,可以看出,按键未按下时的状态是高电平,按下为低电平.下边是小梅哥画的图解. 因为是机械按键,按下时候有一个不稳定的抖动期, ...

最新文章

  1. 消息积压在消息队列里怎么办
  2. semantic segmentation 和instance segmentation
  3. Android Websites
  4. 写一个迷你版Smarty模板引擎,对认识模板引擎原理非常好(附代码)
  5. vue树形多列_[vue]使用Element-ui的el-table实现多列同时排序。
  6. Fckeditor插入视频或视频文件
  7. vb编写脚本能让计算机屏幕黑屏,,win7上设置颜色黑屏
  8. ubuntu16.04下面的redis desktop manger的使用
  9. php 测试控制器,php – 控制器的Laravel单元测试
  10. 【August】百度运维+测试面试
  11. Docker Win 10 安装
  12. 【C++入门】C++ 运算符的重载
  13. 怎么查看自己电脑是否被安装远程监控
  14. Maven 打包-添加第三方包、依赖包 mvn clean package
  15. Centos7 在docker中安装Mysql 8.0 的相关问题
  16. 赋值运算符和赋值表达式
  17. 《千与千寻》与《天空之城》配色分享
  18. 一文学会 Spring MVC 表单标签
  19. JAVA中RandomAccess接口
  20. 码字 层映射 预编码的概念总结

热门文章

  1. threejs学习笔记:实现导入的动画gltf模型播放动画
  2. C语言(求解一元二次方程的根)
  3. 【图像处理】.jpg 和 .png
  4. 分销商城是怎么运营?
  5. 前端导出表格,万级数据,带样式(留自用)
  6. Google hacking使用总结
  7. 智慧屏与普通屏幕有何区别?
  8. TinyIM流程之删除好友
  9. 网络/运维工程面试题汇总二
  10. sklearn+机器学习