zl程序教程

您现在的位置是:首页 >  后端

当前栏目

跨时钟域(CDC)设计方法之多bit信号篇(一)

方法 设计 信号 时钟 bit CDC 之多
2023-09-11 14:14:48 时间

写在前面

        本博客所有CDC相关的内容:跨时钟域(CDC)设计汇总


1、跨时钟域处理方法的分类

        信号的跨时钟域传输可能会引入亚稳态问题,那么就需要想办法对其进行处理,从而降低亚稳态发生的概率(即提高MTBF)。

        跨时钟域处理方法可以分为两个大类:单Bit信号跨时钟域处理、多Bit信号跨时钟域处理。分类的原因是多bit信号的传递不光只有亚稳态这一个问题,还可能会因为多个信号之间由于工艺、PCB布局等因素导致的信号传输延时(skew)的存在,从而导致信号被漏采或者错采。

2、合并多个控制信号

        在下面的例子中,数据的读取需要载入信号load和使能信号en同时置位,但是这两个信号之间存在一个小偏差(skew),在分别进行单bit的跨时钟域同步时,由于小skew的存在,导致这两个信号在被同步到目的时钟域后有一个时钟周期的偏差,而这个偏差直接导致数据无法被读取。

        现在不妨问自己:这两个信号是否都必须传递?实际上不是必须的,应用中我们可以把两个信号合并为一个控制信号,这样就将多bit信号的跨时钟域传递转换成了单bit信号的跨时钟域传递。如下:

 3、格雷码

        在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code),另外由于最大数与最小数之间也仅一位数不同,即“首尾相连”,因此又称循环码或反射码。 关于格雷码的内容:Verilog实现的格雷码与二进制码的互相转换

        下表给出了4bit自然二进制码、4bit典型格雷码(无特殊说明,典型格雷码即格雷码)与4bit十进制整数的对照:

         从格雷码的性质,我们可以发现其虽然是多bit信号的CDC,但是由于每次只有相邻的一位不同,实际上就是1bit信号的CDC,好家伙,又把问题转化成了我们熟悉的单bit信号的跨时钟域问题。

        但是格雷码的应用也有局限:

  • 格雷码只有相邻的两位之间存在只有1bit的改变,这就意味着数据的改变必须要连续(相邻),也就是说其只适用连续变化的数据,例如计数器,这无疑限制了格雷码的应用场景;
  • 格雷码传递的数据个数必须为2的N次幂----由于最大数与最小数之间也仅一位数不同,即“首尾相连”,因此格雷码又称循环码。若格雷码个数不为2的N次幂,则无法实现“首尾相连”,即最后一位传递到初始位时,就不止变化1bit了,这无疑违背了我们使用格雷码的初衷。

4、握手法

        握手法的本质是负反馈,通俗来讲,就是先将被CDC信号展宽,展宽后将其同步到目的时钟域,在目的时钟域生成指示信号,该指示信号用来指示此时信号已经被目的时钟域接收,然后将指示信号反馈到源时钟域(反馈过程),源时钟域接收到这个反馈信号后将被CDC信号拉低,从而确定了展宽长度,也通过”发送--反馈--操作“这一握手过程完成了一次CDC传输。

        上图是典型的握手过程来进行CDC:

  • 源时钟域aclk下的信号adt1信号是要进行CDC的信号;
  • adt1先是在源时钟域aclk下被展宽,然后通过两级同步器被同步到目的时钟域bclk下,分别为bq1_dat,bq2_dat;
  • bq2_dat作为指示信号(反馈信号,也可以通过bq1_dat和bq2_dat来生成新的指示信号)又被反馈到了目的时钟域aclk下,并进行同步,分别为aq1_dat,aq2_dat;
  • aq2_dat的拉高则说明反馈信号的同步完成,此时可以将adt1拉低(结束展宽过程);
  • adt1拉低(结束展宽过程)后表示一次CDC操作结束。

        握手法是一种很保险的方法,但是缺点也很明显:需要的时序开销很大。

5、异步FIFO

        毫无疑问异步FIFO是多bit信号来跨时钟域处理的最好的、也是最常用的方法。异步FIFO通过先进新出的缓存机制,将两端数据的读写都控制在各自的时钟域内,时钟域之间通过指针+格雷码形式来指示数据的空、满。

        关于异步FIFO可以参考:

                异步FIFO的Verilg实现方法

                关于异步FIFO设计,这7点你必须要搞清楚

6、DMUX同步器

        对于多bit的data信号,还可以使用使能技术,也就是通过一个使能信号来判断data信号是否已经稳定,当使能信号有效的时候说明data处于稳定状态,在这种情况下终点寄存器才对信号进行采样,可以保证没有setup/hold违例。而使能信号一般使用double FF的方法来进行同步。下面是DMUX的同步示意图:

7、其他

  • 以往我的文章我一般都是会贴出代码和仿真测试的。这次我就不贴了,因为我找到了一个不需要自己敲代码的方法。这个方法就下一篇文章再写吧!
  • 关于本文,您有什么想法均可在评论区留言!
  • 创作不易,如果本文对您有帮助,还请多多点赞、评论和收藏。您的支持是我更新的最大动力!