狀態機的常見問題
一、狀態機的常見問題
標准的狀態機包括摩爾狀態機和米勒狀態機:摩爾狀態機的輸出只與當前狀態有關,而米勒狀態機則和輸入和狀態都有關。狀態機能夠穩定工作,但是占用資源過多。在摩爾狀態機中的時鍾偏斜可能會導致狀態轉換時會出現過渡狀態(狀態轉化出現時序問題),米勒狀態機由於輸出異步,更加容易出現時序問題。
二、選擇狀態機的編碼方式
(1)狀態機的定義
//使用邏輯向量定義狀態 signal current_state: std_logic_vector(1 downto 0); signal next_state: std_logic_vector(1 downto 0); //定義方法二 type mystate is (st0,std1,std2,std3); signal current_state,next_state:mystate; //定義方法三 constant std0: std_logic_vector(1 downto 0): ="00"; constant std1: std_logic_vector(1 downto 0): ="01"; constant std2: std_logic_vector(1 downto 0): ="10"; constant std3: std_logic_vector(1 downto 0): ="11"; signal current_state,next_state:std_logic_vectro(1 downto 0);
(2)編碼方式
順序碼:使用二進制序列
格雷碼:二進制數每次只改變一位
讀熱碼:為狀態機中每個狀態分配一個觸發器,只有當前設置為有效,其他設置均無效。
三、合理選擇單進程和多進程來設計狀態機
單進程使用的不多,主要是可讀性較差。單進程狀態機一般需要在組合邏輯輸出后加上一級時序邏輯緩存。多進程中,雙進程的輸出描述和某個狀態描述混合在一起。三進程中,可以分為組合邏輯輸出和時序邏輯輸出兩種情況。不推薦組合邏輯輸出,容易和狀態轉移的組合邏輯產生毛刺問題。一般使用時序邏輯輸出比較好·。
四、設計工具能夠實現的狀態機
設計狀態機的基本原則:
給輸出分配默認值,放置產生鎖存器;
狀態的狀態邏輯和輸出邏輯分立;
多個狀態需要使用某個計算邏輯,采用調用形式。
使用簡單的復位邏輯實現狀態機的上位狀態。
五、小結
狀態機需要考慮狀態轉化和邏輯輸出,分別設計后可以有效提高數據的可讀性和設計的穩定性。具體的操作還是需要在實際的操作中實現。