当前位置:文档之家› 实战训练2 基于verilog按键消抖设计

实战训练2 基于verilog按键消抖设计

实战训练2 基于verilog按键消抖设计
实战训练2 基于verilog按键消抖设计

实战训练2 基于verilog按键消抖设计

键盘的分类

键盘分编码键盘和非编码键盘。键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如计算机键盘。而靠软件编程来识别的称为非编码键盘。

在单片机组成的各种系统中,用的最多的是非编码键盘。也有用到编码键盘的。非编码键盘有分为:独立键盘和行列式(又称为矩阵式)键盘。

按键在闭合和断开时,触点会存在抖动现象:

从上面的图形我们知道,在按键按下或者是释放的时候都会出现一个不稳定的抖动时间的,那么如果不处理好这个抖动时间,我们就无法处理好按键编码,所以如何才能有效的消除按键抖动呢?

经典的verilog键盘扫描程序

//当三个独立按键的某一个被按下后,相应的LED被点亮;再次按下后,LED 熄灭,按键控制LED亮灭

`timescale 1ns/1ns

module keyscan(

clk,

rst_n,

sw1_n,

sw2_n,

sw3_n,

//output

led_d3,

led_d4,

led_d5

);

input clk; //主时钟信号,48MHz

input rst_n; //复位信号,低有效

input sw1_n,sw2_n,sw3_n; //三个独立按键,低表示按下

output led_d3,led_d4,led_d5; //发光二极管,分别由按键控制 // ---------------------------------------------------------------------------

reg [19:0] cnt; //计数寄存器

always @ (posedge clk or negedge rst_n)

if (!rst_n) //异步复位

cnt <= 20'd0;

else

cnt <= cnt + 1'b1;

reg [2:0] low_sw;

always @(posedge clk or negedge rst_n)

if (!rst_n)

low_sw <= 3'b111;

else if (cnt == 20'hfffff) //满20ms,将按键值锁存到寄存器low_sw中

low_sw <= {sw3_n,sw2_n,sw1_n};

// ---------------------------------------------------------------------------

reg [2:0] low_sw_r; //每个时钟周期的上升沿将low_sw信号锁存到low_sw_ r中

always @ ( posedge clk or negedge rst_n )

if (!rst_n)

low_sw_r <= 3'b111;

else

low_sw_r <= low_sw;

//当寄存器low_sw由1变为0时,led_ctrl的值变为高,维持一个时钟周期

wire [2:0] led_ctrl = low_sw_r[2:0] & ( ~low_sw[2:0]);

reg d1;

reg d2;

reg d3;

always @ (posedge clk or negedge rst_n)

if (!rst_n)

begin

d1 <= 1'b0;

d2 <= 1'b0;

d3 <= 1'b0;

end

else

begin //某个按键值变化时,LED将做亮灭翻转

if ( led_ctrl[0] ) d1 <= ~d1;

if ( led_ctrl[1] ) d2 <= ~d2;

if ( led_ctrl[2] ) d3 <= ~d3;

end

assign led_d5 = d1 ? 1'b1 : 1'b0; //LED翻转输出

assign led_d3 = d2 ? 1'b1 : 1'b0;

assign led_d4 = d3 ? 1'b1 : 1'b0;

endmodule

也许初看起来这段代码似乎有点吃力,好多的always好多的wire啊,而我们通常用得最多的判断转移好像不是主流。的确是这样,一个好的verilog代码,用多个always语句来分摊一个大的always来执行,会使得综合起来更快,这也是接前两篇日志说到代码优化的一个值得学习的方面。其次是wire连线很多,你要是仔细研究代码,不难发现所有的锁存器的连线关系编程者都考虑到

了,这样就不会平白无故的生成意想不到的寄存器了,这也是一个优秀代码的必备要素。

上面说的是代码风格,下面就看程序的编程思想吧。前两个always语句里其实是做了一个20ms的计数,每隔20ms就会读取键值,把这个键值放到寄存器low_sw中,接下来的一个always语句就是把low_sw的值锁存到low_sw_r 里,这样以来,low_sw和low_sw_r就是前后两个时钟周期里的键值了,为什么要这样呢?看下一个语句吧:

wire [2:0] led_ctrl = low_sw_r[2:0] & ( ~low_sw[2:0]);

仔细分析,你会发现当没有键按下时,low_sw=low_sw_r=3’b111,此时的led_ctrl=3’b000;只有当low_sw和low_sw_r的某一位分别为0和1时,才可能使led_ctrl的值改变(也就是把led_ctrl的某一位拉高)。那么这意味着当键值由1跳变到0时才可能把led_ctrl拉高。回顾前面的20ms赋键值,也就是说每20ms内如果出现按键被按下,那么有一个时钟周期里led_ctrl是会被拉高的,而再看后面的程序,led_ctrl的置高就使得相应的LED灯的亮灭做一次改变,这就达到了目的。

FPGA按键消抖实验(源码)

modulekey_scan( inputclk, inputrst_n, input [3:0] row, // 矩阵键盘行 output reg [3:0] col, // 矩阵键盘列 output reg [7:0] key_val // 键盘值 ); //++++++++++++++++++++++++++++++++++++++ // 分频部分开始 //++++++++++++++++++++++++++++++++++++++ reg [19:0] cnt; // 计数子 always @ (posedgeclk, negedgerst_n) if (!rst_n) cnt<= 0; else cnt<= cnt + 1'b1; wirekey_clk = cnt[19]; // (2^20/50M = 21)ms //-------------------------------------- // 分频部分结束 //-------------------------------------- //++++++++++++++++++++++++++++++++++++++ // 状态机部分开始 //++++++++++++++++++++++++++++++++++++++ // 状态数较少,独热码编码 parameter NO_KEY_PRESSED = 6'b000_001; // 没有按键按下parameter SCAN_COL0 = 6'b000_010; // 扫描第0列parameter SCAN_COL1 = 6'b000_100; // 扫描第1列parameter SCAN_COL2 = 6'b001_000; // 扫描第2列parameter SCAN_COL3 = 6'b010_000; // 扫描第3列parameter KEY_PRESSED = 6'b100_000; // 有按键按下 reg [5:0] current_state, next_state; // 现态、次态 always @ (posedgekey_clk, negedgerst_n) if (!rst_n) current_state<= NO_KEY_PRESSED; else current_state<= next_state;

比赛计分器课程设计

湖南工程学院 课程设计 课程名称微机原理与应用 课题名称比赛计分器设计 专业 班级 学号 姓名 指导教师 2011 年 5 月30 日

湖南工程学院 课程设计任务书 课程名称微机原理与应用 课题比赛计分器设计 专业班级 学生姓名 学号 指导老师 审批 任务书下达日期2011 年 5 月30 日任务完成日期2011 年 6 月9 日

设计内容与设计要求 设计内容: 设计一个甲,乙两队用的比赛计分器,要求实现以下功能: 1、给甲,乙两队分别设置1个加分按钮,按一下能分别实现加一分。 2、给甲,乙两队分别设置1个减分按钮,按一下能分别实现减一分。 3、设置一个清零按钮,按一下能实现清零 4、设置预置分按钮。 5、设置一个加减一分、两分和三分的切换按钮。 设计要求: 1、设计方案要合理、正确; 2、系统硬件设计及焊接制作; 3、系统软件设计及调试; 4、系统联调; 5、写出设计报告。

主要设计条件 1、MCS-51单片机实验操作台1台; 2、PC机及单片机调试软件; 3、单片机应用系统板1套; 4、制作工具1套; 5、系统设计所需的元器件。 说明书格式 1.封面 2.课程设计任务书 3.目录 4.系统总体方案设计 5.系统硬件设计 6.软件设计(包括流程图) 7.系统的安装调试说明 8、总结 9、参考文献 10、附录(源程序清单及硬件原理图等); 11、课程设计成绩评分表。

进度安排 设计时间为两周 第一周 星期一、上午:布置课题任务,讲课及课题介绍 下午:借阅有关资料,总体方案讨论 星期二、确定总体设计方案 星期三、硬件模块方案设计 星期四、软件模块方案设计 星期五、设计及调试 第二周 星期一、设计及调试 星期二、设计及调试 星期三、总调 星期四、写说明书 星期五、上午:写说明书,整理资料 下午:交设计资料,答辩 参考文献 [1]、《微型计算机原理及应用》许立梓编机械工业出版社 2002 [2]、《微型计算机接口技术及应用》刘乐善编华中理工大学出版社 2000 [3]、《计算机硬件技术基础试验教程》邹逢兴编高等教育出版社 2000 [4]、《16位微型计算机原理接口及其应用》周佩玲编中国科学技术大学出版社 2000 [5]、《微型计算机原理与接口技术》吴秀清编中国科学技术出版社 2001 [6]、《微型计算机接口技术》邓亚平编清华大学出版社 2001 [7]、《单片机原理及及应用》王迎旭编机械工业出版社 2001 [8]、《单片机应用程序设计技术》周航慈著北京航空航天大学出版社 2002 [9]、《单片机实用技术问答》谢宜仁主编人民邮电出版社 2002

按键消抖与时间按键

按键消抖与时间按键 这篇文章写给正在学51单片机的或者刚入门51单片机准备进阶的的朋友,我们来着重讨论一下按键消抖和时间按键这两项。 我们常用的按键大多都是机械的,机械开关就会出现机械振动,这个由物理学或者实验可以推出来,抖动会在单片机上面出现重复扫描次数,次数多少与单片机的时钟晶振有关,时钟晶振越高单片机执行速度越快,重复次数就越多 整个按键数百ms 按下瞬间,抖动时间大概10ms 弹起瞬间,抖动大概10ms 按键一次出现的电平变化 (上面的时间都是老师说的和书上现成的,没有实际测试,而且不同的按键应该也会有差异,作为学习研究确实不应该,找个时间锅锅会测出这个时间供大家参考,嘿嘿) 由图我们可以看出,按下去瞬间会出现抖动,弹起来也会出现抖动,明显是个阻尼振动,按键扫描程序是按顺序执行的; 首先提出三个问题大家思考一下 1.为什么要消除抖动 2.如何消抖 3.是不是按键都要消抖,不是的话,哪些需要消抖,哪些不需要消抖 4.消抖的时间是不是必须10ms 5.按键消抖的方式是不是一定像书上的那样,如何消抖更节省CPU,且更简单 按键如果不消除抖动,那么单片机检测到的低电平的次数就不止一次,那我们按键一次,单片机会检测到多次,比如我们把按某个按键设置按一次成某个变量加1,结果按一次就加了很多次,这样我们就不能精确的通过按键来调整我们想要的参数,所以我们消除抖动的目的就是要实现按一次按键让单片机读出一次按键操作 消抖分硬件和软件消抖, 硬件消抖有《模拟电子技术》上提到用三态门实现,当然还有周立功那个7920(管理数码管和按键的芯片),当然还有很多硬件电路以及一些按键有自带消抖电路,但是如果要做产

FPGA实验二:拨动开关的消抖电路的设计

实验报告 课程名称:_____FPGA实验______指导老师:__竺红卫/陈宏__成绩:__________________ 实验名称:____拨动开关的消抖电路的设计___实验类型:_FPGA实验_同组学生姓名:__ 一、实验目的和要求(必填) 1. 熟悉软件对于消抖的实现原理; 2. 熟悉实验板拨动开关的工作方法。 二、实验内容和原理(必填) 实验板具有4个滑动开关,当开关关上或上拉时,FPGA的管脚连接3.3V电源,即逻辑高电平。断开或下拉时,FPGA管脚接地,逻辑低电平。一般开关的机械闭合时间为2ms,这里没有使用活动的回弹线路,尽管这种线路可以很容易地加到FPGA上。 实验需要实现的功能是:当RESET为低电平,不论SW为低电平或高电平,LED保持全灭;当RESET 为高电平,LED全亮;当RESET保持高电平时,每次SW由高电平变为低电平,对应的LED状态改变,而当SW由低电平变为高电平,对应的LED状态保持不变。 对LED引脚输出高电平时,LED点亮,,反之LED灭。 三、主要仪器设备(必填) 1. 电脑一台; 2. 实验板一块,Xilinx Spartan-3E; 3. 实验板电源一只; 4. 实验板连接电脑的下载线一根。 四、操作方法和实验步骤

对于程序的各个步骤,如新建项目、新建Verilog HDL、新建.ucf文件、Synthesize、Implement Design、Generate Programming File、Configure Target Device等等,在实验一中已经展示过,每一次实验的基本操作步骤都是差不多的,故这里不再重复阐述。 本次实验共有5个源代码需要编写、运行并解释: 1)未加debounce电路的源代码; 2)加了debounce电路的源代码; 3)由未加debounce电路的源代码出发,只添加锁存器的源代码; 4)由未加debounce电路的源代码出发,只添加滤波器的源代码; 5)加了debounce电路,并且一个开关控制3个灯,向上拨动开关时灭,向下亮的源代码。 前四种情况的.ucf文件如下: NET "CLK" LOC="C9"; NET "led_d3" LOC="C11"; NET "led_d4" LOC="F11"; NET "led_d5" LOC="E11"; NET "RST_N" LOC="L13"; NET "sw1" LOC="L14"; NET "sw2" LOC="H18"; NET "sw3" LOC="N17"; 最后一种情况的.ucf文件如下: NET "CLK" LOC="C9"; NET "led_d3" LOC="C11"; NET "led_d4" LOC="F11"; NET "led_d5" LOC="E11"; NET "RST_N" LOC="L13"; NET "sw1" LOC="L14"; 对于最后一种情况,只使用sw1同时控制板上的LD2、LD3、LD4。 五、实验源代码、现象和解释 1)未加debounce电路 源代码: `timescale 1ns/1ns module sw_led(clk, rst_n, sw1, sw2, sw3, led_d3, led_d4, led_d5); input clk; input rst_n; input sw1,sw2,sw3; //低电平有效 output led_d3; output led_d4; output led_d5; reg d1,d2,d3; always @ (posedge clk or negedge rst_n) if ( !rst_n ) begin d1 <= 1'b0; d2 <= 1'b0; d3 <= 1'b0;

按键消抖的原理和基于fpga的消抖设计

按键消抖 1功能概述 按键开关是各种电子设备不可或缺的人机接口,如电脑的键盘等。实际应用中,按键开关通常为机械式弹性开关。当机械点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定接通,断开时也不会马上断开,在闭合和断开的瞬间均伴随有一连串的抖动。为保证系统及时正确识别,必须对这种情况作出相应处理。我们称之为按键消抖。 按键消抖可分为硬件消抖和软件消抖。硬件消抖的原理是在信号输入系统之前消除抖动干扰,在按键较少的情况下比较适宜。如果按键较多,则使用软件消抖。软件消抖的实质在于降低键盘输入端口的采样频率,将高频抖动略去。需要注意的是,软件消抖需要占据一定的系统资源。 尽管硬件消抖和软件消抖能实现按键消抖功能,串行处理的方式都存在一定的局限性,显得不那么完美。而硬件资源丰富的FPGA系统采用并行处理的模式,利用硬件来减轻软件工作量,通过硬件加速软件消抖处理,即可做到软件消抖并行化,因而在按键消抖处理方面具备非常明显的优势。 优秀的设计程序应该是用最简单的代码(架构、信号)实现功能。在本例中,我们的只需要用4个信号界定,并用很短的代码即可。下面我们先来看看功能要求: 在系统设计中,消除按键抖动的方法五花八门,无论是硬件电路和软件设计都十分成熟。在本项目中,我们将用Verilog语言给出具体实现过程,设计一个程序来检查键值,有效滤除按键抖动区间20 ms的毛刺脉冲。 2 设计思路 一般按键所用开关为机械弹性开关,由于机械触点的弹性作用,每个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动,如下图。抖动时间的长短由按键的机械特性决定,一般为5 ms~10 ms。 1

单片机课程设计-触控调光灯

绪论 随着经济发展的加快,科学技术的进步,人们生活水平得到了提高,设备逐渐完善。台灯是生活中的伴侣,我们是不喜欢与强烈的光线打交道的,因为强光对人身体是有害的,为了大家能健康地生活与工作,设计师也想出了一个较为完美的构思,就是台灯的出现,它的出现让很多朋友们得到了满意的效果,但是生活中没有完美的东西,台灯亦不例外,这就需要我们的改进。例如,很多时候我们并不需要让台灯处于全亮状态,有时候我们只需要微弱的光照即可,过强的光线反而会对使用者造成不必要的干扰,而且这也是对电能的一大浪费。此外,关于开关的使用寿命,也是影响台灯的耐用性的另一个问题。 因此,本设计的指导思想就是让台灯更耐用、更好用且能够调节亮度,解决过高的亮度对使用者的干扰同时也是为了节能,以及解决普通机械开关易损坏的问题。对于触模式台灯,手一触到台灯的感应部位灯就会自动亮,如果多触摸几下,台灯就会达到最亮的极限,这样就可以调节了台灯的亮度也避免了开关易坏导致的调节亮度易失灵的问题。本文介绍了触摸式台灯调光电路的设计及工作过程。本设计目的是通过设计工作熟悉触摸式调光灯电路基本构成与基本工作原理,并能将这些技术应用实际系统设计,提高自己对电路知识的认识。

一、系统工作原理 本设计采用STC公司的12系列单片机为控制芯片,配合外围电路进行对触摸按键的检测及对台灯亮度和开关的控制,利用单片机产生不同占空比的PWM方波实现对灯光的亮暗控制。此外,本设计的触控功能的实现则是利用单片机的I/O口的开漏模式且未加上拉电阻,在此模式下I/O更容易接受外界微弱的电平,更容易受到手指的干扰。 本设计中,在被设置成开漏的I/O口要在单片机读该口前将其置1,使其成为高阻状态,当I/O接口被设置到高阻输入状态时,I/O接口就是纯电平输入状态,在接口悬空时为低电平,当有手指触摸到I/O接口时,手指上的微弱电流会使I/O 接口跳变到高电平,只要读出I/O接口的电平高低就可以了解是否有触摸操作,然后加一段按键去抖程序后去调整与PWM占空比相关的数值,从而实现灯光亮度的连续可调。 二、系统硬件组成 本设计中所采用的芯片有STC公司的小型封装插件式单片机STC12C2052AD、AMS1117 5.0降压稳压IC、以及若干二极管、三极管,电阻电容等元器件。 其中: 2.1 控制部分 STC12C2052AD单片机的引脚位置与用途如图2-1所示: 图2-1 STC12C2050AD引脚图

按键开关消抖程序

按键开关消抖程序 实践中,单片机端口在连接开关器件时都要考虑消抖的问题,或在硬件上 增加延迟,或是增加软件延迟查询的功能模块。这里,我们考虑这样一个检测 电路:单片机连接一个开关和两个LED。程序是这样的,如果开关的消抖正确, 就点亮LED1,否则就闪亮LED2。按下开关,点亮LED1,释放开关,LED1 即熄灭。我们加入20 毫秒的消抖延迟时间。当检测到开关为低电平时,单片 机在延迟20 毫秒后再次检测开关的状态。如果此时开关状态为高,则LED2 就闪亮,如为低则点亮LED1。源代码: led1bitP2.0led2bitP2.1switch1bitP1.0ORG 0000hsetb switch1//initialize switch 1 as inputsetb led1//Turn OFF LED1setb led2//Turn OFF LED2 wait:jb switch1,wait// Wait till switch1 has been pressedcall debounce_delayjb switch1,c1_wait//switch low even after debouncing period//switch has been succesfully debouncedclr led1//Turn ON LED1jnb switch1,$//wait till switch has been releasedsetb led1//Turn OFF LED1ajmp wait c1_wait://Switch PIN high after debounce period so error in debouncingcpl led2ajmp wait debounce_delay://Subroutine for generating 20ms delaymov r7,#245l1_debounce_delay:mov r6,#40djnz r6,$djnz r7,l1_debounce_delayret END tips:感谢大家的阅读,本文由我司收集整编。仅供参阅!

扫描式矩阵键盘课程设计

扫描式矩阵键盘课程设 计 Company number【1089WT-1898YT-1W8CB-9UUT-92108】

4X4扫描式矩阵键盘课程设计课程设计名称: 4_4扫描式矩阵键盘设计 姓名: DUKE 班级:电子1008班 学号: 10086 成绩: 日期: 2014年1月6日 摘要 随着21世纪的到来,电子信息行业将是人类社会的高科技行业之一,式设施现代化的基础,也是人类通往科技巅峰的直通路。电子行业的发展从长远来看很重要,但最主要的还是科技问题。 矩阵式键盘提高效率进行按键操作管理有效方法,它可以提高系统准确性,有利于资源的节约,降低对操作者本身素质的要求。是它能准时、实时、高效地显示按键信息,以提高工作效率和资源利用率。 矩阵式键盘乃是当今使用最为广泛的键盘模式,该系统以N个端口连接控制N*N个按键,显示在LED数码管上。单片机控制依据这是键盘显示系统,该系统可以对不同的按键进行实时显示,其核心是单片机和键盘矩阵电路部分,主要对按键与显示电路的关系、矩阵式技术及设备系统的硬件、软件等各个部分进行实现。 4*4矩阵式键盘采用AT89C51单片机为核心,主要由矩阵式键盘电路、译码电路、显示电路等组成,软件选用C语言编程。单片机将检测到的按键信号

转换成数字量,显示于LED显示器上。该系统灵活性强,易于操作,可靠性高,将会有更广阔的开发前景。 目录 第一章:系统功能要求-------------------------------------------------------- 1.1 4*4 矩阵式键盘系统概述------------------------------------------------ 1.2 本设计任务和主要内容--------------------------------------------------- 第二章:方案论证--------------------------------------------------------------- 第三章:系统硬件电路的设计------------------------------------------------ 3.1 单片机控制系统原理----------------------------------------------------- 3.2 原理图绘制说明---------------------------------------------------------- 3.3 画出流程图---------------------------------------------------------------- 3.4 原理图绘制---------------------------------------------------------------

按键消抖

一、按键消抖 1.1 计数器型消抖电路(一) 计数器型消抖电路(一)是设置一个模值为(N+1)的控制计数器,clk在上升沿时,如果按键开关key_in='1',计数器加1,key_in='0' 时,计数器清零。当计数器值为2时,key_out 输出才为1,其他值为0时。计数器值为N时处于保持状态。因此按键key_in持续时间大于N个clk时钟周期时,计数器输出一个单脉冲,否则没有脉冲输出。如果按键开关抖动产生的毛刺宽度小于N个时钟周期,因而毛刺作用不可能使计数器有输出,防抖动目的得以实现。clk的时钟周期与N的值可以根据按键抖动时间由设计者自行设定。 主要程序结构如下: 图1是N为3的波形仿真图,当按键持续时间大于3个时钟周期,计数器输出一个单脉冲,其宽度为1个时钟周期,小于3个时钟周期的窄脉冲用作模拟抖动干扰,从图1可以看出,抖动不能干扰正常的单脉冲输出。 1 按键抖动产生原因分析 绝大多数按键都是机械式开关结构,由于机械式开关的核心部件为弹性金属簧片,因而在开关切换的瞬间会在接触点出现来回弹跳的现象。虽然只是进行了一次按键,结果在按键信号稳定的前后出现了多个脉冲,如图1所示。如果将这样的信号直接送给微处理器扫描采集的话,将可能把按键稳定前后出现的脉冲信号当作按键信号,这就出现人为的一次按键但微处理器以为多次按键现象。为了确保按键识别的准确

性,在按键信号抖动的情况下不能进入状态输入,为此就必须对按键进行消抖处理,消除抖动时不稳定、随机的电压信号。机械式按键的抖动次数、抖动时间、抖动波形都是随机的。不同类型的按键其最长抖动时间也有差别,抖动时间的长短和按键的机械特性有关,一般为5~10 ms,但是,有些按键的抖动时间可达到20 ms,甚至更长。所以,在具体设计中要具体分析,根据实际情况来调整设计。 2 按键消抖电路的设计 按键消抖一般采用硬件和软件消抖两种方法。硬件消抖是利用电路滤波的原理实现,软件消抖是通过按键延时来实现。在微机系统中一般都采用软件延时的消抖方法。在用可编程逻辑器件FPGA/CPLD设计数字系统中,也可以用VHDL语言设计相应的时序和逻辑电路,对按键信号进行处理,同样可以达到消抖目的。本文利用Altera公司的可编程逻辑器件CPLD和QuartusⅡ,设计性能可靠的按键消抖电路。 2.1 按键消抖电路设计原理 按键消抖的关键是提取稳定的低电平(或高电平)状态,滤除按键稳定前后的抖动脉冲。在用基于VHDL 语言的时序逻辑电路设计按键消抖电路时,可以用一个时钟脉冲信号对按键状态进行取样,当第一次采样到低电平时,启动延时电路,延时结束后,再对按键信号进行连续三次取样,如果三次取样都为低电平,则可以认为按键已经处在稳定状态,这时输出一个低电平的按键确认信号,如果连续三次的取样中,至少有一次是高电平,则认为按键仍处在抖动状态,此时不进行按键确认,按键输出信号为高电平。 2.2 按键消抖电路设计 该控制电路采用VHDL语言的有限状态机的设计方法来描述和实现,其状态转换图如图2所示。

按键消抖实验

基于verilog按键消抖设计 Aaron malone 关于键盘的基础知识,我就以下面的一点资料带过,因为这个实在是再基础不过的东西了。然后我引两篇我自己的博文,都是关于按键消抖的,代码也正是同目录下project里的。这两篇博文都是ednchina的博客精华,并且在其blog 首页置顶多日,我想对大家会很有帮助的。 键盘的分类 键盘分编码键盘和非编码键盘。键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如计算机键盘。而靠软件编程来识别的称为非编码键盘。 在单片机组成的各种系统中,用的最多的是非编码键盘。也有用到编码键盘的。非编码键盘有分为:独立键盘和行列式(又称为矩阵式)键盘。 按键在闭合和断开时,触点会存在抖动现象:

从上面的图形我们知道,在按键按下或者是释放的时候都会出现一个不稳定的抖动时间的,那么如果不处理好这个抖动时间,我们就无法处理好按键编码,所以如何才能有效的消除按键抖动呢?让下面的两篇博文日志给你答案吧。 经典的verilog键盘扫描程序 从最基础的分频程序开始,但看到这个键盘扫描程序后,直呼经典,有相见恨晚的感觉,还想说一句:威百仕( VibesIC ),我很看好你!WHY?待我慢慢道来,这个程序的综合后是0error,0warning。想想自己编码的时候那个warning是满天飞,现在才明白HDL设计有那么讲究了,代码所设计的不仅仅是简单的逻辑以及时序的关系,更重要的是你要在代码中不仅要表现出每一个寄存器,甚至每一个走线。想想我写过的代码,只注意到了前者,从没有注意过后者,还洋洋自得以为自己也算是个高手了,现在想来,实在惭愧啊!学习学习在学习,这也重新激发了我对HDL设计的激情,威百仕给了我一个方向,那我可要开始努力喽! 废话说了一大堆,看程序吧:(本代码经过ise7.1i综合并下载到SP306板上验证通过)

课程设计——拔河游戏机

课程设计任务书 题目拔河游戏控制电路 专业学号姓名 主要内容、基本要求、主要参考资料等: 主要内容 * 1.阅读相关科技文献。 2.学习protel软件的使用。 3.学会整理和总结设计文档报告。 4.学习如何查找器件手册及相关参数。 技术要求 1.< 2.要求电路使用9个发光二极管显示拔河过程,开机后只有中间一个发光二极管发光,即为拔河 中心; 3.游戏双方各持一个按钮,按钮每按下一次,亮点向本方移动一次,拔河过程中有且只有一个发 光二极管发光; 4.亮点移动到任意一段的终端二极管时,此方获胜,并且此时双方按钮均无作用,输出状态保持, 复位后亮点回到中心点。 主要参考资料 1.何小艇,电子系统设计,浙江大学出版社,2001年6月; ( 2.姚福安,电子电路设计与实践,山东科学技术出版社,2001年10月; 3.王澄非,电路与数字逻辑设计实践,东南大学出版社,1999年10月;

4.李银华,电子线路设计指导,北京航空航天大学出版社,2005年6月;5.康华光,电子技术基础,高教出版社,2003。 } 完成期限: 2011年6月28日 指导教师签章: 专业负责人签章: 2011年6月27日

摘要 》 本课题的主要任务是让拔河游戏控制电路的电平指示灯由中点向己方延伸,而阻止其向对方延伸。可以设想用可预置的加/减计数器作主要器件,用计数器的输出状态通过译码器控制电平指示灯的显示状态。如当计数器进行加法计数时,发亮的电平指示灯向甲方延伸,相反,进行减法计数时,发亮的电平指示灯向相反方向延伸。当延伸到一方的终点就就把电路锁定,此时双方按键均无作用,只有裁判员按了复位按键双方才能继续下一盘的比赛。 此电路可分为脉冲发生器电路和计数/译码器电路两大部分。脉冲发生器电路部分采用两个与非门组成的基本RS触发器构成的去抖电路以及有与门、与非门构成的整形电路,可以将按钮A、B产生的脉冲整形成占空比较高的信号。计数器电路部分以74LS/HC193为主体,译码器采用由集成芯片74HC138扩展的4线-16线译码器。芯片74LS/HC193根据UP端和DOWN端的状态来判断进行加计数还是减计数,然后将计数结果输出到由74HC138构成的译码器,译码器将结果输出到发光二极管。由于74HC138输出端为低电平,所以当双方终端二极管对应的输出端有一个为低时即表示游戏结束,双方按键失效。此功能实现可将74LS193的输出置数至输入端,使译码器的输出保持,将双方的端二极管对应的输出进行与运算,如果有一个为低则输出为低,再接低电平有效的置数端,实现游戏结束时按键无作用。 关键字:去抖电路 74LS138 反馈置数 &

Verilog写的按键消抖程序

前几天看了特权同学用Verilog写的按键消抖程序,感觉很经典。在这里将程序贴出来分享一下。 module lcd_button2(clk,rst,seg,wei,sw1,sw2,sw3,sw4);//按键按下,数码管依次显示0-9 input clk; input rst; input sw1,sw2,sw3,sw4; output [3:0] wei; output[7:0] seg; reg [7:0] seg; reg [3:0] wei; integer num; initial begin num = 0; end reg[3:0] key_rst; always @(posedge clk or negedge rst) if(!rst) key_rst <= 4'b1111; else key_rst <= {sw4,sw3,sw2,sw1}; reg[3:0] key_rst_r; always @(posedge clk or negedge rst) if(!rst) key_rst_r <= 4'b111; else key_rst_r <= key_rst; wire[3:0] key_an = key_rst_r & (~key_rst); reg[19:0] cnt; always @(posedge clk or negedge rst) if(!rst) cnt <= 0; else if(key_an) cnt <= 0; else cnt <= cnt+1'b1; reg [3:0] low_sw; always @(posedge clk or negedge rst)

课程设计-制作单片机的4X4矩阵键盘

课程设计-制作单片机的4X4矩阵键盘

目录 摘要.............................................. 错误!未定义书签。第一章硬件部分 (5) 第一节AT89C51 (5) 第二节4*4矩阵式键盘 (8) 第三节LED数码管 (11) 第四节硬件电路连接 (13) 第二章软件部分 (15) 第一节所用软件简介 (15) 第二节程序流程图 (18) 第三节程序 (20) 第三章仿真结果 (23) 心得体会 (26) 参考文献 (27)

第一章硬件部分 第一节AT89C51 AT89C51是一种带4K字节FLASH存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。引脚如图所示 AT89C5 图1 AT89C51管脚 图 AT89C51其具有以下特性: 与MCS-51 兼容 4K字节可编程FLASH存储器 寿命:1000写/擦循环 数据保留时间:10年

全静态工作:0Hz-24MHz 三级程序存储器锁定 128×8位内部RAM 32可编程I/O线 两个16位定时器/计数器 5个中断源 可编程串行通道 低功耗的闲置和掉电模式 片内振荡器和时钟电路 特性概述: AT89C51 提供以下标准功能:4k 字节Flash 闪速存储器,128字节内部RAM,32 个I/O 接口,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。同时,AT89C51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。 管脚说明: VCC:供电电压。 GND:接地。 P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P0口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的低八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须接上拉电阻。 P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为低八位地址接收。

使用硬件方式对按键进行消抖处理

按键电路:常用的非编码键盘,每个键都是一个常开开关电路。 按键消抖: 通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,电压信号小型如下图。由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动,如下图。抖动时间的长短由按键的机械特性决定,一般为5ms~10ms。这是一个很重要的时间参数,在很多场合都要用到。 按键稳定闭合时间的长短则是由操作人员的按键动作决定的,一般为零点几秒至数秒。键抖动会引起一次按键被误读多次。为确保CPU对键的一次闭合仅作一次处理,必须去除键抖

动。在键闭合稳定时读取键的状态,并且必须判别到键释放稳定后再作处理。按键的抖动,可用硬件或软件两种方法。 <1> 硬件消抖:在键数较少时可用硬件方法消除键抖动。下图所示的RS触发器为常用的硬件去抖。 图中两个“与非”门构成一个RS触发器。当按键未按下时,输出为1;当键按下时,输出为0。此时即使用按键的机械性能,使按键因弹性抖动而产生瞬时断开(抖动跳开B),中要按键不返回原始状态A,双稳态电路的状态不改变,输出保持为0,不会产生抖动的波形。也就是说,即使B 点的电压波形是抖动的,但经双稳态电路之后,其输出为正规的矩形波。这一点通过分析RS触发器的工作过程很容易得到验证。 <2> 软件消抖:如果按键较多,常用软件方法去抖,即检测出键闭合后执行一个延时程序,产生5ms~10ms的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。当检测到按键释放后,也要给5ms~10ms的延时,待后沿抖动消失后才能转入该键的处理程序。按键消抖

消抖电路原理及实现

实 验 报 告 实验日期: 学 号: 姓 名: 实验名称: 消抖电路 总 分: 一、实验概述 运用LPM 原件定制DFF 触发器,并调用LPM 定制的DFF 触发器,用VHDL 语言的元件例化实现消抖电路并了解其工作原理。 二、实验原理 1、触发器原理 触发器是一种可存储1位二进制码的逻辑电路,是构成各种时序电路的最基本逻辑单元。触发器有一对互补输出端,输出状态不仅与当前输入有关,还与前一输出状态有关。触发器有两个稳定状态,在一定的外界信号作用下会发生状态翻转。 2、消抖电路原理 脉冲按键与电平按键通常采用机械式开关结构,其核心部件为弹性金属簧片。按键信号在开关拨片与触电接触后经多次弹跳才会稳定,而在按键过程中,可能出现了多个脉冲。因此需要根据实际情况进行按键消抖处理以提取稳定脉冲,在按键过程中提取稳定的电平状态,通过对抖动脉冲多次检测信号按键电平值,并提取一前一后两个信号按键电平值来进行比较,以此来获取开关状态。输出一个周期的脉冲时,要求前一次检测到的电平信号为低电平,后一次检测到的电平信号为高电平时。 3、结构图: 三、实验设计 时钟信号 元件记忆当前的按键信号电平 元件记忆上一次按键信号电平 两次按键的电平进行比较 脉冲信号

1、LPM元件定制DFF触发器 (1)设置lpm_ff元件选择Installed Plug-Ins→Storage→lpm_ff项。 (2)LPM元件定制步骤,设置输入data为1位,clock为时钟信号,类型为D 型。 (3)添加异步清零和异步置1。 (4)aclr异步清零且高电平有效,aset异步置1且高电平有效,二者无效时,q输出由clock上升沿触发更新为data。 (5)调出其vhd文件添加至消抖电路的工程中。 (6)仿真验证并下载。 功能仿真波形分析 参数:end time 为2.0ns,grid size为100ns; 信号:alcr 异步清零且高电平有效,二进制; aset异步置1且高电平有效,二进制; 二者无效,q(二进制)输出由clock(二进制)上升沿触发更新为 data(二进制)。 aclr输入无效,aset 输入有效,q输出1 aclr和aset均无效,q输出1;clock上升时,触发更新为data,q输出0 aclr和 aset均无 效,q输 出1; clock上 升时,触 发更新 为data, q输出1; aclr异步 清零,q 输出0 aclr有 效,aset 无效,清 零得q输 出0;aclr 和aset 均无效, q输出0; clock上 升时,触 发更新 为data, q输出0;

FPGA学习按键消抖实验Verilog代码

module sw_de(clk,rst_n,sw1_n,sw2_n,sw3_n,led_d1,led_d2,led_d3); input clk; //主时钟信号 50MHz input rst_n; //复位信号 低有效 input sw1_n,sw2_n,sw3_n;//三个独立按键 低表示按下 output led_d1,led_d2,led_d3;//发光二级管,分别由按键控制 //------------------------------------------------------ reg[2:0] key_rst; always @ (posedge clk or negedge rst_n) if(!rst_n) key_rst<=3'b111; else key_rst <= {sw3_n ,sw2_n ,sw1_n}; reg[2:0] key_rst_r;//每个时钟周期的上升沿将low_sw信号锁存到low_sw_r中 always @ (posedge clk or negedge rst_n) if(!rst_n) key_rst_r<=3'b111; else key_rst_r<=key_rst; //当寄存器key_rst由1变为0时,led_an的值变为高,维持一个时钟周期 wire[2:0]key_an=key_rst_r&(~key_rst); //----------------------------------------------------- reg[19:0] cnt;//计数寄存器 always @ (posedge clk or negedge rst_n)/*always块clk时钟的上升沿和rst_n复位信号的下降沿触发执行*/ if (!rst_n) cnt<=20'd0; else if (key_an) cnt<=20'd0; else cnt<=cnt+1'b1; reg[2:0] low_sw;

VHDL入门:关于按键消抖的那个process

这学期的EDA课程设计有涉及到一个按键信号稳定的问题,虽然就算没有这块处理,最后成绩只会扣3分,但自己觉得像LED亮度变化,数字钟设置这些功能,如果没有加进一个稳定按键信号的模块,根本不能算是已实现的功能。按键消抖的程序在网上有几种可供选择,但这里只讨论一种,本人觉得简单得来又比较强大的一种。 其实消抖的原理就是把一个按键周期内所输入的所有有效信号,包括那些毛刺,处理成一个脉冲输入。能达到这点,就可以实现消抖功能了。 功能的源代码: 代码中的 key 是按键输入,count 是自定义的计数器,N的值可以根据需要结合时钟频率设置,如果只是想达到按键一次输入一个脉冲的效果,建议 count 的时长设为 5ms,key_en 是处理完后输出的单个脉冲,至于有效信号是 '0' 还是'1' ,这要看板上的电路设计了。此代码中是 '0' 为有效信号。 不要怀疑这段代码有错,理清逻辑后再套用,如果弄不明白什么原理,建议还是别用,用了可能会更糟糕。要注意的是一个 process 中只能有一个时钟信号,否则很容易出错,就算编译通过,实际操作还是不行。所以如果要对多个按键消抖,一定要在 "if clk'event and clk='1' then" 语句的内部增加,别重新设置一个 clk'event 。还有就是按键的消抖功能块最好用单独的 process 运行,将 key_en 设置成新的按键输入信号,而实际的输入信号 key 只在按键消抖的process 中读入。 之所以说这种消抖方法简单得来又比较强大,是因为这方法不需要用到什么状态机、component 之类较高级点的东西,只需要多个 process 即可;另外这种方法还有其他的拓展用途,比如可以利用这个 count 延时周期设置一个短按键和长按键的识别,实现长按此键切换或者 reset 等等的功能,这里不详细解释。这种拓展的用途是用 D触发器消抖的方式没办法实现的(其实是我还没想到,难讲有高手可以实现)。 这篇小日志是个人学习成长的一个记录见证,也希望它能给那些刚开始学习VHDL的同学们一点帮助。不想每个初学者都像我这样要用一天只睡两个钟的代

实验05按键消抖

实验五按键消抖 一. 实验目的 1. 掌握QuartusII的硬件描述语言设计方法 2. 了解同步计数器的原理及应用 3. 设计一个带使能输入、进位输出及同步清零的增1四位N (N<16)进制同步计数器 二. 准备知识 在按键使用的过程中,常常遇到按键抖动的问题,开关在闭合(断开)的瞬间,不能一接触就一直保持导通(断开),因为开关的机械特性,重要经历接触-断开-再接触-再断开,最终稳定在接触位置,这就是开关的抖动,即虽然只是按下按键一次然后放掉,结果在按键信号稳定前后,竟出现了一些不该存在的噪声,这样就会引起电路的误动作。在很多应用按键的场合,要求具有消抖措施。按键抖动与开关的机械特性有关,其抖动期一般为5-10ms。 键按下 键稳定 前沿抖动后沿抖动 图5.1 按键电平抖动示意图 按键的消除抖动分为硬件消除抖动和软件消除抖动。硬件消除抖动一般采用滤波的方法,通常在按键两端并联一个1~10u左右的电容,有时这样也不能完全消除按键的抖动。软件消除抖动的方法有多种,常用的是延时扫描和定时器扫描。延时扫描其原理为:检测到按键操作后延时一端时间(如10ms)后,再检测是否为仍然为同样的按键操作状态,如果相同,就认为是进行了按键操作,然后对该操作进行相应的处理。定时器扫描的原理是:每隔一端时间(几毫秒)扫描一次键盘,如果连续两次(或3次)的所获得的按键状态相同,就输出按键状态,然后再对这种按键状态进行处理,这里的扫描时间间隔和连续判断按键状态的次数是有关系的,一般总时间要大于按键的抖动期。如果总时间太长,则感觉按键迟钝,太短可能不能完全消除抖动,要根据实际的情况合适的选择。 在实际电路设计中,经常采用的是软硬件相结合对按键进行消除抖动的处理方法。 本实验采用的方法:实验箱按键的硬件电路是共阳极电路,按下按键时输出到FPGA管脚的电平为低电平,松开按键时为高电平。我们采用5ms的定时器扫描FPGA管脚电平,如果连续3次为低电平时,存储连续按键状态的次数CNT的值加1,直到该计数值等于10(或再大一些),就不再累加(防止长按该值溢出而重新计数),此时认为按键已稳定,输出按键操作标志;在该过程中,一旦FPGA管脚电平为低电平就对CNT复位清零并同时对按键操作标志位复位,即一个异步复位。 本实验采用的方法:实验箱按键的硬件电路是共阳极电路,按下按键时输出到FPGA管脚的电平为低电平,松开按键时为高电平。我们采用5ms的定时器扫描采样FPGA管脚电平,如果连续3次为低电平时,可以认为此时按键已稳定,输出一个低电平按键信号;继续采样的过程中如果不能满足连续3次采样为低,则认为键稳定状态结束,这时输出变为高电平(连线3次采用信号相“或”),

相关主题
文本预览
相关文档 最新文档