FPGA高级状态机设计教程
核心概述
本文是FPGA培训教材的第4.3章,系统讲解有限状态机(FSM)的设计方法。状态机是数字时序电路的核心组件,广泛应用于CPU总线仲裁、通信协议握手等场景。
状态机基本概念
三要素
- 状态变量:划分逻辑顺序和时序规律
- 输出:某个状态时特定发生的事件
- 输入:进入某个状态的条件
稳定状态机要求
- 时钟同步的输入
- 时钟同步的输出
状态机分类
按逻辑形式分
| 类型 | 特点 |
|---|---|
| Moore状态机 | 输出仅依赖当前状态,与输入无关,输出时钟同步 |
| Mealy状态机 | 输出依赖当前状态+输入条件,输出异步,可能随输入变化 |
按描述方式分
- 2段式:一个always块描述状态跳转(时序),一个描述下一状态(组合)
- 3段式:三个always块分别描述状态更替、下一状态产生、输出产生
同步问题
输入同步
状态机输入通常异步,需同步化避免错误跳转。采用二级同步器设计:
Input → Flip-Flop(Syc1) → Flip-Flop(Syc2) → 状态机
可降低亚稳态概率。
输出同步
- Moore状态机输出本身同步
- Mealy状态机需额外同步化设计
设计方法
传统设计法(以偶校验器为例)
- 画出状态转移图
- 建立状态转移表
- 推导真值表
- 逻辑方程提取:NS = PS^PI, OUT = PS
- 电路映射实现
算法状态机(ASM)设计法
ASM图由三种基本元素组成:
- 状态框:表示状态
- 条件输出框:表示条件-dependent输出
- 判断框:表示条件判断
- 寄存器操作框:表示寄存器操作
适合复杂状态机设计,类似软件流程图。
设计实例
实例1:UART发射机
- 控制信号:Byte_ready, Load_XMT_shftreg, T_byte, bit_count, start, shift, clear
- 状态:idle → waiting → sending
- 数据通道:XMT_datareg → XMT_shftreg → Serial_out
实例2:UART接收机
- 控制信号:read_not_ready_in, inc/clear_Sample_counter, inc/clear_Bit_counter, shift, load, Error1/Error2
- 状态:idle → starting → receiving
- 错误检测:Error1(采样超时)、Error2(停止位丢失)
实例3:简单RISC控制器
- 指令集:NOP, ADD, SUB, AND
- 状态序列:S_idle → S_fet1 → S_fet2 → S_dec → S_ext1
- 数据通路:PC → Mem → IR → Reg_File → ALU → Reg_File
实例4:SPI发射机控制器
- 状态:S_idle → S_0 → S_1 → … → S_7
- 控制信号:SDO(bit0~7), CS_n, SCLK
- 可扩展:8位指令+8位数据模式
状态编码方式
| 编码方式 | 特点 |
|---|---|
| 二进制编码 | 状态位最少,组合逻辑复杂 |
| 格雷编码 | 状态跳变单次变化,减少glitch |
| 独热编码 | 状态位=状态数,速度快,面积大 |
| 输出状态编码 | 输出与状态编码结合优化 |
状态机初始化
- FPGA中利用全局reset信号正确进入初始状态
- 其他情况需设计初始化电路
- 推荐将初始状态(如Idle)编码为0
关键要点
- 优秀的状态机应具备:安全稳定性高、速度快、面积小、设计清晰易维护
- 状态机同步化是避免亚稳态的关键
- ASM图是复杂状态机设计的有效抽象工具
- 3段式表述方法便于编写可综合的Verilog/VHDL代码