为什么“异步复位同步释放”的时候要用2级寄存器?

2020-02-24 20:31发布

最近在看代码的时候遇到异步复位同步释放的问题,代码里实现的方法如下:
  1. reg rst1, rst2;
  2. wire rst_n_delay;
  3. always @(posedge clk or negedge rst_n)
  4. if(!rst_n)
  5. begin
  6. rst1 <= 1'b0;
  7. rst2 <= 1'b0;
  8. end
  9. else
  10. begin
  11. rst1 <= 1'b1;
  12. rst2 <= rst1;
  13. end
复制代码异步复位是没有疑问的,但是为什么要经过2级的触发器才输出复位信号呢?第一级输出不可以吗?上网找了一下,都是说亚稳态的问题,但是始终看不明白为什么第二级就消除了亚稳态。第二级不就是比第一级延长了一个周期吗?如果第一级存在亚稳态,那么延长一个周期之后这个亚稳态不是也会影响到第二级输出吗?
求解。


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
13条回答
seaundersky
2020-02-25 18:39
回头看到自己发的帖子,发现还是有点问题没有解释清楚。
首先,这里亚稳态的产生是由于reset端在clk上升沿发生时刚好发生变化,这时无法确定reset为高还是低,因此输出不稳定。
我之前一直想不清楚的是为什么后面的寄存器也用了相同的reset端,为什么就不会发生亚稳态。
后来发现原来在reset端变化时第二个寄存器的输入为0,也就是无论reset端为0或1,输出都是0,因此不会有亚稳态的情况产生。
至于为什么输入为0,可以看下图,主要是因为输出相对输入延时。
无标题.png
从图中可以看到,因为通过利用输出相对输入的延时来避过亚稳态。最终rst2相对rst会延时1~2个周期。

一周热门 更多>