1,單always塊結構(一段式):
always @(posedge clk ) begin
case(fsm)
st0;begin
out0;//輸出
if(case0) fsm<=st1;//狀態轉移
endst1;begin
out1;//輸出
if(case0) fsm<=st2;//狀態轉移
end……
default:
endcase
end單always塊把組合邏輯和時序邏輯放在乙個時序always塊描述。輸出時為暫存器輸出,所以**刺。但是這種方式會產生多餘的觸發器(因為把組合邏輯也放在時序邏輯中實現),而且**難以修改除錯。但對於那些簡單的狀態機,一段式還是不錯的,因為它把輸入,轉移,輸出一起體現,更方便理解。但是對於複雜狀態機就是災難了,所以最好還是養成不使用該結構的習慣。
雙always塊結構(兩段式):
//時序邏輯,這段一般是不變的,描述從現態轉移到次態
always @ (posedge clk) begin
current_state<=next_state;
end//組合邏輯,包括轉移條件以及狀態內容(即輸出)
always @ (*) begin
case(current_state)
st0:begin
out0;
if(case0) fsm=st1; //組合邏輯使用阻塞語句
endst1:begin
out1;
if(case1) fsm=st2;
end……
endcase
end二段式中,乙個always塊採用同步時序描述狀態轉移;另乙個採用組合邏輯判斷轉移條件,以及描述輸出。二段式便於閱讀,理解和維護,有利於綜合器優化**。但是由於採用的是組合邏輯輸出,容易產生毛刺,且不利於約束,也不利於綜合器和布局佈線器實現高效能設計。
三always塊結構(三段式):
//第乙個always塊,時序邏輯,描述現態轉移到次態
always @ (posedge clk negedge rst_n) begin
if(!rst_n) current_state<=idle;
else current_state<=next_state;
end//第二個always塊,組合邏輯,描述狀態轉移的條件
always @ (current_state) begin
case(current_state)
s1:if(……) next_state=s2;//組合邏輯,採用阻塞賦值
……endcase
end//第三個always塊,時序邏輯,描述輸出
always @ (posedge clk negedge rst_n) begin
case(next_state) //這裡有的是next_state,有的是current_state,需根據電路要求
s1: out1<=……;
s2: out2<=……;
default:……
endcase
end三段式結構中,2個時序always塊分別用來描述現態邏輯轉移,及輸出賦值。組合always塊用於描述狀態轉移的條件。這種結構是暫存器輸出,輸出**刺,而且**更清晰易讀,特別是對於複雜的狀態機來說,但是消耗的面積也更多點。這是一種比較流行的狀態機結構。
FPGA狀態機總結
1.狀態機的結構 1 邏輯表示式 下乙個狀態 f 當前狀態,輸入訊號 輸出訊號 g 當前狀態,輸入訊號 2 mealy狀態機 時序邏輯的輸出取決於狀態與輸入 3 moore狀態機 時序邏輯的輸出取決於狀態 2.狀態編碼的型別 1 獨熱編碼 乙個bit代表乙個狀態 4中狀態的編碼有 4 b0001,4...
FPGA 狀態機,FPGA的靈魂
有關狀態機的文章,事實上已經寫過很多了,可是即使如此,真的懂了嗎?真的能熟練應用嗎?未必吧。這篇博文 是 fpga之道 認真下看去收貨頗豐!借這個主題來梳理下狀態機 狀態機是fpga設計中一種非常重要 非常根基的設計思想,堪稱fpga的靈魂,貫穿fpga設計的始終。簡單地說,狀態機就是一副描繪著狀態...
FPGA 狀態機的模型之Moore型狀態機
上篇博文 狀態機,fpga的靈魂,說到了狀態機的基礎知識,講到了狀態機的組成六要素,工作四要素。這篇博文來講狀態機的模型之moore狀態機,從標題也能看出,狀態機的知識並沒有結束,後面還會提到mealy型狀態機。根據狀態機的輸出與其現態 輸入之間的關係,可將fpga中的狀態機抽象為三種基本模型 mo...