2-ff 同步器如何确保正确同步?

电器工程 FPGA 同步 CDC 亚稳态
2022-02-02 08:32:10

使用 2-ff 同步器一直是信号跨越时钟边界的标准。并且有很多论文/图表说明了该机制,例如:在此处输入图像描述

似乎bclk只能对adat的脉冲进行一次采样(在 bclk 的第二个上升沿),这会导致 bq1_dat 上的输出稳态如何在下一个有效时钟沿将bq1_dat采样为“高”?


除了我的问题之外,我想添加我认为信号安全通过到另一个时钟域的内容(假设 2-FF 足以满足 MTBF 要求)。如有错误请指正。

在此处输入图像描述

ps:亚稳态不显示“徘徊”波形,而是一个既不是'1'也不是'0'的电平。下图显示了一个亚稳态输出示例。在此处输入图像描述

原始图来自WJ Dally的 EE108A 讲义,第 13 讲:亚稳态和同步故障(当好的触发器变坏时)

2个回答

简单的答案是他们不是靠自己的。同步器的存在不是为了确保数据通过,而是确保您最终不会收到亚稳态信号馈送大量其他信号并导致问题。如图所示,第二个 FF 捕获亚稳态的第一个 FF 输出并防止它在设计中进一步传播。

有各种各样的信号,你如何包含同步器取决于你在谈论什么信号。但是让我们看一下几种常见的类型:

  1. 触发信号- 或任何基本上是必须启动其他东西运行的脉冲的信号。这些通常不携带数据,您感兴趣的只是有一个上升沿,以便在另一个时钟域中启动某些东西。要让这些交叉,您需要一个同步器(基本上是在做图中所示的工作),但您需要更多。

    最简单的选择是扩展脉冲 - 基本上你确保输入脉冲超过目标时钟的 1 个时钟周期(它应该比目标寄存器的设置和保持时间中的较大者至少长 1 个周期) . 例如,如果您要从 20MHz 时钟切换到 15MHz 时钟,您将确保您的脉冲在输入端是两个时钟周期,这将确保它呈现给目标时钟并且不会丢失。这也回答了您关于如何保证信号通过的问题。如果脉冲比一个目标时钟周期宽,则意味着如果它在第一个时钟沿变为亚稳态并最终被视为 0,那么在第二个时钟沿它肯定会捕获脉冲。

    因为对于这种类型的信号,您只对脉冲已经通过感兴趣,因此输出信号是否在某些时候以两个时钟周期高而在其余时间仅以一个周期结束并不重要。如果需要确保它是单周期脉冲,可以例化一个简单的边沿检测器电路。

  2. 控制总线- 或可能的数据总线类型。这些可以说更困难,因为如果您有需要保持同步的多位数据流。在这种情况下,你要做的是实现一种叫做“握手”的东西。您基本上将数据加载到源时钟上并保存。然后,您通过同步器发送请求信号(如 1 中所示)。一旦请求信号通过,您就知道数据总线也将稳定在目标域中。然后,您可以将其打卡到目的地的寄存器库中。然后目的地再次发回一个确认脉冲以通知源它可以加载下一个字。

    如果您需要向目标时钟发送一个控制字,您需要在发送另一个控制字之前知道它已经到达那里(例如,如果您正在发送一个命令来做某事),您将使用这种总线。

  3. 数据总线——对于你有一个连续或突发数据源的数据,你可以说使用 FIFO 比使用同步器更好。FIFO 使用双时钟存储器来保存数据,并使用计数器来跟踪 FIFO 中的数据量。当有空间时,您将数据写入 FIFO,然后增加写入地址。然后这个地址通常被编码成“格雷编码”方案,确保地址中的每个增量只导致一个地址总线中的位要更改(这意味着您不需要同步多个位)。然后将该地址传输到目标域(通过您的同步器链之一),并与读取地址进行比较。如果 FIFO 中有数据,则可以使用目标时钟端口将其从存储器中读出。读取地址同样采用格雷编码并通过另一个同步器发送回源,以便写入端口可以计算 FIFO 中是否有任何空间。

  4. 复位信号- 这些通常使用同步器的修改版本,称为“异步断言,同步解除断言”。在这个修改版本中,输入到第一个触发器的数据连接到 GND,而输入的复位信号连接到同步器中每个触发器的异步预设信号。这会导致输出信号在变为高电平时完全异步,但同步器链通过寄存器链中的零点来确保它与目标时钟同步变为低电平。

    这种类型的同步器对数据和控制来说很糟糕,但非常适合复位信号。如果所有目标逻辑将此链的输出馈送到域中任何寄存器的异步复位输入,则几乎不用担心断言的亚稳态(即使它是异步的),因为所有寄存器都被强制为已知状态。然后,当复位信号在源域中置低时,它在目标域中同步置低,这意味着所有寄存器在相同的时钟周期(而不是 +/- 1 周期,如果它是异步置低)退出复位。


从上面可以看出,进行时钟域交叉比仅在信号上粘贴一个 2 触发器同步器要复杂得多。使用的确切方法取决于应用程序。

1)以您的绘图为例,aclk 和 bclk 彼此异步。换句话说,它们有不同的时钟源。他们将 adat 显示为有效数据,但仅同步到 aclk。这就是 bclk 同步器发挥作用的地方。

2) 这张图假设了最坏的情况,其中 bq1_dat 是一个混乱的输出,因为 bq1 FF 只捕获了数据末尾的一部分,创建了一个亚稳态,在这个状态下输出通常是垃圾。这是诀窍。Bq2 与 bq1 具有相同的 bclk,但数据通过并出现在 bq2_dat 需要 2 个 bclk 时钟周期。

3) 第一个 bclk 捕获了部分数据,导致输出混乱,但第二个 bclk 是一个时钟周期后,有足够的时间让来自 bq1_dat 的模棱两可的数据稳定到高或低状态。凌乱的 bq1_dat 脉冲持续的时间刚好足以让 bq2 捕获有效的逻辑“1”(逻辑高),并将其作为有效且现在同步的数据(逻辑高)传递给 bq2_dat。

4) 在下游,任何使用 bclk 的时钟都会有同步的数据可以使用。请注意,只有第一个 bclk FF 必须处理亚稳态如果adat 只是微微秒或纳秒太晚,则输出可能是逻辑低电平。请记住,这些触发器仅在时钟的上升沿对数据输入进行采样。上升沿之前或之后发生的事情被忽略。