大家一起来讨论下亚稳态的问题吧
采用同步寄存器链的方法可以消除亚稳态,但是亚稳态最终稳定在0或者1上并不是由输入决定,它和各种因素有关,是个随机值。也就是说同步寄存器链对于亚稳态也不能保证逻辑上的正确。只能最大限度消除亚稳态的传递。是这样吗?
不对。如果你说的同步寄存器是指两个寄存器串联在一起,那么其输出是确定的。换句话说,输入是1,两个锁存之后,输出是1;输入是0,两个锁存之后,输出是0.
亚稳态是发生在第一个锁存器之后,第二个锁存器之后发生亚稳态的概率是几万年一次。
即使概率很小,但是也是会发生的吧。如果第一个寄存器采样发生了沿打沿的问题,出现了亚稳态。第一个寄存器输出值在一段时间内发生变化,但是这个值最后稳定在0还是1,恐怕是没法确定的吧。
对的,从理论上来说,概率没有办法降到0,这里面有个概念叫平均失效时间(MTBF=1/FailureRate),和触发器本身的电气特性和器件工作频率有关,两级触发器同步可以使这个参数变得很大,使得出现亚稳态的概率大大降低。
更多可以看看这本书的第一章《The Art of Hardware Architecture》
http://bbs.eetop.cn/viewthread.php?tid=345638&extra=&highlight=the%2Bart%2Bof%2Bhardware&page=1
你说的是对的,两级寄存器的作用主要是最大限度的消除亚稳态的传递,在第一级寄存器发生亚稳态时,第二级寄存器的输出是不确定的。所以单纯的用两级寄存器的方式处理亚稳态问题,需要保证信号脉冲周期比采样时钟周期大;
http://bbs.eetop.cn/thread-318374-1-1.html
这个讨论的很好。我也学习了。
下面是一段引用:
“有用的 亚稳态有个特点是可以传播。也就是说,如果只打一拍,那么很可能将一个不确定的状态传到logic的下一级。要是打两拍的话,第二拍出现亚稳态的概率将会非常的小,这样就会减少亚稳态的传播。
至于“经过resolution time之后Q端将稳定到0或1上,但是究竟是0还是1,是随机的,与输入没有必然的关系”,举个例子,如果原clk的data由0--->1,在第二拍DFF首次接收第一拍DFF的data的时候,可能接收到0,也可能接收到1.不过都没有关系。如果这时候接收到1,就说明catch到了新的data,如果这时候catch到了0,也没有关系,下一个clock肯定就会catch到1。做跨时钟的时候,就像楼上说的,要靠协议来保障提前或者落后catch新的数据应该OK,不会对logic造成影响.”
是的。
两级同步只能保证亚稳态不会继续传播下去,它只保证(或者说,基本上能保证)最终的逻辑值是稳定的,但是不能保证最终得到的逻辑值一定是正确的。
如果你的应用对这个错误比较敏感,那么可以采取别的方式加以处理,例如异步FIFO
各位大侠,学习了,其实我还有一个观点,就是亚稳态出现时是因为跨时钟域的时序违例,也就是说,采到的这个数据本身是没有意义的,不管他是稳定在0还是稳定在1,都是没有意义的。这个东西从它出身就注定它是个异类,他就不属于逻辑正确和逻辑错误,他就是一个不一定。关键就是防止这个不一定传递下去。
一个只存在于教科书上的问题,实际中很难碰到。
亚稳态要处理的是2个:
1)为防止亚稳态一级一级的传播下去,应该采用同步器。以降低产生亚稳态的概率
2)同步器虽然降低了亚稳态产生的概率,但是不能保证逻辑上输出正确的逻辑值。因此一般需要被同步的信号比同步器时钟周期要长,以保证在第二次采样时候能正确采到逻辑值。
正解。举个例子:
用20MHz的时钟去采样一个脉冲信号,用打两拍的方式消除亚稳态,有两种情况(假设两种情况下,第一级DFF均发生了亚稳态):
1)脉冲信号的脉宽为5ns,因为脉宽太窄,第二级DFF采样错误的概率为50%(即漏掉这个脉冲信号的概率为50%)
2)脉冲信号的脉宽为15ns,因为至少可以采样三次,即使第一次出现了亚稳态,导致后面数据错误,但第二、三次会大概率的采样正确(即漏掉这个脉冲信号的概率极低)
upsingmen正解。举个例子:
用20MHz的时钟去采样一个脉冲信号,用打两拍的方式消除亚稳态,有两种情况(假设两种情况下,第一级DFF均发生了亚稳态):
1)脉冲信号的脉宽为5ns,因为脉宽太窄,第二级DFF采样错误的概率为50%(即漏掉这个脉冲信号的概率为50%)
2)脉冲信号的脉宽为15ns,因为至少可以采样三次,即使第一次出现了亚稳态,导致后面数据错误,但第二、三次会大概率的采样正确(即漏掉这个脉冲信号的概率极低)
误差是一个始终周期,可能前一个,也可能后一个
200M
