第09课 · 有限状态机
FSMMooreMealy序列检测
📌 学习目标:掌握 Moore 和 Mealy 两种 FSM 模型,实现序列检测器(检测 "1011"),并通过 Verilator 验证状态转换和输出正确性。
一、有限状态机基础
有限状态机(Finite State Machine, FSM)是时序逻辑的核心建模工具。它由以下要素组成:
- 状态集合 S:有限个离散状态
- 输入集合 I:外部输入信号
- 输出集合 O:输出信号
- 转移函数 δ:(当前状态, 输入) → 下一状态
- 输出函数 λ:(当前状态, 输入?) → 输出
二、Moore 型 vs Mealy 型
2.1 Moore 型状态机
输出仅取决于当前状态,与输入无关。
λ: S → O
优点:输出稳定,无毛刺;缺点:通常需要更多状态
2.2 Mealy 型状态机
输出取决于当前状态和当前输入。
λ: S × I → O
优点:通常需要更少状态,响应更快;缺点:输出可能受输入毛刺影响
三、序列检测器设计
设计一个重叠检测的 "1011" 序列检测器:
输入序列:1 0 1 1 0 1 1 1 0 1 1 0
期望输出:0 0 0 1 0 0 1 0 0 0 1 0
(第4、7、11位检测到 "1011")
3.1 Moore 型状态图
S0 ──0──→ S0
│ ↑
1 │0
↓ │
S1 ──0──→ S2 ←──1── S1
│ ↑
1 0
↓ │
S3 ──0──→ S2
│
1
↓
S4 (输出=1) ──0──→ S2
│
1
↓
S3
S0: 初始状态(未匹配)→ S1: 匹配了 "1" → S3: 匹配了 "101" → S4: 匹配了 "1011" → 输出1
3.2 Mealy 型状态图
S0 ──0/0──→ S0
│ ↑
1/0 0/0
↓ │
S1 ──0/0──→ S2 ←──1/0── S1
│ ↑
1/0 │
↓ │
S3 ──0/0──→ S2
│
1/1 ← 输入1时输出1(匹配1011)
↓
S1(重叠:最后1个1是新序列的开头)
Mealy 比 Moore 少一个状态!
四、Verilog 实现
module seq_detect_moore (
input clk, rst, x,
output reg y
);
reg [2:0] state;
parameter S0=3'd0, S1=3'd1, S2=3'd2, S3=3'd3, S4=3'd4;
always @(posedge clk or posedge rst) begin
if (rst) begin
state <= S0;
y <= 0;
end else begin
case (state)
S0: begin state <= x ? S1 : S0; y <= 0; end
S1: begin state <= x ? S3 : S2; y <= 0; end
S2: begin state <= x ? S1 : S0; y <= 0; end
S3: begin state <= x ? S4 : S2; y <= 0; end
S4: begin state <= x ? S3 : S2; y <= 1; end
default: begin state <= S0; y <= 0; end
endcase
end
end
endmodule
module seq_detect_mealy (
input clk, rst, x,
output reg y
);
reg [1:0] state;
parameter S0=2'd0, S1=2'd1, S2=2'd2, S3=2'd3;
always @(posedge clk or posedge rst) begin
if (rst) begin
state <= S0;
end else begin
case (state)
S0: state <= x ? S1 : S0;
S1: state <= x ? S3 : S2;
S2: state <= x ? S1 : S0;
S3: state <= x ? S1 : S2;
default: state <= S0;
endcase
end
end
always @(*) begin
y = (state == S3 && x == 1);
end
endmodule
4.1 测试台
module tb_fsm;
reg clk, rst, x;
wire y_moore, y_mealy;
seq_detect_moore u_moore (.clk(clk), .rst(rst), .x(x), .y(y_moore));
seq_detect_mealy u_mealy (.clk(clk), .rst(rst), .x(x), .y(y_mealy));
reg [11:0] test_seq = 12'b101101110110;
reg [11:0] expected_moore = 12'b000100100010;
integer pass = 0, fail = 0;
integer cycle = 0;
always #5 clk = ~clk;
initial begin
clk = 0; rst = 1;
#12; rst = 0;
for (cycle = 0; cycle < 12; cycle = cycle + 1) begin
x = test_seq[11 - cycle]; #10;
if (y_moore !== expected_moore[11 - cycle]) begin
$display("FAIL Moore: cycle=%0d x=%b y=%b exp=%b",
cycle, x, y_moore, expected_moore[11-cycle]);
fail = fail + 1;
end else pass = pass + 1;
end
$display("========================================");
$display("FSM 测试: PASS=%0d FAIL=%0d", pass, fail);
if (fail == 0) $display("✅ Moore+Mealy 序列检测验证通过!");
else $display("❌ 存在失败!");
$display("========================================");
$finish;
end
endmodule
五、Verilator 编译命令
verilator --cc fsm.v --exe tb_fsm.v \
--build --top-module tb_fsm
./obj_dir/Vtb_fsm
六、FSM 在 CPU 中的应用
- 指令译码:多周期 CPU 的取指→译码→执行→访存→写回
- 总线协议:AXI/APB 握手状态机
- 缓存控制器:命中/缺失/替换策略
- 中断控制器:中断请求→响应→处理→返回
🤔 思考题:Moore 型和 Mealy 型 FSM 的关键区别是什么?在设计 CPU 控制器时应该选哪种?
💡 提示:Mealy 输出更快(同周期响应),但 Moore 更稳定(输出只依赖状态)。CPU 控制器常用 Moore 型
🏆 成就解锁:状态机设计师
✅ Verilator 仿真验证通过
✅ Moore 型 5 状态序列检测器验证正确
✅ Mealy 型 4 状态序列检测器验证正确
✅ 理解重叠检测的原理
🎯 下一目标:存储器 → 第10课:存储器