## 壹、 狀態機介紹
### 一、Moore Machine
在 Moore Machine 中,每個狀態有一個特定的輸出。這種輸出完全取決於當前的狀態,與當前的輸入無關。因此,只要我們知道了機器的狀態,我們就可以確定它的輸出。這使得 Moore Machine 非常容易預測和控制。

Moore Machine 的一個關鍵特性是其穩定性。由於輸出只依賴於當前狀態,因此即使輸入發生變化,只要狀態沒有改變,輸出也將保持不變。這避免了在快速變化的輸入情況下可能出現的不確定性或不穩定性。
然而,Moore Machine 也有其局限性。其中一個是它可能需要更多的狀態來表示相同的行為。例如,如果某個行為取決於前一個輸入,一個 Moore Machine 可能需要為每種可能的輸入創建一個新的狀態,而一個依賴於當前輸入的 Mealy Machine 則不需要。
### 二、Mealy Machine
相對於 Moore Machine,Mealy Machine 的輸出不僅依賴於當前的內部狀 態,也取決於當前的輸入。

這種結構讓 Mealy Machine 在某些情況下可以使用較少的狀態就能完成相同的功能,因為它可以直接參考當前的輸入來決定輸出,而不需要增加額外的狀態來記憶過去的輸入。結果就是可能有更少的狀態數量。
然而,Mealy Machine 也有其挑戰。由於輸出可能在每個時鐘週期的任何時間改變(取決於輸入的變化),輸出可能會出現所謂的"抖動"。這種情況在需要穩定輸出的系統中可能會導致問題。
儘管有這些考慮因素,Mealy Machine 仍然是現代數位系統設計中的一個強大工具。它們可以讓設計師以更少的狀態實現同樣的功能,這可以節省硬體資源並簡化設計。
## 貳、Moore Machine
### 一、狀態圖

### 二、狀態表
|當狀狀態 |輸入 |下一個狀態|當前輸出 |
| - | - | - | - |
|IDLE (00) |0 |IDLE (00) |0 |
|IDLE (00) |1 |S0 (01) |0 |
|S0 (01) |0 |IDLE (00) |0 |
|S0 (01) |1 |S1 (10) |0 |
|S1 (10) |0 |IDLE (00) |1 |
|S1 (10) |1 |S1 (10) |1 |
## 參、Moore Machine 結果分析
### 一、當前狀態 **00**,下一個狀態 **00**
當前狀態為 0 時,因為 data\_i 為 0 所以不會轉換狀態

### 二、當前狀態 **00**,下一個狀態 **01**
當前狀態為 0 時,因為 data\_i 為 1 所以將狀態轉換成 1,而輸出維持 0

### 三、當前狀態 **01**,下一個狀態 **00**
當前狀態為 01 時,因為 data\_i 為 0,所以將狀態轉換成 00

### 四、當前狀態 **01**,下一個狀態 **10**
當前狀態為 01 時,因為 data\_i 為 1 所以將狀態轉換成 10,當狀態轉換成 10 後,輸出 data\_o 為 1,結果正確

### 五、當前狀態 **10**,下一個狀態 **00**
當前狀態為 10 時,因為 data\_i 為 0 所以將狀態轉換成 00,結果正確

### 六、當前狀態 **10**,下一個狀態 **10**
當前狀態為 10 時,因為 data\_i 為 1 所以不會轉換狀態,結果正確

### 七、合成後面積

## 肆、Mealy Machine 狀態
### 一、狀態圖

### 二、狀態表
|當前狀態** |輸入** |下一個狀態|當前輸出** |
| - | - | - | - |
|IDLE (0) |0 |IDLE (0) |0 |
|IDLE (0) |1 |S0 (1) |0 |
|S0 (1) |0 |IDLE (0) |0 |
|S0 (1) |1 |S0 (1) |1 |
## 伍、Mealy Machine 結果分析
### 一、當前狀態為 **0**,輸入為 **0**,下一個狀態為 **0**
當前狀態為 0,因為 data\_i 為 0,所以不會轉換狀態,結果正確

### 二、當前狀態為 **0**,輸入為 **1**,下一個狀態為 **1**
當前狀態為 0,因為 data\_i 為 1,所以下一個狀態為 1,結果正確

### 三、當前狀態為 **1**,輸入為 **0**,下一個狀態為 **0**
當前狀態為 1,因為 data\_i 為 0,所以下一個狀態為 0,結果正確

### 四、當前狀態為 **1**,輸入為 **1**,下一個狀態為 **1**
當前狀態為 1,因為 data\_i 為 1,所以不會轉換狀態,結果正確

### 五、合成後面積

## 陸、**Moore Machine** 與 **Mealy Machine** 比較
### 一、波型比較
因為 Mealy Machine 的輸出會由當前狀態與輸入共同決定,所以我們可以知道他可以相較於 Moore Machine 有著更少的狀態,同時又可以用更少的 clock 週期來輸出結果,為了驗證結果是否符合預期,接著用波型來佐證。
從波型上來看,可以很明顯看到因為 Mealy Machine 比 Moore Machine 還要少一個狀態,所以輸出可以提前 Moore Machine 一個 clock 週期,因此驗證成功。

### 二、優缺點分析
||Moore Machine |Mealy Machine |
| :- | - | - |
|優點 |<p>1. 設計簡單,易於理解和實現 </p><p>2. 輸出只依賴於當前狀態,使 其在同步系統中工作良好 </p><p>3. 只有狀態會決定輸出,對於 某些應用更具預測性。 </p>|<p>1. 所需要的 clock 數量可能較少 可以節省硬體資</p><p>2.可以節省硬體資源。</p><p>3. 能夠實現更複雜的行為,因為 輸出依賴於狀態和輸入。 </p>|
|缺點 |<p>1. 需要更多的狀態來實現相同的功能,會增加硬體成本</p><p>2. 週期可能較多,因為輸出必 須等到下一個時鐘週期。 </p>|<p>1. 設計可能更複雜,因為輸出取 決於狀態和輸入。 </p><p>2. 因為輸入也會決定輸出,會造 成電路的不穩定。 </p>|
## 柒、結論
Moore Machine 的主要優點在於設計相對簡單以及和可預測性。由於輸出只依賴於當前狀態,所以在設計和理解方面相對較容易。另外,Moore Machine 的輸出只在狀態變化時變化,這使得它們在同步系統中可以更加穩定。然而,這種方法的缺點是可能需要更多的狀態來實現特定的功能,導致硬體成本的上升,並且由於輸出必須等待下一個時鐘週期,因此會需要較多的 clock 週期。
另一方面,Mealy Machine 可以用更短的 clcok 週期輸出結果,因為輸出可以在輸入變化時立即變化,且由於狀態較少,可以節省硬體資源,同時因為輸出依賴於狀態和輸入,所以可以實現更複雜的行為,不過缺點則是會增加電路的不穩定性。
以上兩種狀態機各有優缺點,選擇使用哪一種狀態機需要根據實際上的設計需求。例如需要快速反應或最小化硬體資源,那麼 Mealy Machine 可能是更好的選擇。反之如果需要電路更加穩定,或減少設計的複雜性,那麼 Moore Machine 可能是更好的選擇。因此如何選擇一個適合的狀態機來實現電路是一件非常重要的事。
## 捌、參考資料
[Untitled Document (saihs.edu.tw) ](http://content.saihs.edu.tw/chapter_htm/chapter9/9c/c_03.htm)
[小狐狸事務所: 邏輯設計筆記序向篇 : Finite State Machine (有限狀態機) (yhhuang1966.blogspot.com) ](http://yhhuang1966.blogspot.com/2019/06/finite-state-machine.html)
[(原創) 有限狀態機 FSM coding style 整理 (SOC) (Verilog) - 真 OO 无双 - 博客园 (cnblogs.com) ](https://www.cnblogs.com/oomusou/archive/2011/06/05/fsm_coding_style.html)
[FPGA 學習之有限狀態機講解,什麼是 Moore 與 Mealy 狀態機? - 每日頭 條 (kknews.cc) ](https://kknews.cc/zh-tw/code/9gz88zb.html)