FSM/FSMD 介绍

55 阅读5分钟

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

状态转移图:

fsm_moore.svg

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

状态转移图:

fsm_mealy.svg

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) 图表示

fsmd.svg

3.2 结构框图

fsmd_structure.svg

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 FSMMealy FSMFSMD
状态数量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,控制通路完全不变。