FSM基础与电路选择依据
简述状态机的基本知识,解释状态机时序电路与组合电路的选取依据。
基本概念
在FPGA状态机设计中,一、二、三段式状态机是根据代码结构和逻辑划分方式对状态机实现形式的分类。它们核心区别在于组合逻辑与时序逻辑的组织方式(尤其是状态转移逻辑和输出逻辑的实现位置),目的是优化可读性、可维护性、时序性能和资源消耗。
一段式状态机
- 定义: 所有逻辑(状态寄存、次态计算、输出生成)集中在同一个时序always块(always @(posedge clk))中完成。
- 特点:
- 纯时序逻辑:无独立组合逻辑块。
- 输出可能滞后:输出需等到时钟边沿才更新(即使输入已变)。
- 难维护:状态转移和输出耦合严重。
二段式状态机
- 定义: 用两个always块分别实现:
- 时序逻辑块: 只负责状态寄存器更新 (current_state <= next_state)。
- 组合逻辑块: 负责计算次态 (next_state) 和输出 (out)。
- 特点:
- 清晰分离时序与组合逻辑。
- 输出无时钟延迟(组合逻辑直接输出)。
- 仍存在组合逻辑缺点:
- 输出可能有毛刺(未寄存)。
- 关键路径长(次态+输出逻辑在组合块中串联)。
三段式状态机
- 定义: 用三个always块严格分离逻辑:
- 时序块1: 状态寄存器更新 (current_state <= next_state)。
- 组合块1: 仅计算次态 (next_state = f(current_state, inputs))。
- 时序块2或组合块2: 实现输出逻辑(可组合或时序)。
- 特点:
- 最严格的逻辑分离:状态转移、次态计算、输出各自独立。
- 灵活性高:输出可自由选择组合逻辑(快,有毛刺)或时序逻辑(稳定,延迟一拍)。
- 时序优化:次态逻辑和输出逻辑并行计算(非串联),缩短关键路径。
- 可靠性高:寄存输出可消除毛刺。
电路类型的选取
时序逻辑速度慢,所有逻辑都等时钟边沿更新,响应会慢一拍。组合逻辑没有记忆,无法“记住”当前状态。组合逻辑的输出只取决于当前输入,没有历史信息,无法实现状态转移;同时,组合逻辑速度快但存在毛刺。
- 状态寄存器: 存储当前状态,需要记忆,必须使用时序逻辑。
- 次态逻辑: 根据当前状态和输入计算出下一个状态,这个计算过程不依赖于时钟,只要输入或当前状态变化,输出(下一个状态)就随之变化(经过延迟)。这里无关乎输出瞬间是否存在毛刺,一般经过一个周期的时长,即到采样的时刻有足够时长趋于稳定;更多考虑的是速度,故使用组合逻辑。
- 输出逻辑: 根据当前状态或当前状态和输入产生输出。这通常是组合逻辑,但也可以是时序逻辑。追求没有毛刺,使用时序逻辑;追求快一拍,使用组合逻辑。