零基礎(chǔ)學(xué)FPGA(七)淺談狀態(tài)機(jī)
今天我們來(lái)寫(xiě)狀態(tài)機(jī)。
本文引用地址:http://www.ex-cimer.com/article/267960.htm關(guān)于狀態(tài)機(jī)呢,想必大家應(yīng)該都接觸過(guò),通俗的講就是數(shù)電里我們學(xué)的狀態(tài)轉(zhuǎn)換圖。狀態(tài)機(jī)分為兩中類(lèi)型,一種叫Mealy型,一種叫Moore型。前者就是說(shuō)時(shí)序邏輯的輸出不僅取決于當(dāng)前的狀態(tài),還取決于輸入,而后者就是時(shí)序邏輯的輸出僅僅取決于當(dāng)前的狀態(tài)。下面兩個(gè)圖分別表示兩種不同的狀態(tài)機(jī)。
下面我們就通過(guò)代碼來(lái)寫(xiě)一下?tīng)顟B(tài)機(jī),以下面的狀態(tài)轉(zhuǎn)換圖為例
首先,是一種典型的狀態(tài)機(jī)寫(xiě)法,這種寫(xiě)法我們稱(chēng)為一段時(shí)狀態(tài)機(jī),用于一些簡(jiǎn)單的設(shè)計(jì)是可以的,但如果是復(fù)雜的狀態(tài)機(jī),不建議大家用這種寫(xiě)法。
//***********************************************************
//可綜合的狀態(tài)機(jī)設(shè)計(jì)的典型方法
//實(shí)現(xiàn)典型的狀態(tài)機(jī)設(shè)計(jì)
//**********************************************
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; //當(dāng)前狀態(tài)寄存器
parameter Idle = 2'b00,
Start = 2'b01,
Stop = 2'b10,
Clear = 2'b11; //編碼 ,注意,只有在最后一句用分號(hào),其他地方用逗號(hào)
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語(yǔ)句已經(jīng)指定了所有狀態(tài),這樣綜合器就會(huì)刪除不需要的譯碼電路,使生成的電路簡(jiǎn)單
endcase
endmodule
fpga相關(guān)文章:fpga是什么
評(píng)論