当涉及到 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
但这并不是我正在寻找的解释级别。
最佳答案
您有一个将一种形式主义转换为另一种形式主义的机械过程,因此两者之间没有结构差异。
说到实现上的差异,两种形式主义仅在输出函数 上有所不同,它告诉您应该输出什么符号。具体来说:
- 在摩尔机中,输出仅取决于当前状态
- 在 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 之间不会有太大变化。
特别是,nextOutputSymbol
和 nextState
都归结为表查找或 switch
或 if/else
链,没有真正的实现困难。他们只是写起来很无聊,真的。
注意:我省略了代码片段中的错误检查,以使我们专注于讨论的要点。真实世界的代码会执行一些额外的检查,例如处理 nextInputSymbol
上的 EOF 或处理错误状态的break
。
关于c - Mealy和Moore之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11067994/