1. 状态机基础:什么是状态机、状态机的分类(Moore与Mealy)、状态转移图绘制规范

各位同学好,我是老李。做数字IC设计十几年了,今天咱们聊聊状态机。说实话,状态机这东西,刚入行时觉得挺简单,不就是几个状态跳来跳去嘛。但后来我发现,很多芯片出bug,根子都在状态机设计上。所以这一章,咱们把基础打扎实。

1.1 什么是状态机

状态机,全称是有限状态机(Finite State Machine, FSM)。说白了,就是一个系统在有限个状态之间,根据输入信号和当前状态,决定下一步跳到哪个状态,同时产生输出。

我习惯用一个比喻来理解:状态机就像一台自动售货机。你投币(输入),机器根据当前余额(当前状态),决定能不能出货(输出),然后更新余额(下一状态)。你想想看,是不是这个道理?

状态机有三个核心要素:

  • 状态集合:系统所有可能的状态,比如空闲、读数据、写数据、等待等
  • 转移条件:什么情况下从一个状态跳到另一个状态
  • 输出逻辑:在每个状态下,系统对外输出什么信号

核心要点:状态机设计的好坏,直接决定了你的控制逻辑是否清晰、是否容易调试。我在项目中遇到过,有人把状态机写得像意大利面条一样乱,结果仿真跑三天都找不出bug在哪。

1.2 状态机的分类:Moore与Mealy

状态机主要分两类:Moore型和Mealy型。很多教材讲得云里雾里,我用自己的理解给你说清楚。

Moore型状态机

Moore型的特点是:输出只取决于当前状态。也就是说,只要状态不变,输出就一直保持。这种状态机的好处是输出稳定,不会因为输入抖动而乱跳。

我记得有一次做I2C控制器,用的就是Moore型。因为I2C的时序要求很严格,输出信号必须干净,不能有毛刺。Moore型正好满足这个需求。

Mealy型状态机

Mealy型的特点是:输出取决于当前状态和输入。也就是说,同样的状态,输入不同,输出可能不一样。这种状态机的好处是响应快,输入一变,输出立刻跟着变。

但这里有个坑——我曾经吃过亏。Mealy型如果组合逻辑没处理好,输出很容易出现毛刺。所以做高速设计时,我一般会在输出端加一级寄存器打一拍。

对比项 Moore型 Mealy型
输出依赖 仅当前状态 当前状态 + 输入
输出稳定性 高,无毛刺 可能有毛刺,需注意
响应速度 慢一拍(时钟沿后变化) 快(输入变化立即响应)
状态数量 通常较多 通常较少
典型应用 I2C、SPI等时序敏感接口 高速数据通路、协议解析

我的建议:新手先从Moore型入手,逻辑清晰,不容易出错。等熟练了,再尝试Mealy型。但不管用哪种,一定要在仿真里把边界条件跑透。

1.3 状态转移图绘制规范

状态转移图,是状态机设计的灵魂。图画得好,代码写起来就顺。图画得乱,后面调试能把你逼疯。

我总结了几个绘制规范,都是血泪教训换来的:

  1. 状态用圆圈表示:每个状态一个圆圈,里面写上状态名。比如IDLE、READ、WRITE等。
  2. 箭头表示转移方向:从当前状态指向下一状态,箭头旁边标注转移条件。
  3. 初始状态要标清楚:一般用双圈或者箭头指向,表示复位后的第一个状态。
  4. 输出信号标注:Moore型在状态圆圈内标输出,Mealy型在箭头旁标输出。
  5. 避免交叉线:尽量让箭头不交叉,画出来一目了然。

下面我画一个简单的状态转移图,展示一个UART接收器的状态机:

UART接收器状态转移图(Moore型) IDLE rx_out=1 START rx_out=0 DATA rx_out=0 STOP rx_out=1 复位 rx_in==0 位采样完成 8位数据接收完 停止位采样完 图例 状态转移 ● 转移条件 状态内: 输出信号 复位指向

避坑指南:我曾经画过一个状态转移图,状态之间箭头交叉得密密麻麻,结果写代码时漏掉了一个转移条件,导致芯片在特定场景下死锁。从那以后,我画图一定先规划好布局,尽量让箭头不交叉。如果状态太多,就分层画。

1.4 状态机设计的几个关键点

嗯,这里再补充几个我多年积累的经验:

  • 状态编码要谨慎:二进制编码省寄存器,但组合逻辑复杂。独热码(One-hot)费寄存器,但译码简单、速度快。我一般状态少于8个用独热码,多于8个用二进制。
  • 一定要有默认状态:写case语句时,最后一定要加default,跳到IDLE或者安全状态。否则万一出现非法状态,整个系统就崩了。
  • 仿真时多打印状态信息:我习惯在仿真脚本里把当前状态和转移条件都打印出来,这样波形一看就懂,调试效率高很多。

小技巧:写状态机时,我习惯把状态定义成localparam,用有意义的名字,比如S_IDLE、S_READ、S_WRITE。千万别用数字0、1、2,否则三个月后你自己都看不懂。

好了,这一章就到这里。状态机是数字IC设计的基石,基础打牢了,后面学起来就轻松了。下一章咱们聊聊状态机的Verilog实现,到时候我会拿几个实际项目中的例子来讲。

课后思考:你想想看,如果让你设计一个交通灯控制器,你会用Moore型还是Mealy型?为什么?

可可精品资料库