子状态机

Substatemachine

我有一个有 5 个状态的 FSM。其中 3 个是通过子 FSM(UML 模式)设计的。 对于在 VHDL 中的实现,恕我直言,有两种方法可以做到这一点:

  1. 将它们总结为一个,所以我有一个包含子 FSM 的文档和一个包含一个大 FSM 的产品。

  2. 构建一个包含所有状态的 FSM。对于每个具有子 FSM 的状态,使用来自大状态机的启用信号构建一个独立的 FSM。

这没什么好说的,我觉得这两种方式各有优缺点。但是对于 VHDL 实现,哪种方式更 "clean"?

type my_big_one is (ONE,TWO_one, TWO_two, THREE_one, THREE_two, FOUR,FIVE);

对比

type my_one is (ONE, TWO, THREE, FOUR, FIVE);
type two_fsm is (TWO_one, TWO_two);
type three_fsm is (THREE_one, THREE_two);

一个好的解决方案是构建 2 个 FSM:
- 主要的 FSM 和
- 子 FSM。

两个 FSM 通过握手协议进行通信。

例如主FSM进入状态二。在这样做的同时,子 FSM 开始处理,由来自主 FSM 的信号触发。当 FSM TWO 完成时,它触发一个信号返回到主 FSM,主 FSM 进入状态 TREE。

使用此 "pattern" 允许您根据需要连接任意数量的 FSM。一些任务如等待或地址计数可以外包给计数器,它们只是特殊的 FSM。

分层 FSM 也是一种可行的解决方案;例如

type main_state is (ONE, TWO, THREE, FOUR, FIVE);
type inner_state is (inner_one, inner_two);
signal main  : main_state;
signal inner : inner_state;

...
case main is
when ONE => something_simple;
            main <= TWO;
            inner <= inner_one; -- reset inner SM
when TWO => case inner is
            when inner_one => ...
            when inner_two => ...
            end case;
when THREE => case inner is ...

走极端这会变得难以控制。但是,如果内部状态机相对简单,这可能比三个独立的状态机连同它们的握手更清晰、更简洁,握手除了同步之外没有任何作用。

我有时会使用这种模式,例如 SM 必须向 UART 发送一系列消息,而 "inner" 状态处理驱动 UART 的细节(可能有一个字符计数器消息)。

我不会固执地认为哪个是总体上更好的解决方案,这取决于上下文...