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