Moore 和 Mealy 状态机有什么区别?
更新时间:2026-09-21。问题驱动短答页。FSM 基础见 状态机入门,健壮写法见 FSM 设计,编码结构见 一段式与三段式。
一句话回答
Moore 型状态机的输出「只取决于当前状态」;Mealy 型的输出「取决于当前状态 + 当前输入」。差别就在输出函数里带不带输入:Moore 输出随状态走、天然同步稳定;Mealy 输出直接挂输入、能更快反应、状态数更少,但输入上的毛刺会传到输出。
核心对照
| 维度 | Moore | Mealy |
|---|---|---|
| 输出取决于 | 仅当前状态 | 当前状态 + 当前输入 |
| 输出何时变 | 状态更新后(沿后),通常晚一拍 | 输入变就立刻变(同拍) |
| 响应速度 | 一般慢一拍 | 可提前一拍反应 |
| 状态数 | 可能更多(要用状态区分输出) | 往往更少 |
| 输出毛刺 | 输出可寄存、干净 | 组合输出,可能随输入毛刺 |
| 典型场景 | 控制信号、LED、对外稳定输出 | 协议应答、需立即随输入反应 |
代码上的差别
verilog
// Moore:输出只看状态
always @(*) begin
case (state)
S_A: out = 1'b0;
S_B: out = 1'b1; // 进入 S_B 后输出才为 1
endcase
end
// Mealy:输出同时看状态和输入
always @(*) begin
out = 1'b0;
if (state == S_A && din == 1'b1)
out = 1'b1; // 还在 S_A,只要 din 来了本拍就能拉高
end怎么选与工程建议
- 要对外输出稳定、可直接做使能/控制:选 Moore,或把 Mealy 输出再打一拍寄存——这就是常见的折中。
- 要抢一拍时序、状态编码想精简:可用 Mealy,但务必清楚输出是组合的。
- 实践里推荐 三段式:现态寄存器一段、次态组合逻辑一段、输出单独一段(Moore 或寄存后的 Mealy),清晰、易约束、易读,见 一段式与三段式。
- 两者不互斥,同一状态机里不同输出可以分别用 Moore/Mealy,是为「混合型」。
常见坑
- 把 Mealy 组合输出直接当时钟/握手线:输入毛刺造成误触发,要寄存或加同步。
- Mealy 输出与测试平台预期错一拍:仿真时注意输出在输入变化的同一拍就变。
- 输出组合逻辑路径过长影响频率:把输出寄存,回到 Moore 时序。
- 复位/异常态缺失导致跑飞,健壮性见 健壮 FSM 与恢复。
总结
Moore 输出只由当前状态决定、随状态沿更新、稳定但可能晚一拍、状态略多,适合对外控制信号;Mealy 输出由状态和输入共同决定、输入一变同拍即可反应、能省状态抢时间,但输出是组合逻辑会被输入毛刺影响;选不准就用三段式并把关键 Mealy 输出寄存一拍,既拿到快速响应又保证下游拿到干净的同步信号。