說來慚愧,再寫了不少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做的能達到通用.這點非常重要,首先要分析需求 命令格式.比如,就拿我們自動測試系統來講,在此重點講...