verilog 三段式狀態機的技巧

2021-08-26 05:50:27 字數 2571 閱讀 6598

三段式**多,但是有時鐘同步,延時少,組合邏輯跟時序邏輯分開並行出錯少。

(1)同步狀態轉移 (2)當前狀態判斷接下來的狀態 (3)動作輸出

如果程式複雜可以不止三個always   。always 後常接case  case必須有default   ,對於fpga常用  狀態數較少,獨熱碼編碼 ,或者格雷碼

//獨熱碼編碼

parameter no_key_pressed = 6'b000_001; // 沒有按鍵按下 

parameter scan_row0 = 6'b000_010; // 掃瞄第0行 

parameter scan_row1 = 6'b000_100; // 掃瞄第1行

parameter scan_row2 = 6'b001_000; // 掃瞄第2行 

parameter scan_row3 = 6'b010_000; // 掃瞄第3行 

parameter key_pressed = 6'b100_000; // 有按鍵按下

reg [5:0] current_state, next_state; // 現態、次態

(1)第乙個always模組,格式化描述次態暫存器遷移到現態暫存器

always @ (posedge key_clk, negedge rst_n)//非同步復位

if (!rst_n)

current_state <= no_key_pressed;//初始化按鍵沒按下//預設狀態

else

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

(2)第二個程序,組合邏輯always模組,描述狀態轉移條件判斷用current_state

always @ (current_state) //電平觸發      或者always @ *

begin

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

case(current_state)

s1: if(...)

next_state = s2;     //阻塞賦值

...

endcase

end

(3)第三個程序,同步時序always模組,描述次態暫存器輸出

always @ (posedge clk or negedge rst_n)

...//初始化

case(next_state)

s1:

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

s2:

out2 <= 1'b1;

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

endcase

end

三段式並不是一定要寫為3個always塊,如果狀態機更複雜,就不止3段了。

1. 三段always模組中,第乙個和第三個always模組是同步時序always模組,用非阻塞賦值(「 <= 」);第二個always模組是組合邏輯always模組,用阻塞賦值(「 = 」)。

2. 第二部分為組合邏輯always模組,為了抑制warning資訊,對於always的敏感列表建議採用always@(*)的方式。

3. 第二部分,組合邏輯always模組,裡面判斷條件一定要包含所有情況!可以用else保證包含完全。

4. 第二部分,組合邏輯電平要維持超過乙個clock,**時注意。

5. 需要注意:第二部分case中的條件應該為當前態(current_state)。

6.第三部分case中的條件應該為次態(next_state)。

7. 編碼原則,binary和gray-code適用於觸發器資源較少,組合電路資源豐富的情況(cpld),對於fpga,適用one-hot code。這樣不但充分利用fpga豐富的觸發器資源,還因為只需比較乙個bit,速度快,組合電路簡單。

verilog三段式狀態機伸手就拿湊合用版

最近在做fpga邏輯實現資料幀頭拼接分包時剛接觸狀態機,隨便記一點目前的入門理解。一段二段不用就沒管了,直接無腦三段式。首先,三段式狀態機是因為 從外部看上去分成三塊,分別描述狀態機的切換狀態時間,切換狀態條件,不同狀態下的操作。直接上模板,管你聽沒聽懂,套就完了!step1 變數定義 如下面例子中...

Moor Mealy FMS及三段式狀態機寫法

示例有限狀態機 finite state machine,fsm 包含幾個要素 輸入 狀態 狀態轉移條件 輸出。這裡討論的兩種狀態機區別在於輸出的產生 二段式 有兩個always block 狀態切換用時序邏輯描述 次態判斷和輸出用組合邏輯描述。這種寫法條理清晰,但輸出由組合邏輯描述因此可能存在競爭...

verilog一二三段式狀態機的標準區別和示例

狀態機描述時關鍵是要描述清楚前面提到的幾個狀態機的要素,即如何進行狀態轉移 每個狀態的輸出是什麼 狀態轉移是否和輸入條件相關等。具體描述時方法各種各樣,有的設計者習慣將整個狀態機寫到1 個always 模組裡面,在該模組中即描述狀態轉移,又描述狀態的輸入和輸出,這種寫法一般被稱為一段式fsm 描述方...