[FPGA入门笔记](十):按键消抖实验
简介
今天购买了AXLINX AX7020的开发板,从今天开始每一个例程都要做文档记录,为自己加油。
本实验,基于ALINX AX7020开发板,芯片为xc7z020clg400-2。开发板输入时钟为50MHz。
按键消抖实验
作为FPGA的初学者,完成加法器设计流水灯实验后,肯定有想过能否设计一个当某一个被按下后,相应的LED被点亮;再次按下后,LED熄灭,按键控制LED亮灭。最直观的想法就是去采按键的下降沿,当下降沿到来的时候就让LED亮起,再次采到下降沿的时候就对LED取反。然而,当试图去设计电路实现这样功能的时候,发现想简单了。。。。
由于每一次按下按键按键的机械特性,在按键按下或松开的时候,按键输入值是有抖动的,无论按下去是多平稳,都难以消除抖动,因此直接采输入信号的下降沿不可行。我们需要对输入信号进行检测让输入信号稳定下来,也就是消除抖动。
实验中设计了一个计数器,当按键输入有变化时,计时器清零,否则就累加,直到加到一个预定值(例如20ms),就认为按键稳定,输出按键值,这样就得到以后没有抖动的按键值。由于在很多地方需要用到按键下降沿或上升沿的检测,按键消抖模块直接集成了上升沿和下降沿检测的功能。
一、基于FSM的消抖电路设计(FSM Debounce)
**基于FSM的设计消抖电路,**利用一个10ms的非同步定时器和有限状态机,计时器每10ms产生一个滴答使能周期信号,有限状态机利用此信号来确定输入信号是否稳定。有限状态机将消除时间较短的抖动,当输入信号稳定20ms以后才改变去抖动以后的输出值。中间的时间段(本题为20ms)内不论按键发生了什么变化都无所谓。
解题分析:
1.假定系统的起始态是zero(one)态,当sw变为1(0)时,系统转换为wait1_1态。
2.当处于wait1_1态时,有限状态机处于等待状态并
将m_tick置为有效电平态。若sw变为0则表示1值所
持续的时间过短有限状态机返回zero态。
3.这个动作在wait1_2态和wait1_3态也将再重复2次。
zero态:sw稳定在0值
one态:sw稳定在1值。
状态转移图:
代码:
`timescale 1ns/1ps
module fsm_db(input clk,input rst_n,input btn_i,//button inoutput btn_o //button out);localparam ZERO = 3'b000,WAIT01 = 3'b001,WAIT02 = 3'b010,WAIT03 = 3'b011,ONE = 3'b100,WAIT11 = 3'b101,WAIT12 = 3'b110,WAIT13 = 3'b111;reg [2:0] state_curt;//state currentreg [2:0] state_next;//state nextreg [19:0] count; //20ns*106=20mswire tick;reg btn;//Part 1, state transitionalways@(posedge clk or negedge rst_n)beginif(!rst_n)state_curt <= ONE;else state_curt <= state_next;end//Part 2, next state logicalways@(posedge clk or negedge rst_n)beginif(!rst_n)count <= 20'd0;else if(count == 20'd1000_000)count <= 20'd0;elsecount <= count + 1;endassign tick = (count == 20'd1000_000)? 1'b1:1'b0;always@(posedge clk or negedge rst_n)beginif(!rst_n)state_next <= ONE;else if(tick)begincase(state_curt)ZERO:beginif(btn_i)state_next <= WAIT01;elsestate_next <= ZERO;endWAIT01:beginif(btn_i)state_next <= WAIT02;else state_next <= ZERO;endWAIT02:beginif(btn_i)state_next <= WAIT03;elsestate_next <= ZERO;endWAIT03:beginif(btn_i)state_next <= ONE;elsestate_next <= ZERO;endONE:beginif(!btn_i)state_next <= WAIT11;elsestate_next <= ONE;endWAIT11:beginif(!btn_i)state_next <= WAIT12;else state_next <= ONE;endWAIT12:beginif(!btn_i)state_next <= WAIT13;elsestate_next <= ONE;endWAIT13:beginif(!btn_i)state_next <= ZERO;elsestate_next <= ONE;endendcaseendend//Part 3, output logicalways@(posedge clk or negedge rst_n)beginif(!rst_n)btn <= 1'b1;else begincase(state_next)ZERO: btn <= 1'b0;ONE : btn <= 1'b1;endcaseendendassign btn_o = btn;
endmodule
二、基于两级触发器的消抖电路设计(DFF Debounce)
中间的时间段(本题为20ms)内只要按键发生了什么变化,就会复位。
用两级触发器来构成稳定按键信号,防止抖动。
消抖电路的本质思想是消除按键信号的抖动,也就是判断按键信号能否在一段时间内(20ms)稳定。
本设计的思想是,①首先,设计一个(20ms)加法器;②然后,用两级触发器前后信号是否相同来复位加法器,若(20ms内)不同相则复位加法器。③若加法器的值超过20ms,则认为信号稳定了,输出两级触发器的信号。
代码:
`timescale 1ns/1ps
module dff_db( input clk,input rst_n,input btn_i,output btn_o);reg dff1;reg dff2;wire count_rst;reg [19:0] count;reg btn_out;always@(posedge clk or negedge rst_n)beginif(!rst_n)begindff1 <= 1'b1;dff2 <= 1'b1;endelsebegindff1 <= btn_i;dff2 <= dff1;endendassign count_rst = dff1^dff2;always@(posedge clk or negedge rst_n)beginif(!rst_n)count <= 20'b0;else beginif(count_rst)count <= 20'b0;elsecount <= count +1'b1;endendalways@(posedge clk or negedge rst_n)beginif(!rst_n)btn_out <= 1'b1;elsebeginif(count == 20'd1000_000)btn_out <= dff2;elsebtn_out <= btn_out;endendassign btn_o = btn_out;endmodule
[FPGA入门笔记](十):按键消抖实验相关推荐
- 可编程逻辑器件之按键消抖实验
一.实验目标 能够熟练的进行可编程逻辑器件开发,能够通过具体工程需求进行需求分析.模块划分.代码编写.功能仿真.综合分析.板级验证,能够独立正确的进行实验操作,培养学生的工程实践研究能力和动手实践能力 ...
- ISE 下按键消抖实验
实验原理 按键做为基本的人机输入接口,在很多电子设计中都能见到,由于机械特性,在按键按下或 松开的时候,按键输入值是有抖动的,无论按下去是多平稳,都难以消除抖动,按键消抖方式有 很多,本实验主要是通过 ...
- 单片机入门资料,按键消抖方式,按键怎么消抖
1.什么是按键消我们先来看一下按键按下去的波形图 1.按键消抖原理 我们可以看到当按键按下的那一时刻和松开的时候有类似于锯齿的形状那就是按键抖动,这个抖动不是我们人为能控制得了的,所以我们只能对进行 ...
- 【FPGA】实战之按键消抖
文章目录 一.按键消抖的原理 二.按键消抖的设计思路 三.代码部分 四.仿真验证 五.总结 一.按键消抖的原理 一般开发板上的按键都是机械按键,所以在按下的时候,会产生回弹的时刻,称为机械的弹性开关, ...
- 【FPGA】状态机实现按键消抖
1.状态机简介 状态机,FSM(Finite State Machine),也称为同步有限状态机从.指的是在同步电路系统中使用的,跟随同步时钟变化的,状态数量有限的状态机,简称状态机. 状态机分类 根 ...
- I.MX6U-裸机-按键消抖实验(10)
本次实验思想是通过当按键按下之后,触发中断,如果中断时间结束后还是按下的,那么就认为确实按下了,否则认为是噪声影响. 实验步骤: 1.配置IO中断 2.初始化消抖的定时器 3.编写中断处理函数:(一个 ...
- FPGA按键消抖(高级篇)
一. 硬件介绍 FPGA开发板 一个按键 一个led灯 二. 功能介绍 可以满足三种不同要求的消抖方式 通过led灯测试三种消抖方式 三. 消抖方式介绍 mode 0 : 按键按下消抖后,算一次. m ...
- 【 FPGA 】按键消抖与LED灯流动小实验
记录一个小实验吧,实验的目的是仅仅是塞塞牙缝而已,没其他意思,很简单. 功能:拨码开关控制led灯工作与否,拨码开关为on,led灯工作,否则不工作:导航按键up和down,也就是独立按键而已,控制l ...
- FPGA学习笔记---利用连续赋值语句延时功能实现按键消抖
最近一直在学习FPGA,今天在学习延时语句时,发现了连续赋值的一个特点.在连续赋值语句中添加延时时,任何小于延迟值的输入变化都会被滤除而不会体现在输出上.比如 #10 B = A; 当A的变化小于1 ...
最新文章
- Entity Framework 学习笔记(1)
- C# 基于密钥的64位加密与解密方法(原创)
- Caffe使用step by step:caffe框架下的基本操作和分析
- 大数相乘(c语言/c++)
- 禁止32位安装包运行在64位操作系统上
- idea项目结构树状展示_「软件项目管理入门」(26)如何做功能结构设计?
- 全局路径规划:图搜索算法介绍6(A star)Matlab算法实现
- html判断用户名的合法性,javascript简单判断输入内容是否合法的方法
- 机器学习--详解贝叶斯公式、朴素贝叶斯的来龙去脉(附上多方式代码实现)
- python就业有哪些方向_Python就业有哪些方向?最全信息在这里!
- 24小时从0到1开发阴阳师小程序
- 专业的屏幕录像软件使用教程?
- VoLTE业务端到端流程:EPC侧信令流程
- ssh 原理及fingerprint异常处理
- ICCV21 - 无监督语义分割《Unsupervised Semantic Segmentation by Contrasting Object Mask Proposals》
- [装机版]小路工作室GhostXP 2008贺岁版
- HTML基础 + 实例解析
- 第十届蓝桥杯大赛PythonB组
- python水浒传名字次数_《水浒传》里重名多,是施耐庵取名不用心还是太随意?...
- outlook html 邮件表格边框问题