尖峰脉冲是电路设计中非常重要的一种信号,很多大型设计中模块间的级联握手信号一般都会使用尖峰脉冲,正确的应用尖峰脉冲信号,可以有效的减少系统的逻辑冗余,提高系统稳定性和执行效率。
本节中,我们就来学习如何利用尖峰脉冲来实现按键消抖。
现在我们来设计一个实验,项目需求如下:
用一个按键控制数码管显示,数码管显示的数值为按键的次数,每按一次按键,数码管显示的数值加一,数值从0-F循环显示。
由于数码管在之前的章节中已经有很详细的论述,所以这里我们忽略数码管驱动部分,把注意力放在按键次数的累加模块。说到这里,很多人的脑海中可能会出现下述代码。
部分Verilog 设计
这里的思路就是如果检测到按键变为低电平,则说明有按键按下,然后就开始计数累加。这是最容易首先想到的一种错误方式,假设我们按键按下的时间特别长,那么key_in就会一直保持为低电平,我们的sum计数值也就会因此而不断累加。这与我们按键一次,计数值加一的目标是不相符的,而且这种方式并不能处理电路中遇到的抖动。
那么,我们该如何是好?分析上述电路,我们发现计数值不断累积加的原因在于每次按键按下,key_in都会保持多个周期的低电平。那么我们是否能产生这样一个信号呢?—每次按键按下,不管按键时间如何,该信号能且仅能维持一个时钟周期的高电平。如果可以产生出这样的尖峰脉冲,那么我们就可以实现每次按键,计数值加一。
为了证实这种想法的可行性,接下来我们设计系统结构如下:
设计系统结构
系统结构说明:当检测到按键按下,为了防止抖动,我们启动延时计数,如果按键保持低电平的时间足够长,那么计数值一定会满足我们设置好的延时条件,否则计数清零,等待下次按键到来。如果延时计数满足条件,说明确定有按键按下,那么我们就可以输出一个尖峰脉冲,从而控制sum累加。
具体代码如下:
Verilog 1-11
Verilog 1-12
编写测试代码如下:
Verilog 1-13 测试代码
仿真波形如下:
仿真结果波形
由上述波形可以看出,当按键按下以后,计数器首先开始延时计数,计数满足以后,才会输出一个时钟周期的尖峰脉冲,而按键次数寄存器sum也会在尖峰脉冲的作用下开始累加。每次按键按下,只可能出现一次尖峰脉冲,说明我们的设计正确。