一、状态机基础:从概念到实战

大家好,我是老李。做数字IC设计这些年,状态机可以说是用得最多的设计范式之一。今天咱们就来聊聊状态机的基础,把它的来龙去脉说清楚。

1.1 什么是状态机?

状态机,全称有限状态机(FSM)。说白了,就是一个系统在有限个状态之间跳转的模型。每个时刻,系统只处于一个状态,根据输入信号决定下一步去哪。

我打个比方。你想想看,一个自动售货机就是典型的状态机:

  • 空闲状态:等待投币
  • 投币状态:累计金额
  • 选择商品状态:用户按键
  • 出货状态:吐出商品
  • 找零状态:退还多余的钱

每个状态都有明确的输入条件和输出动作。这就是状态机的核心思想。

核心定义:状态机 = 状态集合 + 输入集合 + 输出集合 + 状态转移规则 + 输出规则

在Verilog里,我们通常用parameter定义状态,用always块实现状态转移和输出逻辑。嗯,这里要注意,状态编码方式会影响电路面积和速度。

1.2 状态机的应用场景

我在项目中遇到过不少场景,状态机几乎是绕不开的。这里列几个典型的:

通信协议解析

比如I2C、SPI、UART这些协议,都有明确的帧格式和时序要求。用状态机来解析最合适不过了。我记得做UART接收器时,就定义了空闲、起始位、数据位、校验位、停止位这几个状态,每个状态处理一个bit,逻辑非常清晰。

控制逻辑

CPU的指令执行、DMA的数据传输、存储器的读写控制,这些本质上都是状态机。我曾经做过一个DMA控制器,有8个状态,包括空闲、请求、响应、传输、完成等。用状态机设计,调试起来方便很多。

协议握手

比如AXI总线的握手协议,valid-ready信号之间的交互,用状态机来管理握手流程,可以避免很多时序问题。

应用场景 典型状态数 关键考量
UART接收器 5-8个 波特率匹配、采样点
SPI控制器 4-6个 时钟极性和相位
DMA控制器 6-10个 优先级、突发传输
CPU指令执行 10-20个 流水线冲突、异常处理

1.3 状态机的分类:Moore与Mealy

这是面试常考的问题。两种状态机的区别,说白了就是输出和状态、输入的关系不同。

Moore型状态机

输出只取决于当前状态。也就是说,状态变了,输出才变。这种状态机比较稳定,输出不会因为输入抖动而毛刺。我个人的习惯是,能用Moore就用Moore,因为调试起来容易。

我的经验:Moore型状态机在综合后,输出路径上通常不需要额外的组合逻辑,时序更容易收敛。

Mealy型状态机

输出取决于当前状态和输入。好处是响应快,输入变化立刻反映到输出。但坏处也很明显——容易产生毛刺。我曾经在一个高速接口设计中用了Mealy,结果输出信号上全是毛刺,后来加了一级寄存器才搞定。

为什么会这样?因为Mealy的输出是组合逻辑,输入信号的变化会直接传递到输出。如果输入信号有毛刺,输出也会有。

特性 Moore Mealy
输出依赖 仅当前状态 当前状态 + 输入
响应速度 慢一拍(时钟沿后) 快(组合逻辑直接输出)
毛刺风险 低 高
状态数 通常较多 通常较少
典型应用 控制逻辑、协议解析 高速数据通路、算术运算

避坑指南:我曾经在一个项目中,为了省两个状态用了Mealy,结果输出信号时序不满足,最后不得不改回Moore。所以我的建议是:除非对延迟有严格要求,否则优先选Moore。

1.4 知识体系总览

下面这张图,是我自己总结的状态机知识体系。你把它理解了,后面学起来就顺了。

有限状态机 FSM 基本定义 应用场景 分类 状态集合 转移规则 输出规则 通信协议 控制逻辑 协议握手 Moore型 Mealy型 状态机知识体系总览

这张图把状态机的三个核心维度串起来了。左边是定义,中间是应用,右边是分类。你学的时候,可以对照这张图,看看自己掌握了哪些。

1.5 小结

这一章我们聊了状态机的基础。说白了,状态机就是一套「状态 + 转移 + 输出」的规则。Moore和Mealy的区别,核心在于输出是否依赖输入。我个人建议初学者先从Moore入手,等熟练了再尝试Mealy。

嗯,这里要提醒一句:状态机设计最忌讳的就是状态太多、逻辑太乱。我见过有人一个状态机写了30多个状态,调试起来简直要命。所以,设计时一定要控制状态数量,该拆分的拆分,该合并的合并。

核心要点回顾:

  • 状态机 = 状态 + 输入 + 输出 + 转移规则
  • Moore输出只依赖状态,Mealy输出依赖状态和输入
  • Moore更稳定,Mealy响应更快
  • 实际项目中,优先考虑Moore

好了,状态机的基础就聊到这里。下一章我们开始实战,用Verilog写一个真正的状态机。

可可精品资料库