0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

跨时钟域CDC之全面解析

ruikundianzi 来源:知芯情报局 2023-03-15 13:58 次阅读

时钟域(Clock Domain Crossing,CDC)作为数字芯片设计中的经典问题,也历来是各面试官常问的问题。今天我们来分析一下跨时钟域的相关问题,希望对你有所启发。

一、什么是时钟域?

在一些较为简单的数字电路中,只有一个时钟,即所有的触发器都使用同一个时钟,那么我们说这个电路中只有一个时钟域。对于功能较为复杂的芯片,如下图所示,电路中往往存在多个时钟,不同的模块使用不同的时钟,那么我们说这个设计中有多个时钟域。当信号在不同时钟域之间传输时,就被称为跨时钟域。

d55605d2-c2f4-11ed-bfe3-dac502259ad0.jpg

二、什么是亚稳态?

数字信号跨时钟域传输时,就会产生亚稳态问题。亚稳态是指触发器无法在某个规定时间段内达到一个可确认的状态。每一个触发器都有其规定的建立(setup)和保持(hold)时间参数, 在这个时间窗口内, 输入信号在时钟的上升沿是不允许发生改变的。如果触发器的数据输入端口上数据在这个时间窗口内发生变化(或者数据更新),那么就会产生时序违规,触发器的输出将徘徊在不可预知的电平状态,即亚稳态。

如下图所示,在CLK2的上升沿到来的时候,触发器Din的数据在发生变化,那么Dout的数据将会徘徊在一个中间电平状态(这个中间电平可能正确值,也可能是错误值)。也就是说,电路处于中间态的时间变长,使得电路“反应”迟钝,这就是“亚稳态”。亚稳态信号的稳定时间通常比一个时钟周期要短的多。

一般情况下不会超过一个或者两个周期,取决于触发器的性能。如果亚稳态超过一个或者两个周期,那么就会被下一个触发器采样到,这样就会造成亚稳态的传播。但是需要强调的是,如果产生亚稳态,亚稳态恢复稳定后的电平不一定是正确的电平,如果稳定后的电平是错误的,那么就很有可能引起后面的逻辑的错误。

d5781a14-c2f4-11ed-bfe3-dac502259ad0.png

再深入一点,触发器进入亚稳态的时间可以用参数 MTBF(mean time between failures)来描述, MTBF即触发器采样失败的时间间隔,其公式描述如下:

d58b0980-c2f4-11ed-bfe3-dac502259ad0.png

其中:

t:在不引起synchronizer failure的前提下,亚稳态持续的最长时间

τ和T0:触发器工艺相关的参数

F1:输入的异步信号频率

F2:起同步作用的的触发器时钟频率

通常,MTBF越大说明系统采样失败的可能越小。从上面公式可以很明显的看出,对于高速数字电路,MTBF发生的概率更大。此外,对于不同的系统和应用场景,MTBF的要求也不同。比如对于一些消费级的产品,比如手机智能手表等,MTBF的要求要远远低于军工级和航天级别的产品,比如卫星,导弹等。

三、怎么降低亚稳态?

首先,亚稳态是不可避免的,是器件的固有属性。通过适当的方法,可以将亚稳态带来的消极影响将至最低。一般来讲,主要有下面几种方案:

使用两级寄存器同步

也就是俗称的“打两拍”。两级寄存是一级寄存的平方,两级并不能完全消除亚稳态危害,但是大大降低了亚稳态的发生概率。a_dat是时钟域a_clk的数据,需要传输到时钟域b_clk。假设在b_clk的上升沿正好采到a_dat的跳变沿(从0变1的上升沿,实际上的数据跳变不可能是瞬时的,所以有短暂的跳变时间),那么此时a_dat为一个不确定的电平状态。所以b_dat1的值也不能确定.但至少可以保证,在b_clk的下一个上升沿,b_dat1基本上已经稳定,可以满足下一级触发器的setup/hold要求,出现亚稳态的概率得到了很大的改善。

如果再加上第三级寄存器,由于第二级寄存器对于亚稳态的处理已经起到了很大的改善作用,第三级寄存器在很大程度上可以说只是对于第二级寄存器的延拍,所以意义是不大的。

异步双口RAM

在处理多bit数据的跨时钟域时,采用较多的是异步双口RAM。假设我们现在有一个信号采集平台,ADC芯片提供源同步时钟20MHz,ADC芯片输出的数据在20MHz的时钟上升沿变化,而FPGA内部需要使用100MHz的时钟来处理ADC采集到的数据(多bit)。

在这种类似的场景中,我们便可以使用异步双口RAM来做跨时钟域处理。先利用ADC芯片提供的20MHz时钟将ADC输出的数据写入异步双口RAM,然后使用100MHz的时钟从RAM中读出。在能使用异步双口RAM来处理跨时钟域的场景中,也可以使用异步FIFO来达到同样的目的。

d5a243d4-c2f4-11ed-bfe3-dac502259ad0.png

格雷码

在上面的第二种方案中,master要等RAM中有ADC的数据之后才去读RAM。这就需要100MHz的时钟对RAM的写地址进行判断,当写地址大于某个值之后再去读取RAM。程序员们使用直接用100MHz的时钟于RAM的写地址进行打两拍的方式,但RAM的写地址属于多bit,如果单纯只是打两拍,那不一定能确保写地址数据的每一个bit在100MHz的时钟域变化都是同步的,肯定有一个先后顺序。如果在低速的环境中不一定会出错,在高速的环境下就不一定能保证了。所以更为妥当的一种处理方法就是使用格雷码转换。

首先什么是格雷码?在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code),另外由于最大数与最小数之间也仅一位数不同,即“首尾相连”,因此又称循环码或反射码。在数字系统中,常要求代码按一定顺序变化。例如,按自然数递增计数,若采用8421码,则数0111变到1000时四位均要变化,而在实际电路中,4位的变化不可能绝对同时发生,则计数中可能出现短暂的其它代码(1100、1111等)。在特定情况下可能导致电路状态错误或输入错误。

使用格雷码可以避免这种错误。格雷码有多种编码形式。格雷码(Gray Code)又称Grey Code、葛莱码、格莱码、戈莱码、循环码、反射二进制码、最小差错码等。如下图所示,若不作特别说明,格雷码就是指典型格雷码,它可从自然二进制码转换而来。二进制格雷码的生成方法有很多,具体可自行搜索。

十进制数字 自然二进制码 典型格雷码 十进制余三格雷码 十进制空六格雷码 步进码
0 0000 0000 0010 0000 00000
1 0001 0001 0110 0001 00001
2 0010 0011 0111 0011 00011

对于格雷码,相邻的两个数间只有一个bit是不一样的,如果先将RAM的写地址转为格雷码,然后再将写地址的格雷码进行打两拍,之后再在RAM的读时钟域将格雷码恢复成10进制。这种处理就相当于对单bit数据的跨时钟域处理了。






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    31

    文章

    5284

    浏览量

    119780
  • MTBF
    +关注

    关注

    1

    文章

    29

    浏览量

    13553
  • 数字电路
    +关注

    关注

    193

    文章

    1593

    浏览量

    80369
  • CDC
    CDC
    +关注

    关注

    0

    文章

    57

    浏览量

    17747
  • 触发器
    +关注

    关注

    14

    文章

    1995

    浏览量

    61003

原文标题:干货 | 跨时钟域(CDC)之全面解析

文章出处:【微信号:IP与SoC设计,微信公众号:IP与SoC设计】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    多位宽数据通过握手方式时钟

    对于多位宽数据,我们可以采用握手方式实现时钟操作。该方式可直接使用xpm_cdc_handshake实现,如下图所示。
    的头像 发表于 05-06 09:22 1074次阅读
    多位宽数据通过握手方式<b class='flag-5'>跨</b><b class='flag-5'>时钟</b><b class='flag-5'>域</b>

    处理时钟CDC)信号同步的最常见方法

    时钟( **Clock Domain Crossing,CDC** )通俗地讲,就是 **模块之间数据交互时用的不是同一个时钟进行驱动*
    的头像 发表于 09-20 11:24 3590次阅读
    处理<b class='flag-5'>跨</b><b class='flag-5'>时钟</b><b class='flag-5'>域</b>(<b class='flag-5'>CDC</b>)信号同步的最常见方法

    关于cdc时钟处理的知识点,不看肯定后悔

    关于cdc时钟处理的知识点,不看肯定后悔
    发表于 06-21 07:44

    cdc路径方案帮您解决时钟难题

    这一章介绍一下CDC也就是时钟可能存在的一些问题以及基本的时钟
    的头像 发表于 11-30 06:29 7089次阅读
    <b class='flag-5'>cdc</b>路径方案帮您解决<b class='flag-5'>跨</b><b class='flag-5'>时钟</b><b class='flag-5'>域</b>难题

    关于FPGA中时钟的问题分析

    时钟问题(CDC,Clock Domain Crossing )是多时钟设计中的常见现象。在FPGA领域,互动的异步
    发表于 08-19 14:52 3301次阅读

    CDC单bit脉冲时钟的处理介绍

    单bit 脉冲时钟处理 简要概述: 在上一篇讲了总线全握手时钟处理,本文讲述单bit脉冲
    的头像 发表于 03-22 09:54 3439次阅读

    CDC时钟的基础概念

    时钟clock domain:以寄存器捕获的时钟来划分时钟。 单时钟
    的头像 发表于 08-29 15:11 2441次阅读

    CDC时钟的基础概念介绍

    时钟clock domain:以寄存器捕获的时钟来划分时钟。单时钟
    的头像 发表于 12-26 15:21 1668次阅读

    单位宽信号如何时钟

    单位宽(Single bit)信号即该信号的位宽为1,通常控制信号居多。对于此类信号,如需时钟可直接使用xpm_cdc_single
    的头像 发表于 04-13 09:11 1258次阅读

    时钟电路设计总结

    时钟操作包括同步时钟操作和异步
    的头像 发表于 05-18 09:18 687次阅读
    <b class='flag-5'>跨</b><b class='flag-5'>时钟</b><b class='flag-5'>域</b>电路设计总结

    FPGA时钟处理方法(二)

    上一篇文章已经讲过了单bit时钟的处理方法,这次解说一下多bit的时钟方法。
    的头像 发表于 05-25 15:07 948次阅读
    FPGA<b class='flag-5'>跨</b><b class='flag-5'>时钟</b><b class='flag-5'>域</b>处理方法(二)

    CDC时钟处理及相应的时序约束

    CDC(Clock Domain Conversion)时钟分单bit和多bit传输
    的头像 发表于 06-21 14:59 1714次阅读

    时钟电路设计—单比特信号传输

    时钟CDC)的应从对亚稳定性和同步性的基本了解开始。
    的头像 发表于 06-27 14:25 982次阅读
    <b class='flag-5'>跨</b><b class='flag-5'>时钟</b><b class='flag-5'>域</b>电路设计—单比特信号传输

    时钟电路设计:单位宽信号如何时钟

    单位宽(Single bit)信号即该信号的位宽为1,通常控制信号居多。对于此类信号,如需时钟可直接使用xpm_cdc_single,如下图代码所示。参数DEST_SYNC_FF决
    的头像 发表于 08-16 09:53 1183次阅读
    <b class='flag-5'>跨</b><b class='flag-5'>时钟</b><b class='flag-5'>域</b>电路设计:单位宽信号如何<b class='flag-5'>跨</b><b class='flag-5'>时钟</b><b class='flag-5'>域</b>

    如何处理时钟这些基础问题

    对于数字设计人员来讲,只要信号从一个时钟跨越到另一个时钟,那么就可能发生亚稳态。我们称为“时钟
    发表于 01-08 09:39 560次阅读
    如何处理<b class='flag-5'>跨</b><b class='flag-5'>时钟</b><b class='flag-5'>域</b>这些基础问题