EE_FPGA基础教程系列 -- 按键消抖
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;elsecnt<= 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;elsecurrent_state<= next_state;// 根据条件转移状态always @ *case (current_state)NO_KEY_PRESSED : // 没有按键按下if (row != 4'hF)next_state = SCAN_COL0;elsenext_state = NO_KEY_PRESSED;SCAN_COL0 : // 扫描第0列if (row != 4'hF)next_state = KEY_PRESSED;elsenext_state = SCAN_COL1;SCAN_COL1 : // 扫描第1列if (row != 4'hF)next_state = KEY_PRESSED;elsenext_state = SCAN_COL2;SCAN_COL2 : // 扫描第2列if (row != 4'hF)next_state = KEY_PRESSED;elsenext_state = SCAN_COL3;SCAN_COL3 : // 扫描第3列if (row != 4'hF)next_state = KEY_PRESSED;elsenext_state = NO_KEY_PRESSED;KEY_PRESSED : // 有按键按下if (row != 4'hF)next_state = KEY_PRESSED;elsenext_state = NO_KEY_PRESSED;endcaseregkey_pressed_flag; // 键盘按下标志reg [3:0] col_val, row_val; // 列值、行值// 根据次态,给相应寄存器赋值always @ (posedgekey_clk, negedgerst_n)if (!rst_n)begincol<= 4'h0;key_pressed_flag<= 0;endelsecase (next_state)NO_KEY_PRESSED : // 没有按键按下begincol<= 4'h0;key_pressed_flag<= 0; // 清键盘按下标志endSCAN_COL0 : // 扫描第0列col<= 4'b1110;SCAN_COL1 : // 扫描第1列col<= 4'b1101;SCAN_COL2 : // 扫描第2列col<= 4'b1011;SCAN_COL3 : // 扫描第3列col<= 4'b0111;KEY_PRESSED : // 有按键按下begincol_val<= col; // 锁存列值row_val<= row; // 锁存行值key_pressed_flag<= 1; // 置键盘按下标志endendcase//--------------------------------------// 状态机部分结束//--------------------------------------//++++++++++++++++++++++++++++++++++++++// 扫描行列值部分开始//++++++++++++++++++++++++++++++++++++++always @ (posedgekey_clk, negedgerst_n)if (!rst_n)key_val<= 4'h0;elseif (key_pressed_flag)case ({col_val, row_val})8'b1110_1110 :key_val<= 8'h01;8'b1110_1101 :key_val<= 8'h02;8'b1110_1011 :key_val<= 8'h03;8'b1110_0111 :key_val<= 8'h04;8'b1101_1110 :key_val<= 8'h05;8'b1101_1101 :key_val<= 8'h06;8'b1101_1011 :key_val<= 8'h07;8'b1101_0111 :key_val<= 8'h08;8'b1011_1110 :key_val<= 8'h09;8'b1011_1101 :key_val<= 8'h10;8'b1011_1011 :key_val<= 8'h11;8'b1011_0111 :key_val<= 8'h12;8'b0111_1110 :key_val<= 8'h13;8'b0111_1101 :key_val<= 8'h14;8'b0111_1011 :key_val<= 8'h15;8'b0111_0111 :key_val<= 8'h16; default: key_val=8'h00;endcaseendmodule。
fpgaVeriloghdl按键消抖部分程序讲解
fpgaVeriloghdl按键消抖部分程序讲解module debounce(clk_in,rst_in,key_in,key_pulse,key_state);input clk_in;//system clockinput rst_in;//system resetinput key_in;//button inputoutput key_pulse;//debounce pulse outoutput reg key_state;//debounce state outreg key_reg;//register key_rst,lock key_in to next clk//定义⼀个寄存器对输⼊信号进⾏锁存always @(posedge clk_in or negedge rst_in)beginif(!rst_in) key_reg<=1;else key_reg<=key_in;endwire key_an=(key_reg==key_in)?0:1;reg[18:0] cnt;/******* 计数器count the number of clk when a dege of key_in if occured*******/always @(posedge clk_in or negedge rst_in)beginif(!rst_in) cnt<=0;else if(key_an) cnt<=0;//由此可见当按键按下信号变化key_an变为1,计数cnt清零,然后重新计数,else cnt<=cnt+1; //由此可见这个程序是⼀直计数(相当于⼀直查询,key_an为1或者复位时cnt清零,重新计数)end/*******延时采样******/reg low_sw;//lock the status to register low_sw when cnt count to 19'd500000(即20ms)always @(posedge clk_in or negedge rst_in)beginif(!rst_in) low_sw<=1'b1;//直接写low_sw<=1;⼀样else if(cnt==500000) low_sw<=key_in;end/********下降沿检测********************/reg low_sw_reg;//register low_sw_reg,lock low_sw to next clkalways @(posedge clk_in or negedge rst_in)beginif(!rst_in) low_sw_reg<=1;else low_sw_reg<=low_sw;endwire key_pulse;//detect the negedge of low,generate pulseassign key_pulse=low_sw_reg&(~low_sw);/******脉冲状态输出*****/always @(posedge clk_in or negedge rst_in)beginif(!rst_in)key_state<=1;else if(key_pulse)key_state<=~key_state;else key_state<=key_state;endendmodule。
按键消抖的原理和基于fpga的消抖设计
按键消抖1功能概述按键开关是各种电子设备不可或缺的人机接口,如电脑的键盘等。
实际应用中,按键开关通常为机械式弹性开关。
当机械点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定接通,断开时也不会马上断开,在闭合和断开的瞬间均伴随有一连串的抖动。
为保证系统及时正确识别,必须对这种情况作出相应处理。
我们称之为按键消抖。
按键消抖可分为硬件消抖和软件消抖。
硬件消抖的原理是在信号输入系统之前消除抖动干扰,在按键较少的情况下比较适宜。
如果按键较多,则使用软件消抖。
软件消抖的实质在于降低键盘输入端口的采样频率,将高频抖动略去。
需要注意的是,软件消抖需要占据一定的系统资源。
尽管硬件消抖和软件消抖能实现按键消抖功能,串行处理的方式都存在一定的局限性,显得不那么完美。
而硬件资源丰富的FPGA系统采用并行处理的模式,利用硬件来减轻软件工作量,通过硬件加速软件消抖处理,即可做到软件消抖并行化,因而在按键消抖处理方面具备非常明显的优势。
优秀的设计程序应该是用最简单的代码(架构、信号)实现功能。
在本例中,我们的只需要用4个信号界定,并用很短的代码即可。
下面我们先来看看功能要求:在系统设计中,消除按键抖动的方法五花八门,无论是硬件电路和软件设计都十分成熟。
在本项目中,我们将用Verilog语言给出具体实现过程,设计一个程序来检查键值,有效滤除按键抖动区间20 ms的毛刺脉冲。
2 设计思路一般按键所用开关为机械弹性开关,由于机械触点的弹性作用,每个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。
因而在闭合及断开的瞬间均伴随有一连串的抖动,如下图。
抖动时间的长短由按键的机械特性决定,一般为5 ms~10 ms。
1图1 按键抖动过程示意当系统检测出按键闭合后,执行一个延时程序,产生5ms~10ms的延时;前沿抖动消失后,再一次检测键的状态;如果仍保持闭合状态电平,则确认为真正有键按下。
当检测到按键释放后,也要给5ms~10ms的延时,待后沿抖动消失后才能转入该键的处理程序。
fpga消抖模块的作用
fpga消抖模块的作用
在电子设备中,按键是常见的输入设备,用于接收用户操作指令。
然而,按键的机械特性使得它们在按下和释放时容易产生抖动,即按键状态的不稳定。
这种抖动现象会对后续的处理带来困扰,因为它可能会导致设备对单次按键行为产生误判,认为是一次或多次的按键动作。
为了解决这一问题,FPGA(现场可编程门阵列)中的消抖模块应运而生。
FPGA消抖模块的主要作用是消除按键抖动。
当按键被按下或释放时,由于机械触点的弹性作用,可能会产生一连串的抖动。
这些抖动可能非常短暂,一般都在10ms以内,但对于系统来说,却可能导致误判。
为了确保系统能够正确识别按键的开关状态,FPGA消抖模块通过特定的算法和逻辑处理,对按键的通断状态进行检测和过滤,消除这些短暂的抖动,从而确保按键状态识别的准确性。
在FPGA中实现消抖功能可以有多种方式。
其中一种是采用硬件消抖的方式,即在FPGA上配置相应的硬件电路来直接处理按键信号。
另一种方式是通过软件算法来实现消抖功能。
无论采用哪种方式,其核心目的都是确保系统能够准确识别
按键状态,避免因按键抖动而产生的误操作。
FPGA消抖模块的作用是消除按键在按下和释放过程中产生的抖动,确保系统能够准确识别按键状态,从而提高设备的可靠性和用户体验。
【豆丁-精品】-基于FPGA的按键消抖动设计
2009年11月吉林师范大学学报(自然科学版)№.4第4期Journal of Jilin Normal University (Natural Science Edition )Nov.2009收稿日期:2009209222 基金项目:吉林省信息产业厅专项发展基金项目(2007042)作者简介:许德成(19772),男,吉林省辽源市人,现为吉林师范大学信息技术学院讲师,硕士.研究方向:基础电子技术,单片机及可编程逻辑器件技术.基于FPG A 的按键消抖动设计许德成(吉林师范大学信息技术学院,吉林四平136000)摘 要:在研制测量仪表、电子仪器及电子设计的过程中,按键是常用器件,而按键的弹跳现象是数字系统设计中存在的客观问题.这就要求电路具有消抖措施,即对于由于机械弹跳产生的噪声信号经过消抖电路滤除,保证电路能够正确的响应.本文介绍了基于FPG A 的两种消除按键抖动的方法,并给出了相应的VH D L 代码以及仿真图形,从而解决了按键的机械抖动影响,保证电路稳定工作.关键词:机械抖动;仿真图形;电路中图分类号:T N912 文献标识码:A 文章编号:1674238732(2009)04201542030 引言我们通常所用的按键都为机械触点开关.由于机械触点存在弹性作用,当我们按下按键或松开按键时,都不可避免的要在触点闭合及断开的瞬间产生有一连串的键抖动.其按键信号的实际波形如图1所示.图1 按键信号的实际波形 由图1可见,在按键闭合和断开时产生了多个边沿.而在实际中每按一次键,我们只需要一组稳定的上升或下降边沿.所以对于电路中的按键信号,如果我们不滤除抖动的话,还是简单的读取信号的边沿,会引起一次按键被误读多次.这样就会引起电路的误动作.为了保证按一次键电路只有一次正确的响应,即在键闭合稳定时读取键的状态,就要求电路中必须采取滤除抖动的措施.消除案件抖动的方法一般有硬件和软件两种方式.对于硬件方式一般可用RS 触发器作为常用的消抖电路,从根本上解决按键抖动问题.但对于按键较多且从节省硬件资源和易于修改的角度考虑,我们常应用软件滤抖.1 基于计数器模式消抖电路的设计方法应用计数器实现,即采用延时的方法.先正确设定计数的时钟脉冲.当判断到按键按下时计数器开始计数,等计数器计满后再一次判断键的状态.如果仍为按下状态,则认为是按键稳定闭合.这时再针对具体按键信号做相应的处理,否则认为是抖动信号,电路不做任何处理.应用这种方法消除按键抖动,其计数器模值的确定和计数时钟的频率是按键抖动消除的关键问题,因为它们共同决定了延时的时间.如果延时时间过长,就会使正确的按键信号得不到处理;如果延时时间过短,则会将抖动误认为是输入信号,从而导致后电路做出错误处理.一般人按键的时间大于100ms ,抖动时间一般·451·为5ms ~10ms.按这种常规处理,我们一般认为接收到的按键信号持续时间如果小于40ms 则其为抖动信号,如果时间大于40ms 则为正确的按键信号.即让计数器的模值和计数时钟周期的乘积略大于40ms 即可.这样就可以把按下的时间小于40ms 的抖动信号滤掉.其VH D L 代码为:library ieee ;use ieee.std -logic -1164.all ;entity anjian is port (clk ,input :in std -logic ;output :out std -logic );end anjian ;architecture one of anjian is signal a :std -logic ;signal count :integer range 0to 9;beginprocess (clk )beginif input =′0′then count <=0;elsif clk ’event and clk =′1′thenif count =9then count <=count ;else count <=count +1;end if ;end if ;if count =8then a <=′1′;else a <=′0′;end if ;end process ;output <=a ;end one; 由上仿真图可以看出:当信号维持时间小于八个计数时钟周期的时候,认为这时的信号是短时间的抖动信号,所以电路输出不做任何反应.保持原电平不变,后续电路也无需处理.当信号维持时间超过八个计数时钟周期,认为这时定稳定的按键信号,即键稳定的闭合.所以输出一个按键脉冲,以供后续电路处理.2 基于RS 触发器模式的消抖动电路设计在设计中用时钟信号进行采样.对于按键输入信号,当两次采样信号相同时,这是判定已经稳定的按下或放开了按键.触发器相应的被置成0态或1态.如两次采样结果不相同.则触发器维持原输出信号不变.由于直接由触发器输出的信号时间宽度可能过长,所以在触发器后再接一级同步化电路,保证每次输出的信号只占有一个时钟周期的宽度.应用这种方法去滤除抖动,关键是确定采样时钟的频率.保证两次采样的时间间隔能够大于按键的抖动时间,且小于正常按键时的按键稳定闭合时间.其VH D L 代码和仿真如下:library ieee ;use ieee.std -logic -1164.all ;entity dou is port (din ,clk :in std -logic ;dout :out std -logic );end entity dou ;architecture one of dou issignal clr0,clr1,q0,q1,d1,d0:std -logic ;beginclr0<=din ;clr1<=q0;process (clk ,clr0,clr1)beginif clr0=′0′then q0<=′0′;elsif clk ′event and clk =′1′thenq0<=′1′;end if ;if clr1=′0′then q1<=′0′;elsif clk ′event and clk =′1′thenq1<=′1′;end if ;end process ;process (clk )beginif clk ′event and clk =′1′thend0<=q1;d1<=d0;end if ;end process ;dout <=d0and (not d1);end ;·551· 由上仿真图形可以看出:当两次的采样信号结果相同时,这时输出信号才可能发生变化,对应的按键的稳定闭合或断开,当两次的采样信号结果不同时,认为输入的信号定抖动信号.这时电路输出维持原状态不变,同时由于有同步化的处理,输出信号的高电平宽度只为采样时钟的一个周期.3 结束语通过以上的仿真图形可以看出,对于带有机械抖动的按键信号,当它经过消抖电路处理后其输出信号已经将抖动滤除,且输出信号只占有一个时钟信号的周期,从而能使后续电路能够正确的读取键值,做相应的响应,有效的避免了误动作.因此该设计有很大的实际应用意义.参 考 文 献[1]潘 松,黄继业.E DA 技术实用教程[M].北京:科学出版社,20051[2]谭会生,瞿遂春.E DA 技术综合应用实例与分析[M].西安:西安电子科技大学出版社,2004.[3]林明权等.VH D L 数字控制系统设计范例[M].北京:电子工业出版社,2003.[4]方 龙,肖献保,李 威.关于消除按键机械抖动的研究[J ].广西轻工业,2008,1:92.[5]潘永雄,泌河,刘向阳.电子线路CAD 实用教程[M].西安:西安电子科技大学出版社,2004.[6]杨 恒,李爱国,王辉,王新安.FPG A/CP LD 最新实用技术指南[M].北京:清华大学出版社,2005.[7][美]沃尔夫(W olr.w )基于FPG A 的系统设计(英语版)[M].北京:机械工业出版社,2005.[8]王强,曾繁泰,励娜.EPA 工程的理论与实践—S OC 系统蕊片设计[M].北京:电子工业出版社,2004.[9]李国洪,胡辉,沈阳山等.E DA 技术与实验[M].北京:电子工业出版社,2005.Shaking R elease Design on the K eys of FPGAXU De 2cheng(C ollege of In formation T echnology ,Jilin N ormal University ,S iping 136000,China )Abstract :K eys were the comm on elements during the research of measure instrument ,electronic apparatus ,and design of the electronic.The bounce phenomenon of keys was the objective problem in the digital system design.Therefore ,the shaking release measurement was necessary.That is to rem ove the noise signal at the engine bounce through the elimi 2nating the shaking circuit in order to ensure the right response of the circuit.The paper introduced tw o methods of elim 2inating shaking on FPG A and gave the relative VH D L code and the imitating picture.It res olved the in fluence of engine shaking on keys and ensurd the steady w orking of the circuit.K ey w ords :engine shaking ;imitating picture ;circuit·651·。
按键消抖
在使用单片机搭建有人机交互的系统时需要用到键盘,因为单片机工作时间都是纳秒与毫秒级别,但是我们人体的反应时间最少要0.2秒,之间差距很大,现实过程中也会不小心碰到按键,正常的按下按键应该是持续数十秒的稳定。
一、按键电路常用的非编码键盘,每个在使用单片机搭建有人机交互的系统时需要用到键盘,因为单片机工作时间都是纳秒与毫秒级别,但是我们人体的反应时间最少要0.2秒,之间差距很大,现实过程中也会不小心碰到按键,正常的按下按键应该是持续数十秒的稳定。
一、按键电路常用的非编码键盘,每个键都是一个常开开关电路。
计数器输入脉冲最好不要直接接普通的按键开关,因为记数器的记数速度非常快,按键、触点等接触时会有多次接通和断开的现象。
我们感觉不到,可是记数器却都记录了下来。
例如,虽然只按了1下,记数器可能记了3下。
因此,使用按键的记数电路都会增加单稳态电路避免记数错误。
二、按键消抖通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,电压信号小型如下图。
由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。
因而在闭合及断开的瞬间均伴随有一连串的抖动,如下图。
抖动时间的长短由按键的机械特性决定,一般为5ms~10ms。
这是一个很重要的时间参数,在很多场合都要用到。
按键稳定闭合时间的长短则是由操作人员的按键动作决定的,一般为零点几秒至数秒。
键抖动会引起一次按键被误读多次。
为确保CPU对键的一次闭合仅作一次处理,必须去除键抖动。
在键闭合稳定时读取键的状态,并且必须判别到键释放稳定后再作处理。
按键的抖动,可用硬件或软件两种方法。
三、硬件消抖在键数较少时可用硬件方法消除键抖动。
下图所示的RS触发器为常用的硬件去抖。
消抖电路如下图中两个“与非”门构成一个RS触发器。
当按键未按下时,输出为1;当键按下时,输出为0。
此时即使用按键的机械性能,使按键因弹性抖动而产生瞬时断开(抖动跳开B),中要按键不返回原始状态A,双稳态电路的状态不改变,输出保持为0,不会产生抖动的波形。
FPGA学习按键消抖实验Verilog代码
FPGA学习按键消抖实验Verilog代码modulesw_de(clk,rst_n,sw1_n,sw2_n,sw3_n,led_d1,led_d2,led_d3);input clk; //主时钟信号 50MHzinput 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;always @ (posedge clk or negedge rst_n)if (!rst_n) low_sw<=3'b111;else if(cnt==20'hfffff)/*满20ms,将按键值锁存到寄存器low_sw中20'hfffff='d1048575 t=1/48000000*1048575=0.021s*/ low_sw<={sw3_n,sw2_n,sw1_n};/*将按键sw3_n,sw2_n,sw1_n,用位拼接符{}拼接为一个三位的数传给low_sw*///-----------------------------------------------------------reg[2:0] low_sw_r; //每个时钟周期的上升沿将low_sw信号锁存到low_sw_ralways @ (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_ctr1的值变为高,维持一个时钟周期wire[2:0] led_ctr1=low_sw_r[2:0]&(~low_sw[2:0]);//找出变化的键存到led_ctr1中reg d1;reg d2;reg d3;always @ (posedge clk or negedge rst_n)if (!rst_n)begind1<=1'b0;d2<=1'b0;d3<=1'b0;endelse begin //某个按键值变化时,LED将亮灭翻转 if (led_ctrl[0]) d1<=~d1;if (led_ctrl[1]) d2<=~d2;if (led_ctrl[2]) d3<=~d3;endassign led_d3=d1?1'b1:1'b0; assign led_d2=d2?1'b1:1'b0; assign led_d1=d3?1'b1:1'b0; endmodule。
按键去抖说明
(r>O v« O-按键去抖说明由于机械触点的弹性振动,按键在按下时不会马上稳定地接通而在弹起时也不能一下子完 全地断开,因而在按键闭合和断开的瞬间均会出现一连串的抖动,这称为按键的扌耳动干扰, 其产生的渡形如图5.3.1所示,当按键按下时•会产生前沿抖动,当按键弹起时会产生后沿抖 动。
这是所有机械蝕点武按键在状态输出时的共性问题,抖动的时间长短取决于按键的机械 特性与操作状态,一般为10~L00ms,此为键处理设计时要考虑的一个重要参数。
取按键状态,必须在按键囲合或斷开时,消除产生的前沿或后沿抖动,去抖动的方法有硬件 方法和软件方法两种。
1.硬件方法硬件方法是设计一个滤波延时电路或单稳态电路尊硬件电路来遥开按键的抖动时间。
图>3. 2是由R2和C 组成的滤波延时消抖电路,设豈在按键S 与CPU 数据线Di 之 间。
按键S 未按下时•,电容两端电压为0,即与非门输入丙为0,输出卩o 为1。
当S 按下 时,由于C 两端电压不能突变,充电电压丙在充电时间内未达到与非门的开启电压,门的瑜 出心将不会改变,亘到充电电压巧丈于门的开启电压时,与非门的输出X )才变为0,这 段充电延迟时间取决于Rl 、R2和C 值的大小,电路设计时只要使之大于或等于10 0 ms 即可避开按键抖动的彫响。
同理,按键S 断开时,即使出现押动,由于C 的放电延迟 过程,也会消除按键抖动的彫响-4-5 VR-1按键去抖说明^2是施帕滤波电路后消除抖动的波形"2.软件方法软件方法是指编制一段时间大^lOOms的延时程序,在第一次检测到有键按下时,执行这段延时子程序使键的前沿抖动消失后再检测该键状态,如果该键仍保持闭台伏态电平,则确认为该钳已稳定按F 否则无镇按兀从而消除了料动的影响’同理,在检测到按键释放后,也同样要延迟一段时间,以消除后沿抖动,然后转入对该按键的处理。
基于FPGA的抖动及消抖的方法
基于FPGA的抖动及消抖的方法抖动的产生通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。
因而在闭合及断开的瞬间均伴随有一连串的抖动,为了不产生这种现象而作的措施就是按键消抖。
抖动时间抖动时间的长短由按键的机械特性决定,一般为5ms~10ms。
这是一个很重要的时间参数,在很多场合都要用到按键稳定闭合时间的长短则是由操作人员的按键动作决定的,一般为零点几秒至数秒。
键抖动会引起一次按键被误读多次。
为确保FPGA对键的一次闭合仅作一次处理,必须去除键抖动。
在键闭合稳定时读取键的状态,并且必须判别到键释放稳定后再作处理。
FPGA内实现消抖的方法在FPGA内实现按键消抖的方法多种多样,但是最简单的是采用移位寄存器的方法进行消抖。
因为移位寄存器的方法不需要对时钟进行分频,也不需要进行延时等复杂操作,即可实现对按键边沿的检测。
假设未按下时键值=1.1、在无键按下时,移位寄存器samp[7:0]始终采集到高电平,即samp[7:0]=8b1111_1111;2、当键按下时,samp[7:0]将采集到低电平,数据的变化方式为samp[7:0]=8b1111_1110--8b1111_1100--8b1111_1000-- ........8b0000_0000;samp[7:0]=8b1111_ 1110即为按键下降沿。
3、当松开按键时,samp[7:0]将重新采集到高电平,数据变化方式为samp[7:0]=8b0000_0001--8b0000_0011-- ........--8b1111_1111;当samp[7:0]=8b0111_1111时,即为按键上升沿。
参考Verilog代码//模块名:EdgeDetect,边沿检测//button:按键,无键按下时为高电平//clk:10M时钟//rst:复位按钮,低电平有效//rise:检测到上升沿,高电平有效,宽度为1个clk//fall:检测到下降沿,高电平有效,宽度为1个clkmodule EdgeDetect(input clk,input rst,input button,output reg rise,output reg fall);。
fpga按键消抖原理
fpga按键消抖原理fpga按键消抖原理___________________FPGA按键消抖是一种用于处理按键输入信号的技术,它可以有效地降低噪声对按键信号的影响,从而确保按键输入的正确性。
## 一、什么是fpga按键消抖FPGA按键消抖是一种应用于处理外部输入的技术,它可以有效地减少按键输入的误差,同时防止因由噪声或触发时间过长等原因导致的误操作,从而保证操作系统的稳定性和正确性。
## 二、fpga按键消抖的原理FPGA按键消抖的原理是:当用户按下一个按钮时,FPGA会连续采集多个采样点,并判断采样点的平均值,如果采样值与平均值相差不大,则认为是有效的输入;如果采样点的平均值与采样值相差较大,则认为采样点受到了噪声干扰,此时不认为是有效的输入。
此外,FPGA还会根据按钮被按下的时间来决定是否应该将其作为有效输入:如果用户在一定的时间内多次重复按下一个按钮,FPGA会自动将其作为无效输入,从而避免重复操作。
## 三、fpga按键消抖的应用FPGA按键消抖在实际应用中最常用于处理用户输入,它可以有效地避免由于噪声或触发时间过长而导致的误差。
此外,FPGA也可以用于处理传感器输出,例如测量传感器的输出信号、光学传感器的输出信号等。
## 四、fpga按键消抖的注意事项在使用FPGA进行按键消抖时,应该注意以下几点:1. FPGA采样点的数量要适当:采样点的数量不宜过多或过少,要根据实际情况适当调整。
2. FPGA采样点的间隔要适当:采样点之间的间隔应该尽可能小,以便能够有效地减少噪声对信号的影响。
3. FPGA采样点的平均值要适当:采样点的平均值应该尽可能小,以便能够有效地减少噪声对信号的影响。
4. FPGA采样时间要适当:FPGA在采样信号时应该尽可能快,以便能够有效地减少噪声对信号的影响。
## 五、总结FPGA是一种常用的电子设备,它可以有效地处理外部输入信号,从而避免因由噪声或触发时间过长而导致的误差。
详解MCU独立按键消抖,原因、方法统统都有
简单的说,进入了电子,不管是学纯模拟,还是学单片机,DSP、ARM等处理器,或者是我们的FPGA,一般没有不用到按键的地方。
按键:人机交互控制,主要用于对系统的控制,信号的释放等。
因此在这里,FPGA上应用的按键消抖动,也不得不讲!一、为什么要消抖动在按键被按下的短暂一瞬间,由于硬件上的抖动,往往会产生几毫秒的抖动,在这时候若采集信号,势必导致误操作,甚至系统崩溃;同样,在释放按键的那一刻,硬件上会相应的产生抖动,会产生同样的后果。
因此,在模拟或者数字电路中,我们要避免在最不稳定的时候采集信号,进行操作。
对此一般产用消抖动的原理。
一般可分为以下几种:(1)延时(2)N次低电平计数(3)低通滤波在数字电路中,一般产用(1)(2)种方法。
后文中将详细介绍。
二、各种消抖动1. 模拟电路按键消抖动对于模拟电路中,一般消抖动用的是电容消抖动或者施密特触发等电路,再次不做具体介绍。
2. 单片机中按键消抖动对于单片机中的按键消抖动,本节Bingo根据自己当年写过的单片机其中的一个代码来讲解,代码如下所示:针对以上代码,消抖动的顺序如下所示:(1)检测到信号(2)延时5ms,消抖动(3)继续检测信号,确认是否被按下a) 是,则开始等待释放b) 否,则返回0,退出(4)延时5ms,消抖动(5)确认,返回按下信号,退出当然在单片机中也可以循环计数来确认是否被按下。
Bingo认为如此,太耗MCU 资源,因此再次不做讲述。
3. FPGA中的按键消抖动对于FPGA中的消抖动,很多教科书上都没有讲述。
但Bingo觉得这个很有必要。
对于信号稳定性以及准确性分析,按键信号必须有一个稳定的脉冲,不然对系统稳定性有很大的干扰。
FPGA入门系列实验教程——按键消抖控制LED亮灭
FPGA入门系列实验教程——按键消抖控制LED亮灭1.实验任务实现按键控制LED亮灭。
通过这个实验,掌握采用Verilog HDL语言编程实现按键控制LED亮灭及按键消抖方法。
2.实验环境硬件实验环境为艾米电子工作室型号EP2C8Q208C8增强版开发套件。
软件实验环境为Quartus II8.1开发软件。
3.实验原理当独立按键key1按下后,相应的LED被点亮;再次按下后,LED做翻转输出,即LED熄灭,从而实现按键控制LED亮灭。
本实验对按键进行了消抖处理。
作为机械开关的按键,操作时,机械触点的弹性及电压突跳等原因,在触点闭合或开启的瞬间会出现电压抖动,实际应用中如果不进行处理将会造成误触发。
按键去抖动的关键在于提取稳定的低电平状态,滤除前沿、后沿抖动毛刺。
按键消抖处理一般有硬件和软件两种方法。
软件消抖是检测到有触发后,延时一段时间后再检测触发状态,如果与之前检测到的状态相同,则认为有按键按下;如果没有则认为是误触发。
硬件就是加去抖电路。
4.实验程序module key_debounce(rst_n,clk,key,led);input rst_n;input clk;input key;output led;//通过降采样对key的输入做低通滤波,将其高频分量滤除,得到low_sw值reg[17:0]cnt;always@(posedge clk)if(!rst_n)cnt<=18'd0;elsecnt<=cnt+1'b1;wire sample_pulse=cnt==18'h3ffff;reg low_sw;always@(posedge clk)if(!rst_n)low_sw<=1'b1;else if(sample_pulse)low_sw<=key;//在整个low_sw(active_low)有效过程中取一个控制量作为led的控制信号//本实例中使用low_sw的下降沿reg low_sw_r;//将low_sw信号锁存一个时钟周期,延时不是真的“锁存”always@(posedge clk)low_sw_r<=low_sw;wire led_ctrl=low_sw_r&(!low_sw);reg led;always@(posedge clk or negedge rst_n)if(!rst_n)led<=1'b0;else if(led_ctrl)led<=~led;endmodule5.实验步骤(1)建立新工程项目:打开Quartus II软件,进入集成开发环境,点击File→New project wizard建立一个工程项目key_debounce。
10_基于FPGA进行按键消抖
10_基于FPGA进⾏按键消抖10_基于FPGA进⾏按键消抖实验原理计数器型消抖电路:计数器型消抖电路(⼀) 计数器型消抖电路(⼀)是设置⼀个模值为(N+1)的控制计数器,clk在上升沿时,如果按键开关key_in='1',计数器加1,key_in='0'时,计数器清零。
当计数器值为2时,key_out输出才为1,其他值为0时。
计数器值为N时处于保持状态。
因此按键key_in持续时间⼤于N个clk时钟周期时,计数器输出⼀个单脉冲,否则没有脉冲输出。
如果按键开关抖动产⽣的⽑刺宽度⼩于N个时钟周期,因⽽⽑刺作⽤不可能使计数器有输出,防抖动⽬的得以实现。
clk的时钟周期与N的值可以根据按键抖动时间由设计者⾃⾏设定。
下图为N为3的波形仿真图,当按键持续时间⼤于3个时钟周期,计数器输出⼀个单脉冲,其宽度为1个时钟周期,⼩于3个时钟周期的窄脉冲⽤作模拟抖动⼲扰,从图1可以看出,抖动不能⼲扰正常的单脉冲输出。
该⽅法的特点是能很好消除按键抖动产⽣的窄脉冲,还可以滤去⼲扰、噪⾳等其他尖峰波,但遇到脉宽⼤于N个Tclk时钟周期的⼲扰、噪⾳等时会有输出从⽽产⽣误操作,⽽对于按键操作要求按键时间必须⼤于N个Tclk时钟周期,否则按键操作也没有输出。
计数器型消抖电路(⼆) 计数器型消抖电路(⼆)是控制计数器⼯作⼀个循环周期(N+1个状态),且仅在计数器为0时输出为"1"。
电路设计了连锁控制设施。
在计数器处于状态0时,此时若有按键操作,则计数器进⼊状态1,同时输出单脉冲(其宽度等于时钟周期)。
计数器处于其他状态,都没有单脉冲输出。
计数器处于状态N时,控制en='0',导致计数器退出状态N,进⼊状态0。
计数器能否保持状态0,取决于⼈⼯按键操作,若按键key_in='1',控制en='1'(计数器能正常⼯作),key_in='0',计数器状态保持。
按键的硬件消抖电路原理
为什么要进行按键消抖按键消抖通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。
因而在闭合及断开的瞬间均伴随有一连串的抖动,为了不产生这种现象而作的措施就是按键消抖。
按键的抖动对于人类来说是感觉不到的,但对单片机来说,则是完全可以感应到的,而且还是一个很“漫长”的过程,因为单片机处理的速度在“微秒”级,而按键抖动的时间至少在“毫秒”级。
一次按键动作的电平波形如下图。
存在抖动现象,其前后沿抖动时间一般在5ms~10ms之间。
由于单片机运行速度非常快,经过A时刻的时候会检测到低电平判断按键被按下。
当到了B时刻的时候,单片机同样会检测到高电平,误以为松开按键,然后又到了C时刻检测到低电平,判断到按键被按下。
周而复始,在5-10ms内可能会出现很多次按下的动作,每一次按键的动作判断的次数都不相同。
为确保单片机对按键的一次闭合仅作一次处理,必须处理按键抖动问题。
在按键闭合或者释放稳定时再读取按键的状态。
硬件消抖电路硬件消抖一般有两种实现方式:o RS触发器o电容滤波RS触发器利用RS触发器来吸收按键的抖动。
一旦有键按下,触发器立即翻转,触电的抖动便不会再对输出产生影响,按键释放时也一样。
RS触发电路消抖电路图如下。
电容滤波将电容并联在按键的两端,利用电容的放电的延时特性。
将产生抖动的电平通过电容吸收掉。
从而达到消抖的作用,电容消抖电路图如下图所示。
总结实际上,在没有MCU的情况下,对按键进行消抖通常是通过硬件消抖电路来实现。
而在嵌入式开发中,大多数情况下都是通过程序来实现按键消抖。
简单说就是加合适的延迟,显然这实现成本要比硬件电路方式低得多。
按键消抖
end
else
cnt <= 0; end
always @(posedge clk or negedge nrst) begin
if(nrst == 0)
key_out <= 0;
else if(cnt == TIME_20MS - 1)
key_out <= key_in; endendmodule
方案3
// key down, bounce 19ms
repeat(951) @(negedge clk) key_in = ~key_in;
// last 60ms
repeat(3000) @(negedge clk);
cnt <= 0;
//
end always @(posedge clk or negedge nrst) begin
if(nrst == 0)
key_cnt
<= 0;
else if(key_cnt == 0 && key_in != key_out)
key_cnt <= 1;
else
if(cnt == TIME_20MS - 1)
// clock .key_out(key_out) );
initial begin
clk = 1;
forever #(T/2) clk
= ~clk; end
// reset initial begin
nrst = 1;
@(negedge clk) nrst = 0;
@(negedge clk) nrst
按键消抖
按键去抖:由上图可以看出理想波形与实际波形之间是有区别的,实际波形在按下和释放的瞬间都有抖动的现象,抖动 时间的长短和按键的机械特性有关,一般为5~10ms。通常我们手动按键然后释放,这个动作中稳定闭合的时间超过了 20ms。因此单片机在检测键盘是否按下时都要加上去抖动操作,有专用的去抖动电路,也有专门的去抖动芯片,但通常 我们采用软件延时的方法就可以解决抖动问题。
fpga按键消抖的原理和方法
FPGA(现场可编程门阵列)是一种可按照用户需求重新配置其硬件资源的可编程硅芯片。
在数字电路中,按键消抖 (Debounce) 是一个非常常见但重要的问题,因为机械按钮在按下和释放时会产生不稳定的信号。
为了解决这个问题,我们需要消除机械按键所产生的抖动信号。
消抖的原理是为输入信号添加处理和判断逻辑,将抖动视为一个单位的无效信号,从而过滤有问题的输入信号。
针对 FPGA,常用的按键消抖方法有以下两种:1. **计数器方法 (Counter Method)**这种方法检测按键输入是否持续一定时间内(假设我们使用n 个时钟周期)保持稳定。
如果输入持续稳定,则将其作为有效输入信号。
通过计数器实现的消抖具备可配置的消抖时间,从而适应各种不同类型的按键。
以下是计数器消抖方法的大致步骤:1. 初始化一个 n 位计数器。
2. 如果按键输入保持稳定(按下或释放),计数器增加,否则计数器清零。
3. 当计数器达到预定的阈值时,改变按键的状态(按下或释放)。
4. **移位寄存器方法 (Shift Register Method)**其实现原理是将多个连续的抖动信号视为一个有效输入,适用于按键抖动时间较短的场景。
以下是移位寄存器消抖方法的大致步骤:1. 初始化一个 n 位移位寄存器。
2. 每个时钟周期将输入信号添加到移位寄存器的低位(或高位),同时向右(或左)移动一位。
3. 当移位寄存器中所有位的值都相同(全为 0 或全为 1)时,认为信号稳定,将其视为有效输入信号。
在消抖方法的选择上,实际应用要考虑系统性能、消抖精度、按键抖动时间等因素。
简单的消抖算法可能只跟踪按键的状态改变,而更高级的算法可以检测按键被按下并保持的持续时间,从而在功能上更灵活。
【黑金原创教程】【FPGA那些事儿-驱动篇I】实验二:按键模块①-消抖
【⿊⾦原创教程】【FPGA那些事⼉-驱动篇I】实验⼆:按键模块①-消抖实验⼆:按键模块① - 消抖按键消抖实验可谓是经典中的经典,按键消抖实验虽曾在《建模篇》出现过,⽽且还惹来⼀堆⿇烦。
事实上,笔者这是在刁难各位同学,好让对⽅的惯性思维短路⼀下,但是惨遭⼝⽔攻击 ... ⾯对它,笔者宛如被甩的男⼈,对它⼜爱⼜恨。
不管怎么样,如今 I’ll be back,笔者再也不会重复⼀样的悲剧。
按键消抖说傻不傻说难不难。
所谓傻,它因为原理不仅简单(就是延迟⼏下下⽽已),⽽且顺序语⾔(C语⾔)也有⽆数不尽的例⼦。
所谓难,那是因为⼈们很难从单⽚机的思维跳出来 ... 此外,按键消抖也有许多细节未曾被⼈重视,真是让⼈伤⼼。
按键消抖⼀般有3段操作:l 检测电平变化;l 过滤抖动(延迟);l 产⽣有效按键。
假设C语⾔与单⽚机的组合想要检测电平变化,它们⼀般是利⽤if查询或者外部中断。
事后,如果这对组合想要过滤抖动,那么可以借⽤for 延迟的⼒量,⼜或者依赖定时中断产⽣精明的延迟效果。
反观有效案件的产⽣,这对组合视乎⽽外钟情“按下有效”似的 ... 不管怎么样,C语⾔与单⽚机这对组合在处理按键的时候,它们往往会错过⼀些黄⾦。
“黄⾦?”,读者震撼道。
所谓黄⾦时间就是电平发⽣变化那⼀瞬间,还有消抖(延迟)以后那⼀瞬间。
按键按下期间,按键的输⼊电平故会发⽣变化,如果使⽤if查询去检测,结果很容易浪费单⽚机的处理资源,因为单⽚机必须⼀直等待 ... 换之,如果反⽤外部中断,中断寻址也会耽误诺⼲时间。
假设C语⾔与单⽚机这对组合挨过电平检测这起难关,余下的困难却是消抖动作。
如果利⽤for循环实现去消抖,例如 Delay_ms(10) 之类的函数。
For循环不仅计数不紧密,⽽且还会⽩⽩浪费单⽚机的处理资源。
定时中断虽然计数紧密,但是中断触发依然也会产⽣诺⼲的寻址延迟。
补上,所谓寻址延迟是处理器处理中断触发的时候,它要事先保护现场之余,也要寻址中断处理⼊⼝,然后执⾏中断函数,完后回复现场,最后再返回当前的⼯作。
EE_FPGA基础教程系列 -- 按键消抖
这段短短的程序,其实有着两个非常重要的知识点值得我们学习。 首先,大家了解下复位语句,if (!rst_n) begin *** end 起到异步复位作用, 就是对程序设置一个初始值,这样的语句大家只要了解初始值是多少就可以。 对于蓝色标注的两段程序,有个重要的知识点。在介绍这个知识点之前,大 家还必须对非阻塞赋值和阻塞赋值有个清楚的了解。这里就利用了非阻塞赋值的
测上升沿的典型语句。不信你画个时序图看看。顺便多说一句,做数字电路,画
时序图是解决问题的一个很好的方法哦。
理解了以上两个知识点,那这个按键消抖的程序就很好懂了。如果管脚检测
到下降沿,我们用 key_an 作为标志信号启动计数器,当计数器计到 20’hfffff 的
时候,(即约 10 万个 clk 周期,20ms)。再次存入键值,
程序设计的基本思路是: 1、检测管脚电平是否拉低 2、若检测到低电平,启动计数器,延时 20ms 左右的时间 3、再次检测管脚是否低电平 4、若还是低电平,确定按键被按下。输出控制信号
2.4 按键消抖程序
input clk; //主时钟信号,50MHz input rst_n; //复位信号,低有效 input key1; //按键 1 //--------------------------------------------------------------------------reg reg0_key; reg reg1_key; always @(posedge clk or negedge rst_n) begin
if (!rst_n) cnt_key <= 20'd0; //复位 else if(key_an) cnt_key <=20'd0; else cnt_key <= cnt_key + 1'b1; end
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
电子工程世界
EE_FPGA 基础教程系列
我们画一张时序图来解释这个问题就非常好理解了。我们假设按键 key1 输
if (!rst_n)
reg1_low <= 1'b1;
else
reg1_low <= reg_low;
end
//---------------------------------------------------------------------------
//当寄存器 reg_low 由 1 变为 0 时,key_low 的值变为高,维持一个时钟周期 wire key_low = reg1_low & ( ~reg_low);
else if(cnt
reg_low <= key1;
// cnt == 20'hfffff 约 20ms
reg1_low <= reg_low;
if (!rst_n) cnt_key <= 20'd0; //复位 else if(key_an) cnt_key <=20'd0; else cnt_key <= cnt_key + 1'b1; end
reg reg_low;
reg reg1_low;
always @(posedge clk or negedge rst_n) begin
//当寄存器 key1 由 1 变为 0 时,led_an 的值变为高,维持一个时钟周期 wire key_an; assign key_an = reg1_key & ( ~reg0_key); //-------------------------------启动延时-------------------------------------------reg[19:0] cnt_key; //计数寄存器 always @ (posedge clk or negedge rst_n) begin
程序设计的基本思路是: 1、检测管脚电平是否拉低 2、若检测到低电平,启动计数器,延时 20ms 左右的时间 3、再次检测管脚是否低电平 4、若还是低电平,确定按键被按下。输出控制信号
2.4 按键消抖程序
input clk; //主时钟信号,50MHz input rst_n; //复位信号,低有效 input key1; //按键 1 //--------------------------------------------------------------------------reg reg0_key; reg reg1_key; always @(posedge clk or negedge rst_n) begin
Revision History
Description
EE_FPGA 基础教程---- 按键消抖
Date
Keywords:
Abstract: 本文分析按键消抖的 verilog 程序。学习非阻塞赋值和脉冲边沿检测的原
理。
电子工程世界
EE_FPGA 基础教程系列
测上升沿的典型语句。不信你画个时序图看看。顺便多说一句,做数字电路,画
时序图是解决问题的一个很好的方法哦。
理解了以上两个知识点,那这个按键消抖的程序就很好懂了。如果管脚检测
到下降沿,我们用 key_an 作为标志信号启动计数器,当计数器计到 20’hfffff 的
时候,(即约 10 万个 clk 周期,20ms)。再次存入键值,
2.2 何为按键消抖
如果仅仅是按上面所说,那这个是否太简单了一点呢?是滴,你一定会想到
电子工程世界
EE_FPGA 基础教程系列
按键消抖的问题。似乎不管是学单片机还是 DSP 的时候,凡是涉及到按键的都 会提到按键消抖。正好,网上找到一张关于按键抖动的图。
抖动时间 t1、t3 一般在 20ms 左右。从理论上讲,在抖动时间内,会产生多 个脉冲信号,如果不进行任何处理,则按一次按键,程序会认为按了多次,从而 产生错误。
2.5 程序分析
这段短短的程序,其实有着两个非常重要的知识点值得我们学习。 首先,大家了解下复位语句,if (!rst_n) begin *** end 起到异步复位作用, 就是对程序设置一个初始值,这样的语句大家只要了解初始值是多少就可以。 对于蓝色标注的两段程序,有个重要的知识点。在介绍这个知识点之前,大 家还必须对非阻塞赋值和阻塞赋值有个清楚的了解。这里就利用了非阻塞赋值的
if(!rst_n) begin reg0_key <= 1'b1; reg1_key <= 1'b1;
end else begin
电子工程世界
EE_FPGA 基础教程系列
reg0_key <= key1; reg1_key <= reg0_key; end end
if (!rst_n) begin
reg_low <= 1'b1;
end
else if(cnt_key == 20'hfffff) begin
reg_low <= key1;
// cnt == 20'hfffff 约 20ms
end
end
always @(posedge clk or negedge rst_n) begin
电子工程世界
EE_FPGA 基础教程系列
1. 回顾
这次我们继续给玩转 LED 加入些新元素,使用按键控制 LED。点亮 LED 是 利用了 FPGA 输出电平,这次对按键进行操作则是对 FPGA 进行输入了。
2. 按键消抖
2.1 按键输入原理
首先,我们得打开 EE_FPGA 的硬件手册,找到按键部分的原理图。 如下图所示,这会大家就可以利用在 LED 中学到的知识进行分析了,当按 键没有被按下的时候,管脚连接的是 VDD3.3V 的高电平;当按键被按下时,管 脚接地。 所以我们只要检测这几个管脚是否是低电平,就可以判断是否有按键被按下 啦。
入上图这样一段时序序列。经过 reg0_key 和 reg1_key 的移位操作,以及 reg0_key
的取反。最后寄存器 key_an 被拉高一个时钟周期,清楚地显示了下降沿的位置。
这段程序是用来检测下降沿的典型程序。这里,我提醒下,我们只要把取反
的寄存器换一下,改成 assign key_an = reg0_key & ( ~reg1_key);就变成了一段检
电子工程世界
EE_FPGA 基础教程系列
EE_FPGA 基础教程系列
按键消抖
V1.0
作者:xieqiang
整理: chenzhufly QQ: 36886052 2011-3-22
电子工程世界
Version
1.0
Author
chenzhufly
EE_FPGA 基础教程系列
那不消抖可不可以的呢,也许有些地方是没什么问题的。上次还在论坛上看 到一位朋友一定要找出一种能说明按键不消抖有问题的例子。我想,这样没必要, 设计的时候根据实际情况自然就知道需不需要消抖了。这里,我们是学习这个知 识点。
2.3 按键消抖思路
关于 FPGA 的按键消抖,我在网上找了一个经典的程序,稍加修改,便于大 家学习和理解。
2.1 按键输入原理........................................................................................................4 2.2 何为按键消抖........................................................................................................4 2.3 按键消抖思路........................................................................................................5 2.4 按键消抖程序........................................................................................................5 2.5 程序分析 ...............................................................................................................6 2.6 整体程序 ...............................................................................................................8 3. 实验结果 ........................................................................................................................10 4. 总结................................................................................................................................11
Table of Contents