FPGA培训资料-高级状态机设计
---
title: "FPGA培训资料-高级状态机设计"
source: "/日常学习资料/FPGA培训资料/FPGA培训_2012_07/4.3FSM.pdf"
original_path: "/日常学习资料/FPGA培训资料/FPGA培训_2012_07/4.3FSM.pdf"
author: "FPGA培训资料"
date: "2012-07"
size: "528 KB"
pages: 67
status: done
method: PDF文本提取
---核心内容
Altera(现Intel)FPGA培训课程中关于有限状态机(FSM)设计的专题讲座,涵盖Moore/Mealy状态机、同步问题、传统与ASM设计方法,以及UART、RISC控制器等实例。
状态机概述
基本定义
- 有限状态机(FSM):时序电路中只能存在有限个状态,每个状态和输出都是确定的
- 三要素:状态变量(划分逻辑顺序)、输入(进入状态的条件)、输出(特定事件)
- 核心作用:控制事件发生顺序、调整数据通路时序、实现通讯握手协议等
分类方式
- 按逻辑形式:Moore状态机(输出仅依赖当前状态)、Mealy状态机(输出依赖当前状态和输入)
- 按描述方式:2段式、3段式
Moore vs Mealy状态机对比
| 特性 | Moore状态机 | Mealy状态机 |
|---|---|---|
| 输出依赖 | 仅当前状态 | 当前状态 + 输入 |
| 输出同步性 | 时钟同步(有优势) | 异步(随输入改变) |
| 时序设计 | 更有优势 | 需同步化处理 |
| 结构 | 状态寄存器 + 次态逻辑 + 输出逻辑 | 状态寄存器 + 次态/输出联合逻辑 |
同步问题与亚稳态
问题根源
- 状态机输入通常来自异步信号,与时钟不同步
- 直接采样可能导致错误状态跳转
解决方案
- 输入同步:使用D触发器在时钟上升沿采样
- 二级同步器:两个级联D触发器,降低亚稳态概率
- 输出同步:Moore输出已同步;Mealy需用触发器同步化输出
状态机设计方法
传统设计方法
适用于简单状态机(如偶校验器):
- 状态转移图 → 状态转移表 → 真值表 → 逻辑方程 → 电路映射
算法状态机(ASM)设计方法
适用于复杂状态机:
- ASM图三元素:状态框、条件输出、判断框、寄存器操作框
- 3段式Verilog描述:
- 第一个always块:状态更替(时序逻辑)
- 第二个always块:次态逻辑(组合逻辑)
- 第三个always块:输出逻辑(组合或时序)
设计实例
1. 偶校验器
- 状态:EVEN(0)、ODD(1)
- 输入:bit
- 输出:parity
- 状态方程:NS = PS XOR PI,OUT = PS
2. UART发射机
- 状态:idle → waiting → sending
- 关键控制信号:Byte_ready、Load_XMT_shftreg、T_byte、bit_count、shift、clear
- 使用ASM图清晰表达控制流程
3. UART接收机
- 状态:idle → starting → receiving
- 采样计数器(Sample_counter)用于多采样抗干扰
- 错误检测:Error1(主机未准备好)、Error2(终止位丢失)
4. 简单RISC控制器
- 指令集:NOP、ADD、SUB、AND
- 控制单元 + 数据通道单元分离架构
- 状态编码:S_idle、S_fet1、S_fet2、S_dec等
5. SPI发射机控制器
- 状态机驱动SDO、CS_n、SCLK时序
- 支持8位指令+8位数据扩展
状态编码方式
| 编码方式 | 特点 |
|---|---|
| 二进制编码 | 最省触发器,编码解码逻辑复杂 |
| 格雷编码 | 相邻状态仅1位变化,减少glitch |
| 独热码 | 每个状态一个触发器,比较快但资源多 |
| 输出状态编码 | 部分状态复用输出位 |
推荐:将初始状态(如Idle)编码为0,利用FPGA全局reset正确初始化
关键设计原则
- 安全性:避免无效状态导致电路死锁
- 稳定性:状态转移清晰,无毛刺输出
- 速度:满足设计时钟要求
- 面积:合理选择编码方式
- 可维护性:设计清晰易懂,便于后续修改