FPGA三段式狀態(tài)機如何設(shè)計?看看我的代碼你就知道了!
在這篇文章中,小編將為大家?guī)?a href="/tags/FPGA" target="_blank">FPGA三段式狀態(tài)機設(shè)計的相關(guān)內(nèi)容。如果你對本文即將要講解的內(nèi)容存在一定興趣,不妨繼續(xù)往下閱讀哦。
三段式狀態(tài)機使用3個always塊,其中一個組合always塊用于寫狀態(tài)機的狀態(tài)跳轉(zhuǎn)邏輯,一個時序always塊用于緩存狀態(tài)寄存器,另一個always塊用于寫當前狀態(tài)下的寄存器輸出邏輯。這種方式邏輯代碼清晰,易于調(diào)試和理解,也是比較推薦的一個方式。
三段式狀態(tài)機則通過在組合邏輯后再增加一級寄存器實現(xiàn)邏輯輸出:
· 一個always塊采用同步時序描述狀態(tài)轉(zhuǎn)移
· 一個always塊采用組合邏輯判斷轉(zhuǎn)移條件、轉(zhuǎn)移狀態(tài)規(guī)律
·一個always塊采用同步時序描述狀態(tài)的輸出
這種三段式狀態(tài)機的寫法代碼非常清晰,極大降低了編寫維護代碼的復(fù)雜度,最大程度清晰完整的顯示出狀態(tài)機的結(jié)構(gòu)。同時可以有效地濾除兩段式狀態(tài)機組合邏輯輸出可能產(chǎn)生的毛刺信號;另外對于總線形式的輸出來說,容易使總線數(shù)據(jù)對齊,從而減小總線數(shù)據(jù)間的偏移,減小接收端數(shù)據(jù)采樣出錯的頻率:但是三段式消耗的資源相對多一點,并且三段式從輸入到輸出比一段式和二段式會延時一個時鐘周期。
下面是本人實現(xiàn)的FPGA三段式狀態(tài)機的代碼,大家可以參考:
module state_machine (
input clk,
input rst_n,
input [1:0] inp,
output reg outp
);
// 定義狀態(tài)
localparam STATE_0 = 0,
STATE_1 = 1,
STATE_2 = 2,
STATE_3 = 3;
// 定義狀態(tài)寄存器和初始狀態(tài)
reg [1:0] state_r, next_state ;
// 定義狀態(tài)寄存器
always @(posedge clk or negedge rst_n) begin
if (~rst_n) begin
state_r <= STATE_0;
end else begin
state_r <= next_state;
end
end
// 定義狀態(tài)轉(zhuǎn)移邏輯
always @(*) begin
case (state_r)
STATE_0: begin
if (inp == 2'b00) begin
next_state = STATE_0;
end else if (inp == 2'b01) begin
next_state = STATE_1;
end else if (inp == 2'b10) begin
next_state = STATE_2;
end else begin
next_state = STATE_3;
end
end
STATE_1: begin
if (inp == 2'b00) begin
next_state = STATE_1;
end else if (inp == 2'b01) begin
next_state = STATE_2;
end else if (inp == 2'b10) begin
next_state = STATE_3;
end else begin
next_state = STATE_0;
end
end
STATE_2: begin
if (inp == 2'b00) begin
next_state = STATE_2;
end else if (inp == 2'b01) begin
next_state = STATE_3;
end else if (inp == 2'b10) begin
next_state = STATE_0;
end else begin
next_state = STATE_1;
end
end
STATE_3: begin
if (inp == 2'b00) begin
next_state = STATE_3;
end else if (inp == 2'b01) begin
next_state = STATE_0;
end else if (inp == 2'b10) begin
next_state = STATE_1;
end else begin
next_state = STATE_2;
end
end
endcase
end
// 定義輸出邏輯
always @(*) begin
case (state_r)
STATE_0: outp = 0;
STATE_1: outp = 1;
STATE_2: outp = 0;
STATE_3: outp = 1;
endcase
end
endmodule
注意:組合邏輯代碼中,if語句和case語句必須寫滿,否則容易形成latch,導(dǎo)致實際運行出問題。
以上就是小編這次想要和大家分享的有關(guān)FPGA三段式狀態(tài)機設(shè)計的內(nèi)容,希望大家對本次分享的內(nèi)容已經(jīng)具有一定的了解。如果您想要看不同類別的文章,可以在網(wǎng)頁頂部選擇相應(yīng)的頻道哦。