FSM之next_state
FSM状态机可以不使用next_state,直接根据当前的current_state和inputs通过组合逻辑计算出来结果,在使用时序逻辑获得current_state吗?
问题本质
这个问题背后的本质为:一段式状态机与二/三段式状态机的区别。
一段式状态机:
二/三段式状态机:
next_state
假定input信号不抖动或者抖动时长小于一个时钟周期,信号在触发器采样时已经保持稳定,分析使用next_state的优点与不足。
优点:
清晰的状态计算与状态更新分离:
next_state
设计将状态的计算(即计算出下一个状态的值)与状态的更新(将当前状态更新为下一个状态)分开。这种分离让设计变得更加清晰。- 这种分离使得设计者可以更容易理解状态转换逻辑,尤其是在系统变得复杂时,状态计算和状态更新的逻辑分开让修改和调试变得更加容易。
提高扩展性和维护性:
- 当设计变得复杂时,
next_state
设计提供了清晰的逻辑结构,使得扩展设计或修改状态转移变得更简便。在增加新的状态或修改现有状态时,你只需要修改next_state
的计算,而无需担心时序或同步问题。 - 例如,如果状态转移逻辑变得更复杂,使用
next_state
使得修改时仅涉及到“计算状态”部分,而不需要改变整个状态机的更新逻辑。
- 当设计变得复杂时,
减少设计的复杂性:
- 对于复杂的状态机设计,
next_state
提供了更简洁的方式来表达状态计算,避免了状态计算和更新交织在一起时可能引起的混乱。 next_state
设计可以减少代码中的冗余逻辑,特别是在状态机的逻辑较复杂时,设计变得更加清晰和模块化。
- 对于复杂的状态机设计,
调试和验证:
- 将状态计算和状态更新分离有助于调试。你可以单独验证
next_state
的计算过程,而不必担心它如何与状态更新同步。这种分离让调试变得更加高效。
- 将状态计算和状态更新分离有助于调试。你可以单独验证
不足:
增加不必要的设计复杂度:
- 对于非常简单的状态机设计,**
next_state
设计可能带来不必要的复杂性。在这种情况下,输入信号稳定并且状态机的逻辑非常简单,寄存器的边沿采样已经足够保证状态更新的稳定性,不需要额外的next_state
设计**。 - 由于状态更新已经是时钟同步的,并且信号的变化也不会导致不一致,**
next_state
增加了不必要的代码量和逻辑复杂度**,使得设计变得冗长。
- 对于非常简单的状态机设计,**
引入额外的时钟周期延迟:
- 使用
next_state
设计意味着状态的计算和状态更新是分开的。状态的计算是在时钟周期内完成的,而状态的更新是在下一个时钟周期进行的。这导致状态更新会延迟一个时钟周期,在一些对延迟有严格要求的系统中,这个延迟可能是不可接受的。 - 在没有
next_state
的设计中,状态更新和计算是同步的,不需要等待下一个时钟周期,因此设计响应速度更快。
- 使用
**在不需要高扩展性的系统中并不需要
next_state
**:- 如果系统输入信号非常简单且稳定,并且不需要复杂的状态机逻辑或状态转移,使用
next_state
设计会显得多余。因为寄存器的边沿采样已经足够处理信号的变化,无需引入next_state
。 next_state
的设计虽然在复杂设计中有优势,但对于简单状态机,它会导致设计复杂度的增加而没有带来明显的好处。
- 如果系统输入信号非常简单且稳定,并且不需要复杂的状态机逻辑或状态转移,使用
其他
在查阅AI的过程中,发现还存在以下优点,但我不太认可:
时序逻辑的稳定性和同步性
在FPGA设计中,状态机的状态更新通常由时钟信号同步。在一个时钟周期内,状态机的next_state是由current_state和inputs决定的,下一状态的计算通常依赖组合逻辑。然后,在下一个时钟周期,next_state会被传递给current_state。
如果直接通过current_state和inputs计算current_state,可能会导致在同一个时钟周期内计算和更新状态的不一致性。例如,current_state可能已经在计算过程中被改变,导致计算得到的不再是期望的值。避免反馈回路
在某些设计中,直接将current_state反馈到输入进行下一状态的计算可能导致不必要的复杂反馈回路,增加了设计的难度和不确定性。通过使用next_state中介,可以有效地将状态变化的计算与时钟同步,避免这些反馈问题。
FPGA中的寄存器用于同步输入信号并在时钟边沿进行采样。寄存器只在上升沿(或下降沿)采样输入信号,这意味着:
- 即使输入信号在一个时钟周期内发生了多次变化,寄存器只会在时钟边沿时采样信号,并将采样值存储在寄存器中。状态更新将只发生在下一个时钟周期。
这种特性带来以下优势:
- 信号的时序问题得以解决:由于寄存器的边沿采样,信号的瞬时波动或顺序变化不会影响状态更新。即使输入信号在时钟周期内发生变化,只有当信号稳定并在时钟边沿采样时,才会更新状态。
- 消除信号交错变化的影响:多个信号的变化顺序或时序差异不会影响到状态机的稳定性,因为状态更新是由时钟边沿触发的,所有信号都会在采样时刻“稳定下来”。