1. 程式人生 > >徹底搞清三段狀態機的來龍去脈(2)

徹底搞清三段狀態機的來龍去脈(2)

(1)一個完備的狀態機應該具有初始狀態預設狀態 。當晶片加電或者復位後,狀態機能夠自動將所有的判斷條件復位,並進入初始狀態 ;起始狀態是指電路復位後所處的狀態,選擇一個合理的起始狀態將使整個系統更簡捷高效 。當轉移條件不滿足,或者狀態發生突變時,狀態機進入一個**預設(default)**狀態,能保證邏輯不會陷入“死迴圈”,這是對狀態機健壯性的一個重要要求,即自動恢復功能 。在case語句的最後,不要忘了加上default分支語句,以避免鎖存器的產生

(2)對於狀態編碼,主要有二進位制,格雷,一位獨熱編碼三種方式:
二進位制 :S0=3’d0,S1=3’d1,S2=3’d2,S3=3’d3,S4=3’d4
格雷碼 :S0=3’b000,S1=3’b001,S2=3’b010,S3=3’b011,S4=3’b110
獨熱:S0=5’b00001,S1=5’b00010,S2=5’b00100,S3=5’b01000,S4=5’b10000
二進位制碼適用於觸發器資源較少,組合電路資源豐富的情況(CPLD),其缺點是由一個狀態轉換到相鄰狀態時,可能有多個位元位發生變化,瞬變次數多,易發生毛刺,引起邏輯錯誤。獨熱編碼雖佔用暫存器資源多,但是佔用的組合邏輯少,充分發揮了晶片觸發器數量多的優點,保障電路效能同時,提高狀態機執行速度。

(3)根據觸發條件的不同,時序邏輯電路可以分為非同步時序和同步時序邏輯。在非同步時序邏輯中觸發條件很隨意,任何時刻都有可能發生,所以記憶狀態的觸發器輸出在任何時刻都有可能發生;而同步時序邏輯中表示狀態的觸發器輸出只能在惟一確定的觸發條件發生時刻改變,例如只能由時鐘的上升沿或下降沿觸發。同步時序邏輯的觸發輸入至少可以維持一個時鐘週期後才會發生第二次觸發,利用這一段時間,即在下一次觸發訊號來到前,為電路的狀態改變創造了一個穩定可靠的條件。因此,同步時序邏輯比非同步時序邏輯具有更可靠、更簡單的邏輯關係。目前,綜合工具只支援同步時序邏輯的設計,用Verilog設計可綜合的狀態機也都使用同步時序邏輯。實用的狀態機都應設計為由唯一時鐘邊沿觸發的同步執行方式。

(4)編碼風格對組合邏輯建模採用阻塞式賦值,對時序邏輯建模採用非阻塞式賦值,儘量不要在同一個always塊裡面混合使用“阻塞賦值”和“非阻塞賦值”,如果在同一個always塊裡面既為組合邏輯,又為時序邏輯建模,應使用“非阻塞賦值”