1. 状态机基础

大家好,我是你们的RTL设计讲师。今天咱们聊聊状态机——这个数字IC设计里绕不开的话题。

说实话,我刚开始做设计那会儿,觉得状态机就是个「高级点的if-else」。后来踩过几次坑才明白,这东西要是没搞透,轻则代码乱成一锅粥,重则芯片功能直接翻车。

1.1 什么是状态机?

状态机,全称有限状态机(FSM)。说白了,就是一个系统在有限个状态之间跳来跳去,根据当前状态和输入决定下一步去哪。

你想想看,生活中的状态机到处都是:

  • 电梯:停在1楼、2楼、3楼...按了按钮就移动
  • 红绿灯:红→绿→黄→红,循环往复
  • 自动售货机:等待投币→选择商品→出货→找零

在数字电路里,状态机就是一组寄存器(存当前状态)加上组合逻辑(算下一状态和输出)。

核心三要素:

  • 状态寄存器:记住当前在哪
  • 次态逻辑:根据当前状态和输入,算出下一步去哪
  • 输出逻辑:根据当前状态(或加上输入),产生输出信号

嗯,这里要注意:状态机的状态数量必须是有限的。你不可能设计一个「无限状态」的电路——寄存器就那么几个bit,能表示的状态数是有上限的。

1.2 状态机的应用场景

我在项目中遇到过太多需要状态机的地方了。说白了,只要你的设计里有「顺序控制」或者「协议交互」,大概率就得用状态机。

常见的应用场景包括:

场景 举例 为什么用状态机
通信协议 I2C、SPI、UART 协议有明确的时序阶段,状态机天然匹配
数据通路控制 FIFO读写、DMA传输 需要按步骤控制数据流动
系统调度 CPU指令执行、总线仲裁 多任务切换,状态机管理清晰
安全逻辑 上电复位序列、错误恢复 需要严格的状态转换顺序

我记得有一次做PCIe控制器,协议状态图密密麻麻画了三十多个状态。当时年轻,想用一堆if-else硬怼,结果代码写到一半自己都看不懂了。后来老老实实画状态图、写状态机,一周就搞定了。

我的经验:只要你的设计里出现「先做A,再做B,如果条件满足就做C,否则回到A」这种逻辑,就赶紧上状态机。别犹豫。

1.3 状态机的分类:Moore与Mealy

状态机分两种:Moore型和Mealy型。这俩的区别,说白了就是「输出什么时候变」。

Moore型状态机

输出只取决于当前状态。输入变了,输出不会立刻变,得等到状态跳转之后才变。

特点:

  • 输出与时钟同步,稳定、无毛刺
  • 状态数通常比Mealy多(因为输出信息要编码到状态里)
  • 适合对输出时序要求严格的场景

Mealy型状态机

输出取决于当前状态 和 当前输入。输入一变,输出立刻跟着变(组合逻辑直接输出)。

特点:

  • 输出响应快,输入变化立刻反映到输出
  • 状态数通常比Moore少(因为输出信息不用全编码到状态里)
  • 输出可能有毛刺(组合逻辑直接输出嘛)

我曾经在一个高速接口项目里,为了省两个状态用了Mealy型。结果仿真没问题,上FPGA实测发现输出毛刺导致后级逻辑误触发。嗯,从那以后我学乖了——对时序敏感的输出,老老实实用Moore。

避坑指南:Mealy型状态机的输出是组合逻辑,如果后级是异步复位或者边沿触发,很容易出问题。我建议:除非你非常清楚自己在做什么,否则新手先用Moore。

1.4 两种状态机的对比

对比项 Moore Mealy
输出依赖 仅当前状态 当前状态 + 当前输入
输出时序 时钟沿后变化 输入变化立即变化
状态数量 通常较多 通常较少
输出毛刺 无(寄存器输出) 可能有(组合逻辑输出)
设计复杂度 状态图清晰,易理解 状态图可能更紧凑
典型应用 控制逻辑、安全关键 高速数据通路、协议解析

1.5 知识体系总览

下面这张图,是我自己总结的状态机知识框架。你把它存脑子里,后面学起来就顺了。

状态机知识体系 有限状态机 (FSM) 什么是状态机 应用场景 分类 Moore型 输出仅依赖当前状态 Mealy型 输出依赖状态+输入 核心:状态寄存器 + 次态逻辑 + 输出逻辑

这张图把今天的内容串起来了。你记住:状态机就是「在哪→要去哪→输出啥」这三个问题。搞明白这个,后面写代码就是填空了。

一个小技巧:我每次设计状态机之前,都会先在纸上画状态转换图。画清楚了再写代码,效率翻倍。别一上来就敲Verilog,容易把自己绕进去。

好了,状态机的基础概念就聊到这儿。下一节咱们会深入讲状态机的编码方式——二进制、格雷码、独热码,各有各的坑,到时候我给你们讲讲我当年选错编码方式导致时序违例的惨痛经历。


可可精品资料库