Mealy和Moore之间的区别

use*_*251 7 c state-machine fsm

在C实现方面,Mealy和Moore状态机之间的区别是否有任何实际意义?通常会有什么不同?

很久以前,在RTL方面,我更容易理解Mealy/Moore的优缺点.整个输出取决于当前状态/输出取决于当前状态+当前输入差异是有意义的,因为在某些情况下Mealy可以用少1个状态制作也是有意义的.将时序图与每个FSM实现相关联也使它们之间的区别更加清晰.

假设我在C中制作状态机.在一种情况下,LUT取决于状态/电流输入(Mealy),而在Moore中,LUT只查找当前状态并返回下一个状态.在输出发生在LUT返回之后(我想,虽然我可能是错的).我没想到Mealy在用C编码时有明显的优势.代码可读性,速度,代码密度,设计简易等主题可能都是相关主题 - 从我的角度看,这两个模型看起来几乎相同.

也许这种差异只是学术界的一个主题 - 而在C实现中,差异可以忽略不计.如果你知道C状态机实现在Mealy和Moore之间的关键方式,并且如果有真正的优势(也很重要),我很想知道.我想强调一点 - 我不是在询问RTL实现.

我确实在这里看到了另一个Mealy/Moore帖子:Mealy v/s.穆尔

但这并不是我所寻求的解释水平.

Ste*_*ppo 4

您有一个将一种形式主义转换为另一种形式主义的机械程序,因此两者之间不存在结构差异。

说到实现上的差异,两种形式仅在输出函数上有所不同,它告诉您应该输出什么符号。具体来说:

  1. 在摩尔机中,输出仅取决于当前状态
  2. 在 Mealy 机器中,输出取决于当前状态当前输入。

摩尔机的实现可能会更简单一些,因为在生成输出时需要跟踪的信息较少,但差异非常小。

下面是一个简单的摩尔机在 C 语言中的样子:

int state = INITIAL;
while (!isTerminal(state)) {
    char input = nextInputSymbol();
    fprintf(output, "%c", nextOutputSymbol(state));
    state = nextState(state, input);
}
Run Code Online (Sandbox Code Playgroud)

这是 Mealy 机器:

int state = INITIAL;
while (!isTerminal(state)) {
    char input = nextInputSymbol();
    fprintf(output, "%c", nextOutputSymbol(input, state));
    state = nextState(state, input);
}
Run Code Online (Sandbox Code Playgroud)

如您所见,唯一的区别在于 的定义nextOutputSymbol()。对于一种或另一种形式来说,所述功能的实现是否更容易,这实际上取决于具体的应用。

nextInputSymbol只是获取新符号(可能是 ascanf等)的例程,并且nextState取决于具体的机器,但其复杂性在 Mealy 和等效的 Moore 之间不会有太大变化。

特别是,两者nextOutputSymbolnextState归结为表查找或aswitchif/else链,没有真正的实现困难。真的,他们写起来很无聊。

注意:我省略了代码片段中的错误检查,以使我们专注于讨论的要点。现实世界的代码会执行一些额外的检查,例如处理 EOFnextInputSymbolbreak错误状态。