2015-09-16 35 views
1

我有一個FSM有5個州。其中3個是通過sub-FSM(UML Pattern)設計的。 對於VHDL實現有2種方式,恕我直言,這樣做:Substatemachine

  1. 總結他們到一個,所以我有子FSM的一個文檔,並與一個大的FSM產品。

  2. 構建一個與所有狀態的FSM。對於每個具有sub-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); 

回答

3

分層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的細節(可能使用消息中字符的計數器) 。

我不會教條主張哪個是更好的解決方案,這取決於上下文...

2

一個很好的解決方案是構建2周的FSM:
- 主FSM和
- 子FSM(一個或多個)。

兩個FSM通過握手協議進行通信。

例如,主FSM進入狀態TWO。在這樣做的時候,子FSM開始處理,由來自主FSM的信號觸發。當FSM TWO完成時,它觸發一個信號返回到主FSM,該主FSM進入狀態TREE。

使用此「模式」可以根據需要連接儘可能多的FSM。一些任務如等待或計算地址可以外包給計數器,這些計數器只是特殊的FSM。