一、状态机基础:从零开始理解状态机

大家好,我是你们的FPGA讲师。今天咱们聊聊状态机——这个在数字电路设计里绕不开的核心概念。

说实话,我刚入行那会儿,觉得状态机就是个高大上的东西。后来做项目多了才发现,它其实就是个「有限状态的自动切换器」。说白了,就是告诉电路:你现在处于什么状态,遇到什么情况该跳到哪个状态去。

1.1 什么是状态机?

状态机,全称有限状态机(Finite State Machine, FSM)。它由三部分组成:

  • 状态寄存器:记录当前处于哪个状态
  • 状态转移逻辑:决定下一个状态是什么
  • 输出逻辑:根据当前状态(或输入)产生输出

我习惯把状态机想象成一个「有记忆的自动售货机」。你投币(输入),它记住你投了多少(状态),然后决定能不能出货(输出)。

核心要点:状态机是时序逻辑电路,它依赖时钟沿来更新状态。没有时钟,状态机就「卡住」了。

1.2 状态机的应用场景

状态机在FPGA开发中无处不在。我挑三个最常见的场景说说:

场景一:按键消抖

按键按下时,机械触点会抖动几十毫秒。如果不处理,一次按键可能被识别成多次。用状态机来处理就很简单:

// 按键消抖状态机(简化版)
typedef enum {
    IDLE,       // 空闲状态
    PRESS_DETECT, // 检测到按下
    DEBOUNCE,   // 消抖等待
    PRESS_CONFIRM // 确认按下
} debounce_state_t;

我在项目中遇到过最头疼的按键问题,是某款工业控制面板的按键抖动长达100ms。当时我用了4状态的状态机,配合20ms的定时器,完美解决了问题。

场景二:UART协议

UART(通用异步收发器)的接收端,本质上就是一个状态机。它需要检测起始位、接收数据位、校验位和停止位。

// UART接收状态机
typedef enum {
    IDLE,       // 等待起始位
    START_BIT,  // 检测到起始位
    DATA_BITS,  // 接收数据位
    PARITY_BIT, // 校验位(可选)
    STOP_BIT    // 停止位
} uart_rx_state_t;

嗯,这里要注意:UART的波特率决定了每个位的采样时机。我建议用16倍过采样,在数据位的中间采样,这样抗干扰能力更强。

场景三:SD卡控制器

SD卡协议是状态机应用的经典案例。从初始化、发送命令、接收响应到数据传输,每一步都是一个状态。

个人经验:SD卡控制器是我做过最复杂的单模块状态机之一。它有20多个状态,包括CMD发送、响应超时处理、CRC校验等。写这种状态机,我建议先画状态转移图,再写代码。

1.3 状态机的分类:Moore型与Mealy型

这是面试常考的问题。两种类型有什么区别?我直接说结论:

特性 Moore型 Mealy型
输出依赖 仅当前状态 当前状态 + 输入
输出时序 时钟沿后稳定 输入变化即变化
状态数 通常较多 通常较少
响应速度 慢一拍 即时响应
抗干扰能力 较强 较弱(易受毛刺影响)

Moore型:输出只跟当前状态有关。比如一个简单的流水灯,状态决定哪个灯亮,跟输入没关系。

Mealy型:输出同时依赖当前状态和输入。比如UART接收器,在DATA_BITS状态下,输入数据直接决定输出值。

避坑指南:我曾经在一个高速数据采集项目里用了Mealy型状态机,结果因为输入信号毛刺导致输出误触发。后来改成Moore型,虽然多了一个时钟周期的延迟,但稳定性大大提升。所以,如果你的输入信号质量不好,优先考虑Moore型。

1.4 状态机设计的一般步骤

我总结了一套「四步法」,新手照着做基本不会出错:

  1. 画状态转移图:用圆圈表示状态,箭头表示转移条件
  2. 列状态转移表:把每个状态和输入对应的下一个状态写清楚
  3. 写RTL代码:用三段式状态机写法(状态寄存器、次态逻辑、输出逻辑分开)
  4. 仿真验证:覆盖所有状态转移路径,特别是边界条件

你想想看,如果跳过第一步直接写代码,大概率会漏掉某个状态转移条件。我见过太多这样的案例了。

1.5 本章知识体系

下面这张图总结了本章的核心内容:

状态机基础 - 知识体系 有限状态机 (FSM) 什么是状态机? 应用场景 分类 按键消抖 UART协议 SD卡控制器 Moore型 Mealy型 状态寄存器 状态转移逻辑 输出逻辑 核心:有限状态 + 时钟驱动 + 状态转移 设计四步法 画图 → 列表 → 写代码 → 仿真验证

这张图把本章的知识点串起来了。你看到没?状态机其实就三个核心问题:它是什么?用在哪?怎么分类? 搞懂这三个,基础就打牢了。

最后说一句:状态机是FPGA设计的「基本功」。我面试新人时,第一个问题往往是「给我讲讲状态机的三种写法」。如果你能把这个讲清楚,说明你的数字电路基础是扎实的。

可可精品资料库