狀态機設計需滿足的幾個要求:
1. 三段式要求
有限狀态機采用三段式風格,即三個always塊描述狀态機.
第一個組合邏輯always塊用來描述下一狀态的轉移(next state logic)
第二個時序邏輯always塊用來描述目前狀态.(current state) 寄存器的複位和變化.
第三個always塊用來描述輸出.(output logic) 組合or時序 均可.
優點:書寫清晰,組合與時序分離設計,易于綜合,且在一定程度上避免了狀态轉移和輸出等組合邏輯中的毛刺.
2. 狀态機狀态信号命名方法
目前狀态命名為current_state,下一狀态命名為next_state.
主要目的是為了提高狀态機的可讀性,為分析邏輯功 能提供友善,也可以是cstate or nstate.
3.編碼方式
準則:使用參數指派狀态
兩種常用的編碼方式:二進制編碼及獨熱碼編碼
二進制編碼占用的位數少,但其狀态跳變需要額外的譯碼電路,這樣的編碼方式會對狀态機的運作速度有所限制,可以滿足一般的設計要求。
獨熱碼編碼,以n bit表示n個 狀态,這樣編碼的譯碼部分可以做到最簡,工作頻率可以做到較高,相對于二進制而言,需要更多的位。
建議使用的獨熱碼,電路的速度和可靠性有顯著的提高,但注意:存在多餘的狀态,就有一些不可到達的狀态,需要在case語句的最後,加default分支,以確定能回到IDLE狀态。
4.狀态機設計的注意事項
設計的狀态跳轉條件是否充分
狀态跳轉條件都不滿足的情況下,狀态機如何工作
未定義的狀态應如何設計
狀态機跳轉設計中,是否受外部信号的影響
5.三段式的寫法
組合邏輯always塊:(負責狀态的跳轉)、
always@(current_state or else signal)(敏感清單中存放對狀态跳轉有影響的信号)
begin
next_state=x; (初始化,使得系統複位進入正确的狀态)
case(current_state)
s1: if(.....)
next_state=s2
.
.
.......
endcase
end
時序邏輯always塊:
always@(posedge clk or negedge rst)
if(!rst)
current_state<=IDLE;
else
current_state<=next_state;
描述輸出的always塊可以是組合的也可以是時序的;
6.典型的序列檢測狀态機寫法:
IMG_0141.JPG
作者:喜歡蘿莉的逗逼青年
連結:https://www.jianshu.com/p/5eee434ab24d
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。