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 知识体系总览
下面这张图,是我自己总结的状态机知识框架。你把它存脑子里,后面学起来就顺了。
这张图把今天的内容串起来了。你记住:状态机就是「在哪→要去哪→输出啥」这三个问题。搞明白这个,后面写代码就是填空了。
一个小技巧:我每次设计状态机之前,都会先在纸上画状态转换图。画清楚了再写代码,效率翻倍。别一上来就敲Verilog,容易把自己绕进去。
好了,状态机的基础概念就聊到这儿。下一节咱们会深入讲状态机的编码方式——二进制、格雷码、独热码,各有各的坑,到时候我给你们讲讲我当年选错编码方式导致时序违例的惨痛经历。
可可精品资料库