狀態(tài)機設計需滿足的幾個要求:
1. 三段式要求
有限狀態(tài)機采用三段式風格,即三個always塊描述狀態(tài)機.
第一個組合邏輯always塊用來描述下一狀態(tài)的轉移(next state logic)
第二個時序邏輯always塊用來描述當前狀態(tài).(current state) 寄存器的復位和變化.
第三個always塊用來描述輸出.(output logic) 組合or時序 均可.
優(yōu)點:書寫清晰,組合與時序分離設計,易于綜合,且在一定程度上避免了狀態(tài)轉移和輸出等組合邏輯中的毛刺.
2. 狀態(tài)機狀態(tài)信號命名方法
當前狀態(tài)命名為current_state,下一狀態(tài)命名為next_state.
主要目的是為了提高狀態(tài)機的可讀性,為分析邏輯功 能提供方便,也可以是cstate or nstate.
3.編碼方式
準則:使用參數(shù)賦值狀態(tài)
兩種常用的編碼方式:二進制編碼及獨熱碼編碼
二進制編碼占用的位數(shù)少,但其狀態(tài)跳變需要額外的譯碼電路,這樣的編碼方式會對狀態(tài)機的運行速度有所限制,可以滿足一般的設計要求。
獨熱碼編碼,以n bit表示n個 狀態(tài),這樣編碼的譯碼部分可以做到最簡,工作頻率可以做到較高,相對于二進制而言,需要更多的位。
建議使用的獨熱碼,電路的速度和可靠性有顯著的提高,但注意:存在多余的狀態(tài),就有一些不可到達的狀態(tài),需要在case語句的最后,加default分支,以確保能回到IDLE狀態(tài)。
4.狀態(tài)機設計的注意事項
設計的狀態(tài)跳轉條件是否充分
狀態(tài)跳轉條件都不滿足的情況下,狀態(tài)機如何工作
未定義的狀態(tài)應如何設計
狀態(tài)機跳轉設計中,是否受外部信號的影響
5.三段式的寫法
組合邏輯always塊:(負責狀態(tài)的跳轉)、
always@(current_state or else signal)(敏感列表中存放對狀態(tài)跳轉有影響的信號)
begin
next_state=x; (初始化,使得系統(tǒng)復位進入正確的狀態(tài))
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.典型的序列檢測狀態(tài)機寫法:
IMG_0141.JPG