clock domain crossing(CDC)

本文探讨了数字电路设计中跨时钟域(CDC)的基本概念及潜在问题,包括亚稳态、glitch、多路扇出和重新聚合等,阐述了这些问题如何影响电路功能,并提出了解决方案。

 

随着技术的发展,数字电路的集成度越来越高,设计也越来越复杂。很少有系统会只工作在同一个时钟频率。一个系统中往往会存在多个时钟,这些时钟之间有可能是同步的,也有可能是异步的。如果一个系统中,异步时钟之间存在信号通道,则就会存在CDC(clock domain crossing)问题。在下面的文章里,我们将会讨论CDC的一些技术细节。


一, CDC的基本概念

我们首先来看CDC的一些基本的概念:

1. 时钟域(Clock domain)

如果某一设计只有一个或者几个有固定相位关系的时钟驱动,我们称这个设计属于一个时钟域。比如,一个时钟和它的反相时钟以分频时钟一般有固定的相位关系,属于同一个时钟域。而如果两个或者多个时钟之间没有固定的相位关系,则它们属于不同的时钟域。

如下图中,divCLK是由CLK分频得到的,divCLK和CLK被认为是同步时钟,而由divCLk和CLK驱动的设计被认为是属于同一个时钟域。

如下图中,CLKA和CLKB之间没有固定的相位关系,是异步时钟。前半部分设计属于时钟域CLKA,后半部分设计属于时钟域CLKB。DA信号从时钟域CLKA进入到时钟域CLKB,是一个跨时钟域的信号,这条path也会被称为CDC path。

 

如今的数字电路设计中,跨时钟域的情况及其普遍。举一个最简单的例子,一个USB转串口的模块,串口因为波特率的不同,会工作在不同的时钟频率下,USB接口也会因为工作在不同的速度而有不同的工作频率。USB接口的时钟和串口的时钟之间不存在任何相位上的关系,也就是说,USB接口模块和串口模块属于不同的时钟域,他们之间相连的path就是跨时钟域的path。

二 跨时钟域设计的潜在问题

一般来讲,如果设计中存在有多个时钟域,那么就必然会存在跨时钟域的timing path。如果对跨时钟域的timing path处理不当,则容易导致亚稳态,glitch,多路扇出,重新聚合等等问题,导致设计不能稳定工作或者就根本不能正常工作。

1. 亚稳态

对时序逻辑电路来说,一个DFF的输入信号必须在该DFF的时钟沿前后一段时间内都保持稳定才能保证DFF能锁存到正确的值。这既我们所说的setup time和hold time,其中信号在时钟沿之前的保持时间为setup time,信号在时钟沿之后的保持时间为hold time。正常情况下,如果DFF的输入能满足setup time和hold time的要求,那么在tCO(the clock to output delay)时间内DFF的输出就会达到一个有效的逻辑值(高电平或者低电平)。否则,DFF的输出就需要远大于tCO的时间来达到有效的逻辑值,这段时间内,DFF的输出信号是不稳定的,被称为不稳定状态,或者叫亚稳态。

在下图中,如果CLK B在DA变化的时候来对DA进行采样,那么DB就会出现亚稳态。

 

对于同时钟域的信号。无论是在ASIC设计还是在FPGA设计中,我们也可以方便的通过STA来保证同时钟域的信号能满足setup/hold time的要求,不会出现亚稳态的问题。

但对于异步信号,相位关系是完全不可控的,而且会随时间发生变化,这就必然会存在亚稳态的问题,而且STA工具也没有办法对不同时钟域之间的timing path进行分析。也就是说,我们是没有办法完全避免异步信号之间的亚稳态问题的,但是可以通过在跨时钟域的信号上加入一些特殊的电路来减少亚稳态问题对电路功能所产生的负面影响。

2. Glitch

前面我们讲过,STA工具室不会对跨时钟域的信号做STA。跨时钟域的信号很容易产生glitch并最终影响电路功能。如下图中,CLKA domain中,DA1和DA2分别为两个DFF的输出,理想状态下,DA1和DA2到达与门两个输入端的时间是一样的,这样设计就不会出问题。但由于后端布局,环境等等因素导致的传播延迟Td会使A&B存在一个Glitch。而由于CLKB和CLKA为两个clock domain,之间不存在固定的相位关系,假设这个Glitch恰好被CLKB锁存住,那么就会在DB2生成一个有效的高电平信号,这个高电平信号不是我们的设计所期望的,那就会导致后继的电路功能出现问题。

也有可能是下面的情况,因为Td的影响,导致本应该传递到CLKB的高电平信号没有被传递过去,从而导致后继电路的功能出现问题。

在实际系统中,如果没有处理好跨时钟域的信号,那么由此导致的问题是很容易出现的。我在做silicon debug的时候,曾经多次遇到过由CDC导致的问题。由CDC导致的问题,在实际系统上的表现并不是非常一致,但经常表现出来的就是设计时而可以正常工作,时而出错,而且出错的概率不尽相同,这对问题的分析解决是非常不利的。我曾经遇到过一个CDC导致问题,需要执行数千次的操作,才可能复现出来,但问题一出现就是致命的,会导致系统出错。由于非常难复现问题,分析解决起来就特别困难。所以我们在做设计的时候,要尽量从一开始就解决掉这些问题。

3 多路扇出

如果信号从一个时钟域分多路进入另外一个时钟域,那么很有可能会导致功能上的错误。如下图所示,由于Td的存在,DA1和DA2到达CLKB的时间不同,最终导致fsm1_en和fsm2_en这两个本应该同时有效的信号实际上相差一个CLKB的周期。这很可能会影响到后继的电路功能。

l 重新聚合

如果多个信号从一个时钟域进入另外一个时钟域,然后这些信号在目标时钟域中又聚合到一起,那么就有可能因为信号的重新聚合导致电路功能上的异常。

如下图所示,原本EN1和EN2转换时钟域后,期望得到的值是2’b00和2’b11,但由于EN1和EN2到达CLKB时钟域的时间有差异,实际得到的值是2’b00,2’b10和2’b11,最终导致后继电路功能出现问题。

 

 

<think>好的,用户让我介绍一下Clock Domain CrossingCDC),也就是时钟域交叉。我需要先理解这个概念,然后组织一个清晰的解释。首先,用户可能是电子工程或计算机科学的学生,或者是数字电路设计相关的工程师,他们可能在实际设计中遇到了跨时钟域的问题,想了解如何处理。 首先,我要明确CDC的基本定义,也就是当信号从一个时钟域传递到另一个时钟域时的情况。然后,需要解释为什么这会成为问题,主要是因为异步时钟可能导致亚稳态,数据不一致等。接下来,要介绍常见的CDC问题,比如亚稳态、数据丢失、数据不一致,这样用户能明白为什么需要处理CDC。 然后,我需要详细说明解决CDC的方法。这里要分点,可能包括同步器(如两级触发器)、握手协议、FIFO(异步FIFO)、格雷码等。每个方法需要简要说明其原理和应用场景,比如同步器适用于单比特信号,FIFO用于多比特数据总线,格雷码用于计数器同步。 还要注意用户提到的系统级指令,比如数学公式要用$...$,独立公式用$$...$$,并且用中文回答。不过在这个主题中可能公式不多,但如果有的话,比如格雷码的转换,或者同步器的结构,可能需要用LaTeX表达。例如,同步器的结构可以用两个触发器的连接方式,但可能不需要复杂的数学公式。 结构方面,需要先概述CDC是什么,然后问题,再解决方案,最后设计要点。这样用户能一步步理解。同时要确保语言清晰,避免专业术语过多导致理解困难,但又要准确。 可能需要注意的细节是,用户是否需要具体的设计例子,或者更偏向理论。根据问题描述,用户要求介绍,所以理论为主,但需要具体的方法说明。另外,设计要点部分要强调验证的重要性,比如使用CDC分析工具,这在实际工程中很关键。 最后检查是否符合格式要求,是否有使用正确的LaTeX格式,是否有分点清晰,用中文回答。可能需要在同步器部分提到两级触发器结构,用$Q_1$和$Q_2$这样的符号,但需要用$...$包裹。例如:第一级触发器输出为$Q_1$,第二级为$Q_2$,这样可以提高稳定性。 总结一下,整个思考过程是确定用户需求,组织逻辑结构,分点解释问题和方法,注意格式要求,并用易懂的中文表达。同时确保技术细节准确,比如同步器的级数,FIFO的指针使用格雷码等,这些都是CDC处理中的关键点。</think>### 时钟域交叉(Clock Domain Crossing, CDC)分步解析 #### 1. **基本概念** 时钟域交叉(CDC)指**信号从一个时钟域传递到另一个时钟域**的场景。 - **时钟域**:由同一时钟驱动的电路区域 - **异步时钟关系**:若两个时钟频率/相位无固定关系(例如不同晶振生成),或同源但频率比为非整数 #### 2. **CDC核心问题** 当信号跨异步时钟域传输时,可能引发: - **亚稳态(Metastability)** 触发器输入违反建立/保持时间($t_{su}$/$t_h$),导致输出在$0$和$1$之间长时间振荡。 $$ \text{MTBF} \propto e^{\frac{t_r}{\tau}} $$ (MTBF:平均无故障时间,$t_r$为分辨时间,$\tau$为电路时间常数) - **数据不一致** 多比特信号因传输延迟差异,导致接收端采样到错误组合(如从$011$跳变为$100$时,中间出现$010$) #### 3. **CDC解决方案** 根据场景选择不同策略: ##### 3.1 单比特信号 - **两级同步器(2-FF Synchronizer)** 通过两个串联触发器过滤亚稳态: ``` 信号 → FF1(时钟域B) → FF2(时钟域B) ``` - 第一级FF1捕获亚稳态,第二级FF2降低传播概率 - 适用场景:低频控制信号(如复位、使能) ##### 3.2 多比特数据 - **异步FIFO** - 使用双端口RAM + 格雷码计数器 - 写指针(时钟域A)和读指针(时钟域B)通过格雷码同步,避免计数器跳变时的多比特错误 - 格雷码特性:相邻数值仅1位变化 → $$ G_n = n \oplus \lfloor n/2 \rfloor $$ - **握手协议(Handshaking)** 通过“请求-确认”机制确保数据完整性
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值