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