CDC不考虑时钟关系可以吗?
读书的时候,书上关于CDC的这块内容,总是分快到慢或者慢到快等情况讨论。然而,在实际设计中,这个时钟关系可能不是很明确的,因为存在DVFS,AVS等机制的影响,或者在设计初期,对于时钟关系本身就是不明确。那么这种情况下,CDC部分怎么实现呢?
01信号宽度较宽的单bit信号
很简单,直接打两到三拍即可。
首先我们把需要同步的单比特信号在源时钟域扩展为电平信号,然后将扩展后的高电平信号经过目的时钟域打两拍进行同步,再使用同步后的电平信号产生一个脉冲信号。
如下图所示:
这个方式的短板在于必须保证pulse之间的间隔性,不能够太密集。要保证目的端能踩到电平边沿。
如果像下面这个图,就是过于密集。
对于过于密集的pulse信号,则需要使用其他方式,比如使用握手或者异步FIFO等。而握手在本质上也是限制了发送pulse的频率,只是能够确保数据不发生丢失。
数据传输可以使用握手或者FIFO作为中间载体。这个使用很广泛,前面的文章中也讲述过。
Clifford论文系列--多异步时钟设计的综合及脚本技术(1)
但是使用FIFO,在很多设计上是消耗过大的,因此也存在另外一些方式,比如MCP,这个本质上也是一种握手机制+pulse转level的形式,这个具体细节可以查看文章跨时钟域的方法--多周期路径和跨时钟域的方法--MCP方式个人理解 。
这个方式的好处仍然在于不需要考虑时钟之间的快慢关系,但是存在的问题在于不能接受数据快速变化,换句话说,两次有效数据之间的间隔必须保证在至少6个cycle以上(基于打两拍的前提下)。
本质原因是状态机只要收到反馈信号以后才能把下一次的有效数据发送出去。
如果数据过于密集,还是得采用FIFO等。
以上只是设计常用方式,理解有限,有错误烦请通知更正。