微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 亚稳态疑惑?请高手指点。

亚稳态疑惑?请高手指点。

时间:10-02 整理:3721RD 点击:
通过两级寄存器,能减少亚稳态发生的概率。
那么问题是了,是因为第一级到第二级中间隔了1个周期的时间,(或者是半个周期),这个时间足够稳定了下来,所以相当于第二级采到的一个稳定的数据?
还是因为说,跟这个时间关系不大,即使第二级的输入处于亚稳态,还是可以输出稳定的数据。

准确地说,打2拍是防止亚稳态扩散,而不是降低亚稳态发生概率。
你说的前者是对的。后一拍是为了让前一拍采到的亚稳态有足够长的时间变成稳态。


   多谢。
   那按你的说法,其实,没必要两级寄存器啊(因为用两级能稳定,说明一个周期内就可以稳定了)。
    那么,用一级寄存器同样可以满足,反正第二个周期来的时候,已经稳定了。



    两拍出去的信号才能用来做逻辑计算。有的时候两拍还不够,需要3拍 4拍

一般要求是至少抓两拍后的信号才能使用,相比设计健壮性而言,省这一个DFF完全不值得。



  如果你不打第二拍,直接给别的组合逻辑用,那延迟就是组合逻辑延迟+亚稳态稳定时间,这个总延迟有很大概率会超过时钟周期,特别是对于大的组合逻辑。

小编你考虑过多bit的情况没



   再请教一个问题, 这样子有问题吗?  因为d_re 用了第一级寄存器的输出, 虽然在真正使用d_re的时候,又打了一拍。 谢谢   always @(posedge clk or negedge rstn)
   begin
       if (!rstn) begin
           d1 <= 0;
           d2 <= 0;
       end
       else begin
           d1 <= d;
           d2 <= d1;
       end
   end
   assign d_re = d1 & ~d2;
    always @(posedge clk or negedge rstn)
    begin
         if (!rstn) begin
              test <= 0;
         end
         begin
              if (d_re) begin
                  test <= 1;
              end
         end
    end


按我受到的教育,这样是不允许的。
应该把d2再打一拍变成d3,用d2和d3去做逻辑。



   知道理由吗?  我的勉强理解是,d2能稳定输出,说明一拍后,d1已经稳定下来。  做了个简单的逻辑,如上面例子,应该是问题不大。
     若是逻辑比较大,d1要稳定下来还需要+ 组合逻辑的时间,就有可能大于一个周期,你觉得呢?

路过。谢谢小编



   你写的这个RTL,如果d来自于另外一个时钟域,抓两拍后的信号才能使用,应该使用d2和d3产生clk域下的逻辑,d1还不能使用。而且,d必须是另一个时钟域的寄存器输出信号,不能是组合逻辑输出。



如果是d变化后1个时钟,即已经同步给d1,但还没同步给d2的时候呢?
d2也是稳定的呀,但d1可能有亚稳态,和d2做了逻辑会增长亚稳态的稳定时间。

同步时钟域 不需要打拍处理,所以你的代码没有任何影响;
亚稳态存在于跨时钟域,影响表征为 在后级组合逻辑上产生的结果在统计学上的随机性,打拍仅仅是为了过滤掉这种随机性;但并不代表采集到经过打拍后的信号状态就一定是期望的状态,其取决于前级信号在稳定后达到的状态;所以依然需要相应的处理逻辑配合;
多bit位常见于跨时钟域FIFO,此时会使用格雷码将多bit转换为对一bit信号的亚稳态处理;


再请教个问题:跨时钟域,默认都是需要两级寄存器,在第一级到第二级中间,有1个周期时间来让亚稳态稳定下来,减少亚稳态都后续电路的影响。
经典的时钟切换电路中,也是需要两级寄存器进行同步,但是,发现是前级采用上升沿,后级采用下降呀,或者是前级采用下降沿,后级采用上升沿,这样的话,不就只有半个周期的时间让亚稳态稳定下来,这样子没问题吗?

亚稳态不可能完全解决,只能把发生概率降低到一个可以接受的程度

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top