版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024至2030年檸檬綠茶項(xiàng)目投資價(jià)值分析報(bào)告
- 2024至2030年抗干擾電容項(xiàng)目投資價(jià)值分析報(bào)告
- 學(xué)生食堂合同范例
- 土方貨車轉(zhuǎn)讓合同范例
- 陜西能源職業(yè)技術(shù)學(xué)院《模具設(shè)計(jì)與制造》2023-2024學(xué)年第一學(xué)期期末試卷
- 房屋租賃網(wǎng)絡(luò)合同范例
- 定制家具對公合同范例
- 招生顧問老師合同范例
- 服務(wù)升級項(xiàng)目合同范例
- 木質(zhì)臺階租賃合同范例
- 2024人教版英語七年級上冊期末全冊知識點(diǎn)復(fù)習(xí)
- 注冊會計(jì)師考試職業(yè)能力綜合測試科目(試卷一、試卷二)試題及解答參考(2024年)
- 行政案例分析-終結(jié)性考核-國開(SC)-參考資料
- 操作系統(tǒng)-001-國開機(jī)考復(fù)習(xí)資料
- 快樂讀書吧:中國民間故事(專項(xiàng)訓(xùn)練)-2023-2024學(xué)年五年級語文上冊(統(tǒng)編版)
- 出車前的安全檢查
- 山東省煙臺市2023-2024學(xué)年高一上學(xué)期期末考試 化學(xué) 含解析
- 2024落實(shí)意識形態(tài)責(zé)任清單及風(fēng)險(xiǎn)點(diǎn)臺賬
- 2024年度護(hù)士長工作總結(jié)
- 《籃球:原地持球交叉步突破》教案(三篇)
- 稀土新材料在新能源技術(shù)領(lǐng)域的應(yīng)用
評論
0/150
提交評論