Verilog写的按键消抖程序

合集下载

按键消抖计数原理与测试说明

按键消抖计数原理与测试说明

“按键消抖计数”程序测试与原理说明1程序运行效果说明按下KEY1,数码管上的示数加1。

按下KEY2,数码管上的示数减1。

2程序电路工作原理以及按键抖动原因按键电路示意图(三个按键分别是K1、K2、K3)当按键被按下的时候,电路导通接地,I/O口为低电平;当按键未被下时,电路断开,I/O口保持高电平的。

但一般的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。

因而在闭合及断开的瞬间均伴随有一连串的抖动,假如不加以处理,会导致按键被识别为按下多次。

为了不产生这种现象而作的措施就是按键消抖。

3消抖的方法按键消抖分为硬件消抖和软件消抖。

3.1硬件消抖在键数较少时可用硬件方法消除键抖动。

下图所示的RS触发器为常用的硬件去抖。

硬件消抖电路图图中两个“与非”门构成一个RS触发器。

当按键未按下时,输出为0;当键按下时,输出为1。

此时即使用按键的机械性能,使按键因弹性抖动而产生瞬时断开(抖动跳开B),只要按键不返回原始状态A,双稳态电路的状态不改变,输出保持为0,不会产生抖动的波形。

也就是说,即使B点的电压波形是抖动的,但经双稳态电路之后,其输出为正规的矩形波。

这一点通过分析RS触发器的工作过程很容易得到验证。

3.1软件消抖方法1:使用延时如果按键较多,常用软件方法去抖,即检测出键闭合后执行一个延时程序,5ms~10ms 的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。

当检测到按键释放后,也要给5ms~10ms的延时,待后沿抖动消失后才能转入该键的处理程序。

方法2:检测多次可以设定一个检测周期,如果在一个检测周期内,按键被检测为被按下达到了一定次数,则确认为真正被按下。

VHDL语言按键去抖动电路的设计

VHDL语言按键去抖动电路的设计

--状态机复位,dout输出信 状态机复位, 状态机复位 输出信 号复位。 号复位。
--按键按下 按键按下
--按键按下 按键按下
--按键释放 按键释放
仿真结果
S0
S1
S0
S0
S1
S2
S2
S0
维持3个周期的低电平时 变成低电平, 当din维持 个周期的低电平时,dout变成低电平,表示有 维持 个周期的低电平时, 变成低电平 按键按下。 按键按下。
c lk res et key 1 key 2 key 3 key 4
ins t
led1 led2 led3 led4
clk:时钟,50MHz; :时钟, ; reset:复位信号; :复位信号; key1, key2, key3, key4:按键信号 : 输入; 输入; 输出信号: 输出信号: led1, led2, led3, led4:发光二极管 : 信号输出。 信号输出。
--key2按下 按下
--key3按下 按下
--key4按下 按下
--没有键被按下 没有键被按下
仿真结果
clk reset key 3
INPUT VCC
dout
din inst9 debounce clk reset dout
该设计包含分频模块、 该设计包含分频模块、去抖 动模块和按键扫描模块组成。 动模块和按键扫描模块组成。
key 4
INPUT VCC
din inst10
按键扫描程序
--key1按下 按下
50MHz
clk
INPUT VCC
Parameter Value Type n 250000 Signed Integer
f div 200hz clkin clkout

按键消抖电路中可能遇到的问题

按键消抖电路中可能遇到的问题

按键消抖电路的问题及解决方案引言在很多电子设备和系统中,我们经常会遇到按键输入的问题,尤其是当按键被长时间按下或快速频繁按下时,可能会出现按键误触或重复触发的现象。

为了解决这个问题,需要使用按键消抖电路。

按键消抖电路是一种用于解决按键输入中抖动问题的电路,其主要功能是确保每个按键信号只被触发一次。

本文将介绍按键消抖电路可能遇到的问题,并提供相应的解决方案。

问题一:按键抖动按键抖动是指在按键被按下或释放的瞬间,由于机械开关的弹性导致的电气接触不稳定现象。

抖动会导致信号在短时间内多次切换,从而可能引起系统错误触发或功能失效。

解决方案: - 硬件滤波:可以使用外部电容器和电阻器组成的RC电路来进行硬件滤波。

通过适当选择电容和电阻值,可以使抖动信号被滤除,只有稳定的按键信号被传递给后续电路。

- 软件滤波:可以在微控制器或数字逻辑芯片中使用软件滤波算法来处理按键信号。

软件滤波可以通过设置特定的时间窗口,在此期间内检测和记录按键状态变化,并在时间窗口结束时确定按键的最终状态。

这种方式可以有效抑制按键抖动,但需要相应的处理算法支持。

问题二:按键重复触发当按键被长时间按下时,由于机械开关的弹性使得接触点会产生微小的颤动,这可能会导致按键信号以较高频率持续触发,而不是期望的单次触发。

解决方案: - 软件消抖:可以在软件中设置合适的按键触发间隔。

当按键被按下时,记录触发时间,并在下一次检测到按键状态变化时,检查与上次触发时间的间隔是否超过设定的阈值。

如果超过阈值,则认为新的按键触发有效,否则忽略。

这种方式可以防止按键重复触发,但要求相应的处理算法支持。

- 硬件消抖:可以使用SR触发器或者集成了消抖功能的按键开关来进行硬件消抖。

SR触发器可以稳定输入信号,并将其作为触发器的输出,以确保只输出一次触发信号。

问题三:按键失效按键失效是指按键无法产生正确的信号输出。

这可能是由于电路连接不良、开关接触不良或按键磨损等原因导致的。

按键消抖实验

按键消抖实验

基于verilog按键消抖设计Aaron malone关于键盘的基础知识,我就以下面的一点资料带过,因为这个实在是再基础不过的东西了。

然后我引两篇我自己的博文,都是关于按键消抖的,代码也正是同目录下project里的。

这两篇博文都是ednchina的博客精华,并且在其blog 首页置顶多日,我想对大家会很有帮助的。

键盘的分类键盘分编码键盘和非编码键盘。

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

而靠软件编程来识别的称为非编码键盘。

在单片机组成的各种系统中,用的最多的是非编码键盘。

也有用到编码键盘的。

非编码键盘有分为:独立键盘和行列式(又称为矩阵式)键盘。

按键在闭合和断开时,触点会存在抖动现象:从上面的图形我们知道,在按键按下或者是释放的时候都会出现一个不稳定的抖动时间的,那么如果不处理好这个抖动时间,我们就无法处理好按键编码,所以如何才能有效的消除按键抖动呢?让下面的两篇博文日志给你答案吧。

经典的verilog键盘扫描程序从最基础的分频程序开始,但看到这个键盘扫描程序后,直呼经典,有相见恨晚的感觉,还想说一句:威百仕( VibesIC ),我很看好你!WHY?待我慢慢道来,这个程序的综合后是0error,0warning。

想想自己编码的时候那个warning是满天飞,现在才明白HDL设计有那么讲究了,代码所设计的不仅仅是简单的逻辑以及时序的关系,更重要的是你要在代码中不仅要表现出每一个寄存器,甚至每一个走线。

想想我写过的代码,只注意到了前者,从没有注意过后者,还洋洋自得以为自己也算是个高手了,现在想来,实在惭愧啊!学习学习在学习,这也重新激发了我对HDL设计的激情,威百仕给了我一个方向,那我可要开始努力喽!废话说了一大堆,看程序吧:(本代码经过ise7.1i综合并下载到SP306板上验证通过)//当三个独立按键的某一个被按下后,相应的LED被点亮;再次按下后,LED 熄灭,按键控制LED亮灭经过一次20ms的采样后判定为键盘按下。

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

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 等等的功能,这里不详细解释。

verilog按键消抖原理

verilog按键消抖原理

verilog按键消抖原理(原创实用版)目录1.按键消抖的原理2.Verilog 实现按键消抖的方法3.按键消抖的具体设计4.总结正文一、按键消抖的原理按键消抖是指在按键输入过程中,由于机械特性的影响,导致按键在按下或松开的瞬间会产生抖动,即电平从一个状态转换到另一个状态时,会在短时间内出现多次变化。

为了消除这种抖动,需要设计一种按键消抖电路或算法,确保输入信号的稳定性。

二、Verilog 实现按键消抖的方法Verilog 是一种硬件描述语言,可以用来设计和验证数字电路。

在Verilog 中实现按键消抖,主要可以通过计数器和寄存器来完成。

当按键输入发生变化时,计数器清零;当按键输入稳定时,计数器累加到一定值,此时输出稳定信号。

三、按键消抖的具体设计以下是一个基于 Verilog 的按键消抖设计示例:```verilogmodule keyjitter(clk, keyin, keyout);input clk; // 50MHz clock ininput keyin;output keyout;reg [22:0] counthigh;reg [22:0] countlow;reg keyreg;always @(posedge clk) beginif (keyin == 1"b0) begincountlow <= countlow - 1;end else begincountlow <= 23"h000000;endendalways @(posedge clk) beginif (keyin == 1"b1) begincounthigh <= counthigh + 1;end else begincounthigh <= 23"h000000;endendalways @(posedge clk) beginif (counthigh == 23"h250000) beginkeyreg <= 1"b1;end else if (countlow == 23"h250000) beginkeyreg <= 1"b0;end else beginkeyreg <= keyreg;endendendmodule```在这个设计中,我们使用了两个计数器,分别记录按键输入的高电平和低电平。

vivado按键消抖原理

vivado按键消抖原理

vivado按键消抖原理按键消抖是指在数字电路中,当按键按下或释放时,由于按键机械开关的特性,会导致电路出现不稳定的信号状态。

这种不稳定状态可能会导致错误的触发,例如出现多次触发或漏触发。

因此,为了确保按键信号的稳定性和可靠性,需要进行按键消抖处理。

按键消抖的原因主要有两个方面。

首先,按键机械开关的接触面存在微小的弹跳现象,当按键按下或释放时,接触面会在短时间内反复接触和分离,导致电路信号出现多次变化。

其次,由于电路中存在的噪声干扰,也会使得按键信号产生抖动。

为了解决按键消抖问题,可以采用硬件和软件两种方法。

硬件方法主要通过添加滤波电路或使用稳定的按键开关来消除按键弹跳现象。

滤波电路可以通过RC电路或者使用专用的按键消抖芯片来实现。

而软件方法主要通过在数字电路中添加按键消抖算法来处理按键信号。

在Vivado中,按键消抖可以通过使用状态机来实现。

状态机是一种用于描述系统行为的模型,可以根据输入信号的状态变化来改变系统的状态和输出。

在按键消抖中,可以使用状态机来检测按键信号的变化,并根据一定的状态转换规则来消除按键弹跳现象。

具体实现时,可以将按键信号作为输入,将按键状态和输出作为状态机的状态和输出。

当按键信号发生变化时,状态机会根据一定的状态转换规则进行状态转换,并输出消抖后的按键信号。

常用的状态转换规则包括按键按下时状态转换为按下状态,按键释放时状态转换为释放状态,以及连续按键时状态不变。

在Vivado中,可以使用Verilog或VHDL等硬件描述语言来编写状态机代码。

首先,需要定义状态机的输入、输出和状态变量,并初始化各个变量的初始值。

然后,需要编写状态转换规则和输出逻辑,根据输入信号的状态变化来改变状态和输出。

最后,需要将状态机代码综合生成对应的逻辑电路,并进行仿真和验证。

总结起来,按键消抖是数字电路设计中常见的问题,为了确保按键信号的稳定性和可靠性,需要进行按键消抖处理。

在Vivado中,可以使用状态机来实现按键消抖,通过定义状态转换规则和输出逻辑,消除按键弹跳现象。

键盘消抖原理代码说明(Verilog)

键盘消抖原理代码说明(Verilog)

笔记2 键盘消抖(别人的笔记)老实说,这个实验的开始之前和之后,都给我蛋疼了。

时钟了解不到源码的思路,边看源码边睡着。

醒来的时候既然“惊”一下,相通了......module lesson02(CLK, RST,SW0, SW1, SW2,LED0, LED1, LED2);input CLK;input RST;input SW0, SW1, SW2;output LED0, LED1, LED2;//---------------------------------------------------------------------------//Detect the switch pressingreg [2:0] Press0;reg [2:0] Press1;wire [2:0] isPress;always @ (posedge CLK or negedge RST)if(!RST)Press0 <= 3'b111;elsePress0 <= {SW0, SW1, SW2}; //read the pin result;always @ (posedge CLK or negedge RST)if(!RST)Press1 <= 3'b111;elsePress1 <= Press0; //read the previous Press0 resultassign isPress=Press1 & (~Press0); //detect the logic with bit is changed from logic 1 to 0 //---------------------------------------------------------------------------//if pressing, counter start counting for 20msreg [19:0] Counter; //计数寄存器always @ (posedge CLK or negedge RST)if(!RST)Counter <= 20'd0;else if(isPress)Counter <= 20'd0;elseCounter <= Counter + 1'b1; //increment for counter//------------------------------------------------------------------------//After 20ms read the key pin resultreg [2:0] Press2;reg [2:0] Press3;wire [2:0] Result;always @ (posedge CLK or negedge RST)if(!RST)beginPress2 <= 3'b111;Press3 <= 3'b111;endelse if(Counter == 20'hfffff)Press2 <= {SW0, SW1, SW2}; //read the pin result after 20mselsealways @ (posedge CLK or negedge RST)if(!RST)elsePress3 <= Press2; //read the previous pin resultassign Result = Press3 & (~Press2); //detect the changing bit from logic 1 to 0//------------------------------------------------------------------------//turn on led with pin resultreg D1;reg D2;reg D3;always @ (posedge CLK or negedge RST)if(!RST)beginD1 <= 1'b0;D2 <= 1'b0;D3 <= 1'b0;endelsebeginif( Result[0] ) D1 <= ~D1;if( Result[1] ) D2 <= ~D2;if( Result[2] ) D3 <= ~D3;endassign LED0 = D1 ? 1'b1 : 1'b0;assign LED1 = D2 ? 1'b1 : 1'b0;assign LED2 = D3 ? 1'b1 : 1'b0;endmodule这个实验主要有计数器和边缘检查来实现按键消抖,按键功能。

Verilog写的按键消抖程序

Verilog写的按键消抖程序

前几天看了特权同学用Verilog写的按键消抖程序,感觉很经典。

在这里将程序贴出来分享一下。

module lcd_button2(clk,rst,seg,wei,sw1,sw2,sw3,sw4);//按键按下,数码管依次显示0-9input 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 beginnum = 0;endreg[3:0] key_rst;always @(posedge clk or negedge rst)if(!rst)key_rst <= 4'b1111;elsekey_rst <= {sw4,sw3,sw2,sw1};reg[3:0] key_rst_r;always @(posedge clk or negedge rst)if(!rst)key_rst_r <= 4'b111;elsekey_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)if(!rst)low_sw <= 4'b1111;else if(cnt==10'hfffff)low_sw <= {sw4,sw3,sw2,sw1};reg[3:0] low_sw_r;always @(posedge clk or negedge rst)if(!rst)low_sw_r <= 4'b1111;elselow_sw_r <= low_sw;wire [3:0] led_ctrl = low_sw_r[3:0] & (~low_sw[3:0]);reg d1,d2,d3,d4;always @(posedge clk or negedge rst)if(!rst) begind1 <= 0;d2 <= 0;d3 <= 0;d4 <= 0;endelse beginif(led_ctrl[0]) beginnum <= num+1;if(num==9)num <= 0;endendalways @(posedge clk ) beginwei <= 4'b1111;case(num)0: seg <= 8'hfc;1: seg <= 8'h60;2: seg <= 8'hda;3: seg <= 8'hf2;4: seg <= 8'h66;5: seg <= 8'hb6;6: seg <= 8'hbe;7: seg <= 8'he0;8: seg <= 8'hfe;9: seg <= 8'hf6;default: seg <= 8'h02;endcaseendendmodule参考了特权的代码。

Verilog按键消抖的理解

Verilog按键消抖的理解

Verilog按键消抖的理解按键在按下时会产生抖动,释放时也会产生抖动,所以在设计键盘扫描程序时必须考虑按键的消抖,我们一般只考虑按下时的抖动,而放弃对释放时抖动的消抖。

抖动时间一般为20ms左右。

按下的最终结果是低电平'在单片机设计的的按键去抖思路是:检测到按下时延时20ms,再检测,如果状态仍为按下,贝U确认是按下的;如果状态为弹起的,则确认是干扰,无按键按下。

图1 按键抖动特性有一个概念要理一下,按键按下时会有抖动,也就是说我们其实只按一次,但是实际产生的&ldquo; 按下&rdquo; 却是许多次的,这些许多次集中在这20ms 里。

我们按的只是一次,而实际却产生了许多次,那么就必须滤除其他的次数。

单片机为了得到真正的&ldquo; 按下&rdquo;,通过延时20ms,把其他的&ldquo;按下&rdquo; (也就是抖动)给滤除了。

然后再次判断是否有按下,因为有的时候干扰很大。

而在FPGA中,基于下面的程序,理解如下:在这个程序里检测按键是否按下的方法是脉冲边沿检法。

而在单片机里是判断是否为低电平的方法(那么在FPGA中可不可以也用这个方法呢?)第一次检测到后,启动20ms 计数器,时间到后再检测。

这里的检测方法跟脉冲边沿检测法有异曲同工之处,FPGA过20ms检测按键是否按下,存储检测到的值,并且按位取反与前一个20ms检测的值相与,得到一个值,如果为1,则判断按键按下,否则则无按下。

所以跟单片机按键扫描的原理是一样的,不同的是检测方法不一样。

图2 FPGA 按键的理解示意图其中key_an 寄存器的功能是检测第一次的 &ldquo;按 下&rdquo;,是ent 的启动标志位。

通过也能滤除干扰信 号。

led_etrl是确实有按键按下的信号,维持一个时钟周期。

特权同学的Verilog 键盘扫描程序// 说明:当三个独立按键的某一个被按下后,相应的LED 被点亮;//再次按下后,LED 熄灭,按键控制 LED 亮灭 modulesw_debounce( clk,rst_n, sw1_n,sw2_n,sw3_n,下的JS生 谨产汞 按时彼伺隔勿吧时间轴110 UCi 111] 边沿唸迴注检测到"m 零汁数器并启动⑷矶的 时间计数 tn in no 110led_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。

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

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

按键消抖的原理和基于verilog的消抖设计按键开关是各种电子设备不可或缺的人机接口。

在实际应用中,很大一部分的按键是机械按键。

在机械按键的触点闭合和断开时,都会产生抖动,为了保证系统能正确识别按键的开关,就必须对按键的抖动进行处理。

在系统设计中,有各种各样的消除按键抖动的设计方法,硬件电路和软件设计都很成熟。

不过我们这里要从另外一个角度来讨论按键的消抖,并给出一个用verilog给出一个具体的实现。

首先,看一个普通的机械按键的触点在闭合与断开时的波形(用示波器抓取)。

下面的四张图都是按键在闭合的时候抓到的波形。

可以看到两个明显的趋势:1. 按键在几个us之内就可以达到稳定状态,从高电平转换到底电平;2. 在高电平转换到低电平的过程中,触点有非常明显的抖动。

下面的两张图是按键在断开的时候抓到的波形。

也可以看到两个明显的趋势:1. 按键的变化趋势比较缓慢,从低电平变为高电平需要大概10~20ms的时间;2. 按键断开时没有闭合时那么大的抖动下面两张图是用手迅速闭合按键然后就断开时,按键的输出波形。

在处理按键抖动的程序中,必须同时考虑消除闭合和断开两种情况下的抖动。

所以,对于按键消抖的处理,必须按最差的情况来考虑。

我们从上面的图上可以看到,按键输出的信号的跳变时间(上升沿和下降沿)最大是在20ms左右。

按键一次闭合最短的时间大概是120ms 左右。

如果我们把按键的输出做为一个时钟域(时钟频率未知,但信号的slow rate是已知的,既最大20ms左右)的信号,用另外一个时钟来采集这个按键的输出,则就可以把按键的消抖归结为一个最基本的CDC问题来处理。

而问题的核心是如何确定采集时钟的频率。

假设采集时钟的周期小于20ms,那么,采集时钟就有可能两次采到按键断开时的不。

verilog按键消抖原理

verilog按键消抖原理

verilog按键消抖原理(原创版)目录1.Verilog 简介2.按键消抖的概念3.按键消抖的实现原理4.实际应用中的按键消抖设计5.总结正文【1.Verilog 简介】Verilog 是一种硬件描述语言,主要用于数字系统硬件的描述、模拟和验证。

在数字电路设计和 FPGA 开发领域,Verilog 被广泛应用。

通过Verilog,设计人员可以对硬件电路进行建模、模拟和验证,以确保设计满足性能要求。

【2.按键消抖的概念】按键消抖,又称按键去抖,是一种在按键输入过程中消除误触发的技术。

在实际应用中,按键输入可能会受到噪声、抖动等因素的影响,导致误触发。

按键消抖的目的就是消除这些干扰,确保按键输入的准确性。

【3.按键消抖的实现原理】按键消抖的实现原理主要有两种:软件消抖和硬件消抖。

(1)软件消抖:软件消抖是通过程序算法实现的。

在按键触发时,程序会检测按键触发信号是否满足一定的条件,例如连续触发次数、触发时间间隔等。

如果满足条件,则认为这是一个有效的按键触发,否则不予响应。

(2)硬件消抖:硬件消抖是通过硬件电路实现的。

硬件消抖电路通常包括滤波器、延迟器等组件。

当按键触发信号输入时,滤波器会滤除噪声,延迟器会消除触发信号的抖动,从而保证输出信号的稳定性。

【4.实际应用中的按键消抖设计】在实际应用中,按键消抖设计需要考虑多种因素,如按键触发信号的噪声、抖动特性,系统的响应速度等。

为了实现高效、可靠的按键消抖,设计人员需要对这些因素进行综合考虑,选择合适的消抖方案。

【5.总结】按键消抖是一种重要的技术,可以有效消除按键输入中的误触发,提高系统的稳定性和可靠性。

消抖电路

消抖电路

基于VHDL语言的按键消抖电路设计及仿真按键开关是电子设备实现人机对话的重要器件之一。

由于大部分按键是机械触点,在触点闭合和断开时都会产生抖动。

为避免抖动引起误动作造成系统的不稳定,就要求消除按键的抖动,确保按键每按一次只做一次响应。

随着可编程逻辑器件的综合性能的不断提高,它已经象单片机一样。

广泛应用在各种数字逻辑领域。

用可编程逻辑器件直接获取键盘信息也得到广泛的应用。

这里提出用VHDL 语言编程的有限状态机的设计方法来实现按键的消抖,经仿真分析和下载实现,这种方法设计的消抖电路能够很好地实现电路功能,进行快速按键时都能保证每按一次做一次的响应,且性能稳定。

1 按键抖动产生原因分析绝大多数按键都是机械式开关结构,由于机械式开关的核心部件为弹性金属簧片,因而在开关切换的瞬间会在接触点出现来回弹跳的现象。

虽然只是进行了一次按键,结果在按键信号稳定的前后出现了多个脉冲,如图1所示。

如果将这样的信号直接送给微处理器扫描采集的话,将可能把按键稳定前后出现的脉冲信号当作按键信号,这就出现人为的一次按键但微处理器以为多次按键现象。

为了确保按键识别的准确性,在按键信号抖动的情况下不能进入状态输入,为此就必须对按键进行消抖处理,消除抖动时不稳定、随机的电压信号。

机械式按键的抖动次数、抖动时间、抖动波形都是随机的。

不同类型的按键其最长抖动时间也有差别,抖动时间的长短和按键的机械特性有关,一般为5~10 ms,但是,有些按键的抖动时间可达到20 ms,甚至更长。

所以,在具体设计中要具体分析,根据实际情况来调整设计。

2 按键消抖电路的设计按键消抖一般采用硬件和软件消抖两种方法。

硬件消抖是利用电路滤波的原理实现,软件消抖是通过按键延时来实现。

在微机系统中一般都采用软件延时的消抖方法。

在用可编程逻辑器件FPGA/CPLD设计数字系统中,也可以用VHDL语言设计相应的时序和逻辑电路,对按键信号进行处理,同样可以达到消抖目的。

EDA实验五报告

EDA实验五报告

实验五按键消抖和分频器电路设计一、实验目的学习和掌握使用Verilog语言设计按键去抖动电路和分频器的方法二、实验原理分频器就是简单的加法计数器,对于偶数分频和奇数分频应注意其占空比的问题。

当按一次按健时,由于按健有反应时间、有大量的毛刺产生(抖动),可能按一次机器感应到几次。

消抖就是让在按键正常反应时间内机器只感应一次按键效果,防止误操作。

消抖的原理是:当检测到有键按下时,并不认为有键按下,而是等待20ms后,再次判断是否有键按下,若有则认为确实有键按下;若没有则认为上次的按键是误操作。

三、实验内容1.分频器设计:使用实验箱左下角的时钟频率源,编写一段Verilog程序,使led发光管,每隔1S闪烁一次。

程序设计:module clk5M_1s(clk5M,clk1s);input clk5M;output clk1s;parameter i1=4999;parameter i2=999;reg [12:0]t1,t2;reg k;reg clk1s;always @(posedge clk5M)begin //进行5000分频if(t1<=i1) t1<=t1+1'b1; else t1<=1'b0;if(t1==i1) k<=k+1'b1;endalways @(posedge k)begin //进行1000分频if(t2<=i2) t2<=t2+1'b1; else t2<=1'b0;if(t2==i2) clk1s<=clk1s+1'b1;endendmodule分析:选用的时钟频率源为5M,如果产生频率为1Hz的脉冲使led发光管每隔1s亮一次,则共需分频5000000次,因此分频次数超过内部芯片1个计数器所能承受的范围,故需用两个计数器进行两次分频,即程序中所指出的第一次5000分频,第二次1000分频。

FPGA入门系列实验教程——按键消抖控制LED亮灭

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。

详解MCU独立按键消抖:原因、方法统统都有

详解MCU独立按键消抖:原因、方法统统都有

详解MCU独立按键消抖:原因、方法统统都有简单的说,进入了电子,不管是学纯模拟,还是学单片机,像DSP、ARM等处理器,或者是我们的FPGA,一般没有不用到按键的地方(按键:人机交互控制,主要用于对系统的控制,信号的释放等)。

因此在这里,FPGA上应用的按键消抖动,也不得不讲!一、为什么要消抖动在按键被按下的短暂一瞬间,由于硬件上的抖动,往往会产生几毫秒的抖动,在这时候若采集信号,势必导致误操作,甚至系统崩溃;同样,在释放按键的那一刻,硬件上会相应的产生抖动,会产生同样的后果。

因此,在模拟或者数字电路中,我们要避免在最不稳定的时候采集信号进行操作。

对此,一般产用消抖动的原理,其可分为以下三种:(1)延时(2)N次低电平计数(3)低通滤波在数字电路中,一般采用第1、2种方法(后文中将详细介绍)。

二、各种消抖动1、模拟电路按键消抖动对于模拟电路中,一般消抖动用的是电容消抖动或者施密特触发等电路,再次不做具体介绍。

图片2、单片机中按键消抖动对于单片机中的按键消抖动,本节Bingo根据自己当年写过的单片机其中的一个代码来讲解,代码如下所示:unsigned char key_sCAN(void){if(key == 0) //检测到被按下{delay(5); //延时5ms,消抖if(key != 0)retrurn 0; //是抖动,返回退出while(!key1); // 确认被按下,等下释放delay(5); //延时5ms,消抖while(!key1); //确认被释放return 1; //返回按下信号}return 0; //没信号}针对以上代码,消抖动的顺序如下所示:(1)检测到信号(2)延时5ms,消抖动(3)继续检测信号,确认是否被按下a. 是,则开始等待释放b. 否,则返回0,退出(4)延时5ms,消抖动(5)确认,返回按下信号,退出当然,在单片机中也可以循环计数来确认是否被按下。

Bingo认为如此,太耗MCU资源,因此再次不做讲述。

fpga按键消抖的原理和方法

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】实验二:按键模块①-消抖

【⿊⾦原创教程】【FPGA那些事⼉-驱动篇I】实验⼆:按键模块①-消抖实验⼆:按键模块① - 消抖按键消抖实验可谓是经典中的经典,按键消抖实验虽曾在《建模篇》出现过,⽽且还惹来⼀堆⿇烦。

事实上,笔者这是在刁难各位同学,好让对⽅的惯性思维短路⼀下,但是惨遭⼝⽔攻击 ... ⾯对它,笔者宛如被甩的男⼈,对它⼜爱⼜恨。

不管怎么样,如今 I’ll be back,笔者再也不会重复⼀样的悲剧。

按键消抖说傻不傻说难不难。

所谓傻,它因为原理不仅简单(就是延迟⼏下下⽽已),⽽且顺序语⾔(C语⾔)也有⽆数不尽的例⼦。

所谓难,那是因为⼈们很难从单⽚机的思维跳出来 ... 此外,按键消抖也有许多细节未曾被⼈重视,真是让⼈伤⼼。

按键消抖⼀般有3段操作:l 检测电平变化;l 过滤抖动(延迟);l 产⽣有效按键。

假设C语⾔与单⽚机的组合想要检测电平变化,它们⼀般是利⽤if查询或者外部中断。

事后,如果这对组合想要过滤抖动,那么可以借⽤for 延迟的⼒量,⼜或者依赖定时中断产⽣精明的延迟效果。

反观有效案件的产⽣,这对组合视乎⽽外钟情“按下有效”似的 ... 不管怎么样,C语⾔与单⽚机这对组合在处理按键的时候,它们往往会错过⼀些黄⾦。

“黄⾦?”,读者震撼道。

所谓黄⾦时间就是电平发⽣变化那⼀瞬间,还有消抖(延迟)以后那⼀瞬间。

按键按下期间,按键的输⼊电平故会发⽣变化,如果使⽤if查询去检测,结果很容易浪费单⽚机的处理资源,因为单⽚机必须⼀直等待 ... 换之,如果反⽤外部中断,中断寻址也会耽误诺⼲时间。

假设C语⾔与单⽚机这对组合挨过电平检测这起难关,余下的困难却是消抖动作。

如果利⽤for循环实现去消抖,例如 Delay_ms(10) 之类的函数。

For循环不仅计数不紧密,⽽且还会⽩⽩浪费单⽚机的处理资源。

定时中断虽然计数紧密,但是中断触发依然也会产⽣诺⼲的寻址延迟。

补上,所谓寻址延迟是处理器处理中断触发的时候,它要事先保护现场之余,也要寻址中断处理⼊⼝,然后执⾏中断函数,完后回复现场,最后再返回当前的⼯作。

Verilog-按键消抖程序

Verilog-按键消抖程序

按键消抖一、程序(50mhz)modulexiaodou(clk,clr,key1,key2,key3,key4,key5,key_out1,key_out2,key_out3,key_out4,key_ out5);input clk,clr;input key1,key2,key3,key4,key5;output key_out1,key_out2,key_out3,key_out4,key_out5;//-------------------------------------------------reg [4:0] key_rst;reg [4:0] key_rst_n;reg [19:0] cnt;reg [4:0] key_next;reg [4:0] key_next_n;reg d1,d2,d3,d4,d5;wire[4:0] key_flag;wire [4:0] key_out_n;reg [23:0] count1;reg count_flag;always @(posedge clk or negedge clr) //get the fist valuebeginif(!clr)begin key_rst<=5'b11111;endelsebegin key_rst<={key5,key4,key3,key2,key1};endend//---------------------------------------always @(posedge clk or negedge clr) beginif(!clr)begin key_rst_n<=5'b11111;endelsebegin key_rst_n<=key_rst;endend//---------------------------------------- assign key_flag=key_rst_n&(~key_rst); //--------------jishu------------------- always @(posedge clk or negedge clr) beginif(!clr)begin cnt<=20'd0;endelse if(key_flag)begin cnt<=20'b0;endelsebegin cnt<=cnt+1'b1;endend//-----------------20ms after ------------- always @(posedge clk or negedge clr) beginif(!clr)begin key_next<=5'b11111;endelse if(cnt==20'hfffff)beginkey_next<={key5,key4,key3,key2,key1};endend//----------------------------------always @(posedge clk or negedge clr)beginif(!clr)begin key_next_n<=5'b11111;endelsebegin key_next_n<=key_next;endend//-------------------------------------------assign key_out_n=key_next_n&(~key_next);//--------------------------------------always @(posedge clk or negedge clr)beginif(!clr)begin d1<=1'b1;d2<=1'b1;d3<=1'b1;d4<=1'b1;d5<=1'b1;count_flag<=1;endelse //应led止显示一个时钟周期,我们观测不到,begin //此处有个计数延时,目的是led灯显示能够持续一段时间if(key_out_n[0])begin d1<=1'b0;count_flag<=1'b0;endelseif(count1==24'hffffff)begin d1<=1'b1;count_flag<=1;endif(key_out_n[1])begin d2<=1'b0;count_flag<=1'b0;endelseif(count1==24'hffffff)begin d2<=1'b1;count_flag<=1;endif(key_out_n[2])begin d3<=1'b0;count_flag<=1'b0;endelseif(count1==24'hffffff)begin d3<=1'b1;count_flag<=1;endif(key_out_n[3])begin d4<=1'b0;count_flag<=1'b0;endelseif(count1==24'hffffff)begin d4<=1'b1;count_flag<=1;endif(key_out_n[4])begin d5<=1'b0;count_flag<=1'b0;endelseif(count1==24'hffffff)begin d5<=1'b1;count_flag<=1;endendendassign key_out1=d1?1'b1:1'b0;assign key_out2=d2?1'b1:1'b0;assign key_out3=d3?1'b1:1'b0;assign key_out4=d4?1'b1:1'b0;assign key_out5=d5?1'b1:1'b0;always @(posedge clk or negedge clr) //计数延时,具体时间没有计算beginif(!clr)begin count1<=0;endelseif(count_flag==1'b0)begin count1<=count1+1'b1;endelsebegincount1<=0;endendendmodule二、框图。

单片机按键去抖动程序设计思路

单片机按键去抖动程序设计思路

单片机按键去抖动程序设计思路
1.去抖动原理:按键在按下和松开的瞬间会产生震动,导致按键信号在短时间内出现多次转换,给程序带来困扰。

为了解决这个问题,需要对按键信号进行去抖动处理,即在按键按下和松开时,只记录一次按键状态变化。

2.软件去抖动方法:软件去抖动方法主要通过软件延时来判断按键信号是否稳定。

具体来说,可以通过以下步骤实现软件去抖动:-初始化按键引脚为输入模式,并使能内部上拉电阻;
-设定一个延时时间阈值t,用于判断按键是否稳定;
-读取按键引脚的电平,如果为低电平,说明按键按下;
-进入一个循环,每次循环读取一次按键引脚的电平,并与前一次读取的电平进行比较;
-如果连续读取到的电平与前一次相同,说明按键信号稳定;
-如果连续读取到的电平与前一次不同,则说明按键信号还在抖动,继续读取直到连续读取到的电平与前一次相同;
-当稳定的电平持续时间超过延时时间阈值t时,认为按键信号已稳定,可以进行相应的处理。

3. 硬件去抖动方法:硬件去抖动方法主要通过电路设计来实现。

常见的硬件去抖动电路包括RC滤波电路和Schmitt触发器电路。

其中,RC 滤波电路利用电容和电阻的特性,对按键信号进行平滑处理;Schmitt触发器电路则通过正反馈的方式,将不稳定的信号转换为稳定的信号。

这两种方法可以根据实际需求选择。

总结:
按键去抖动程序设计可以通过软件去抖动和硬件去抖动两种方式实现。

软件去抖动主要通过软件延时判断按键信号是否稳定,而硬件去抖动则通
过电路设计实现。

根据具体的应用场景和需求,可以选择适合的方法来设
计按键去抖动程序。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

前几天看了特权同学用Verilog写的按键消抖程序,感觉很经典。

在这里将程序贴出来分享一下。

module lcd_button2(clk,rst,seg,wei,sw1,sw2,sw3,sw4);//按键按下,数码管依次显示0-9input 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 beginnum = 0;endreg[3:0] key_rst;always @(posedge clk or negedge rst)if(!rst)key_rst <= 4'b1111;elsekey_rst <= {sw4,sw3,sw2,sw1};reg[3:0] key_rst_r;always @(posedge clk or negedge rst)if(!rst)key_rst_r <= 4'b111;elsekey_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)if(!rst)low_sw <= 4'b1111;else if(cnt==10'hfffff)low_sw <= {sw4,sw3,sw2,sw1};reg[3:0] low_sw_r;always @(posedge clk or negedge rst)if(!rst)low_sw_r <= 4'b1111;elselow_sw_r <= low_sw;wire [3:0] led_ctrl = low_sw_r[3:0] & (~low_sw[3:0]);reg d1,d2,d3,d4;always @(posedge clk or negedge rst)if(!rst) begind1 <= 0;d2 <= 0;d3 <= 0;d4 <= 0;endelse beginif(led_ctrl[0]) beginnum <= num+1;if(num==9)num <= 0;endendalways @(posedge clk ) beginwei <= 4'b1111;case(num)0: seg <= 8'hfc;1: seg <= 8'h60;2: seg <= 8'hda;3: seg <= 8'hf2;4: seg <= 8'h66;5: seg <= 8'hb6;6: seg <= 8'hbe;7: seg <= 8'he0;8: seg <= 8'hfe;9: seg <= 8'hf6;default: seg <= 8'h02;endcaseendendmodule参考了特权的代码。

/1375/21132.aspx-------------------------------------------------module key_debounce(input i_clk,input i_rst_n,input [4:1] i_key, // 按下为0,松开为1output reg [4:1] o_key_val // 键值);//++++++++++++++++++++++++++++++++++++++reg [4:1] key_samp1, key_samp1_locked;// 将i_key采集至key_samp1always @ (posedge i_clk, negedge i_rst_n)beginif(!i_rst_n)key_samp1 <= 4'hF;elsekey_samp1 <= i_key;end// 将key_samp1锁存至key_samp1_lockedalways @ (posedge i_clk, negedge i_rst_n)beginif(!i_rst_n)key_samp1_locked <= 4'hF;elsekey_samp1_locked <= key_samp1;end//--------------------------------------//++++++++++++++++++++++++++++++++++++++wire [4:1] key_changed1;// 当key_samp1由1变为0时// key_changed1由0变为1,且维持一个时钟周期assign key_changed1 = key_samp1_locked & (~key_samp1);//--------------------------------------//++++++++++++++++++++++++++++++++++++++reg [19:0] cnt;// 一旦有按键按下,cnt立即被清零always @ (posedge i_clk, negedge i_rst_n)beginif(!i_rst_n)cnt <= 20'h0;else if(key_changed1)cnt <= 20'h0;elsecnt <= cnt + 1'b1;end//--------------------------------------//++++++++++++++++++++++++++++++++++++++reg [4:1] key_samp2, key_samp2_locked;// 只有当按键不变化(不抖动),且维持20ms以上时// 才将i_key采集至key_samp2always @ (posedge i_clk, negedge i_rst_n)beginif(!i_rst_n)key_samp2 <= 4'hF;else if(cnt == 20'hF_FFFF) // 0xFFFFF/50M = 20.9715ms key_samp2 <= i_key;end// 将key_samp2锁存至key_samp2_lockedalways @ (posedge i_clk, negedge i_rst_n)beginif(!i_rst_n)key_samp2_locked <= 4'hF;elsekey_samp2_locked <= key_samp2;end//--------------------------------------//++++++++++++++++++++++++++++++++++++++wire [4:1] key_changed2;// 当key_samp2由1变为0时// key_changed2由0变为1,且维持一个时钟周期assign key_changed2 = key_samp2_locked & (~key_samp2); //--------------------------------------//++++++++++++++++++++++++++++++++++++++// 每次按键稳定后,都将键值取反always @ (posedge i_clk, negedge i_rst_n)beginif(!i_rst_n)o_key_val <= 4'hF;elsebeginif(key_changed2[1])o_key_val[1] <= ~o_key_val[1];if(key_changed2[2])o_key_val[2] <= ~o_key_val[2];if(key_changed2[3])o_key_val[3] <= ~o_key_val[3];if(key_changed2[4])o_key_val[4] <= ~o_key_val[4];endend//--------------------------------------endmodulemodule debounce(clk,rst_n,key_i,key_o);input clk;input rst_n;input key_i;output key_o;reg key_o;wire key;wire clk_slow;//分频电路reg [22:0] cnt;reg [25:0] cnt_out;wire key_o_reg ;always @ ( posedge clk or negedge rst_n )if ( !rst_n )cnt <= 23'd0;elsecnt <= cnt + 1'b1;assign clk_slow = cnt[22];//防反跳电路reg temp_r [2:0];reg key_r;integer i;always @ ( posedge clk_slow or negedge rst_n )if ( !rst_n )beginfor ( i = 0 ; i < 3; i = i+ 1)temp_r[i] <= 'd0;endelsebegintemp_r[0] <= key_i;temp_r[1] <= temp_r[0];temp_r[2] <= temp_r[1];endassign key = (~temp_r[0]) & temp_r[1] & temp_r[2]; // 防抖动电路always @ ( posedge clk or negedge rst_n )if ( !rst_n )key_r <= 1'b0;elsekey_r <= key;assign key_o_reg = key & (~key_r);/*always @ ( posedge clk or negedge rst_n )if( !rst_n )key_o <= 1'b0 ;elsebeginif( cnt_out<='d3******* )beginif( cnt_out=='d0 )beginif( key_o_reg )begincnt_out <= 'd1 ;key_o <= 1'b1 ;endelsebegincnt_out <= 'd0 ;key_o <= 1'b0 ;endendelsecnt_out <= cnt_out + 'd1 ;endelsecnt_out <= 'd0 ;end*/endmodule/bbs/bbs_content.jsp?bbs_sn=3870307&bbs_id=1029。

相关文档
最新文档