EDA應(yīng)用技術(shù) 第2版 課件 03-基于VHDL程序的狀態(tài)機(jī)描述課件_第1頁
EDA應(yīng)用技術(shù) 第2版 課件 03-基于VHDL程序的狀態(tài)機(jī)描述課件_第2頁
EDA應(yīng)用技術(shù) 第2版 課件 03-基于VHDL程序的狀態(tài)機(jī)描述課件_第3頁
EDA應(yīng)用技術(shù) 第2版 課件 03-基于VHDL程序的狀態(tài)機(jī)描述課件_第4頁
EDA應(yīng)用技術(shù) 第2版 課件 03-基于VHDL程序的狀態(tài)機(jī)描述課件_第5頁
已閱讀5頁,還剩10頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

有限狀態(tài)機(jī)(finite-statemachine,縮寫:FSM)又稱有限狀態(tài)自動機(jī),簡稱狀態(tài)機(jī),是表示有限個狀態(tài)以及在這些狀態(tài)之間轉(zhuǎn)移和動作等行為的數(shù)學(xué)模型。狀態(tài)機(jī)由狀態(tài)寄存器和組合邏輯電路構(gòu)成,能夠根據(jù)控制信號按照預(yù)先設(shè)定的狀態(tài)進(jìn)行狀態(tài)轉(zhuǎn)移,協(xié)調(diào)相關(guān)信號動作,完成特定操作的控制。在VHDL程序設(shè)計的實(shí)用時序邏輯系統(tǒng)中,狀態(tài)機(jī)是應(yīng)用廣泛的電路模塊,其在運(yùn)行速度的高效、執(zhí)行時間的確定性和高可靠性方面都顯現(xiàn)出強(qiáng)大的優(yōu)勢。項(xiàng)目6狀態(tài)機(jī)的VHDL程序描述1.狀態(tài)機(jī)狀態(tài)機(jī)是以描述控制特性為主的建模方法,它可以應(yīng)用于從系統(tǒng)分析到設(shè)計的所有階段。狀態(tài)機(jī)的基本操作有兩種:(1)狀態(tài)機(jī)內(nèi)部狀態(tài)轉(zhuǎn)換狀態(tài)機(jī)內(nèi)部狀態(tài)轉(zhuǎn)換操作使?fàn)顟B(tài)機(jī)經(jīng)歷一系列狀態(tài),下一狀態(tài)由狀態(tài)譯碼器根據(jù)當(dāng)前狀態(tài)和輸入條件決定。(2)產(chǎn)生輸出信號序列產(chǎn)生輸出信號序列操作是根據(jù)當(dāng)前狀態(tài)和輸入條件確定輸出信號,由輸出譯碼器輸出信號。典型的狀態(tài)機(jī)有兩種:Mealy狀態(tài)機(jī)和Moore狀態(tài)機(jī)。項(xiàng)目6狀態(tài)機(jī)的VHDL程序描述2.一般狀態(tài)機(jī)的VHDL程序描述一般狀態(tài)機(jī)的結(jié)構(gòu)如圖6.9所示,狀態(tài)機(jī)的VHDL程序描述通常用枚舉類數(shù)據(jù)類型來定義狀態(tài)機(jī)的狀態(tài),使用多進(jìn)程方式來描述狀態(tài)機(jī)的內(nèi)部邏輯。通常包括說明部分、主控時序進(jìn)程、主控組合進(jìn)程和輔助進(jìn)程等。項(xiàng)目6狀態(tài)機(jī)的VHDL程序描述圖6.9一般狀態(tài)機(jī)的結(jié)構(gòu)結(jié)構(gòu)框圖(1)說明部分說明部分一般放在結(jié)構(gòu)體的architecture和begin之間,用枚舉型數(shù)據(jù)類型定義狀態(tài)機(jī)的狀態(tài)名。(2)主控時序進(jìn)程主控時序進(jìn)程是實(shí)現(xiàn)狀態(tài)轉(zhuǎn)換的進(jìn)程。(3)主控組合進(jìn)程主控組合進(jìn)程的功能是狀態(tài)譯碼,向外部發(fā)出控制信號,確定下一狀態(tài)的走向。(4)輔助進(jìn)程輔助進(jìn)程用于配合狀態(tài)機(jī)工作的組合、時序進(jìn)程或配合狀態(tài)機(jī)工作的其他時序進(jìn)程。項(xiàng)目6狀態(tài)機(jī)的VHDL程序描述libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;useieee.std_logic_arith.all;entitys_machineisport(clk,reset:instd_logic;

state_inputs:in

std_logic_vector(0to1);

control_outputs:outstd_logic_vector(0to1));endentitys_machine;architecturebehaveofs_machineistypestatesis(S0,S1,S2,S3);--定義states為枚舉數(shù)據(jù)類型signalcurrent_state,next_state:states;beginP1:process(reset,clk)beginifreset='1'thencurrent_state<=S0;elsif

clk='1'andclk'eventthen--上升沿觸發(fā)current_state<=next_state;--當(dāng)前態(tài)轉(zhuǎn)換為次態(tài)endif;endprocessP1;【例6.1】雙進(jìn)程描述的狀態(tài)機(jī)項(xiàng)目6狀態(tài)機(jī)的VHDL程序描述進(jìn)程P1為主控時序進(jìn)程,在“clk”上升沿時,狀態(tài)機(jī)的狀態(tài)由當(dāng)前態(tài)“current_state”向次態(tài)“next_state”轉(zhuǎn)變。P2:process(current_state,state_inputs)--主控組合進(jìn)程begincasecurrent_stateiswhenS0=>control_outputs<="00";--輸出當(dāng)前狀態(tài)的控制值ifstate_inputs="00"then--根據(jù)外部輸入的值確定次態(tài)的走向

next_state<=S0;else

next_state<=S1;endif;whenS1=>control_outputs<="01";ifstate_inputs="00"then

next_state<=S1;else

next_state<=S2;endif;whenS2=>control_outputs<="10";ifstate_inputs="11"then

next_state<=S2;else

next_state<=S3;endif;whenS3=>control_outputs<="11";ifstate_inputs="11"then

next_state<=S3;else

next_state<=S0;endif;endcase;endprocess;endarchitecturebehave;說明部分:使用type語句定義狀態(tài)機(jī)狀態(tài)進(jìn)程P2為主控組合進(jìn)程;根據(jù)當(dāng)前狀態(tài)“current_state”與輸入信號“state_inputs”確定次態(tài)的狀態(tài)。進(jìn)程間通過“current_state”、“next_state”信號傳遞信息。例6.1程序編譯后,在QuartusPrime20.1集成環(huán)境,選擇【Tool】菜單【NetlistViewers】選項(xiàng)【RTLViewer】命令,將產(chǎn)生例6.1描述的狀態(tài)機(jī)的寄存器傳輸級綜合效果圖,如圖6.10所示。項(xiàng)目6狀態(tài)機(jī)的VHDL程序描述圖6.10寄存器傳輸級綜合效果圖RTL例6.1程序編譯后,在QuartusPrime20.1集成環(huán)境,選擇【Tool】菜單【NetlistViewers】選項(xiàng)【StateMachineViewer】命令,將產(chǎn)生例6.1描述的狀態(tài)機(jī)的狀態(tài)轉(zhuǎn)換圖,如圖6.11所示。項(xiàng)目6狀態(tài)機(jī)的VHDL程序描述圖6.11狀態(tài)機(jī)狀態(tài)轉(zhuǎn)換圖例6.1程序的功能仿真結(jié)果,如圖6.12所示。項(xiàng)目6狀態(tài)機(jī)的VHDL程序描述圖6.12狀態(tài)機(jī)功能仿真圖從圖中可知,狀態(tài)的轉(zhuǎn)變與輸出值的改變,與輸入時鐘的上升沿同步,與輸入信號“state_inputs”不同步。在55ms處,輸入信號“state_inputs”由“01”變?yōu)椤?1”,但輸出與狀態(tài)并沒有發(fā)生改變(control_outputs=10),在70ms“clk”上升沿處,輸出狀態(tài)還是“10”態(tài)沒有發(fā)生改變。這是由于當(dāng)前態(tài)是S2狀態(tài),根據(jù)程序可知當(dāng)前態(tài)是S2態(tài),輸入信號“state_inputs”值為“11”時,狀態(tài)轉(zhuǎn)換是由S2態(tài)轉(zhuǎn)向S2態(tài),因而,狀態(tài)沒有發(fā)生改變。3.Moore狀態(tài)機(jī)的VHDL程序描述Moore有限狀態(tài)機(jī)輸出只與當(dāng)前狀態(tài)有關(guān),與輸入信號的當(dāng)前值無關(guān),是嚴(yán)格的現(xiàn)態(tài)函數(shù)。Moore有限狀態(tài)機(jī)的典型結(jié)構(gòu),如圖6.13所示。項(xiàng)目6狀態(tài)機(jī)的VHDL程序描述圖6.13Moore狀態(tài)機(jī)的典型結(jié)構(gòu)libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;useieee.std_logic_arith.all;entitymooreisport(clk,reset:instd_logic;

data_in:in

std_logic;

data_out:outstd_logic_vector(3downto0));endentitymoore;architecturebehaveofmooreistypestates_typeis(S0,S1,S2,S3);--定義states_type為枚舉數(shù)據(jù)類型signalstate:states_type;--聲明信號state為states_type數(shù)據(jù)類型Begin【例6.2】Moore狀態(tài)機(jī)的描述項(xiàng)目6狀態(tài)機(jī)的VHDL程序描述進(jìn)程P1為主控時序進(jìn)程,在“clk”上升沿時,狀態(tài)機(jī)的狀態(tài)轉(zhuǎn)變。P1:process(reset,clk)--主控時序進(jìn)程beginifreset='0'thenstate<=S0;elsif

clk='1'andclk'eventthen--上升沿觸發(fā)casestateiswhenS0=>ifdata_in='1'thenstate<=S1;endif;whenS1=>ifdata_in='0'thenstate<=S2;endif;whenS2=>ifdata_in='1'thenstate<=S3;endif;whenS3=>ifdata_in='0'thenstate<=S0;endif;endcase; endif;endprocessP1說明部分:使用type語句定義狀態(tài)機(jī)狀態(tài)P2:process(state)--主控組合進(jìn)程begincasestateiswhenS0=>data_out<="0001";--輸出當(dāng)前狀態(tài)的值whenS1=>data_out<="0010";whenS2=>data_out<="0100";whenS3=>data_out<="1000";endcase;endprocess;endarchitecturebehave;【例6.2】Moore狀態(tài)機(jī)的描述項(xiàng)目6狀態(tài)機(jī)的VHDL程序描述進(jìn)程P2為主控組合邏輯進(jìn)程例6.2程序編譯后,在QuartusPrime20.1集成環(huán)境,選擇【Tool】菜單【NetlistViewers】選項(xiàng)【StateMachineViewer】命令,將產(chǎn)生例6.2描述的狀態(tài)機(jī)的狀態(tài)轉(zhuǎn)換圖,如圖6.14所示。圖6.14狀態(tài)機(jī)狀態(tài)轉(zhuǎn)換圖項(xiàng)目6狀態(tài)機(jī)的VHDL程序描述由圖可知,狀態(tài)機(jī)在異步復(fù)位后進(jìn)入S0態(tài)(state=S0),在第30ns時clk上升沿處,state=S0,data_in=0(≠1),狀態(tài)不變,保持處于S0態(tài),輸出data_out=0001;在30ns~50ns的一個時鐘周期內(nèi),一直保持輸出信號不變,雖然在40ns處,data_in變?yōu)?,但狀態(tài)并不改變,而是要到50ns時,clk上升沿處才發(fā)生狀態(tài)轉(zhuǎn)變(S0態(tài)轉(zhuǎn)變?yōu)镾1態(tài))。說明了Moore狀態(tài)機(jī)在時鐘周期內(nèi)輸入信號發(fā)生變化,但輸出保持穩(wěn)定不變,屬于同步輸出狀態(tài)機(jī)。例6.2程序的功能仿真結(jié)果,如圖6.15所示。圖6.15Moore狀態(tài)機(jī)的仿真結(jié)果4.Mealy狀態(tài)機(jī)的VHDL程序描述Mealy狀態(tài)機(jī)的輸出是現(xiàn)態(tài)和所有輸入的函數(shù),隨輸入變化而隨時發(fā)生變化,Mealy狀態(tài)機(jī)典型的結(jié)構(gòu)如圖6.16所示。從時序上看,Mealy狀態(tài)機(jī)屬于異步輸出狀態(tài)機(jī),它不依賴于時鐘,狀態(tài)機(jī)的輸出在輸入發(fā)生變化后立即發(fā)生。項(xiàng)目6狀態(tài)機(jī)的VHDL程序描述圖6.16Mealy狀態(tài)機(jī)的典型結(jié)構(gòu)libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;useieee.std_logic_arith.all;entitymealyisport(clk,reset:instd_logic;

data_in:in

std_logic;

data_out:outstd_logic_vector(3downto0));endentitymealy;architecturebehaveofmealyistypestates_typeis(S0,S1,S2,S3);--定義states_type為枚舉數(shù)據(jù)類型signalstate:states_type;begin【例6.3】Mealy狀態(tài)機(jī)的描述項(xiàng)目6狀態(tài)機(jī)的VHDL程序描述P1:process(reset,clk)--主控時序進(jìn)程beginifreset='0'thenstate<=S0;elsif

clk='1'andclk'eventthen--上升沿觸發(fā)casestateiswhenS0=>ifdata_in='1'then--根據(jù)外部輸入的值確定次態(tài)的走向state<=S1;endif;whenS1=>ifdata_in='0'thenstate<=S2;endif;whenS2=>ifdata_in='1'thenstate<=S3;endif;whenS3=>ifdata_in='0'thenstate<=S0;endif;endcase; endif;endprocessP1;說明部分:使用type語句定義狀態(tài)機(jī)狀態(tài)P2:process(state,data_in)--主控組合進(jìn)程begi

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論