(一)狀态編碼方式對狀态機性能的影響
對于狀态較多的大型狀态機而言,狀态的編碼方式會影響到狀态機的性能。
在Verilog中最常用的編碼方式有二進制編碼(Binary)、格雷碼(Gray-code)編碼、獨熱碼(One-hot)編碼。二進制碼和格雷碼是壓縮狀态編碼。
二進制碼 | 格雷碼 | 獨熱碼 |
0000 | 0000 | 000001 |
0001 | 0001 | 000010 |
0010 | 0011 | 000100 |
0011 | 0010 | 001000 |
0100 | 0110 | 010000 |
0101 | 0111 | 100000 |
… | … | … |
若使用格雷編碼,則相鄰狀态轉換時隻有一個狀态位發生翻轉,這樣不僅能消除狀态轉換時由多條狀态信号線的傳輸延遲所造成的毛刺,又可以降低功耗。
獨熱編碼即 One-Hot編碼,又稱一位有效編碼,其方法是使用N位狀态寄存器來對N個狀态進行編碼,每個狀态都由他獨立的寄存器位,并且在任意時候,其中隻有一位有效。雖然使用較多的觸發器,但由于狀态譯碼簡單,可減少組合邏輯且速度較快,這種編碼方式還易于修改,增加狀态或改變狀态轉換條件都可以在不影響狀态機的其它部分的情況下很友善地實作。另外,它的速度獨立于狀态數量。與之相比,壓縮狀态編碼在狀态增加時速度會明顯下降。
二進制編碼、格雷碼編碼使用最少的觸發器(因為狀态數被最緊湊的編碼),消耗較多的組合邏輯(case條件需要組合邏輯判斷),而獨熱碼編碼反之。獨熱碼編碼的最大優勢在于狀态比較時僅僅需要比較一個位,進而一定程度上簡化了譯碼邏輯。雖然在需要表示同樣的狀态數時,獨熱編碼占用較多的位,也就是消耗較多的觸發器,但這些額外觸發器占用的面積可與譯碼電路省下來的面積相抵消。
目前聰明的編譯器,都會根據狀态機規模,在綜合階段對狀态編碼方式進行優化。
(二)狀态機的複位态與default 狀态
不同于資料鍊路,狀态機必須具有确定的複位狀态,并保證跳轉條件的完備性。
狀态機的複位狀态是不可以被省略的。一般的,狀态機都會設定一個複位态或空閑态,以保證狀态運轉的起點正确。是以,狀态機代碼裡複位配置狀态是不可以省略的。
狀态機的狀态跳轉條件和狀态定義必須是完備的。否則極其可能綜合出如圖所示的具有孤島和半孤島的狀态機。
例如,使用4bit格雷碼可是構造16狀态的狀态機,而當有效狀态少于16個時,若忽略其餘狀态,這可能産生孤島。
是以,對于狀态轉移條件判定的代碼裡:每個狀态必須有條件跳出,不可省略default狀态的跳轉,
case(current_state)
S0:begin
if(condition1) next_state <= S1; // 一定要有轉移到其他狀态的條件
else if (condition2) next_state<= S2; //狀态轉移
else next_state <= S0;
end
……
default: begin //default情況不可省略
if(condition0) next_state <= S0;
end
endcase