FPGA高级状态机设计教程

核心概述

本文是FPGA培训教材的第4.3章,系统讲解有限状态机(FSM)的设计方法。状态机是数字时序电路的核心组件,广泛应用于CPU总线仲裁、通信协议握手等场景。

状态机基本概念

三要素

  • 状态变量:划分逻辑顺序和时序规律
  • 输出:某个状态时特定发生的事件
  • 输入:进入某个状态的条件

稳定状态机要求

  • 时钟同步的输入
  • 时钟同步的输出

状态机分类

按逻辑形式分

类型特点
Moore状态机输出仅依赖当前状态,与输入无关,输出时钟同步
Mealy状态机输出依赖当前状态+输入条件,输出异步,可能随输入变化

按描述方式分

  • 2段式:一个always块描述状态跳转(时序),一个描述下一状态(组合)
  • 3段式:三个always块分别描述状态更替、下一状态产生、输出产生

同步问题

输入同步

状态机输入通常异步,需同步化避免错误跳转。采用二级同步器设计:

Input → Flip-Flop(Syc1) → Flip-Flop(Syc2) → 状态机

可降低亚稳态概率。

输出同步

  • Moore状态机输出本身同步
  • Mealy状态机需额外同步化设计

设计方法

传统设计法(以偶校验器为例)

  1. 画出状态转移图
  2. 建立状态转移表
  3. 推导真值表
  4. 逻辑方程提取:NS = PS^PI, OUT = PS
  5. 电路映射实现

算法状态机(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

关键要点

  1. 优秀的状态机应具备:安全稳定性高、速度快、面积小、设计清晰易维护
  2. 状态机同步化是避免亚稳态的关键
  3. ASM图是复杂状态机设计的有效抽象工具
  4. 3段式表述方法便于编写可综合的Verilog/VHDL代码