【持续更新】 CDC 跨时钟域处理

在之前的专栏《硬件架构的艺术》里,有讲过亚稳态以及多个时钟的处理办法,但是感觉还是太宽泛了些,不太好理解。在这篇博客里,将主要参考《Clock Domain Crossing (CDC) Design & Verification Techniques Using SystemVerilog》这篇论文,系统整理CDC处理方法。

亚稳态

产生原因与影响

产生原因: 寄存器采样不满足建立时间或保持时间要求

  • 亚稳态的产生是无法避免的,只能想办法降低其发生的频率。在跨时钟域设计中,如果不采取手段,会有很大概率引入亚稳态。
  • 下图显示了一个同步失败的示例, 其原因是当一个时钟域中产生的信号在另一个时钟域的时钟信号上升沿附近被采样时,输出进入亚稳态并且没有收敛到合法稳定状态(0或1)。

**亚稳态的影响:**亚稳态最大的危害就是会将系统引入一个未知状态,对于许多设计而言,这无疑是致命的。

  • 如下图所示,接收时钟域中的亚稳态输出会导致非法信号值在整个设计的其余部分传播。由于CDC 信号可能会波动一段时间,因此接收时钟域中其余部分的输入逻辑可能会将波动信号的逻辑电平识别为不同的值,从而将错误信号传播到接收时钟域中。

MTBF:平均无故障工作时间

MTBF表征两次故障之间的时间,即多久会发生一次亚稳态。影响同步器电路MTBF 的两个最重要因素是采样时钟频率(信号被采样到接收时钟域的速度)和数据更改频率(跨越CDC 边界的数据更改速度有多快)。

  • 从上面的部分方程可以看出,在更高速度的设计中,或采样数据变化更频繁时,故障发生的频率更高(MTBF 更短)。
  • 这里的故障是指一个信号被传递到同步触发器,然后在第一级同步触发器上进入亚稳态,并且在一周期后继续处于亚稳态时被采样到第二级同步触发器中。由于该信号在一个时钟周期后没有稳定到已知值,因此当它被采样并传递到接收时钟域时,该信号仍可能处于亚稳态,从而导致相应逻辑出现潜在故障。
  • MTBF的值越大越好,表示潜在故障之间的时间间隔较长。若能将MTBF控制在几十年(可以做到),则该设计即可视为几乎不会发生亚稳态的设计,毕竟数字系统预期寿命也没那么长(军工级除外)

两种同步场景

跨CDC 边界传递信号时可能出现两种情况:

  • 允许漏采在时钟域之间传递的信号的值:有时不需要对每个值都进行采样,但重要的是采样值必须要准确。 例如,异步FIFO设计中,就可以允许漏采的存在。因为异步FIFO的设计最重要的是正确(或者说不错误)地判断FIFO的空和满。漏采一些数据并不会对其判断空满造成错误,某种意义上还会使其设计更加安全。
  • 不允许漏采在时钟域之间传递的信号的值:CDC 信号必须被正确识别或握手后才允许更改。

在这两种情况下,CDC 信号都需要通过某种形式同步到接收时钟域中。

同步器

同步器是一种设备,它采样异步信号,并输出一个与本地或采样时钟同步的信号版本

双触发器同步器

如下图所示,第一个触发器将异步输入信号采样到新的时钟域,并等待一个完整的时钟周期,以允许第一阶段输出信号上的亚稳态衰减,然后用相同的时钟对第二级触发器进行采样,其目的是使第二级触发器输出成为一个稳定且有效的同步信号,并在新时钟域内准备分配。

相关推荐
松小白song1 天前
FPGA架构解密:为何要用750kHz低频时钟驱动二级缓存?
fpga开发
Riwuarua1 天前
从近似0基础开始FPGA开发 -- part.2 仿真
fpga开发
unicrom_深圳市由你创科技2 天前
国产FPGA的芯片选型应该考虑哪些因素?
fpga开发
明德扬2 天前
高速采集选 Direct RF 还是外置 ADC/FMC?从采样率、JESD204B 和开发周期对比
fpga开发·fpga
明德扬2 天前
机器人为什么需要“感知—控制—计算”一体化?FPGA 多传感器底板设计要点
fpga开发·机器人·fpga
A.说学逗唱的Coke2 天前
【数据库专题】ClickHouse 深度实战:从列式存储原理到 PB 级海量日志与可观测性分析
数据库·clickhouse·硬件架构
zlinear数据采集卡2 天前
数据采集卡从入门到精通(46):趋势展望——软件定义硬件、AI分析与开源生态
arm开发·stm32·单片机·嵌入式硬件·fpga开发·开源
落chen2 天前
基于FPGA的SDRAM开发-进阶篇
fpga开发
飞猫的边缘AI3 天前
边缘AI-5: 了解最灵活的计算芯片FPGA
人工智能·fpga开发·ai芯片·边缘ai·计算芯片·边缘ai芯片·titanium edge
badboy1213 天前
Xilinx Vitis Core Development Kit 2025.2.1_Win+Linux
linux·fpga开发·xilinx