Mealy和Moore之间的区别

时间:2012-06-17 00:17:36

标签: 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. Moore

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

2 个答案:

答案 0 :(得分:4)

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

说到实现上的差异,这两种形式只在输出函数中有所不同,它告诉你应该输出什么符号。具体做法是:

  1. 在Moore机器中,输出仅取决于当前状态
  2. 在Mealy机器中,输出取决于当前状态当前输入。
  3. 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只是获取新符号的例程(可能是scanf之类),nextState将依赖于特定的机器,但其复杂性不会有太大变化在Mealy和同等摩尔之间。

    特别是,nextOutputSymbolnextState归结为表查找或switchif/else链,没有真正的实施难度。他们写作真的很无聊。

    注意:我省略了代码段中的错误检查,以便让我们专注于讨论的要点。真实世界代码会执行一些额外的检查,例如在nextInputSymbol处理EOF或在break处理错误状态。

答案 1 :(得分:1)

摩尔机器:输出仅取决于当前状态。 Mealy机器:输出取决于当前状态和&目前的意见。