Verilog 狀態機寫法

2021-05-21 21:27:02 字數 1160 閱讀 2183

狀態機是時序電路的****,所有時序電路都能通過狀態機實現。以前寫程式時喜歡用一段式狀態機,現在流行用三段式。好象三段時也沒多大優點。

在cpld中暫存器較少,個人感覺用一段式也可以,主要是省資源。

時序電路的狀態是乙個狀態變數集合,這些狀態變數在任意時刻的值都包含了為確定電路的未來行為而必需考慮的所有歷史資訊。

狀態機採用veriloghdl語言編碼,建議分為三個always段完成。

三段式建模描述fsm的狀態機輸出時,只需指定case敏感表為次態暫存器, 然後直接在每個次態的case分支中描述該狀態的輸出即可,不用考慮狀態轉移條件。

三段式描述方法雖然**結構複雜了一些,但是換來的優勢是使fsm做到了同步暫存器輸出,消除了組合邏輯輸出的不穩定與毛刺的隱患,而且更利於時序路徑分組,一般來說在fpga/cpld等可程式設計邏輯器件上的綜合與布局佈線效果更佳。

示列如下:

//第乙個程序,同步時序always模組,格式化描述次態暫存器遷移到現態暫存器

always @ (posedge clk or negedge rst_n)  //非同步復位

if(!rst_n)

current_state <= idle;

else

current_state <= next_state;//注意,使用的是非阻塞賦值

//第二個程序,組合邏輯always模組,描述狀態轉移條件判斷

always @ (current_state)   //電平觸發

begin

next_state = x;  //要初始化,使得系統復位後能進入正確的狀態

case(current_state)

s1: if(...)

next_state = s2;  //阻塞賦值

...endcase

end

//第三個程序,同步時序always模組,格式化描述次態暫存器輸出

always @ (posedge clk or negedge rst_n)

...//初始化

case(next_state)

s1:out1 <= 1'b1;  //注意是非阻塞邏輯

s2:out2 <= 1'b1;

default:...   //default的作用是免除綜合工具綜合出鎖存器。

endcase

end

採用verilog編寫狀態機

如果使用的是system verilog,一定要使用列舉型來描述狀態機。使用引數 parameters 來對狀態機進行分配,因為引數會使得狀態機易讀以及減少編碼過程中的錯誤。儘管quartus ii能夠識別出整數,盡量不要直接使用整數來定義狀態值。在狀態轉換邏輯中,不要使用狀態暫存器進行算術運算,例...

Verilog語言介紹狀態機

狀態暫存器由一組觸發器組成,用來記憶狀態機當前所處的狀態,狀態的改變只發生在時鐘的跳變沿。狀態是否改變 如何改變,取決於組合邏輯f的輸出,f是當前狀態和輸入訊號的函式。狀態機的輸出是由輸出組合邏輯g提供的,g也是當前狀態和輸入訊號的函式。狀態機設計方法 假設一天的生活有4個狀態 睡覺 學習 吃飯 娛...

狀態機 狀態機0

近半年都忙於做專案,沒有太多的時間去整理和總結在專案中用過的技術 個人還是覺得技術需要總結提煉和沉澱的,忙到沒時間去總結提公升其實不 是什麼好事,這次講下狀態機,在戰鬥型別的遊戲中角色有多種不同的狀態,而狀態的切換錯綜複雜,23種設計模式中有一種模式叫做狀態模式,不過 這種模式是把狀態切換條件放到各...