为什么我们需要在FSM中同步异步输入?


8

我刚开始学习数字电子学。我知道有一些门执行逻辑功能,我了解了RS-Latch,D-Latch和Master-Slave-D-Flip-Flop。现在,我可以执行逻辑功能并存储状态,现在可以创建有限状态机(例如,交通信号灯)。在课堂上,我们讨论了这个特定的交通信号灯示例,并讨论了如果要添加启动/停止按钮(向交通信号灯发出的信号,表明行人正在等待绿灯)会出现什么问题。

结论是,该按钮将是一个异步输入,我们需要在状态机之前放置一个触发器,以便可以首先同步该输入。

我不明白的是,异步输入有什么问题?为什么我们需要同步它?为什么在状态机前面或后面的触发器有助于同步呢?我读了几篇有关“可移植性”的文章,但我还是不明白

非常感谢

Answers:


6

正如您已经了解的那样,您的交通信号灯控制器状态机是同步机。也就是说,它由某个时钟驱动,以使所有组合逻辑发生变化,并稳定到稳定值的时间足够长,直到下一个时钟沿满足所需的建立时间为止。

原理图

模拟此电路 –使用CircuitLab创建的原理图

在此处输入图片说明

如果数据在该设置时间内发生变化,则最终输出不仅将是不可预测的,而且由于亚稳定性,在选择最终值之前,实际上可能会在中间值附近浮动或跳动一段时间。它甚至可能在高频下在逻辑1和逻辑零之间振荡,从而导致相当大的电流流动和发热。

在此处输入图片说明

因此,状态机的任何异步输入都需要在某个时候进行同步,以使系统按预期工作。但是,这并不一定意味着您总是需要向系统添加另一个闩锁。

如果输入仅进行到单个“下一个门”并且输入的状态独立于所有其他输入,则信号迟到到达聚会真的无关紧要。基本上,您需要问...“如果我们在一个时钟周期内错过了输入,这有关系吗?”

但是,如果输入,则将输入多个不同的门。下一个门可能会看到不同的逻辑电平,并将错误状态传播到下一个锁存器。基本上,各种坏事都会发生。

这可以通过您的简单示例进行说明。请注意,如果在下一个时钟之前REG1的亚稳性尚未稳定,则可能导致WALK和Traffic灯同时打开,或者两者都不打开。

原理图

模拟该电路

此外,如果异步输入与您希望同时发生的另一个异步输入有关系,则可以识别第二个输入,而第一个则不能。

在这两种情况下,您都需要在输入端添加一个同步锁存器,以使信号时序与状态机时钟保持一致。注意,这会增加一个时钟周期延迟,或者如果您使用时钟信号的另一边沿,则会增加半个时钟周期延迟。

但是,您可能会问:“但那个锁存器不会遇到同样的问题吗?” 当然,答案是肯定的。但是这里的技巧是让潜在的亚稳定性发生在电路中与我上面强调的无关紧要的某个点。

对于依赖的输入,找到这一点可能会有问题。通常,需要添加额外的逻辑来限定这些输入。

但是,请注意,亚稳态是一种可能性。尽管由于制造公差的差异,大多数闩锁会很快地拾起,但仍有可能在相当长的一段时间内保持不稳定。时钟脉冲之间的间隔越长,其稳定的可能性就越高。因此,如果您的系统时钟频率很高,请谨慎地将其分频以进行预锁存,以留出更多的建立时间。但是,即使如此,也无法保证。

最后的想法。我提到过,当同步随机外部输入时,可能会出现亚稳定引起的大电流和发热。不幸的是,除了移除异步输入电路之外,您几乎无能为力地纠正此问题,并且长期存在亚稳态问题。


谢谢!因此,触发器额外的一个时钟周期会增加时间来稳定亚稳态吗?另外,为什么我们要在FSM的末尾放一个触发器?
Eren

@Eren Yes增加了时间,并且从逻辑上讲,它给它提供了一个安全的地方来建立同步。通常,您希望所有输出都同时更改。因此,最后一级通常应该是触发器,或更准确地说是“锁存”输出,因此输出都是同步的。
Trevor_G

1
为您提供了多个门的+1,但请相信您可以更正最后一段。同步锁存器中的亚稳定性也很重要,因为它可以传递到电路中。有没有治愈的亚稳态。但是,您可以通过等待更长时间才能做出最终决定,从而将可能性降低到极小的可能性。为了避免降低时钟速率,通常是通过在其之前对多余的D触发器进行流水线处理来完成的。一旦错误概率降到了宇宙时代的最高水平,对于10亿次最大时钟频率的电路,大多数人都认为亚稳性“被治愈了”
Neil_UK

@Neil_UK是的,我想这样说,不要让OP过于混乱。仍在进行中。还是走了一天。谢谢。
Trevor_G

1
在这些类型的讨论中,亚稳是一个忌讳。实际上,您描述的跨时钟边界馈入多个输入的情况比获得亚稳态事件的失败率更高。路由延迟可能会以纳秒为单位倾斜,这意味着数据变化可能会在接收时钟的上升沿之前到达一个触发器,并可能在上升沿之后到达另一个触发器。我之所以这样区分是因为亚稳性仅是在您的松弛很少的情况下出现的问题,而布线偏斜始终是一个问题。
jalalipop

3

异步设计的一个问题是存在种族或危险。例如,在该电路中,首先让A = 1,B = 0,C = 1,这样D稳定并稳定在1。

在此处输入图片说明

现在,假设B变更为1和C变为0 在同一时刻。很明显,D将保持为1。但是在实际电路中,传播延迟和线路延迟很重要。因此,很有可能C的变化到达OR门的速度比B的变化通过AND门传播到OR门的速度快。结果是D暂时回到0,然后又回到稳定状态1。这被称为竞赛或危险。此瞬时故障可能触发D之后存在的任何电路,并且这种不希望有的跃迁会传播到整个电路。这会导致不必要的功耗,并可能导致功能错误。

为避免这些问题,我们可以通过在所有输入A,B,C之前和输出D之后添加一个D型触发器来注册输入和输出。因此,我们的电路现在仅在时钟沿锁存稳定的输入,计算表达式,锁存D并仅在下一个时钟沿将其输出。这确保只要触发器的所有输入都满足建立和保持时间,输入或输出中的此类故障就不会在我们的电路中传播。

这是尽管异步设计速度很快,但仍更偏爱同步设计的主要原因。


非常感谢你!我还有一个问题,那就可以了。在输入之前和输出之后添加触发器将导致两个时钟周期的移位。转移会给我们的状态机造成任何麻烦吗?打个比方,人A计数为7,然后问人B是否计数正确。B将对其进行分析并回答“是”。如果我们前面有一个触发器,并在输出后回答“是”,则人A已经9岁时就会到达答案。我看不到这会造成什么麻烦,除了延迟之外
-Eren

在一个时钟周期内锁存输入后,我们将在下一个时钟周期本身获得输出。功能将保持不变。每个时钟周期中的状态转换。FSM通常是这样设计的。
Mitu Raj

是的,这就是触发器造成的延迟,但这并不影响功能。
Mitu Raj
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.