当前位置:   article > 正文

FPGA笔记 跨时间域处理_fpga 两个时钟域数据读取

fpga 两个时钟域数据读取

FPGA:跨时钟域处理

1.CDC(Clock Domain Crossing)基础概念

时钟域(Clock Domain):时钟域为由单个时钟或具有恒定相位关系的时钟驱动的设计部分。换句话说,时钟域就是时钟信号的势力范围,且一个时钟域中只能存在一个时钟信号,而一个时钟信号最多可以对应两个时钟域。

多个时钟来自不同的来源,而由这些时钟驱动的逻辑单元部分为时钟域,这些异步时钟域之间的接口信号称为时钟域交叉(CDC)路径

如图一,divCLK是由CLK分频得到的,所以divCLKCLK为同步时钟,也是属于同一个时钟域的。

在这里插入图片描述

如图二,DA信号被认为是一个异步信号进入时钟领域,即CLKACLKB之间不存在恒定的相位和时间关系。

在这里插入图片描述

2.跨时钟域设计的潜在问题

在实际系统中,如果没有处理好跨时钟域的信号,那么由此导致的问题是很容易出现的。由CDC导致的问题,在实际系统上的表现并不是非常一致,但经常表现出来的就是设计时而可以正常工作,时而出错,而且出错的概率不尽相同,这对问题的分析解决是非常不利的。

1.亚稳态(Metastability)

触发器输出的正确性取决于输入在时钟边沿之前的一段时间和之后的一段时间内是否稳定。如果Tsu(setup time)和Th(hold time)满足要求,在tCO(时钟到输出的延迟时间)的最大延迟后,触发器将输出一个有效的输出电平(低或高)。但是,如果TsuTh不满足要求,触发器的输出需要比tCO更多的时间才能达到有效输出电平,这就被称为亚稳态

在同步系统中,输入信号总是系统时钟同步,能够达到寄存器的时序要求,所以亚稳态不会发生。亚稳态问题通常发生在一些跨时钟域信号传输以及异步信号采集上。

亚稳态产生的原因:

  1. 在跨时钟域信号传输时,由于源寄存器时钟和目的寄存器时钟相移未知,所以源寄存器数据发出数据,数据可能在任何时间到达异步时钟域的目的寄存器,所以无法保证满足目的寄存器TsuTh的要求;
  2. 在异步信号采集中,由于异步信号可以在任意时间点到达目的寄存器,所以也无法保证满足目的寄存器TsuTh的要求;

如下图,当产生亚稳态后Tco时间后会有Tmet(决断时间)的振荡时间段,当振荡结束回到稳定状态时为0或者1,这个是随机的。因此,会对后续电路判断造成影响。

在这里插入图片描述

如下图,当DA信号变化(在CLKB的上升沿和DA的下降沿)时用CLKBDA进行采样,这时DB就处于亚稳态。

在这里插入图片描述

2.毛刺(Glitch)

CDC(Clock Domain Crossing)是时序检测工具(timing tools)的假路径,此路径中的任何逻辑都必须仔细编写和验证;因为该逻辑可能导致Glitch并在下游产生功能错误,即跨时钟域的信号很容易产生Glitch并最终影响电路功能。

如下图中,CLKA的时钟域中,DA1DA2分别为两个D-触发器的输出,理想状态下,DA1DA2到达与门两个输入端的时间是一样的,这样设计就不会出问题。但由于后端布局,环境等等因素导致的传播延迟Td会使A&B存在一个Glitch。而由于CLKBCLKA为两个时钟域,之间不存在固定的相位关系,如果这个Glitch恰好被CLKB锁存住,那么就会在DB2生成一个有效的高电平信号,这个高电平信号不是设计所期望的,那就会导致后继的电路功能出现问题。

在这里插入图片描述

除了上述情况还可能出现,虽然两个源同时发出脉冲,但后续布局中的传播延迟(Td)掩盖了脉冲,导致最后DB2始终保持低电平。

在这里插入图片描述

3.多路扇出(Divergence In The Crossover)

如果信号从一个时钟域分多路进入另外一个时钟域,那么很可能导致功能错误。

如图所示,由于传播延迟(Td)和亚稳稳定时间的(metastable settling times)不同,导致DA1DA2到达CLKB的时间不同,Fsm1_enFsm2_en在不同的时间(相差一个CLKB周期)启动,这很有可能会影响后续电路功能,在同步到两个FSM后,通过展开单个FSM启用来避免这种结构。

在这里插入图片描述

4.重新聚合(Reconvergence Of Synchronized Signals)

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

如图,一旦同步完成,同步器之外的结构仍然很重要。设计必须确保同步信号不重新聚合(若聚合会产生功能错误),后同步逻辑可能会导致DB信号出现Glitch

原本IN1IN2转换时钟域后,期望得到的值是2’b002’b11,但由于IN1IN2到达CLKB时钟域的时间有差异,实际得到的值是2’b002’b102’b11,最终导致后继电路功能出现问题。

在这里插入图片描述

3.跨时钟域处理方法

CDC分为同步时钟域和异步时钟域。其中,同步时钟域是指时钟频率和相位具有一定关系的时钟域,并非一定只有频率和相位相同的时钟才是同步时钟域;异步时钟域的两个时钟则没有任何关系。

1.打两拍

处理跨时钟域的数据有单bit和多bit之分,而打两拍的方式常见于处理单bit数据的跨时钟域问题。

打两拍的方式,其实说白了,就是定义两级寄存器,对输入的数据进行延拍。

如下图,第一级寄存器输出的信号亚稳态发生概率很大,而经过第二级寄存器后输出的信号亚稳态发生的概率减小了:

在这里插入图片描述

在信号DB之后使用了一个同步触发器,信号DB处于亚稳态,但信号DB2已稳定了,且与DA同步。

这里,DA为时钟域1(CLKA)的数据,需要传送到时间域2(CLKB)进行处理,两个同步触发器的时钟都为CLKB,而如图,CLKB为上升沿的时候刚读取到DA的上升沿(这个边沿实际上不是瞬时发生的,需要短暂的跳变时间),所以这时候DA对第一级寄存器的输入是0还是1,这是不确定的,也就导致了DB信号处于亚稳态,但是在CLKB的下一个上升沿的时候,DB基本上满足了第二级寄存器的保持时间(Th)和建立时间(Tsu)的要求,出现亚稳态的概率就得到了很大的改善。

在这里插入图片描述

2.异步双口RAM/异步FIFO

处理多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对应的异步时钟处理,都是需要关注的设计重点)

参考资料

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/839196
推荐阅读
相关标签
  

闽ICP备14008679号