FSM之next_state

FSM状态机可以不使用next_state,直接根据当前的current_state和inputs通过组合逻辑计算出来结果,在使用时序逻辑获得current_state吗?

问题本质

这个问题背后的本质为:一段式状态机与二/三段式状态机的区别。

一段式状态机

图1: 一段式状态机
current_state的值直接由组合逻辑根据current_state和输入计算出来,这个组合逻辑的输出(新的状态值)又直接反馈回它的输入(current_state)。



二/三段式状态机

图2: 二/三段式状态机
在一个时钟周期内,根据当前的current_state和inputs计算出next_state,在下一个时钟上升沿,next_state的值被捕获并更新为新的current_state。

next_state

假定input信号不抖动或者抖动时长小于一个时钟周期,信号在触发器采样时已经保持稳定,分析使用next_state的优点与不足。

优点:

  1. 清晰的状态计算与状态更新分离:

    • next_state 设计将状态的计算(即计算出下一个状态的值)与状态的更新(将当前状态更新为下一个状态)分开。这种分离让设计变得更加清晰。
    • 这种分离使得设计者可以更容易理解状态转换逻辑,尤其是在系统变得复杂时,状态计算和状态更新的逻辑分开让修改和调试变得更加容易。
  2. 提高扩展性和维护性:

    • 当设计变得复杂时,next_state 设计提供了清晰的逻辑结构,使得扩展设计修改状态转移变得更简便。在增加新的状态或修改现有状态时,你只需要修改 next_state 的计算,而无需担心时序或同步问题。
    • 例如,如果状态转移逻辑变得更复杂,使用 next_state 使得修改时仅涉及到“计算状态”部分,而不需要改变整个状态机的更新逻辑。
  3. 减少设计的复杂性:

    • 对于复杂的状态机设计next_state 提供了更简洁的方式来表达状态计算,避免了状态计算和更新交织在一起时可能引起的混乱。
    • next_state 设计可以减少代码中的冗余逻辑,特别是在状态机的逻辑较复杂时,设计变得更加清晰和模块化。
  4. 调试和验证:

    • 将状态计算和状态更新分离有助于调试。你可以单独验证 next_state 的计算过程,而不必担心它如何与状态更新同步。这种分离让调试变得更加高效。

不足:

  1. 增加不必要的设计复杂度

    • 对于非常简单的状态机设计,**next_state 设计可能带来不必要的复杂性。在这种情况下,输入信号稳定并且状态机的逻辑非常简单,寄存器的边沿采样已经足够保证状态更新的稳定性,不需要额外的 next_state 设计**。
    • 由于状态更新已经是时钟同步的,并且信号的变化也不会导致不一致,**next_state 增加了不必要的代码量和逻辑复杂度**,使得设计变得冗长。
  2. 引入额外的时钟周期延迟

    • 使用 next_state 设计意味着状态的计算和状态更新是分开的。状态的计算是在时钟周期内完成的,而状态的更新是在下一个时钟周期进行的。这导致状态更新会延迟一个时钟周期,在一些对延迟有严格要求的系统中,这个延迟可能是不可接受的。
    • 在没有 next_state 的设计中,状态更新和计算是同步的,不需要等待下一个时钟周期,因此设计响应速度更快。
  3. **在不需要高扩展性的系统中并不需要 next_state**:

    • 如果系统输入信号非常简单且稳定,并且不需要复杂的状态机逻辑或状态转移,使用 next_state 设计会显得多余。因为寄存器的边沿采样已经足够处理信号的变化,无需引入 next_state
    • next_state 的设计虽然在复杂设计中有优势,但对于简单状态机,它会导致设计复杂度的增加而没有带来明显的好处。

其他

在查阅AI的过程中,发现还存在以下优点,但我不太认可:

  1. 时序逻辑的稳定性和同步性
    在FPGA设计中,状态机的状态更新通常由时钟信号同步。在一个时钟周期内,状态机的next_state是由current_state和inputs决定的,下一状态的计算通常依赖组合逻辑。然后,在下一个时钟周期,next_state会被传递给current_state。
    如果直接通过current_state和inputs计算current_state,可能会导致在同一个时钟周期内计算和更新状态的不一致性。例如,current_state可能已经在计算过程中被改变,导致计算得到的不再是期望的值。

  2. 避免反馈回路
    在某些设计中,直接将current_state反馈到输入进行下一状态的计算可能导致不必要的复杂反馈回路,增加了设计的难度和不确定性。通过使用next_state中介,可以有效地将状态变化的计算与时钟同步,避免这些反馈问题。

FPGA中的寄存器用于同步输入信号并在时钟边沿进行采样。寄存器只在上升沿(或下降沿)采样输入信号,这意味着:

  • 即使输入信号在一个时钟周期内发生了多次变化,寄存器只会在时钟边沿时采样信号,并将采样值存储在寄存器中。状态更新将只发生在下一个时钟周期。

这种特性带来以下优势:

  • 信号的时序问题得以解决:由于寄存器的边沿采样,信号的瞬时波动或顺序变化不会影响状态更新。即使输入信号在时钟周期内发生变化,只有当信号稳定并在时钟边沿采样时,才会更新状态。
  • 消除信号交错变化的影响:多个信号的变化顺序或时序差异不会影响到状态机的稳定性,因为状态更新是由时钟边沿触发的,所有信号都会在采样时刻“稳定下来”。
作者

LiXintao

发布于

2025-08-10

更新于

2025-08-14

许可协议

评论