FPGA Base 狀態機編寫

2021-10-10 01:25:13 字數 1063 閱讀 7255

說來慚愧,再寫了不少hdl**以後,當被問到三段式狀態機的寫法是如何實現的,我卻不知道,平時基本都是用2個always語句實現。

所以今天補一篇關於狀態機的文件,針對以前自己不規範的開發做乙個約束。

狀態機的基本要素

分類

描述方式

三段式狀態機——rtl最佳實踐

// 第一段時序邏輯 狀態的跳轉

always@(posedge clk) begin

if(rst)

cur_state <= idle;

else

cur_state <= nxt_state;

end//第二段組合邏輯 狀態機的變化

always@(*) begin

case(cur_state)

idle: nxt_state = s1;

s1: nxt_state = s2;

s2: nxt_state = s3;

...default : nxt_state = idle;

endcase

end// 第三段時序邏輯 狀態機的輸出

always@(posedge clk) begin

if(rst)

fsm_out <= 'd0;

else begin

case (nxt_state)

idle: fsm_out <= 'd0;

s1: fsm_out <= 'd1;

s2: fsm_out <= 'd2;

...default : fsm_out <= 'd0;

endcase

endend

總結

三段式狀態機狀態之間的跳轉需要經過一級時序邏輯,同時,狀態機的輸出也需要經過一級時序邏輯,這樣有利於fpga實現時序約束,並且狀態機對外無組合邏輯輸出。取樣標準的三段式的編碼風格,有利於**的維可讀性和維護。

採用verilog編寫狀態機

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

狀態機 狀態機0

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

測試領域狀態機的編寫

我一直把測試領域的狀態機器分成2兩主幹 人機互動 主狀態.而主狀態一般嚴格分成 取引數 相當於c語言中的形參 採集,分析 處理,列印 報表,etc 說起來簡單,其實做起來不簡單 1.取引數,要想乙個pc做的能達到通用.這點非常重要,首先要分析需求 命令格式.比如,就拿我們自動測試系統來講,在此重點講...