跨时钟域同步问题(二)

flop synchronizer(打两拍)

对于sigle bit lever signal(单比特信号),可以用两级flop来同步目标域信号,即俗称的打两拍。
image

如果当bclk信号的上升沿刚好采到了adata的变化沿上,此时bdata0会出现metastable,而如果在下一上升沿到来时,用bdata再去采bdata0的值,在绝大多数时候第二级D所采到的会是上一级Q的一个稳定值。

注意打两拍并不能完全保证不出现metastable,单考虑到MTBF(mean time between false)只要经过评估后这项指标够大,我们就可以认为是可以接受的。
image

如果实在不放心那么最简单粗暴的方法就是打三拍。但flop synchronizer并不是一个对待单比特信号的万能方法。

比如在对待频率大于bclk的pulse(脉冲信号)时,很可能还是会把该信号给直接漏掉。还有另外一种情况是,尽管通过打两拍最终获得了一个稳定信号,但是稳定结果和原信号相反

因此面对这样的情况时,我们就对double flop提出了“三个沿”的要求。即源信号必须在稳定状态下至少经过目标时钟的三个沿。

image

所以如果bclk频率是aclk的1.5倍以上,也可以保证3edge的要求。如果没有这样的频率关系,那么对于adata就有了额外的要求。一般情况下也许我们并不需要获得这样一个脉冲信号。

那么经过设计分析后,我们如果对于短时脉冲信号仍有抓取的需求,此时我们就通过反馈来获知源信号。其中一个办法是利用反馈,即对于源信号的每次反转,都同步到bclk域,在采集成功以后,再同步回aclk,aclk的data只有在看到同步回来的值以后才能进行翻转。

image

这样的代价就是我们将aclk的data进行了扩展,两次同步也增加了延时。在大多数时候。adata的频率没有那么高时,我们就不需要设计反馈电路。

同时,对于尽管通过打两拍最终获得了一个稳定信号,但是稳定结果和原信号相反的情况,如果按照3edge原则进行设计,正确的bdata出现的时间可能会是在adata发生翻转后的两个bclk周期以后。因此在设计和仿真时不能直接假定真bdata出现的时刻,可能会出现问题。

最后,我们所说的单比特信号在跨时钟域之前一定是通过了一个flop之后的,直接通过组合逻辑运算过的输出直接来打两拍也会出问题,因为组合逻辑输出会有毛刺,会增大第一级flop产生metastabe的概率,进而影响整个MTBF。

posted @ 2021-03-23 16:17  disagreements  阅读(331)  评论(0)    收藏  举报