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


9

使用2-ff同步器已经成为信号跨越时钟边界的标准。而且有很多纸/图说明了这种机制,例如:在此处输入图片说明

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


除了我的问题之外,我还想添加一些我认为能使信号安全通过另一个时钟域的信号(假设2-FF足以满足MTBF要求)。如果有任何错误,请纠正我。

在此处输入图片说明

ps:亚稳状态不会显示“四处游荡”的波形,而是既不是“ 1”也不是“ 0”的电平。下图显示了一个亚稳态输出的示例。在此处输入图片说明

原始数据来自WJ Dally的EE108A的讲义,第13讲:亚稳性和同步失败(当好的触发器变坏时会出现)


4
我只想说,显示亚稳态输出“四处游荡”的图表极具误导性。那根本不是那种亚稳态。当FF变为亚稳态时,其输出将变为单个特定的中间电压(该值取决于实现技术)并保持在那里。经过一段不可预知的时间后,电压将在高或低之间摆动,其走向也是不可预测的。
Dave Tweed

@Dave Tweed♦感谢您的评论。在我阅读的几乎所有有关亚稳定性的文档中,我都看到了“徘徊”波形。我四处搜索,发现一个帖子(如果触发器违反设置并变为亚稳态,完成振荡后是否可以保证稳定到输入值?),其中包含从o镜捕获的亚稳态拍摄。该帖子中包含指向该图原始参考的链接。
Fiedel

是的,这完美地说明了我的观点,并且来自Powerpoint的演示文稿中包含很多很好的信息。
戴夫·特威德

Answers:


8

简单的答案是,他们不是靠自己。那里没有同步器,以确保不会传递数据,但要确保您最终不会获得亚稳态信号,从而无法提供许多其他信号并引起问题。如图所示,第二个FF捕获了亚稳态的第一个FF输出,并防止其在设计中进一步传播。

信号种类繁多,如何包含同步器取决于您正在谈论的信号。但是让我们看几个常见的类型:

  1. 触发信号 -或基本上是脉冲的任何信号,必须开始其他运行。这些通常不携带任何数据,并且您感兴趣的只是有一个上升沿,以便开始在另一个时钟域中运行。为了使这些交叉,您需要一个同步器(本质上是执行图中所示的操作),但还需要更多一点。

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

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

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

    如果需要将控制字发送到目标时钟,并且在发送另一个之前要知道它已经到达目的地时钟(例如,如果要发送命令来执行某项操作),则可以使用这种总线。

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

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

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


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


除了Tom的答案外,我还想添加对PoC的引用,该引用具有针对这些情况的实现。在同步文档可在RTD。除了为基本2-FF同步器链接2个触发器的理论外,PoC还sync_Bits为Xilinx和Altera FPGA 提供了专用的实现(),以改善亚稳性能。2-FF同步器例如sync_Strobe用于为脉冲构建更复杂的同步器。
Paebbels

感谢您详细介绍同步策略。这张图片来自Clifford E. Cummings的“使用systemverilog的时钟域穿越(CDC)设计和验证技术”。我了解到,对于一位信号,宽度必须至少为1个时钟周期+设置时间+接收侧的保持时间,才能安全通过。在此图中,由于bclk采样在其下降沿仅对adat的脉冲进行采样一次,因此不满足该标准,这将导致bq1_dat成为亚稳态。
fiedel

...因此,在bclk的下一个上升沿处的bq1_dat读数可能为'0'或'1'。因此,图片中的同步似乎不成功。我对吗?
fiedel

@Paebbels谢谢您的参考。会看一看=)
fiedel

您应该将其编辑为问题,而不是将其发布为答案,但从本质上讲,是的,在该示例中,输出可能为1,也可能没有。
汤姆·卡彭特

1

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

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

3)第一个bclk捕获了部分数据,导致混乱的输出,但是第二个bclk在一个时钟周期之后,足够的时间使bq1_dat中的模糊数据稳定为高电平或低电平状态。混乱的bq1_dat脉冲持续了足够长的时间,足以使bq2捕获有效的逻辑“ 1”(逻辑高),并将其作为有效且现在已同步的数据(逻辑高)传递给bq2_dat。

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


但是请注意,bclk延迟仅提供了一种概率性的安全性度量,确切的延迟量取决于FF技术和bclk周期。在某些情况下,可能需要3个甚至更多阶段才能将错误率降低到可接受的水平。
WhatRoughBeast

@WhatRoughBeast。我知道在最坏的情况下,需要许多同步阶段以及数字滤波。显然,我的回答太简单了。
Sparky256 '16

@ Sparky256让我感到困惑的是3)您的评论。当bq1_dat处于亚稳状态时,bq2如何捕获“ 1”?
fiedel

@ fiedel,bq2能够捕获(至少)干净输入的两件事。首先,亚稳态需要持续一个完整的时钟周期。其次,来自bq1的亚稳态(伪中间轨)值不太可能(或已优化以避免)出现在窗口中,这也将导致bq2成为亚稳态-但主要是其中的第一个。假设该技术可导致5%的亚稳态持续足够长的时间。3-FF同步级会将其降低到0.25%,因为两个单元都必须发生故障。实际上,杂乱是与近乎稳定状态的明确定义的指数偏差。
肖恩·霍利哈内

@SeanHoulihane。感谢您的解释。术语“上升沿”使某些人感到困惑,因为接收数据的窗口(稳定或稳定)处于上升沿的中点,仅持续几皮秒或纳秒。仅在该瞬间为逻辑“1”或“0”的输入数据,无论是亚稳态或稳定的,这取决于它的电压电平相比较,以IC的逻辑1或0的阈值
Sparky256
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.