异步复位释放时导致亚稳态问题的触发原因

描述

上周一个学员做FPGA项目,用异步复位控制一组触发器。仿真跑了一百遍都没问题,上板子之后偶发性地出现几个触发器输出"卡死"的状态——拿ILA抓波形一看,复位释放沿刚好落在时钟上升沿附近,触发了亚稳态。 他跑去网上查资料,越查越懵:有人说"异步复位释放必然导致亚稳态",有人说"只要复位脉冲够宽就没事",还有人说"异步复位根本不会产生亚稳态"。 到底谁说的对?

亚稳态到底怎么产生的

说白了,触发器在时钟沿采样的时候,输入数据必须已经稳定。如果数据正在跳变的过程中被时钟沿"抓住",触发器就不知道该输出0还是1,进入一个既不是0也不是1的悬浮状态。 这个悬浮状态会持续一小段时间(叫亚稳态分辨时间),可能自己恢复到稳定的0或1,也可能导致后级逻辑采到错误值。

异步复位

复位释放沿与时钟上升沿的相位关系,决定了是否触发亚稳态

异步复位释放为什么会触发亚稳态

问题出在"释放"这个动作上。 异步复位信号是异步的,和系统时钟之间没有固定的相位关系。当复位释放沿到来时,如果恰好落在某个触发器时钟上升沿附近(落在建立时间或保持时间窗口内),这个触发器在复位释放后第一次采样数据,输入可能还不稳定。 但要注意一件事:不是每次异步复位释放都会出亚稳态。只有释放沿和时钟沿"撞车"的时候才会出问题。这也是为什么仿真跑一百次都看不到,上板子却偶尔翻车——概率事件。

网上的三种说法

"异步复位必然导致亚稳态"——不对。只有释放沿和时钟沿足够接近时才可能发生。 "异步复位不会产生亚稳态"——也不对。确实存在风险,只是概率不高。 "复位脉冲够宽就没事"——这个说了一半。复位脉冲宽度影响的是复位能否可靠生效,跟释放时刻的亚稳态是两码事。

工程上怎么做:异步复位+同步释放

业界公认最稳的做法:复位信号异步拉低所有触发器(保证快速复位),但释放信号通过两级触发器同步到目标时钟域。

异步复位

两级触发器同步释放结构,Xilinx和Intel官方文档均有推荐

原理不复杂:复位信号从异步路径进入目标时钟域时,第一级触发器可能进入亚稳态,但第二级触发器在下一个时钟沿再次采样,等于给第一级留了整整一个时钟周期的分辨时间。经过两级同步,亚稳态传播到后级逻辑的概率降到极低。 这个结构在Xilinx和Intel的官方文档里都有明确推荐,做FPGA的基本都会用。

实战中容易忽略的几点

1. 同步释放的两级触发器必须放在同一个时钟域,布局布线时尽量靠近

2. 复位信号的扇出不要太大,扇出大会增加skew,拉低同步效果

3. 多时钟域系统里,每个时钟域都需要独立的同步释放链路,不能共用

4. 复位释放后的第一个数据周期,关键路径的时序约束要额外检查

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分