saber酱的抱枕

生于忧患,死于安乐

11/14
21:44
学习

toggle法跨时钟域同步电路

跟CDC杠上了

之前有提到握手法。不知道是我搜索姿势不对还是什么,看到的都是如下方法:
将信号展宽成电平信号,经过multi dff送到对面时钟域,然后对面时钟域同样操作送回来,这时将展宽的信号拉低。然后还得等到对面送回来的信号也拉低,才能进行下一次工作。

这个方法别的都好,就是太慢……

其实有一个稍微修改了一点的握手法……
https://zipcpu.com/blog/2020/10/03/tfrvalue.html
(只注意控制信号传递部分即可)

没错又是这个。姑且叫它翻转法(toggle)吧
其核心在于,不是将输入信号展宽。而是:
现存一个电平信号,每当接到输入信号,就进行翻转。然后multi dff过去。当对面时钟域发现电平翻转了的时候,就产生一个脉冲信号。(很简单,打1拍再异或就是)这样就完成了这个脉冲信号的传递。

它的优点在于速度比需要返回来响应的标准握手法更快,同时仍然能够保证一定能发给对面。缺点就是没法发一个ack回来……
当然了,如果你真的需要发一个回来,直接再接一套不就完了……把刚刚传过来的电平又扔回去就行了。总的来说还是比标准握手法快,因为你不需要等发送方接到ack,拉低电平,等对面也发现电平拉低,把ack也拉低,最后multi dff回来这么个漫长过程了……

那么对照之前说的3个关注点看看这个方法:
1.抑制亚稳态的传播
✔电平用multi dff走的,没问题
2.保证每bit(单bit)信号不漏不错
✔电平信号,肯定不会错漏,最终一定能过去
3.多bit信号对齐(skew的解决)
✘这个方法本身保证不了这个

当然了,你可能注意到,链接里的那个怎么还是传递的多bits?这个其实之前有提过,真正toggle传的只有控制信号。不详说了。另外那里的电路还要更复杂,因为还涉及一些额外的enable信号。感兴趣的话自行阅读即可。

toggle法跨时钟域同步电路