Logisim關於Moore型和Mealy型FSM的搭建
Moore型與Mealy型的區別
根據黑書上所講,Moore型狀態機即為輸出只取決於系統的狀態,而Mealy型狀態機輸出取決於當前系統的狀態和輸入。這樣的解釋可能難以理解,我們可以這樣去區分Moore型與Mealy型:
假設現在有輸入in、狀態S、輸出out,
- 對於Moore型:
out為關於S而不關於in的一個組合邏輯,即每個S都對應一個out(當然可能多個S的out是一樣的,也即out = f(S)),只要當前狀態S發生改變,out便隨之改變。 - 對於Mealy型:
out為關於S和in的一個組合邏輯,即out = f (S,in),這意味着在一個狀態S時,若in發生了改變,out也將立刻隨之改變。
現在你已經知道了什么是Moore型和Mealy型了,來試試動手搭建他們吧~
搭建Moore型電路
如下圖所示,使用一個寄存器來儲存當前狀態,轉移電路通過現態和輸入得到次態,輸出電路根據當前狀態得到輸出值out。其實由於轉移電路和輸出電路都僅僅為一個組合邏輯電路,我們可以簡單地用倆個模塊分別實現他們。(圖中in和out的位數按實際情況處理,此處都記為兩位了)如圖所示,我們要做的工作便是利用logisim的傻瓜鍵——一鍵生成電路來生成這倆個模塊。
- 轉移電路
根據我們畫出的狀態轉移圖在logisim的Combinational Analysis中調整好table,其中一定要注意高低位,在logisim中如果你使用一個splitter就會發現他是默認高位在下面的(如左圖),而在寫table時一般會為了便於自己識別狀態,會將S1寫在S0前面(如中圖),而這樣一鍵生成的電路是高位在上面(如右圖),這時候直接把splitter連上就會出大問題了。
- 輸出電路
這個電路就非常的簡單啦,我們只需要繼續用logisim的傻瓜鍵根據S輸出out就可以,同理,注意高低位。
搭建Mealy型電路
與Moore型類似,只是輸出電路從僅僅由當前狀態決定變成了由當前狀態和當前輸入in共同決定。其他注意事項與搭建倆個模塊的過程均和Moore型差不多。
Moore型與Mealy型的狀態轉移圖
搭建電路是非常簡單的,但是僅僅按上述方法去搭還是可能出錯滴,因為狀態機題最重要的部分應該是如何畫出正確的狀態轉移圖。下面我們來看看兩者的區別和搭建時應注意的東西。
- 兩者的區別
Mealy型的狀態數比Moore型的狀態數少1,假設Moore型有狀態(A,B,C,D,E),其中當輸入in為1時狀態D將轉移到狀態E,而Mealy型僅僅需要4個狀態:(A,B,C,D),這是因為Moore型的輸出out僅僅與狀態有關,若想當狀態為E時輸出out為1,必須形成E狀態。而對於Mealy型,輸出out是由狀態和輸入共同決定的,即如果在狀態D時,輸入in為1,那么輸出電路就可以輸出1了,不需要等到狀態E形成,因此也不需要狀態E,比Moore型少一個狀態。
- 注意事項
最后一個狀態轉移時不一定回到初態,當我們進行字符串匹配時,當匹配到最后一個字符時,接下來如果輸入為字符串的首個字母或該輸入可以與之前的字符形成字符串的前綴,應該將狀態轉移至相應的狀態而不是初態。如匹配101(當輸入的最后3位是101時輸出1),輸入in序列是10101,假設狀態如下表,那么當匹配到第3位時,狀態為D,輸出1,而下一次的輸入0將使狀態直接跳過初態,到達狀態C。
狀態 | 含義 |
---|---|
A | 未匹配 |
B | 匹配到了1 |
C | 匹配到了10 |
D | 匹配到了101 |
- eg
匹配101(當輸入的最后3位是101時輸出1):按上面的注意事項細心地畫出狀態圖如下。其中Moore型的輸出僅與狀態有關,因此把輸出標在狀態下;Mealy型的輸出與狀態和輸入in有關,因此標在圓弧上in/out,代表的含義是當處於圓弧的起點的狀態時輸入in,out所應輸出的值。如從S2到S1的圓弧上標了1/1,代表當狀態為S2時若in為1則輸出1。
同步復位與異步復位的實現
在做題時可能會遇上這兩種不同的復位要求,若要求異步復位則比較簡單,因為logisim中寄存器自帶的復位便是異步復位,因此若題目要求異步復位只需要把reset信號連至寄存器自帶的Clear腳。而若如果要求同步復位,可使用一個二選一多路選擇器,如圖所示,當reset為0時,選擇器將選擇次態信號,若reset為1,將選擇0,也即復位。而由於寄存器只在時鍾上升沿讀入,若此時reset為1,將讀入0(復位),這就實現了同步復位。
寫在最后
這是本菜雞第一次寫博客,如果哪里寫錯了希望各位大佬指正orz,以及希望P0能過。