常用的編碼有三種:二進位制編碼、gray碼、one-hot編碼。另外,還可以自定義編碼,比如在高速設計中以狀態編碼作為輸出。
一.二進位制編碼
順序二進位制編碼,即將狀態依次編碼為順序的二進位制數。順序二進位制編碼是最緊密的編碼,優點在於它使用的狀態向量位數最少。例如對於6 個狀態的狀態機,只需要 3 位二進位制數來進行編碼,因此只需要 3 個觸發器來實現,節約了邏輯資源(在實際應用中,往往需要較多組合邏輯對狀態向量進行解碼以產生輸出,因此實際節約資源的效果並不明顯)。 在上面的例子中,3 位二進位制數總共有8 種可能的編碼模式,其中 6 種用來表示有效狀態,剩下的2 種是無效編碼。
有人認為順序二進位制編碼還有乙個好處。當晶元受到粒子輻射或者由於非同步輸入等問題可能會造成狀態跳轉失常。如果失常中狀態機跳轉到無效的編碼狀態則可能會出現宕機,除非復位否則永遠無法回到 idle 狀態。而因為順序二進位制編碼最緊密,所以無效編碼最少。失常時有更大的概率跳轉到的有效狀態,並最終回到idle 狀態。 這種預想的好處並不會發生在實際中。首先,失常的跳轉到有效狀態並不意味著能夠最終回到idle 狀態。例如在某個有效狀態,狀態機迴圈等待某輸入訊號,並作出應答。如果狀態機失常的跳轉到該狀態,同樣會陷入死等,因為輸入訊號並不會到來。其次,失常的跳轉到有效狀態,意味著可能在不正確的時機產生輸出,這樣會將故障傳播到其他模組。在很多應用中人們寧願宕機不輸出任何訊號也不願意輸出錯誤的訊號。 可見使用順序二進位制編碼並不能使得狀態機具有所想象的容錯能力。
二.gray碼
gray碼在發生狀態跳轉時,狀態向量只有一位發生變化。理論上說 gray狀態機在狀態跳轉時不會有任何毛刺。但是實際上綜合後的狀態機是否還有這個好處也很難說。gray碼狀態機設計中最大的問題是,在狀態機很複雜狀態跳轉的分支很多時,要合理的分配狀態編碼保證每個狀態跳轉都僅有 1 位發生變化,這是很困難的事情。
三.one-hot編碼
雖然獨熱碼多用了觸發器,但所用組合電路可省一些,因而使電路的速度和可靠性有顯著提高,而總的單元數並無顯著增加。同時獨熱碼在狀態躍遷時僅需要改變狀態變數的某一位,在一定程度上簡化了比較邏輯,從而減少了毛刺產生的概率。同時採用獨熱編碼後有了多餘的狀態,就有了一些不可達到的狀態。 為
此,在case 語句的最後需要增加default 分支項。 one-hot編碼有很多變體。比如將 idle 狀態編碼為0,其他狀態按照正常的one-hot編碼。即對於除idle 外的每個給定狀態,對應的狀態向量只有一位置1,其他位置0。這種變體的好處是在復位時可簡單的將狀態向量的各個觸發器清 0。
另一種常見的變體稱為"almost one-hot" 編碼。假設狀態機有功能幾乎相同的兩組狀態(例如,處理對某裝置的讀訪問和寫訪問),可以使用1 個狀態位來指示狀態機當前正處在兩組狀態中的哪一組,而剩下的狀態位採用普通的one-hot編碼(例如一組狀態為4'b0001, 4'b0010, 4'b0100,另一組為4'b1001, 4'b1010, 4'b1100)。因此要對給定狀態進行完整的解碼需要考察兩個狀態位。這種機制具有使用純one-hot編碼的大多數好處,但邏輯更小。 one-hot 狀態機有乙個缺點,它的狀態每次發生跳轉,很多狀態位都會發生變化。首先,狀態機的輸出往往是由狀態位組合生成的。同時變化的狀態位越多,組合輸出穩定前所需的時間就越長,產生的毛刺就越多。如果該輸出不經同步就直接連線到暫存器的時鐘、使能、或鎖存器的使能等控制埠,將很容易導致資料的破壞(正統解決方案是加一級暫存器來同步狀態機的輸出,該方案可能會產生乙個週期的延遲,而且如果該輸出穩定前所需的時間過長還是會違背暫存器的建立時間)。其次,對於有非同步輸入的系統,在時鐘沿到來時有多個狀態位發生變化,即有多個暫存器可能受非同步輸入的影響,使得亞穩態發生的概率有所增加(雖然這並不是one-hot編碼的問題,根本的解決方案還是避免非同步輸入)。
狀態機 狀態機0
近半年都忙於做專案,沒有太多的時間去整理和總結在專案中用過的技術 個人還是覺得技術需要總結提煉和沉澱的,忙到沒時間去總結提公升其實不 是什麼好事,這次講下狀態機,在戰鬥型別的遊戲中角色有多種不同的狀態,而狀態的切換錯綜複雜,23種設計模式中有一種模式叫做狀態模式,不過 這種模式是把狀態切換條件放到各...
python 狀態機 Python 狀態機
class statemachine def init self self.handlers 狀態轉移函式字典 self.startstate none 初始狀態 self.endstate 最終狀態集合 引數name為狀態名,handler為狀態轉移函式,end state表明是否為最終狀態 de...
狀態機小記
工作上有個功能模組用到了類似狀態機的東東,於是上網科普了一番。狀態機是由一系列輸入驅動,然後系統由其中一種狀態轉換為另一種狀態並產生某種輸出,這樣子的乙個系統叫做狀態機。狀態機分為兩種,一種是輸出只和系統狀態有關,叫做摩爾狀態機,另一種是輸出和輸入以及系統狀態都相關,叫做公尺莉狀態機。有關輸入 狀態...