詳細(xì)介紹FPGA狀態(tài)機(jī)的設(shè)計(jì)和應(yīng)用_第1頁
詳細(xì)介紹FPGA狀態(tài)機(jī)的設(shè)計(jì)和應(yīng)用_第2頁
詳細(xì)介紹FPGA狀態(tài)機(jī)的設(shè)計(jì)和應(yīng)用_第3頁
詳細(xì)介紹FPGA狀態(tài)機(jī)的設(shè)計(jì)和應(yīng)用_第4頁
詳細(xì)介紹FPGA狀態(tài)機(jī)的設(shè)計(jì)和應(yīng)用_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

詳細(xì)介紹FPGA狀態(tài)機(jī)的設(shè)計(jì)和應(yīng)用FPGA的特點(diǎn)是并行執(zhí)行,但如果需要處理一些具有前后順序的事件,就需要使用狀態(tài)機(jī)。狀態(tài)機(jī)是一種用于處理具有前后順序的事件的計(jì)算機(jī)模型,包含現(xiàn)態(tài)、條件、動作和次態(tài)四個(gè)要素,它可以將一個(gè)復(fù)雜的控制流程分解成多個(gè)互相獨(dú)立的狀態(tài),從而簡化設(shè)計(jì)過程并提高了系統(tǒng)的可靠性和性能。本文將對FPGA狀態(tài)機(jī)進(jìn)行詳細(xì)介紹,幫助大家了解狀態(tài)機(jī)的設(shè)計(jì)和應(yīng)用。一、FPGA狀態(tài)機(jī)基礎(chǔ)1、基礎(chǔ)概念FPGA狀態(tài)機(jī)是一種能夠描述對象在運(yùn)行周期內(nèi)的所有狀態(tài),以及從一個(gè)狀態(tài)到另一個(gè)狀態(tài)轉(zhuǎn)換的過程的抽象模型。狀態(tài)機(jī)可歸納為4個(gè)要素,即現(xiàn)態(tài)、條件、動作、次態(tài)。①現(xiàn)態(tài):當(dāng)前所處的狀態(tài)。②條件:當(dāng)一個(gè)條件被滿足,將會觸發(fā)一個(gè)動作,或者執(zhí)行一次運(yùn)行狀態(tài)的變化。③動作:條件滿足后執(zhí)行的動作。動作不是必需的,也可以直接遷移到新狀態(tài)而不進(jìn)行任何動作。④次態(tài):條件滿足后要跳轉(zhuǎn)到的新狀態(tài)。其中,“次態(tài)”是相對于“現(xiàn)態(tài)”而言的,一旦被跳轉(zhuǎn)后,“次態(tài)”就轉(zhuǎn)變成新的“現(xiàn)態(tài)”了。2、狀態(tài)機(jī)分類通常情況下,F(xiàn)PGA狀態(tài)機(jī)一般有兩種類型:Moore型狀態(tài)機(jī):下一狀態(tài)只由當(dāng)前狀態(tài)決定。Mealy型狀態(tài)機(jī):下一狀態(tài)不但與當(dāng)前狀態(tài)有關(guān),還與當(dāng)前輸入值有關(guān)。由于Mealy型狀態(tài)機(jī)的輸出與輸入有關(guān),輸出信號很容易出現(xiàn)毛刺,所以一般采用Moore型狀態(tài)機(jī)。(1)Mealy狀態(tài)機(jī)輸出邏輯不但取決于當(dāng)前“狀態(tài)”還取決于“輸入”,如圖所示。(2)Moore狀態(tài)機(jī)輸出邏輯僅僅取決于當(dāng)前狀態(tài),且與當(dāng)前時(shí)刻的輸入無關(guān),如圖所示。二、FPGA狀態(tài)機(jī)實(shí)現(xiàn)方式FPGA狀態(tài)機(jī)的描述方式主要分為3種,分別是一段式、兩段式、三段式。1、一段式狀態(tài)機(jī)一段式狀態(tài)機(jī)使用1個(gè)always塊,把狀態(tài)跳轉(zhuǎn)和寄存器輸出邏輯都寫在一起,其輸出是寄存器輸出,無毛刺,但是這種方式代碼較混亂,邏輯不清晰,難于修改和調(diào)試,應(yīng)該盡量避免使用。下面給出一個(gè)一段式的Mealy狀態(tài)機(jī)示例:moduleone_state_machine(

inputclk,

inputrst_n,

input[1:0]inp,

outputregoutp

);

//定義狀態(tài)

localparamSTATE_0=0,

STATE_1=1,

STATE_2=2,

STATE_3=3;

//定義狀態(tài)寄存器和初始狀態(tài)

reg[1:0]state_r;

//初始化狀態(tài)寄存器

always@(posedgeclkornegedgerst_n)begin

if(~rst_n)begin

state_r<=STATE_0;

endelsebegin

case(state_reg)

STATE_0:begin

if(inp==2'b00)begin

state_r<=STATE_0;

outp<=0;

endelseif(inp==2'b01)begin

state_r<=STATE_1;

outp<=1;

endelseif(inp==2'b10)begin

state_r<=STATE_2;

outp<=0;

endelsebegin

state_r<=STATE_3;

outp<=1;

end

end

STATE_1:begin

if(inp==2'b00)begin

state_r<=STATE_1;

outp<=1;

endelseif(inp==2'b01)begin

state_r<=STATE_2;

outp<=0;

endelseif(inp==2'b10)begin

state_r<=STATE_3;

outp<=1;

endelsebegin

state_r<=STATE_0;

outp<=0;

end

end

STATE_2:begin

if(inp==2'b00)begin

state_r<=STATE_2;

outp<=0;

endelseif(inp==2'b01)begin

state_r<=STATE_3;

outp<=1;

endelseif(inp==2'b10)begin

state_r<=STATE_0;

outp<=0;

endelsebegin

state_r<=STATE_1;

outp<=1;

end

end

STATE_3:begin

if(inp==2'b00)begin

state_r<=STATE_3;

outp<=1;

endelseif(inp==2'b01)begin

state_r<=STATE_0;

outp<=0;

endelseif(inp==2'b10)begin

state_r<=STATE_1;

outp<=1;

endelsebegin

state_reg<=STATE_2;

outp<=0;

end

end

endcase

end

end

endmodule2、二段式狀態(tài)機(jī)二段式狀態(tài)機(jī)使用2個(gè)always塊,都是時(shí)序邏輯,其中一個(gè)always塊用于寫狀態(tài)機(jī)的狀態(tài)跳轉(zhuǎn)邏輯,另一個(gè)always塊用于寫當(dāng)前狀態(tài)下的寄存器輸出邏輯。這種方式邏輯代碼清晰,易于調(diào)試和理解,是比較推薦的一個(gè)方式。下面給出一個(gè)二段式的Moore狀態(tài)機(jī)示例:modulestate_machine(

inputclk,

inputrst_n,

outputregout_reg

);

//狀態(tài)寄存器和下一個(gè)狀態(tài)寄存器

reg[1:0]state_r;

//狀態(tài)定義

parameterIDLE=2'b00;

parameterSTATE1=2'b01;

parameterSTATE2=2'b10;

parameterSTATE3=2'b11;

//always@(posedgeclkornegedgerst_n)時(shí)序邏輯代碼塊,實(shí)現(xiàn)狀態(tài)跳轉(zhuǎn)邏輯

always@(posedgeclkornegedgerst_n)begin

if(~rst_n)begin

state_r<=IDLE;

endelsebegin

case(state_r)

IDLE:begin

state_r<=STATE1;

end

STATE1:begin

state_r<=STATE2;

end

STATE2:begin

state_r<=STATE3;

end

STATE3:begin

state_r<=IDLE;

end

endcase

end

end

//always@(*)時(shí)序邏輯代碼塊,實(shí)現(xiàn)狀態(tài)輸出邏輯

always@(posedgeclkornegedgerst_n)begin

if(~rst_n)begin

out_reg<=1'b0;

endelsebegin

case(state_r)

IDLE:begin

out_reg<=1'b0;

end

STATE1:begin

out_reg<=1'b1;

end

STATE2:begin

out_reg<=1'b1;

end

STATE3:begin

out_reg<=1'b0;

end

endcase

end

end

endmodule3、三段式狀態(tài)機(jī)三段式狀態(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è)方式。modulestate_machine(

inputclk,

inputrst_n,

input[1:0]inp,

outputregoutp

);

//定義狀態(tài)

localparamSTATE_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@(posedgeclkornegedgerst_n)begin

if(~rst_n)begin

state_r<=STATE_0;

endelsebegin

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;

endelseif(inp==2'b01)begin

next_state=STATE_1;

endelseif(inp==2'b10)begin

next_state=STATE_2;

endelsebegin

next_state=STATE_3;

end

end

STATE_1:begin

if(inp==2'b00)begin

next_state=STATE_1;

endelseif(inp==2'b01)begin

next_state=STATE_2;

endelseif(inp==2'b10)begin

next_state=STATE_3;

endelsebegin

next_state=STATE_0;

end

end

STATE_2:begin

if(inp==2'b00)begin

next_state=STATE_2;

endelseif(inp==2'b01)begin

next_state=STATE_3;

endelseif(inp==2'b10)begin

next_state=STATE_0;

endelsebegin

next_state=STATE_1;

end

end

STATE_3:begin

if(inp==2'b00)begin

next_state=STATE_3;

endelseif(inp==2'b01)begin

next_state=STATE_0;

endelseif(inp==2'b10)begin

next_state=STATE_1;

endelsebegin

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語句和case語句必須寫滿,否則容易形成latch,導(dǎo)致實(shí)際運(yùn)行出問題。三、狀態(tài)機(jī)的編碼方式1、獨(dú)熱碼獨(dú)熱碼(One-hot)是一種狀態(tài)編碼方式,其特點(diǎn)是對于任意給定的狀態(tài),狀態(tài)寄存器中只有1位為1,其余位都為0。使用獨(dú)熱碼可以簡化譯碼邏輯電路,因?yàn)闋顟B(tài)機(jī)只需對寄存器中的一位進(jìn)行譯碼,同時(shí)可用省下的面積抵消額外觸發(fā)器占用的面積。相比于其他類型的有限狀態(tài)機(jī),加入更多的狀態(tài)時(shí),獨(dú)熱碼的譯碼邏輯并不會變得更加復(fù)雜,速度僅取決于到某特定狀態(tài)的轉(zhuǎn)移數(shù)量。此外,獨(dú)熱碼還具有諸如設(shè)計(jì)簡單、修改靈活、易于綜合和調(diào)試等優(yōu)點(diǎn)。但值得注意的是,相對于二進(jìn)制碼,獨(dú)熱碼速度更快但占用面積較大。modulestate_machine(

inputclk,

outputreg[3:0]state_out

);

localparamSTATE_A=4'b0001;

localparamSTATE_B=4'b0010;

localparamSTATE_C=4'b0100;

localparamSTATE_D=4'b1000;

reg[3:0]current_state,next_state;

always@(posedgeclk)begin

current_state<=next_state;//當(dāng)時(shí)鐘上升沿到來時(shí)更新狀態(tài)

end

always@(*)begin

case(current_state)

STATE_A:next_state=STATE_B;

STATE_B:next_state=STATE_C;

STATE_C:next_state=STATE_D;

STATE_D:next_state=STATE_A;

default:next_state=STATE_A;//默認(rèn)情況下返回初始狀態(tài)

endcase

end

assignstate_out=current_state;//將當(dāng)前狀態(tài)作為輸出

endmodule2、格雷碼格雷碼是一種相鄰的兩個(gè)碼組之間僅有一位不同的編碼方式。在格雷碼中,相鄰的兩個(gè)碼組之間僅有一位不同,這種編碼方式可以用于實(shí)現(xiàn)相鄰的兩個(gè)狀態(tài)之間只有一位不同的狀態(tài)機(jī);FPGA中的狀態(tài)機(jī)通常需要高速運(yùn)行,因此使用格雷碼可以減少狀態(tài)轉(zhuǎn)換的開銷,并提高時(shí)序性能。modulegray_code_state_machine(

inputclk,

outputreg[3:0]state_out

);

localparamG0=4'b0000;

localparamG1=4'b0001;

localparamG2=4'b0011;

localparamG3=4'b0010;

reg[3:0]current_state,next_state;

always@(posedgeclk)begin

current_state<=next_state;//當(dāng)時(shí)鐘上升沿到來時(shí)更新狀態(tài)

end

always@(*)begin

case(current_state)

G0:next_state=G1;

G1:next_state=G3;

G2:next_state=G0;

G3:next_state=G2;

default:next_state=G0;//默認(rèn)情況下返回初始狀態(tài)

endcase

end

assignstate_out=current_state;//將當(dāng)前狀態(tài)作為輸出

endmodule3、普通二進(jìn)制碼FPGA狀態(tài)機(jī)可以用普通二進(jìn)制碼表示,不同狀態(tài)按照二進(jìn)制數(shù)累加表示,是常用的一種方式,仿真調(diào)試時(shí),狀態(tài)顯示清晰,易于理解代碼。modulebinary_state_machine(

inputclk,

outputreg[1:0]state_out

);

localparamSTATE_A=2'b00;

localparamSTATE_B=2'b01;

localparamSTATE_C=2'b10;

reg[1:0]current_state,next_state;

always@(posedgeclk)begin

current_state<=next_state;//當(dāng)時(shí)鐘上升沿到來時(shí)更新狀態(tài)

end

always@(*)begin

case(current_state)

STATE_A:next_state=STATE_B;

STATE_B:next_state=STATE_C;

STATE_C:next_state=STATE_A;

default:next_state=STATE_A;//默認(rèn)情況下返回初始狀態(tài)

endcase

end

assignstate_out=current_state;//將當(dāng)前狀態(tài)作為輸出

endmodule4、格雷

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論