零基礎(chǔ)學FPGA(七)淺談狀態(tài)機
今天我們來寫狀態(tài)機。
本文引用地址:http://m.ptau.cn/article/267960.htm關(guān)于狀態(tài)機呢,想必大家應(yīng)該都接觸過,通俗的講就是數(shù)電里我們學的狀態(tài)轉(zhuǎn)換圖。狀態(tài)機分為兩中類型,一種叫Mealy型,一種叫Moore型。前者就是說時序邏輯的輸出不僅取決于當前的狀態(tài),還取決于輸入,而后者就是時序邏輯的輸出僅僅取決于當前的狀態(tài)。下面兩個圖分別表示兩種不同的狀態(tài)機。


下面我們就通過代碼來寫一下狀態(tài)機,以下面的狀態(tài)轉(zhuǎn)換圖為例

首先,是一種典型的狀態(tài)機寫法,這種寫法我們稱為一段時狀態(tài)機,用于一些簡單的設(shè)計是可以的,但如果是復(fù)雜的狀態(tài)機,不建議大家用這種寫法。
//***********************************************************
//可綜合的狀態(tài)機設(shè)計的典型方法
//實現(xiàn)典型的狀態(tài)機設(shè)計
//**********************************************
module fsm (clk,rst_n,A,k1,k2,State);
input clk;
input rst_n;
input A;
output k1,k2;
output [1:0] State;
reg k1;
reg k2;
reg [1:0] State; //當前狀態(tài)寄存器
parameter Idle = 2'b00,
Start = 2'b01,
Stop = 2'b10,
Clear = 2'b11; //編碼 ,注意,只有在最后一句用分號,其他地方用逗號
always @(posedge clk or negedge rst_n)
if(!rst_n)
begin
State <= Idle;
k1 <=1'b0;
k2 <=1'b0;
end
else case (State) //狀態(tài)判斷與組合邏輯賦值
Idle :if(A) begin
State <= Start;
k1 <= 0;
end
else begin
State <= Idle;
k1 <= 0;
k2 <= 0;
end
Start :if(!A) State <= Stop;
else State <= Start;
Stop :if(A) begin
State <=Clear;
k2 <= 1;
end
else State <= Stop;
Clear :if(!A) begin
State <= Clear;
k2 <= 0;
k1 <= 1;
end
else State <= Clear;
default : State <= 2'bxx; //告訴綜合器 case語句已經(jīng)指定了所有狀態(tài),這樣綜合器就會刪除不需要的譯碼電路,使生成的電路簡單
endcase
endmodule
fpga相關(guān)文章:fpga是什么
評論