0%

[CO P0]关于 Mealy 机和 Moore 机的思考

完成 P0 课下内容后,我对 Logisim 中完成两种有限状态机的方法以及其区别有了一些见解。
前情提要

两种状态机都有“状态转移”、“状态存储”和“输出电路”三部分构成。且“状态转移”和“输出电路”是组合逻辑实现,而“状态存储”是时序逻辑实现。


Moore 机

Moore Machine

Moore 机的输出不和输入直接挂钩,是根据当前状态来决定是否输出的。换言之,我们应当把状态储存的值提取出来,然后通过一个输出逻辑来生成我们期待的输出值。

这其实隐含了一个信息:状态存储是时序逻辑(一般来说我们用寄存器存储状态编码),其更新通常来说是在时钟上升沿发生的,这就导致了在时钟上升沿(或题指定的时刻)其输出给输出电路的值发生改变,从而最后得到的结果改变。简单来说,输出结果的更新发生在时钟上升沿(或给定时刻)。


Mealy 机

Mealy Machine

Mealy 机的输出与当前输入直接挂钩。输入和当前状态储存的内容共同决定了输出的结果。而且是即时生效,因为组合逻辑不会根据时钟的变化来变化。


时间差

根据以上的分析,Moore 机和 Mealy 机通常会有时间差。比如下面这个例子:
当前状态为 S1,若输入为 In,则状态转为 S2,当状态为 S2,输出 Out 置为 1。

  • Moore 机中,它是这样的:

    • 当前状态 S1;
    • 第一个上升沿,检测到输入为 In,状态转为 S2;
    • 因为状态是 S2,所以输出 Out 置为 1;
  • Mealy 机中,它是这样的:

    • 当前状态 S1;
    • 不论当前是不是上升沿,检测到输入为 In,输出置为 1;
    • 第一个上升沿,若输入还是 In,状态转为 S2;

也就是说 Mealy 机给人的直观感受就是“提前”了一周期,明明还是状态 S1,却将输出置为 1 了?

其实并不是这样一回事,Mealy 机好比有“预判”的功能,如果当前已经是 S1,且输入是 In,它就知道接下来势必变成 S2,因此“预判”了上升沿到来时状态存储的结果,并将输出置为 1。换言之,S2 对于 Mealy 机都是可有可无的,它根本不关心 S1 会不会变成 S2,因为该输出的时候早已经输出了。
可以理解成 Mealy 机的输出和时钟是异步的。

Moore 机则不然。就算知道了当前输入是 In,也得等到下一个周期更新完状态,才能通过输出电路去输出结果。
可以理解成 Moore 机的输出和时钟是同步的。

四不像机

然而我今天画了一个四不像出来。
在状态转移电路中,我的输出端自作多情的添加了一个 isOut 含义的端口。什么意思呢?就是根据输入和当前状态,我直接指定了 Out 端口要不要置为 1。还是上面的例子,就好比我的状态转移电路是这样:

  • 如果当前状态是 S1,且输入是 In,则状态转为 S2,并告诉 Out 要输出 1。

然后我把 isOutOut 直接相连了。

那么这是什么机呢?看似 Out 并没有直接和输入挂钩,可是事实并非如此。我们仍然一步一步分析:

  • 当前状态是 S1,输入是 In。

  • 状态转移电路是组合逻辑,因此无论现在是什么时刻,它读入了当前状态 S1,以及输入 In,然后它想,“哦,现在我要立刻输出 S2,并把 isOut 置为 1。”

  • S2 朝着“状态存储”去了,但是不知道现在是不是时钟上升沿,因此其有没有进入寄存器,我们不知道。

  • 但是 isOut 直接连着 Out,于是 Out 被置为 1 了。

仔细一想,这不是 Mealy 机的形式吗?输出和时钟异步。但是 Out 却没有和输入直接相连,而是隐式地通过 isOut 这个端口相连了。正如前面所说,isOut 起到了“预判”的作用,而这正是 Mealy 机的特点。

如果我希望当前状态更新为 S2 再输出,有办法么?

自然是有的,我们需要将输出强制与时间同步。也就是说不能让 isOut 直接与 Out 相连了。

最简单的办法是弄一个寄存器,isOut 做输入,输出给 Out,然后用时钟驱动。这样如果 isOut 被置为 1,这个信号会因为寄存器的原因被强行滞留到下一个上升沿到来时,然后进入寄存器并立即传给 Out

再来想想这是否是正确的:

  • 当前状态是 S1,输入是 In。

  • 状态转移电路是组合逻辑,因此无论现在是什么时刻,它读入了当前状态 S1,以及输入 In,然后它想,“哦,现在我要立刻输出 S2,并把 isOut 置为 1。”

  • S2 在下一个时钟上升沿到来之前都不会进入寄存器并更新状态,与此同时 isOut 在下一个时钟上升沿到来之前也不会进入寄存器传递给 Out

  • 时钟上升沿到来了,然后 S2 进入了寄存器完成状态转移,同时 Out 置为 1。

看来确实解决问题了,不过这样真的就把整个电路变成“四不像”机了。最正确的做法是不要搞什么 isOut,直接用“状态存储”的输出值来判断要不要将 Out 置为 1。这样就能正确地完成 Moore 机了。如果要的是 Mealy 机,最好把输入和“状态存储”的输出值直接相连,用一个逻辑来判断,以免混淆。

-------------本文结束 感谢您的时间-------------

欢迎关注我的其它发布渠道