c - Mealy和Moore之间的区别

标签 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

但这并不是我正在寻找的解释级别。

最佳答案

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

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

  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 只是获取新符号的例程(可能是 scanf 等),nextState 将取决于具体机,但其复杂度在 Mealy 和等效的 Moore 之间不会有太大变化。

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

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

关于c - Mealy和Moore之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11067994/

相关文章:

c - 对 `getaddrinfo_a' 的 undefined reference

c - 是否可以延迟解析 gcc-as 中的 .weakreference 直到链接时间? (海湾合作委员会)

c++ - 如何模仿静态库的 "multiple instances of global variables within the application"行为但使用 DLL?

c - 在没有外部硬件的情况下测试状态机流程

regex - RE -> FSM 生成器?

c - 如何正确使用 exp 和 sqrt 属性

c# - 测试大型状态机有哪些策略?

c - 通过 RTOS 实现状态机

java - 如何在 Java 中实现 FSM - 有限状态机

Verilog 代码将进行模拟,但不会进行综合。