MamBa_24 发表于 2014-3-23 10:33:13

第二章 何为脉冲边沿检测法(更新)

首先要说一下脉冲边沿检测法的应用:
捕获信号的突变(按键捕获,SDRAM响应标志捕获等)
这里要先说一下按键消抖时所用到的脉冲边沿检测法,如图所示:


上两图是三个按键时做的一个脉冲边沿检测,一个是代码,一个是RTL视图。注意:按键是低电平有效,所以复位时,等于3’b111。
为了防止触发信号(sw_n)的波动,消除抖动,加上几级触发器,使信号更稳定,这里我加了两级的触发器。
当一个按键触发按下时,如从111111...到111000...再到松开按键111000...111...正如第一幅图所示,有按键被按下了,不管你按下多长时间,我就会检测到按键有被按下的状态,这时该如何用代码来表示呢?就是用这个脉冲边沿检测法,来采集到信号被触发的那一刻,即从1变0的过程。有了这个标志,接下来要做的就是剔除消抖,一般按键的抖动时间大约为20ms,就用计数器计数到20ms的时候,key_an为1‘b1,计数清零。
还有一点你们常常会听到打慢一拍同步,究竟是一个啥意思?就是用触发器锁存一下,打慢一拍就是用一个触发器,打慢两拍就是用两级触发器,如此类推...
以下是我做项目时用到的脉冲边沿检测法,如图所示:


简单的说一下,这里我是想捕获SDRAM的写响应完成标志,做了两级的触发器锁存,相信大家看了按键消抖这部分时,已经对脉冲边沿检测有了一个很高的认识,这是对以后编写自己模块时用到的一个算是思想吧,不错,挺管用。
注意:最后一幅图是两级的触发器,经过优化,RTL视图显示为一个,其实是两个的。由此,你可以想象一下,为什么他要优化,省略了一个触发器,其实你用三个或更多的触发器作为锁存,他都会帮你优化成为一个而已,这个就是我上面所说的,你可以用几级触发器,为了信号的稳定,建议用多个。
更新点:
为了让大家更能够理解和明白脉冲边沿检测法,我对上面捕获SDRAM的写响应完成标志sdram_rd_ack做了详细的说明。其实并不是所有标志信号都要用脉冲边沿检测法,这里所说的标志信号是有可能产生连续的信号时,例如我这个sdram_rd_ack在另外一个模块是这样定义的,如图所示:


为什么说他是连续的信号呢?也就是用数学的方式解答为他在一定范围内连续,如本来是高电平111111......,然后遇到逻辑判断产生低电平111111000111111......这时,我只是想捕获他出现低电平时那个变化的信号,就可以用这个脉冲边沿检测法来捕获,这里原理跟按键消抖同出一辙,只是换了环境,换了方式表达而已。再或者极端的话,就出现如1111110111111......我的意图也是想捕获这个跳变的信号也可以用到这种方法。但是我要强调的一点是,他已经能成为这个你想捕获到的那个信号时,就不要再用脉冲边沿检测法了,这是多余的,如图所示:


这个标志信号也是另外一个模块送过来的,他本身就是你要捕获的那个信号,通俗的话就是说,他已经就是一个点了,是某一个时间点出现的一种情况,不是一段连续信号,这个你懂我的意思吗?

cxhy 发表于 2014-3-23 20:26:54

很仔细的读了楼主的帖子,有一点看不懂,想向楼主请教一下。楼主的按键检测代码的实现过程我已经都明白了。但是我不明白为什么要输出一个key_an信号,这个信号是怎么反应三个按键的状态的?

zcy0517 发表于 2014-3-23 20:48:15

谢谢楼主分享{:smile:}

MamBa_24 发表于 2014-3-23 23:04:23

cxhy 发表于 2014-3-23 20:26
很仔细的读了楼主的帖子,有一点看不懂,想向楼主请教一下。楼主的按键检测代码的实现过程我已经都明白了。 ...

key_an是反映一个按键的,不是三个按键,你理解错了吗?就是你不按时111...再按着是变成111000...再放手时,又变成111000000111...这个key_an就是检测到你按下的那一刻

MamBa_24 发表于 2014-3-23 23:04:50

zcy0517 发表于 2014-3-23 20:48
谢谢楼主分享

{:handshake:} 一起学习,一起玩转FPGA
页: [1]
查看完整版本: 第二章 何为脉冲边沿检测法(更新)