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

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

假设我正在用C制造状态机。在一种情况下,LUT取决于状态/当前输入(Mealy),而在Moore中,LUT只是查找当前状态并返回下一个状态。在这两种情况下,输出都是在LUT返回之后发生的(我认为,尽管我可能错了)。我还没有想到一个清晰的方法,即用C语言进行编码时Mealy会具有优势。诸如代码可读性,速度,代码密度,设计难易度之类的主题可能都是相关主题-从我的 Angular 看,这两个模型几乎相同。

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

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

但这并不是我想要的解释级别。

最佳答案

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

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

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

    特别地,nextOutputSymbolnextState都可以归结为一个表查找或switchif/else链,而没有真正的实现困难。他们真的很无聊。

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

    08-24 23:11