第09课 · 有限状态机

FSMMooreMealy序列检测

📌 学习目标:掌握 Moore 和 Mealy 两种 FSM 模型,实现序列检测器(检测 "1011"),并通过 Verilator 验证状态转换和输出正确性。

一、有限状态机基础

有限状态机(Finite State Machine, FSM)是时序逻辑的核心建模工具。它由以下要素组成:

二、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 实现

// fsm.v — Moore & Mealy 序列检测器 (1011) // Moore 型序列检测器 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 // Mealy 型序列检测器 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; // 重叠:1是新序列开头 default: state <= S0; endcase end end // Mealy 输出:取决于状态和输入 always @(*) begin y = (state == S3 && x == 1); end endmodule

4.1 测试台

// tb_fsm.v 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 中的应用

🤔 思考题:Moore 型和 Mealy 型 FSM 的关键区别是什么?在设计 CPU 控制器时应该选哪种?

💡 提示:Mealy 输出更快(同周期响应),但 Moore 更稳定(输出只依赖状态)。CPU 控制器常用 Moore 型

🏆 成就解锁:状态机设计师

✅ Verilator 仿真验证通过

✅ Moore 型 5 状态序列检测器验证正确

✅ Mealy 型 4 状态序列检测器验证正确

✅ 理解重叠检测的原理

🎯 下一目标:存储器 → 第10课:存储器