FPGA 有限状态机设计入门:状态、转移与输出
myfpga.com.cn 编辑部 · 2026-10-05
有限状态机(FSM)适合描述控制流程:电路处于某个状态,根据输入条件决定下一状态,并产生相应输出。常见例子包括接口控制器、命令处理、数据采集顺序和初始化流程。
FSM 的三个部分
一个典型 FSM 可以拆成:
- 状态寄存器:在时钟边沿保存当前状态;
- 下一状态逻辑:依据当前状态和输入计算下一状态;
- 输出逻辑:依据状态,或状态与输入,产生控制输出。
把这几部分分清楚,便于编写 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 等状态编码各有资源与时序取舍,结果会随器件、综合工具和控制逻辑变化。工具通常能依据设计进行编码选择;如需固定编码,应以综合报告和目标设计测量为依据,而不是假设某种编码总是更快或更省资源。
设计与验证要点
- 列出合法状态和每条转移的触发条件;
- 为组合输出和下一状态提供完整默认值;
- 明确复位后进入的状态;
- 检查非法状态、输入边界和状态停留条件;
- 在仿真波形中观察状态、输入、输出与时钟的关系;
- 查看综合报告,确认工具识别出的 FSM 及编码结果符合预期。
阅读 组合逻辑与时序逻辑基础 可了解状态寄存器的 RTL 写法;若输入来自独立时钟域,还需处理 跨时钟域信号传递。整体实现步骤见 FPGA 开发流程入门。