Substatemachine

时间:2015-09-16 15:16:14

标签: vhdl fsm

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

  1. 将它们汇总成一个,所以我有一个sub-FSM的文档和一个带有一个大FSM的产品。

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

  3. 这对于什么更好是毫无疑问的,我认为两种方式各有利弊。但对于VHDL实现,哪种方式更“干净”?

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

    VS

    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 个答案:

答案 0 :(得分:3)

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

SELECT * FROM (
    SELECT 'Cancelled' AS STATUS_TYPE 
    UNION 
    SELECT 'Resolved' 
    UNION 
    SELECT 'Open' 
    UNION 
    SELECT 'Closed' ) AS X 
WHERE STATUS_TYPE NOT IN (@StatusType)

走极端,这变得无法控制。但是如果内部状态机相对简单,那么它可以比三个独立的状态机以及它们的握手更清晰,更简洁,除了同步之外没有任何其他目的。

我有时使用这种模式,例如SM必须向UART发送一系列消息,“内部”状态处理驱动UART的细节(可能带有消息中字符的计数器)。

我不会教诲总体上哪个是更好的解决方案,这取决于背景......

答案 1 :(得分:2)

一个好的解决方案是建立2个FSM:
  - 主FSM和
  - 次FSM。

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

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

使用此“模式”可以根据需要连接多个FSM。等待或地址计数等一些任务可以外包到计数器中,这些计数器只是特殊的FSM。

相关问题