myFPGA.com.cnFPGA 技术与产业观察
← 返回栏目

FPGA 有限状态机设计入门:状态、转移与输出

myfpga.com.cn 编辑部 · 2026-10-05

有限状态机(FSM)适合描述控制流程:电路处于某个状态,根据输入条件决定下一状态,并产生相应输出。常见例子包括接口控制器、命令处理、数据采集顺序和初始化流程。

FSM 的三个部分

一个典型 FSM 可以拆成:

  1. 状态寄存器:在时钟边沿保存当前状态;
  2. 下一状态逻辑:依据当前状态和输入计算下一状态;
  3. 输出逻辑:依据状态,或状态与输入,产生控制输出。

把这几部分分清楚,便于编写 RTL、构造 testbench,也便于从波形中追踪状态转移。

Moore 与 Mealy 输出

Moore 型输出只由当前状态决定,通常在状态寄存器更新后变化。Mealy 型输出同时依赖当前状态和输入,因此输入变化可能在时钟边沿之间影响输出。选择哪种形式要看接口时序与功能要求;无论哪种形式,都要检查输出在目标电路中的时序路径。

SystemVerilog 示例

以下示例有空闲、等待和完成三个状态。完成状态拉高 ready,这是一个由当前状态决定的 Moore 型输出:

logic clk, reset, start, done, ready;
typedef enum logic [1:0] {IDLE, WAIT, DONE} state_t;
state_t state_q, state_d;

always_ff @(posedge clk) begin
  if (reset)
    state_q <= IDLE;
  else
    state_q <= state_d;
end

always_comb begin
  state_d = state_q;
  ready = 1'b0;

  case (state_q)
    IDLE: if (start) state_d = WAIT;
    WAIT: if (done)  state_d = DONE;
    DONE: begin
      ready = 1'b1;
      if (!start) state_d = IDLE;
    end
    default: state_d = IDLE;
  endcase
end

组合过程先给 state_d 和 ready 赋默认值,避免不完整赋值;default 为未识别状态指定恢复方向。复位在这个例子中是同步高有效。产品设计应按系统复位要求选择合适结构,并通过仿真检查复位和状态异常场景。

状态编码不必手动猜测

二进制、one-hot 等状态编码各有资源与时序取舍,结果会随器件、综合工具和控制逻辑变化。工具通常能依据设计进行编码选择;如需固定编码,应以综合报告和目标设计测量为依据,而不是假设某种编码总是更快或更省资源。

设计与验证要点

阅读 组合逻辑与时序逻辑基础 可了解状态寄存器的 RTL 写法;若输入来自独立时钟域,还需处理 跨时钟域信号传递。整体实现步骤见 FPGA 开发流程入门。

信息来源