FSM/FSMD 介绍
〇、简介
0.1 FSM
FSM(Finite-State Machine):即有限状态机,是数字系统设计中描述时序行为的基本模型。根据输出产生方式的不同,其分为两种经典类型:
- Moore型:输出仅取决于当前状态,与输入无关。输出在状态转移后的时钟周期稳定,适合对时序要求严格、输出不宜有毛刺的场景。
- Mealy型:输出取决于当前状态和当前输入。输出在输入变化时立即响应,状态数量通常较少,但可能存在组合逻辑毛刺。
0.2 FSMD
当系统涉及多比特数据运算(如加法、比较、移位)时,传统 FSM 需要为每一种数据值或中间结果设计专门状态,导致状态爆炸问题,为此引入FSMD
FSMD(Finite-State Machine with Datapath):即带数据通路的有限状态机,其核心思想是将系统划分为两部分:
| 部分 | 组成 | 职责 |
|---|---|---|
| 控制通路 | 简化的 FSM | 调度“何时做什么” |
| 数据通路 | 寄存器、ALU、比较器等运算/存储单元 | 具体执行操作 |
优势:
- 将复杂的数据处理与控制逻辑分离
- 显著减少状态数量
- 便于设计参数化和扩展
应用领域:现代处理器、DSP、加密引擎等复杂数字系统的核心设计范式。
0.3 示例问题
下面将用下述问题介绍 FSM 和 FSMD
功能描述:设计一个电路,输入为单比特串行数据 din(每个时钟周期输入一位),输出为单比特 dout。当连续输入的 4 位数据与预设序列“1101”完全匹配时,dout 输出一个时钟周期的高电平脉冲;否则 dout 为 0。
示例波形:
- 输入序列:1 1 0 1 0 1 1 0 1 1 ...
- 输出序列:0 0 0 1 0 0 0 0 1 0 ...
一、FSM-Moore型
Moore型有限状态机的输出仅与当前状态有关,与输入无关
1.1 状态转移图(文本描述)
| 状态 | 含义 |
|---|---|
| S0 | 初始状态 |
| S1 | 接收到1 |
| S2 | 接收到11 |
| S3 | 接收到110 |
| S4 | 接收到1101 |
状态转移图:
1.2 Verilog代码
module moore_1101 (
input clk,
input rst_n,
input din,
output reg dout
);
typedef enum logic [2:0] {
S0, S1, S2, S3, S4
} state_t;
state_t state, next;
always @(posedge clk or negedge rst_n)
if (!rst_n) state <= S0;
else state <= next;
always @(*) begin
next = state;
case (state)
S0: next = din ? S1 : S0;
S1: next = din ? S2 : S0;
S2: next = din ? S2 : S3;
S3: next = din ? S4 : S0;
S4: next = S0;
endcase
end
always @(*) dout = (state == S4);
endmodule
二、FSM-Mealy型
Mealy型有限状态机的输出取决于当前状态和当前输入。检测到“1101”的最后一个输入时,立即在同一时钟周期内输出1。
2.1 状态转移图
| 状态 | 含义 |
|---|---|
| S0 | 未匹配 |
| S1 | 接收到1 |
| S2 | 接收到11 |
| S3 | 接收到110 |
状态转移图:
2.2 Verilog代码
module mealy_1101 (
input clk,
input rst_n,
input din,
output reg dout
);
typedef enum logic [1:0] {
S0, S1, S2, S3
} state_t;
state_t state, next;
always @(posedge clk or negedge rst_n)
if (!rst_n) state <= S0;
else state <= next;
always @(*) begin
next = state;
dout = 0;
case (state)
S0: if (din) next = S1;
S1: if (din) next = S2;
else next = S0;
S2: if (!din) next = S3;
else next = S2;
S3: if (din) begin
dout = 1;
next = S0;
end else next = S0;
endcase
end
endmodule
三、FSMD(带数据通路的有限状态机)
FSMD将系统划分为控制通路(FSM)和数据通路。数据通路包含移位寄存器和比较器,控制通路仅负责调度。
3.1 ASMD图
状态:IDLE(初始化)、SHIFT(移位并比较)、OUT(输出脉冲)
流程:
- 进入 IDLE 后立即进入 SHIFT。
- SHIFT 状态:
- 数据操作:shift_reg = {shift_reg[2:0], din}
- 判断 match = (shift_reg == 1101)
- 如果 match=0,重复 SHIFT
- 如果 match=1,进入 OUT 状态输出 dout=1,然后返回 SHIFT
FSMD 的表示一般用 ASMD(Algorithmic State Machine with Datapath) 图表示
3.2 结构框图
3.3 Verilog代码
module fsmd_1101 (
input clk,
input rst_n,
input din,
output reg dout
);
// ---------- 数据通路 ----------
reg [3:0] shift_reg;
wire match = (shift_reg == 4'b1101);
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
shift_reg <= 4'b0;
else if (shift_en)
shift_reg <= {shift_reg[2:0], din};
end
// ---------- 控制通路 ----------
typedef enum { IDLE, SHIFT } state_t;
state_t state, next;
reg shift_en;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) state <= IDLE;
else state <= next;
end
always @(*) begin
next = state;
shift_en = 0;
dout = 0;
case (state)
IDLE: begin
shift_en = 1;
next = SHIFT;
end
SHIFT: begin
shift_en = 1;
if (match) dout = 1;
next = SHIFT;
end
endcase
end
endmodule
四、总结
| 特性 | Moore FSM | Mealy FSM | FSMD |
|---|---|---|---|
| 状态数量 | 5个 | 4个 | 2个(控制通路) |
| 输出产生时机 | 状态切换后的下一周期 | 输入有效时立即 | 可立即(Mealy型控制)或下一周期 |
| 记忆历史的方式 | 状态本身 | 状态本身 | 数据通路(移位寄存器) |
| 修改检测序列的代价 | 重画状态图,增加状态 | 重画状态图,可能增加状态 | 只改数据通路的比较常数 |
| 图形表示 | 状态转移图(圆圈+箭头) | 状态转移图(输出标箭头) | ASMD图(状态框+操作+菱形) |
| 典型应用 | 简单控制,输出需稳定 | 高速响应,状态数受限 | 复杂算法硬件(GCD、CPU、加密) |
核心区别
- Moore vs Mealy:输出是否依赖输入(Moore更稳定,Mealy更快)。
- FSM vs FSMD:FSM将全部“记忆”放在状态中,导致状态爆炸;FSMD将数据记忆与运算分离到数据通路,控制通路极度简化,更适合算法密集型设计。
适用场景:如果设计包含大量数据运算(比较、加法、移位),优先选择FSMD;如果仅需检测简单信号边沿或握手协议,普通FSM更直接。对于“1101”这样的固定短序列,三者都能工作,但FSMD体现了可扩展性——若要检测“110101”,FSMD只需将移位寄存器改为6位、比较常数改为6'b110101,控制通路完全不变。