FPGA一段式狀態(tài)機(jī)如何設(shè)計(jì)?看看我寫的代碼就知道了!
今天,小編將在這篇文章中為大家?guī)?a href="/tags/FPGA" target="_blank">FPGA一段式狀態(tài)機(jī)設(shè)計(jì)的有關(guān)報(bào)道,通過閱讀這篇文章,大家可以對(duì)它具備清晰的認(rèn)識(shí),主要內(nèi)容如下。
FSM(finite State Machine),也稱為同步有限狀態(tài)機(jī),之所以說"同步"是因?yàn)闋顟B(tài)機(jī)中所有的狀態(tài)跳轉(zhuǎn)都是在時(shí)鐘的作用下進(jìn)行的,而"有限"則是說狀態(tài)的個(gè)數(shù)是有限的。狀態(tài)機(jī)的每一個(gè)狀態(tài)代表一個(gè)事件,從執(zhí)行當(dāng)前事件到執(zhí)行另一事件我們稱之為狀態(tài)的跳轉(zhuǎn)或狀態(tài)的轉(zhuǎn)移,我們需要做的就是執(zhí)行該事件然后跳轉(zhuǎn)到一下時(shí)間,這樣我們的系統(tǒng)就“活"了,可以正常的運(yùn)轉(zhuǎn)起來了。狀態(tài)機(jī)通過控制各個(gè)狀態(tài)的跳轉(zhuǎn)來控制流程,使得整個(gè)代碼看上去更加清晰易懂,在控制復(fù)雜流程的時(shí)候,狀態(tài)機(jī)優(yōu)勢明顯。
根據(jù)狀態(tài)機(jī)的輸出是否與輸入條件相關(guān),可將狀態(tài)機(jī)分為兩大類,即摩爾(Moore)型狀態(tài)機(jī)和米利(Mealy)型狀態(tài)機(jī)。
FPGA狀態(tài)機(jī)的描述方式主要分為3種,分別是一段式、兩段式、三段式。在這里,可以看下本人設(shè)計(jì)的一段式狀態(tài)機(jī)。
一段式狀態(tài)機(jī)使用1個(gè)always塊,把狀態(tài)跳轉(zhuǎn)和寄存器輸出邏輯都寫在一起,其輸出是寄存器輸出,無毛刺,但是這種方式代碼較混亂,邏輯不清晰,難于修改和調(diào)試,應(yīng)該盡量避免使用。
下面給出一個(gè)本人寫的一段式的Mealy狀態(tài)機(jī)示例:
module one_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;
// 初始化狀態(tài)寄存器
always @(posedge clk or negedge rst_n) begin
if (~rst_n) begin
state_r<= STATE_0;
end else begin
case (state_reg)
STATE_0: begin
if (inp == 2'b00) begin
state_r <= STATE_0;
outp <= 0;
end else if (inp == 2'b01) begin
state_r <= STATE_1;
outp <= 1;
end else if (inp == 2'b10) begin
state_r <= STATE_2;
outp <= 0;
end else begin
state_r <= STATE_3;
outp <= 1;
end
end
STATE_1: begin
if (inp == 2'b00) begin
state_r <= STATE_1;
outp <= 1;
end else if (inp == 2'b01) begin
state_r <= STATE_2;
outp <= 0;
end else if (inp == 2'b10) begin
state_r <= STATE_3;
outp <= 1;
end else begin
state_r <= STATE_0;
outp <= 0;
end
end
STATE_2: begin
if (inp == 2'b00) begin
state_r <= STATE_2;
outp <= 0;
end else if (inp == 2'b01) begin
state_r <= STATE_3;
outp <= 1;
end else if (inp == 2'b10) begin
state_r <= STATE_0;
outp <= 0;
end else begin
state_r <= STATE_1;
outp <= 1;
end
end
STATE_3: begin
if (inp == 2'b00) begin
state_r <= STATE_3;
outp <= 1;
end else if (inp == 2'b01) begin
state_r <= STATE_0;
outp <= 0;
end else if (inp == 2'b10) begin
state_r <= STATE_1;
outp <= 1;
end else begin
state_reg <= STATE_2;
outp <= 0;
end
end
endcase
end
end
以上便是小編此次帶來的有關(guān)FPGA一段式狀態(tài)機(jī)設(shè)計(jì)的全部內(nèi)容,十分感謝大家的耐心閱讀,想要了解更多相關(guān)內(nèi)容,或者更多精彩內(nèi)容,請(qǐng)一定關(guān)注我們網(wǎng)站哦。