三段式**多,但是有時鐘同步,延時少,組合邏輯跟時序邏輯分開並行出錯少。
(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 描述方...