狀態暫存器由一組觸發器組成,用來記憶狀態機當前所處的狀態,狀態的改變只發生在時鐘的跳變沿。
狀態是否改變、如何改變,取決於組合邏輯f的輸出,f是當前狀態和輸入訊號的函式。狀態機的輸出是由輸出組合邏輯g提供的,g也是當前狀態和輸入訊號的函式。
狀態機設計方法:
假設一天的生活有4個狀態——睡覺、學習、吃飯、娛樂。即每天在這四個狀態之間轉換。這四個狀態的集合即為狀態空間。
因為verilog只能處理二進位制數,所以我們要對這四個狀態進行編碼。如下圖:
(右側為獨熱碼,即每個狀態只有乙個暫存器置位,解碼邏輯簡單。)
使用parameter
定義引數
使用reg
定義暫存器型別變數(位寬要求與引數位寬保持一致),current_state
表示當前狀態、next_state
表示下乙個狀態。
每當復位的時候,把sleep值賦給當前狀態,當時鐘上公升沿的時候,把下乙個狀態賦值給當前狀態(時序邏輯,注意使用非阻塞賦值)
上圖**為判斷當前狀態及時間,判斷下個狀態
或
三段式可以在組合邏輯後再增加一級暫存器來實現時序邏輯輸出
可以有效地濾去組合邏輯輸出的毛刺
可以有效地進行時序計算與約東
另外對於匯流排形式的輸出訊號來說,容易使匯流排資料對齊,從而減小匯流排資料間的偏移,減小接收端資料取樣出錯的頻率。
Verilog 狀態機寫法
狀態機是時序電路的 所有時序電路都能通過狀態機實現。以前寫程式時喜歡用一段式狀態機,現在流行用三段式。好象三段時也沒多大優點。在cpld中暫存器較少,個人感覺用一段式也可以,主要是省資源。時序電路的狀態是乙個狀態變數集合,這些狀態變數在任意時刻的值都包含了為確定電路的未來行為而必需考慮的所有歷史資訊...
採用verilog編寫狀態機
如果使用的是system verilog,一定要使用列舉型來描述狀態機。使用引數 parameters 來對狀態機進行分配,因為引數會使得狀態機易讀以及減少編碼過程中的錯誤。儘管quartus ii能夠識別出整數,盡量不要直接使用整數來定義狀態值。在狀態轉換邏輯中,不要使用狀態暫存器進行算術運算,例...
狀態機簡單介紹
可以把狀態機的要素分為4個要素,即 現態 條件 動作 次態。現態 和 條件 是因,動作 和 次態 是果。1 現態 是指當前所處狀態 2 條件 又稱為 事件 當條件被滿足時,將會觸發乙個動作,或者執行一次狀態的遷移。3 動作 條件滿足後執行的動作。動作不是必須的,當條件滿足後,也可以不執行任何動作,直...