FPGA 常用 狀態機

2021-07-10 01:53:14 字數 1671 閱讀 9424

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...