一 亚稳态
亚稳态的产生是由于寄存器采样不满足建立时间或保持时间要求导致的,亚稳态的产生是无法避免的,我们能做的只是想办法降低其发生的频率。在跨时钟域设计中,由于时钟域存在跨域,如果不采取手段,则会有很大概率会引入亚稳态。
今天看了亚稳态这一章,感觉印象最深刻的是,它对应的是异步的处理,也就是发送的寄存器的时钟是一个,接收寄存器的时钟是另外一个。
1 单bit的信号
如果是一个单比特的信号,那么可以通过让接收寄存器的从一个变成两个级联,这样的话在第二个时钟域就有两拍可以完成,相当于哪怕第一拍出现亚稳态没采上信号,第二拍大概率可以采上了。
(下图黑框里的部分,专业名称是双触发器同步器,也可以叫级联触发器构成的同步链,英文名称two flip-flop synchronizer)
在代码中需要用到 ASYNC_REG这个综合属性:
ASYNC_REG用于单bit信号采用双(或多)触发器实现异步跨时钟域的场合,此时所有用于同步的触发器都要标记ASYNC_REG。标记方式为:
(* ASYNC_REG = “TRUE” *) reg sync_0, sync_1;
目的是告诉综合工具布线时将这2个寄存器放在一起(即同一个SLICE中),从而减少线延迟对时序的影响。
2 多bit的信号
如果是多比特的数据的话,那就必须得用 FIFO 了。其实我在实际经验中会用到 FIFO 处理跨时钟域的视频数据,是多比特的,以前不明白这个点没有考虑太多,原来最根本的就是时钟异步的处理,就防止有这种亚稳态。
在亚稳态的这一章里面还有一个平均无故障时间MTBF,公式推导完就可以发现,就是接收触发器的接收时钟频率越大,还有同步链中第一个寄存器,他的接收到的异步信号的翻转率越大(传输的那个数据 D 变化快),就可以降低MTBF。