亚稳态&MTBF&同步器&AFIFO

因为分析时理想化了输出特性曲线,认为0到1的翻转瞬间完成“突变”,但实际上变化有一个过程。高于VH才算1,低于VL才算0,中间的既不是1也不是0。如果输入信号刚好在寄存器不能判断的区间,那么输出就不能判断是0还是1,即亚稳态。(边沿采样边沿,数据不满足建立时间or保持时间)。

MTBFmean time between failure 平均故障间隔时间:从问题出现并导致故障的两个事件的之间的平均时间。越高越稳定。

不考虑器件本身的影响,对同一个触发器,数据变化频率越小,采样时钟越低,MTBF越大。

减少亚稳态的方法:

1.2级同步器

2.降低频率

3.避免变化过快或频繁的信号进行跨时钟域采样

4.采用更快的触发器(需要的建立时间和保持时间更短)

两级同步器无法避免亚稳态传播的情况:

两级同步器能够起作用的原因是:亚稳态在第二个周期最终会稳定下来,如果:

1.暂稳态维持时间不止一个周期,在下一个时钟上升沿的建立时间之前没有稳定,则第二级的触发器也会进入亚稳态。这种情况的概率是:1/MTBF

2.第一级亚稳态在下一个时钟上升沿之前稳定但是稳定为错误的值(比如要传递1,结果稳定为0),则亚稳态虽然不会传播下去但是引起了采样错误。

采用同步器的另外一个要求:

需要跨时钟域的信号,需要是源时钟域的寄存器输出,中间不能有组合逻辑。

组合逻辑毛刺变化太快,减小MTBF,这会增加亚稳态出现的概率

异步fifo:

介绍fifo可以从几个block下手,双端口RAM(随机存取存储器),写逻辑负责产生写信号和地址,读逻辑负责产生读信号和地址,地址比较负责产生空满标志。

空满判断:在写时钟域的地址比较用于产生写满信号,在读时钟域的地址比较用于产生读空信号。

地址传递要将二进制转换为格雷码进行传递,因为格雷码相邻两个只有一位发生变化能够避免亚稳态的传播。

二进制转格雷码:将二进制数向右移动一位再与原来的二进制数按位异或

格雷码转二进制码:最简单是使用loop的形式。

for(i=0,i<格雷码位数,i=i--)

bin[i] = ^(gray[格雷码位数,i])

 地址的比较:通常fifo为了防止读写溢出,一般都会增加一个额外的MSB,为了判断地址是否经过回卷。

通过比较地址判断空满,如果是二进制地址,地址每一位都相同表示读空;如果最高位不同,低3位相同表示写满。

如果是格雷码地址,格雷码地址发生回卷后,最高两位恰好是不回卷的反;根据这个特点,如果地址的每一位都相同表示读空,如果读地址的最高两位取反后和写地址相同表示写满。

 将空和将满:实质上是更加保守的空信号和满信号。当读写地址之间的间隔小于等于某一个间隔值就产生将空将满信号。

此时要注意格雷码地址不能用于计算间隔,所以要将格雷码转换成二进制码。

写地址减去读地址的差值小于等于间隔就表示将空。读时钟域产生将空信号。

对于将满信号,最高位相同,低3位读地址减去写地址再加上fifo深度 小于等于间隔产生将满信号

         最高位不同,低3位读地址减去写地址 小于等于间隔产生将满信号

原文地址:https://www.cnblogs.com/zhanghaha-zzz/p/12924732.html