赞
踩
时钟域(Clock Domain):时钟域为由单个时钟或具有恒定相位关系的时钟驱动的设计部分。换句话说,时钟域就是时钟信号的势力范围
,且一个时钟域中只能存在一个时钟信号,而一个时钟信号最多可以对应两个时钟域。
多个时钟来自不同的来源,而由这些时钟驱动的逻辑单元部分为时钟域
,这些异步时钟域之间的接口信号称为时钟域交叉(CDC)路径
。
如图一,divCLK
是由CLK
分频得到的,所以divCLK
和CLK
为同步时钟,也是属于同一个时钟域的。
如图二,DA
信号被认为是一个异步信号进入时钟领域,即CLKA
和CLKB
之间不存在恒定的相位和时间关系。
在实际系统中,如果没有处理好跨时钟域的信号,那么由此导致的问题是很容易出现的。由CDC导致的问题,在实际系统上的表现并不是非常一致,但经常表现出来的就是设计时而可以正常工作,时而出错,而且出错的概率不尽相同,这对问题的分析解决是非常不利的。
触发器输出的正确性取决于输入在时钟边沿之前的一段时间和之后的一段时间内是否稳定。如果Tsu
(setup time)和Th
(hold time)满足要求,在tCO
(时钟到输出的延迟时间)的最大延迟后,触发器将输出一个有效的输出电平(低或高)。但是,如果Tsu
和Th
不满足要求,触发器的输出需要比tCO
更多的时间才能达到有效输出电平,这就被称为亚稳态。
在同步系统中,输入信号总是系统时钟同步,能够达到寄存器的时序要求,所以亚稳态不会发生。亚稳态问题通常发生在一些跨时钟域信号传输以及异步信号采集上。
亚稳态产生的原因:
Tsu
和Th
的要求;Tsu
和Th
的要求;如下图,当产生亚稳态后Tco
时间后会有Tmet
(决断时间)的振荡时间段,当振荡结束回到稳定状态时为0
或者1
,这个是随机的。因此,会对后续电路判断造成影响。
如下图,当DA
信号变化(在CLKB
的上升沿和DA
的下降沿)时用CLKB
对DA
进行采样,这时DB
就处于亚稳态。
CDC(Clock Domain Crossing)是时序检测工具(timing tools)的假路径,此路径中的任何逻辑都必须仔细编写和验证;因为该逻辑可能导致Glitch
并在下游产生功能错误,即跨时钟域的信号很容易产生Glitch
并最终影响电路功能。
如下图中,CLKA
的时钟域中,DA1
和DA2
分别为两个D-触发器的输出,理想状态下,DA1
和DA2
到达与门两个输入端的时间是一样的,这样设计就不会出问题。但由于后端布局,环境等等因素导致的传播延迟Td
会使A&B
存在一个Glitch
。而由于CLKB
和CLKA
为两个时钟域,之间不存在固定的相位关系,如果这个Glitch
恰好被CLKB
锁存住,那么就会在DB2
生成一个有效的高电平信号,这个高电平信号不是设计所期望的,那就会导致后继的电路功能出现问题。
除了上述情况还可能出现,虽然两个源同时发出脉冲,但后续布局中的传播延迟(Td
)掩盖了脉冲,导致最后DB2
始终保持低电平。
如果信号从一个时钟域分多路进入另外一个时钟域,那么很可能导致功能错误。
如图所示,由于传播延迟(Td
)和亚稳稳定时间的(metastable settling times)不同,导致DA1
和DA2
到达CLKB
的时间不同,Fsm1_en
和Fsm2_en
在不同的时间(相差一个CLKB
周期)启动,这很有可能会影响后续电路功能,在同步到两个FSM后,通过展开单个FSM启用来避免这种结构。
如果多个信号从一个时钟域进入另外一个时钟域,然后这些信号在目标时钟域中又聚合到一起,那么就有可能因为信号的重新聚合导致电路功能上的异常。
如图,一旦同步完成,同步器之外的结构仍然很重要。设计必须确保同步信号不重新聚合(若聚合会产生功能错误),后同步逻辑可能会导致DB
信号出现Glitch
。
原本IN1
和IN2
转换时钟域后,期望得到的值是2’b00
和2’b11
,但由于IN1
和IN2
到达CLKB
时钟域的时间有差异,实际得到的值是2’b00
、2’b10
和2’b11
,最终导致后继电路功能出现问题。
CDC分为同步时钟域和异步时钟域。其中,同步时钟域是指时钟频率和相位具有一定关系的时钟域,并非一定只有频率和相位相同的时钟才是同步时钟域;异步时钟域的两个时钟则没有任何关系。
处理跨时钟域的数据有单bit和多bit之分,而打两拍的方式常见于处理单bit数据的跨时钟域问题。
打两拍的方式,其实说白了,就是定义两级寄存器,对输入的数据进行延拍。
如下图,第一级寄存器输出的信号亚稳态发生概率很大,而经过第二级寄存器后输出的信号亚稳态发生的概率减小了:
在信号DB
之后使用了一个同步触发器,信号DB
处于亚稳态,但信号DB2
已稳定了,且与DA
同步。
这里,DA
为时钟域1(CLKA
)的数据,需要传送到时间域2(CLKB
)进行处理,两个同步触发器的时钟都为CLKB
,而如图,CLKB
为上升沿的时候刚读取到DA
的上升沿(这个边沿实际上不是瞬时发生的,需要短暂的跳变时间),所以这时候DA对第一级寄存器的输入是0还是1,这是不确定的,也就导致了DB信号处于亚稳态,但是在CLKB的下一个上升沿的时候,DB基本上满足了第二级寄存器的保持时间(Th
)和建立时间(Tsu
)的要求,出现亚稳态的概率就得到了很大的改善。
处理多bit数据的跨时钟域,绝大多数情况下采用异步双口RAM或者异步FIFO来作为中间缓冲,采用双时钟对数据缓冲。
使用场景:在有大量的数据需要进行跨时钟域传输,并且对数据传输速度要求比较高的场合。
假设我们现在有一个信号采集平台,ADC芯片提供源同步时钟60MHz,ADC芯片输出的数据在60MHz的时钟上升沿变化,而FPGA内部需要使用100MHz的时钟来处理ADC采集到的数据(多bit)。在这种类似的场景中,我们便可以使用异步双口RAM来做跨时钟域处理。先利用ADC芯片提供的60MHz时钟将ADC输出的数据写入异步双口RAM,然后使用100MHz的时钟从RAM中读出。
当然,在能使用异步双口RAM来处理跨时钟域的场景中,也可以使用异步FIFO来达到同样的目的。
一个异步FIFO一般由如下部分组成:
1. Memory, 作为数据的存储器;
2. 写逻辑部分,主要负责产生写信号和地址;
3. 读逻辑部分,主要负责产生读信号和地址;
4. 地址比较部分,主要负责产生FIFO空、满的标志。
(异步FIFO的设计也涉及到格雷码使用,FIFO深度计算,FIFO对应的异步时钟处理,都是需要关注的设计重点)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。