异步信号边沿检测电路该如何实现呢?

所谓边沿检测(又叫沿提取),就是检测输入信号的上升沿和下降沿。在设计数字系统时,边沿检测是一种很重要的思想,实际编程时用的最多的时序     电路   应该就是边沿检测电路和分频电路了。

那么,边沿检测电路该如何实现呢?

我们知道,在always块的敏感信号列表中可以直接用posedge和negedge来提取上升沿和下降沿,但是如果要在always程序块的内部检测上升沿或者下降沿呢?还是用poesedge和negedge吗?显然是不可以的,因为这样的语句不可综合,我在     Quartus   II中尝试了,编译时提示 ”mul     ti   ple event control sta     te   ments not supported for synthesis !“,意思就是不可综合。实际上,posedge和negedge只能用在always块的敏感信号列表中或者testbench中,所以我们还是通过其他的办法来实现吧。

要实现边沿检测,最直接的想法是用两级     寄存器   ,第二级寄存器     锁   存住某个     时钟   上升沿到来时的输入电平,第一级寄存器锁存住下一个时钟沿到来时的输入电平,如果这两个寄存器锁存住的电平信号不同,就说明检测到了边沿,具体是上升沿还是下降沿可以通过组合逻辑来实现。如下图所示:

 异步信号边沿检测电路该如何实现呢?_设计制作_制造/封装

图1  用两级寄存器实现边沿检测

上图使用 block 图表示的,也可以用     verilog   编写出来,代码如下:

//边沿检测电路 //2014/12/10 module edge_cap (     input clk, rst_n,     input pulse,          output pos_edge,     output neg_edge      ); reg pulse_r1, pulse_r2; always @ (posedge clk or negedge rst_n)if(!rst_n)      begin     pulse_r1 <= 1'b0;     pulse_r2 <= 1'b0;     end else      begin     pulse_r1 <= pulse;     pulse_r2 <= pulse_r1;     end      assign pos_edge = (pulse_r1 && ~pulse_r2) ?1:0; assign neg_edge = (~pulse_r1 && pulse_r2) ?1:0;  endmodule

当检测到上升沿时, pos_edge信号输出一个时钟周期的高电平; 检测到下降沿时,neg_edge输出一个时钟周期的高电平。

乍一看,这个电路似乎很简单地实现了边沿检测的功能,但是仔细分析就可以发现这种方法存在一个潜在的风险:当待测信号pulse是一个异步信号时,输出可能是亚稳态,如果pulse信号的变化刚好发生在clk时钟的建立时间和保持时间之内,那么第一级寄存器的输出 pulse_r1 就会进入亚稳态,而pulse_r1的亚稳态会立即传递给pos_edge和neg_edge信号,从而使得整个电路的输出进入亚稳态,进而影响下一级电路的正常工作,甚至导致整个系统崩溃!

因此,在进行异步信号边沿提取时,不能直接使用上面的这种电路,而应该先将异步信号同步化,一般采用多加一级寄存器的方法来减小亚稳态的发生概率,如下图所示:

 异步信号边沿检测电路该如何实现呢?_设计制作_制造/封装

图2  异步信号边沿检测

也可以用verilog编写出来,代码如下:

//异步信号边沿检测电路,三级寄存器实现 //2014/12/08 module edge_cap (     input clk, rst_n,     input pulse,          output pos_edge,     output neg_edge      ); reg pulse_r1, pulse_r2, pulse_r3; always @ (posedge clk or negedge rst_n) if(!rst_n)      begin     pulse_r1 <= 1'b0;     pulse_r2 <= 1'b0;     pulse_r3 <= 1'b0;     end else      begin     pulse_r1 <= pulse;     pulse_r2 <= pulse_r1;     pulse_r3 <= pulse_r2;     end      assign pos_edge = (pulse_r2 && ~pulse_r3) ?1:0; assign neg_edge = (~pulse_r2 && pulse_r3) ?1:0;  endmodule

经过这样的同步处理后, 可以大大减小电路进入亚稳态的概率,如果第一级寄存器进入了亚稳态,一般也会在一个clk周期内稳定下来(可能稳定为0也可能稳定为1),如下图所示:

 异步信号边沿检测电路该如何实现呢?_设计制作_制造/封装

图中pulse信号的改变刚好发生在 clk 的建立时间和保持时间之内,因而第一级寄存器的输出pulse_r1可能会进入亚稳态,图中Tco为第一级寄存器pulse_r1的状态建立时间(即clock to output),一般情况下,亚稳态的决断时间(即从进入亚稳态到稳定下来的时间)不会超过一个时钟周期,因此在下一个clk上升沿到来之前,pulse_r1已经稳定下来(可能稳定到0也可能稳定到1),这样第二级寄存器就会采集到一个稳定的状态,从而把亚稳态限制在第二级寄存器之前,保证了整个电路输出的稳定性。

综上所述,在异步信号边沿检测电路中,至少需要采用三级寄存器来实现,在对系统稳定性要求较高的数字系统中,可以采用更多级的寄存器来减小亚稳态发生概率,提高系统稳定性。

18
54
0
35

相关资讯

  1. 1、连夺2周全球冠军,票房破3.8亿美金,真正的好莱坞大片来了2387
  2. 2、给喜欢孙红雷的朋友推荐几部孙红雷主演的评分高电影4044
  3. 3、影后朱丽安摩尔主演《美声》曝中字预告1935
  4. 4、《诡拼车》11月8日映启动“万里诡拼车”活动3041
  5. 5、你更喜欢有精英气质的职场剧还是乡土气息浓厚的乡村剧?4164
  6. 6、全程高能太刺激,这部19禁新剧一集比一集带劲2571
  7. 7、《七月与安生》首发动物系海报沈月陈都灵成“海系”姐妹花4371
  8. 8、《爱情从告白开始》开播卓文萱演绎迷糊女孩1392
  9. 9、她出道十年成“烂片女王”,从明星到网红,一直不温不火2022
  10. 10、《大江大河2》叙写时代变迁“和光同尘”精神再奏鸣682
全部评论(0)
我也有话说
0
收藏
点赞
顶部