【问题标题】:Substatemachine子状态机
【发布时间】:2023-04-01 20:25:02
【问题描述】:

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

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

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

这不是什么更好的问题,我认为这两种方式都有其优点和缺点。但是对于 VHDL 实现,哪种方式更“干净”?

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);

【问题讨论】:

    标签: vhdl fsm


    【解决方案1】:

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

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

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

    使用这种“模式”,您可以根据需要连接尽可能多的 FSM。等待或地址计数等一些任务可以外包给计数器,它们只是特殊的 FSM。

    【讨论】:

      【解决方案2】:

      分层 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 发送一系列消息,而“内部”状态处理驱动 UART 的细节(可能使用消息中字符的计数器)。

      我不会教条式地确定总体上哪个是更好的解决方案,这取决于上下文...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多