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

2021-10-23 22:45:18 字數 1866 閱讀 8098

最近在做fpga邏輯實現資料幀頭拼接分包時剛接觸狀態機,隨便記一點目前的入門理解。

一段二段不用就沒管了,直接無腦三段式。

首先,三段式狀態機是因為**從外部看上去分成三塊,分別描述狀態機的切換狀態時間,切換狀態條件,不同狀態下的操作。直接上模板,管你聽沒聽懂,套就完了!

step1:變數定義

如下面例子中,僅使用三個狀態,則定義乙個兩位狀態暫存器即可,更多狀態可根據需求拓展。

reg [1:

0] current_state,next_state

parameter ini_state =

2'b00;

parameter state1 =

2'b01;

parameter state2 =

2'b10;

step2:

三段式狀態機其一,時序遷移模組

always @(posedge clk or reset)

begin

if(!m00_axi_aresetn)

current_state <= ini_state;

else

current_state <= next_state;

end

step3:

三段式狀態機其二,狀態遷移模組

always @ (

/填入狀態跳轉條件下的所有訊號名稱/)

begin

if(!reset)

next_state = ini_state;

//復位了,回初始狀態

else

current_state <= next_state //進入下一狀態

case

(current_state)

ini_state: begin

if(/判斷條件/)next_state = state1;

//例:在xx條件下,從ini切到state1狀態

else next_state = ini_state;

//想切別的狀態各個兒加

end

state1; begin

if(/判斷條件/)next_state = state2;

//例:在xx條件下,從state1切到state2狀態

else next_state = ini_state;

//想切別的狀態各個兒加

end

state2: begin

if(/判斷條件/)next_state = state1;

//例:在xx條件下,從state2切回state1狀態

else next_state = ini_state;

//想切別的狀態各個兒加

end

step4:

三段式狀態機其三,功能模組

就是每個狀態下你想幹啥。

always @ (

*) begin

case

(current_state)

inni_state: begin

//ini狀態下乾的事兒//

endstate1; begin

//state1狀態下乾的事兒//

endstate2; begin

//state1狀態下乾的事兒//

enddefault

: begin

//預設//

endendcase

end

fin

verilog 三段式狀態機的技巧

三段式 多,但是有時鐘同步,延時少,組合邏輯跟時序邏輯分開並行出錯少。1 同步狀態轉移 2 當前狀態判斷接下來的狀態 3 動作輸出 如果程式複雜可以不止三個always always 後常接case case必須有default 對於fpga常用 狀態數較少,獨熱碼編碼 或者格雷碼 獨熱碼編碼 pa...

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

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

徹底搞懂狀態機(一段式 兩段式 三段式)

例項 fsm實現10010串的檢測 狀態轉移圖 初始狀態s0,a 0,z 0.如果檢測到1,跳轉到s1。下一狀態s1,a 1,z 0.如果檢測到0,跳轉到s2。下一狀態s2,a 0,z 0.如果檢測到0,跳轉到s3。下一狀態s3,a 0,z 0.如果檢測到1,跳轉到s4。下一狀態s4,a 1,z 0...