狀態機描述時關鍵是要描述清楚前面提到的幾個狀態機的要素,即如何進行狀態轉移;每個狀態的輸出是什麼;狀態轉移是否和輸入條件相關等。
具體描述時方法各種各樣,有的設計者習慣將整個狀態機寫到1 個always 模組裡面,在該模組中即描述狀態轉移,又描述狀態的輸入和輸出,這種寫法一般被稱為一段式fsm 描述方法;
還有一種寫法是用2 個always 模組,其中乙個always 模組採用同步時序描述狀態轉移;另乙個模組採用組合邏輯判斷狀態轉移條件,描述狀態轉移規律,這種寫法被稱為兩段式fsm 描述方法;
還有一種寫法是在兩段式描述方法基礎上發展出來的,這種寫法使用3 個always 模組,乙個always模組採用同步時序描述狀態轉移;第二個採用組合邏輯判斷狀態轉移條件,描述狀態轉移規律;第三個always 模組使用同步時序電路描述每個狀態的輸出,這種寫法本書稱為三段式寫法。
一般而言,推薦的 fsm 描述方法是後兩種,即兩段式和三段式fsm 描述方法。其原因為:fsm 和其他設計一樣,最好使用同步時序方式設計,以提高設計的穩定性,消除毛刺。狀態機實現後,一般來說,狀態轉移部分是同步時序電路而狀態的轉移條件的判斷是組合邏輯。
兩段式之所以比一段式編碼合理,就在於兩段式編碼將同步時序和組合邏輯分別放到不同的always 程式塊中實現。這樣做的好處不僅僅是便於閱讀、理解、維護,更重要的是利於綜合器優化**,利於使用者新增合適的時序約束條件,利於布局佈線器實現設計。
而一段式fsm 描述不利於時序約束、功能更改、除錯等,而且不能很好的表示公尺勒fsm 的輸出,容易寫出latches,導致邏輯功能錯誤。在一般兩段式描述中,為了便於描述當前狀態的輸出,很多設計者習慣將當前狀態的輸出用組合邏輯實現。但是這種組合邏輯仍然有產生毛刺的可能性,而且不利於約束,不利於綜合器和布局佈線器實現高效能的設計。因此如果設計執行額外的乙個時鐘節拍的插入(latency),則要求盡量對狀態機的輸出用暫存器寄存一拍。但是很多實際情況不允許插入乙個寄存節拍,此時則可以通過三段式描述方法進行解決。
三段式與兩段式相比,關鍵在於根據狀態轉移規律,在上一狀態根據輸入條件判斷出當前狀態的輸出,從而在不插入額外時鐘節拍的前提下,實現了暫存器輸出。
verilog 三段式狀態機的技巧
三段式 多,但是有時鐘同步,延時少,組合邏輯跟時序邏輯分開並行出錯少。1 同步狀態轉移 2 當前狀態判斷接下來的狀態 3 動作輸出 如果程式複雜可以不止三個always always 後常接case case必須有default 對於fpga常用 狀態數較少,獨熱碼編碼 或者格雷碼 獨熱碼編碼 pa...
verilog三段式狀態機伸手就拿湊合用版
最近在做fpga邏輯實現資料幀頭拼接分包時剛接觸狀態機,隨便記一點目前的入門理解。一段二段不用就沒管了,直接無腦三段式。首先,三段式狀態機是因為 從外部看上去分成三塊,分別描述狀態機的切換狀態時間,切換狀態條件,不同狀態下的操作。直接上模板,管你聽沒聽懂,套就完了!step1 變數定義 如下面例子中...
Moor Mealy FMS及三段式狀態機寫法
示例有限狀態機 finite state machine,fsm 包含幾個要素 輸入 狀態 狀態轉移條件 輸出。這裡討論的兩種狀態機區別在於輸出的產生 二段式 有兩個always block 狀態切換用時序邏輯描述 次態判斷和輸出用組合邏輯描述。這種寫法條理清晰,但輸出由組合邏輯描述因此可能存在競爭...