跨时钟域问题的解决办法

 

由于目前芯片复杂度的增加,所以会存在很多不同的信号在不同的时钟域里面工作,那么这些信号在不同的时钟域之间传递时,就会不可避免的遇到跨时钟域问题。

那么目前解决跨时钟域的方法主要是什么呢 ?

  1. 两级寄存器
  2. 异步FIFO
  3. 握手机制

他们各自的应用场景分别是什么呢?

二级寄存器>单bit传输 异步FIFO>深度要求不高 握手机制>异步FIFO不能满足的情况。

那么什么时候使用握手机制?什么时候使用异步FIFO呢?

  • 握手机制实现较复杂,主要看需要的异步FIFO深度来决定。当能够使用深度较低的异步FIFO解决跨时钟域问题时,就直接使用异步FIFO就好了;当需要使用到深度较深的异步FIFO时,可以考虑通过握手机制来进行数据传输。
  • 采用握手机制可以保证数据传输不出现错误,适用范围非常广,但其缺点是实现起来比较复杂,并且由于需要等待握手的完成再传输数据,因此传输效率较低
  • 感觉异步FIFO就是解决CDC问题的终极必杀武器,其适用范围是最广的,当然代价就是其结构比较复杂,因此使用的时候也要考虑一下实际场景是否必要

异步FIFO的实现,主要是通过格雷码的传递来实现不同时钟域的读写指针同步。格雷码的优点是相邻数值之间对应格雷码只有一个bit发生改变,因此可以认为是单bit传输。

握手机制的实现:通过两个时钟域里面的信号之间的通信来确定读写数据的时间。当接收域准备好了过后再传数据。


本文原创,错误之处在所难免!盼指出!