我有一个有5个状态的FSM。其中3个是通过sub-FSM(UML Pattern)设计的。 对于VHDL中的实现,有两种方法可以做到:
将它们汇总成一个,所以我有一个sub-FSM的文档和一个带有一个大FSM的产品。
构建一个包含所有状态的FSM。对于每个具有子FSM的状态构建一个独立的FSM,其中包含来自大FSM的启用信号。
这对于什么更好是毫无疑问的,我认为两种方式各有利弊。但对于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);
答案 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。