7

当涉及到 C 实现时,Mealy 和 Moore 状态机之间的区别是否有任何实际意义?这种差异通常是什么?

很久以前,当谈到 RTL 时,我更容易理解 Mealy/Moore 的优势/劣势。取决于当前状态的整个输出/取决于当前状态+当前输入差异的输出是有意义的,在某些情况下,Mealy 可以少 1 个状态这一事实也是有意义的。将时序图与每个 FSM 实现相关联也使它们之间的区别更加清晰。

假设我正在用 C 语言制作状态机。在一种情况下,LUT 取决于状态/当前输入(Mealy),而在 Moore 中,LUT 只是查找当前状态并返回下一个状态。在任一输出中都发生在从 LUT 返回之后(我认为,尽管我可能是错的)。我还没有想到一个明确的方式来说明 Mealy 在用 C 编码时具有优势。诸如代码可读性、速度、代码密度、设计易用性等主题可能都是相关主题——从我的角度来看,这两个模型看起来几乎相同。

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

我确实在这里看到了另一篇 Mealy/Moore 帖子:Mealy v/s。摩尔

但这并不是我正在寻找的解释水平。

4

2 回答 2

4

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

说到实现上的区别,两种形式主义只是在输出函数上不同,它告诉你应该输出什么符号。具体来说:

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

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

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

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

这是 Mealy 机器:

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

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

nextInputSymbol只是获取新符号(可能是 ascanf或类似符号)的例程,nextState将取决于特定的机器,但它的复杂性在 Mealy 和等效的 Moore 之间不会有太大变化。

特别是,两者都nextOutputSymbol归结nextState为一个表查找或一个switch或一个if/else链,没有真正的实现困难。他们写起来很无聊,真的。

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

于 2014-07-26T12:41:24.070 回答
1

摩尔机:输出仅取决于当前状态。Mealy Machine:输出取决于当前状态和当前输入。

于 2015-04-25T18:02:56.917 回答