《CPLD FPGA設(shè)計(jì)與應(yīng)用基礎(chǔ)教程》課件第七章_第1頁(yè)
《CPLD FPGA設(shè)計(jì)與應(yīng)用基礎(chǔ)教程》課件第七章_第2頁(yè)
《CPLD FPGA設(shè)計(jì)與應(yīng)用基礎(chǔ)教程》課件第七章_第3頁(yè)
《CPLD FPGA設(shè)計(jì)與應(yīng)用基礎(chǔ)教程》課件第七章_第4頁(yè)
《CPLD FPGA設(shè)計(jì)與應(yīng)用基礎(chǔ)教程》課件第七章_第5頁(yè)
已閱讀5頁(yè),還剩51頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第七章有限狀態(tài)機(jī)設(shè)計(jì)LOREMIPSUMDOLOR目錄CONCENT7.1有限狀態(tài)機(jī)的基本概念7.2有限狀態(tài)機(jī)的算法描述7.3有限狀態(tài)機(jī)描述的基本語(yǔ)法7.4狀態(tài)初始化7.5狀態(tài)編碼7.6FullCase與ParallelCase7.7實(shí)例7.1有限狀態(tài)機(jī)的基本概念GRADUATIONTHESIS7.1有限狀態(tài)機(jī)的基本概念數(shù)字世界主要由組合邏輯電路和時(shí)序邏輯電路組成。而時(shí)序邏輯電路區(qū)別于組合邏輯電路關(guān)鍵在于時(shí)序性以及電路的記憶功能。通常,時(shí)序邏輯電路的基本單元都是D觸發(fā)器。有限狀態(tài)機(jī)則是在時(shí)鐘信號(hào)的控制下,結(jié)合組合邏輯電路和時(shí)序邏輯電路而形成的一種的電路描述行為。在時(shí)鐘信號(hào)有效邊沿的作用下,有限狀態(tài)機(jī)電路會(huì)進(jìn)行順序的跳動(dòng)——時(shí)序中的每一步就稱之為狀態(tài)。有限狀態(tài)機(jī)不僅僅只是一個(gè)時(shí)序邏輯系統(tǒng),而且還包含有組合邏輯電路。其行為是在時(shí)鐘邊沿的作用下按照時(shí)鐘間隔順序發(fā)生。其行為的跳轉(zhuǎn)可能是有條件的,也可能是無條件的。比如在交通燈系統(tǒng)設(shè)計(jì)中,由黃變紅是無條件的,而由紅變綠則是有條件的。7.1有限狀態(tài)機(jī)的基本概念7.1有限狀態(tài)機(jī)的基本概念通過SynplifyPro綜合后生成的邏輯電路圖如下:7.1有限狀態(tài)機(jī)的基本概念7.1.1Mearly型狀態(tài)機(jī)1951年,G.H.Mearly提出了一種并以他名字命名的新型狀態(tài)機(jī)——Mearly型狀態(tài)機(jī)。其狀態(tài)跳轉(zhuǎn)圖如圖7-1所示。它的輸出不僅與當(dāng)前狀態(tài)有關(guān),而且與輸入信號(hào)相關(guān),因而在狀態(tài)跳轉(zhuǎn)圖中的每條轉(zhuǎn)移邊需要包含輸入和輸出的信息。由于Mearly型狀態(tài)機(jī)的輸出與輸入信號(hào)有關(guān),而輸入信號(hào)可能在一個(gè)時(shí)鐘周期內(nèi)任何時(shí)刻發(fā)生變化,所以Mearly型狀態(tài)機(jī)對(duì)輸入的響應(yīng)會(huì)比Moore型狀態(tài)機(jī)早一個(gè)周期,并且輸入信號(hào)的噪聲會(huì)直接影響到輸出信號(hào)的質(zhì)量。7.1.2Moore型狀態(tài)機(jī)Moore型狀態(tài)機(jī)由EdwardF.Moore提出,和Mearly型狀態(tài)機(jī)最大的不同在于,其輸出只與當(dāng)前狀態(tài)有關(guān),與輸入信號(hào)無關(guān)。在狀態(tài)跳轉(zhuǎn)圖中,每條轉(zhuǎn)移邊只包含輸入信息,而在每個(gè)狀態(tài)內(nèi),不僅會(huì)包含當(dāng)前狀態(tài)信息,而且還會(huì)包含輸出信息。Mearly型狀態(tài)機(jī)都可以轉(zhuǎn)化為一個(gè)等價(jià)的Moore型狀態(tài)機(jī)7.1有限狀態(tài)機(jī)的基本概念Moore型狀態(tài)機(jī)把當(dāng)前狀態(tài)存儲(chǔ)在觸發(fā)器中,并把當(dāng)前狀態(tài)解碼成輸出。Moore型狀態(tài)機(jī)的輸出會(huì)在時(shí)鐘脈沖的有效邊沿后的有限個(gè)門延后達(dá)到穩(wěn)定值。7.2有限狀態(tài)機(jī)的算法描述GRADUATIONTHESIS7.2有限狀態(tài)機(jī)的算法描述有限狀態(tài)機(jī)就可以抽象為關(guān)于關(guān)于圖中的變量的函數(shù):FSM=f(X,Z,S,C,R)X——有限狀態(tài)機(jī)的輸入信號(hào)集合;Z——有限狀態(tài)機(jī)的輸出信號(hào)集合;S——包含初始狀態(tài)的狀態(tài)集合,S0∈S。如圖7-1中,S={00,01,10,11},初始狀S0=00;δ——狀態(tài)跳轉(zhuǎn)函數(shù):XxS→S。如卡諾圖中N_State[1:0]和State[1:0]之間的關(guān)系λ——輸出函數(shù):λMearly:XxS→Z,λMoore:S→Z。C——時(shí)鐘信號(hào)R——復(fù)位信號(hào)。一旦該信號(hào)有效,有限狀態(tài)機(jī)立即進(jìn)入初始狀態(tài)。7.3有限狀態(tài)機(jī)描述的基本語(yǔ)法GRADUATIONTHESIS7.3有限狀態(tài)機(jī)描述的基本語(yǔ)法【例7-1】采用SystemVerilog實(shí)現(xiàn)圖7-1的有限狀態(tài)機(jī)邏輯7.3有限狀態(tài)機(jī)描述的基本語(yǔ)法moduleFSM(inputlogicclk,inputlogicrst_l,inputlogicx,outputlogicz);enumlogic[1:0]{S0,S1,S2,S3}state;always_ff@(posedgeclk,negedgerst_l)if(!rst_l)state<=S0;elsecase(state)

S0:state<=(x)?S1:S0;

S1:state<=(~x)?S2:S1;

S2:state<=(~x)?S3:S2;

S3:state<=(x)?S0:S1;

default:state<=S0;endcasealways_combbeginz=1'b0;if(state==S2)z=~x;

elsez=x;endmodule7.3有限狀態(tài)機(jī)描述的基本語(yǔ)法7.3有限狀態(tài)機(jī)描述的基本語(yǔ)法例7-1采用SystemVerilog所設(shè)計(jì)的一個(gè)可綜合的有限狀態(tài)機(jī)。從該例可以看出,對(duì)于有限狀態(tài)機(jī)的描述,其基本語(yǔ)法會(huì)涉及到如下幾部分:(1)變量聲明(2)狀態(tài)編碼(3)狀態(tài)跳轉(zhuǎn)語(yǔ)句(4)組合邏輯語(yǔ)句(5)條件判斷語(yǔ)句(6)多分支語(yǔ)句在復(fù)雜的有限狀態(tài)機(jī)設(shè)計(jì)中,狀態(tài)輸出數(shù)量較多或者組合邏輯輸出較多時(shí),會(huì)影響到代碼的可讀性,一般可以采用任務(wù)和函數(shù)來進(jìn)行封裝,從而提高代碼的可讀性。

(1)任務(wù)task——當(dāng)狀態(tài)跳轉(zhuǎn)頻繁時(shí),可以采用task來進(jìn)行封裝;

(2)函數(shù)function——當(dāng)狀態(tài)機(jī)內(nèi)有大量重復(fù)使用的組合邏輯輸出或者功能時(shí),可以采用function來進(jìn)行封裝,這樣整個(gè)代碼會(huì)顯得更為簡(jiǎn)潔;如例7.2所示7.3有限狀態(tài)機(jī)描述的基本語(yǔ)法【例7-2】采用function進(jìn)行有限狀態(tài)機(jī)設(shè)計(jì)示例//IDLESTATEfunctions{IDLE,4'b0_0_?_0}:next_state={IDLE,1'b0,1'b0,1'b0};{IDLE,4'b1_0_?_0}:next_state={WAIT,1'b0,1'b1,1'b1};{IDLE,4'b0_1_?_0}:next_state={WAIT,1'b0,1'b1,1'b0};{IDLE,4'b1_1_?_0}:next_state={WAIT,1'b0,1'b1,1'b1};//WAITSTATEfunctions{WAIT,4'b0_0_?_0}:next_state={WAIT,1'b0,1'b0,1'b0};{WAIT,4'b0_?_0_0}:next_state={WAIT,1'b0,1'b0,1'b0};{WAIT,4'b0_1_1_0}:next_state={DONE,1'b0,1'b1,1'b0};{WAIT,4'b1_0_?_0}:next_state={WAIT,1'b0,1'b0,1'b1};{WAIT,4'b1_?_0_0}:next_state={WAIT,1'b0,1'b0,1'b1};{WAIT,4'b1_?_0_0}:next_state={WAIT,1'b0,1'b0,1'b1};{WAIT,4'b1_1_1_0}:next_state={DONE,1'b0,1'b1,1'b1};//DONESTATEfunctions{DONE,4'b?_?_0_0}:next_state={DONE,1'b0,1'b0,1'b1};{DONE,4'b?_?_0_0}:next_state={DONE,1'b0,1'b0,1'b1};{DONE,4'b?_?_1_0}:next_state={IDLE,1'b1,1'b0,1'b1};7.4狀態(tài)機(jī)初始化GRADUATIONTHESIS7.4狀態(tài)機(jī)初始化1.初始化的必要

有限狀態(tài)機(jī)在執(zhí)行時(shí)必須初始化,否則將無法正確執(zhí)行有限狀態(tài)機(jī)的跳轉(zhuǎn)動(dòng)作,或者初始化不完整時(shí)會(huì)導(dǎo)致死鎖的現(xiàn)象。2.初始化方法在SystemVerilog或者VerilogHDL語(yǔ)言中,通常采用異步復(fù)位電路來實(shí)現(xiàn)狀態(tài)機(jī)的初始化——也就是說,當(dāng)異步復(fù)位信號(hào)有效時(shí),不管時(shí)鐘信號(hào)的邊沿是否有效,有限狀態(tài)機(jī)將無條件進(jìn)入其初始狀態(tài)。3.初始化的關(guān)鍵在狀態(tài)初始化過程中,需要防止出現(xiàn)偽初始化或者不完整初始化的情況,特別是針對(duì)采用一段式狀態(tài)機(jī)——把狀態(tài)跳轉(zhuǎn)和組合邏輯寫在一起的狀態(tài)機(jī)——來說,這個(gè)尤為重要。7.4狀態(tài)機(jī)初始化【例7-2】不完整初始化的有限狀態(tài)機(jī)示例moduleex_FSM(inputlogicclk,inputlogiccs,inputlogicframe,inputlogicrst_,inputlogicrw,outputlogicad_decode,outputlogicreg_type_dir,outputlogicrst_timer,outputlogictrdy);enumlogic[1:0]{CY_TYPE=2'b00,

IDLE=2'b01,

START=2'b10}state;

always_ff@(posedgeclk,negedgerst_)if(!rst_)

state<=IDLE;//異步狀態(tài)復(fù)位elsecase(state)

CY_TYPE:begin

ad_decode<=1'b0;

rst_timer<=1'b0;

reg_type_dir<=1'b1;

if(!frame)begin

state<=IDLE;

trdy<=1'b1;

end

elsebegin

state<=CY_TYPE;

trdy<=1'b0;

end

end

7.4狀態(tài)機(jī)初始化【例7-2】不完整初始化的有限狀態(tài)機(jī)示例(續(xù))IDLE:begin

rst_timer<=1'b0;

reg_type_dir<=1'b0;

if(frame&&cs)

state<=START;

elsestate<=IDLE;end

START:begin

ad_decode<=1'b1;

rst_timer<=1'b1;

reg_type_dir<=1'b0;

if(!frame)

state<=IDLE;

elseif(rw)

begin

state<=CY_TYPE;

reg_type_dir<=1'b1;

end

elsestate<=START;endendcaseendmodule7.4狀態(tài)機(jī)初始化【例7-2】不完整初始化的有限狀態(tài)機(jī)示例(續(xù))例7-2為典型的一段式狀態(tài)機(jī),在該程序中,既有狀態(tài)跳轉(zhuǎn),也有狀態(tài)的邏輯輸出,很容易生產(chǎn)死鎖。程序主體一開始就針對(duì)狀態(tài)機(jī)進(jìn)行異步復(fù)位,狀態(tài)機(jī)馬上跳轉(zhuǎn)至IDLE狀態(tài),但沒有對(duì)所有的輸出信號(hào)進(jìn)行初始化,因此,當(dāng)狀態(tài)機(jī)跳轉(zhuǎn)至IDLE狀態(tài)時(shí),ad_decode和trdy兩信號(hào)沒有被初始化,因而是未定狀態(tài)。解決此問題的最好方式,就是針對(duì)狀態(tài)機(jī)內(nèi)的所有狀態(tài)和輸出信號(hào)進(jìn)行初始化。同時(shí),需要注意的是,本例沒有采用default關(guān)鍵字,因此,如果出現(xiàn)狀態(tài)為2’b11時(shí),狀態(tài)機(jī)無法正常跳轉(zhuǎn),因此出現(xiàn)死鎖的情況。正確的解決方式是增加一個(gè)default狀態(tài),或者才用unique和priority關(guān)鍵詞來對(duì)case進(jìn)行限定。7.4狀態(tài)機(jī)初始化always_ff@(posedgeclk,negedgerst_)if(!rst_)begin//狀態(tài)異步復(fù)位和輸出復(fù)位

state<=IDLE;

ad_decode<=1'b0;rst_timer<=1'b0;

reg_type_dir<=1'b1;

trdy<=1'b0;

endelse

uniquecase(state)

CY_TYPE:begin

ad_decode<=1'b0;

rst_timer<=1'b0;

reg_type_dir<=1'b1;

if(!frame)begin

state<=IDLE;

trdy<=1'b1;

end

elsebeginstate<=CY_TYPE;trdy<=1'b0;endend在if語(yǔ)句中針對(duì)所有的輸出信號(hào)和狀態(tài)進(jìn)行初始化,同時(shí)在case語(yǔ)句前增加unique關(guān)鍵字,這樣就可以避免死鎖或者未完全初始化的情況。當(dāng)然,本例還有更多更好的方式進(jìn)行有限狀態(tài)機(jī)設(shè)計(jì),后續(xù)章節(jié)將陸續(xù)講述。7.5狀態(tài)編碼GRADUATIONTHESIS7.5狀態(tài)編碼狀態(tài)編碼:

有限狀態(tài)機(jī)最重要的特征之一是狀態(tài)編碼。所謂的狀態(tài)編碼,就是對(duì)有限狀態(tài)機(jī)的所有狀態(tài)進(jìn)行數(shù)字標(biāo)識(shí),并采用文本助記符與數(shù)字標(biāo)識(shí)意義對(duì)應(yīng)。不同的狀態(tài)編碼會(huì)導(dǎo)致不同的面積與速度。狀態(tài)編碼種類:在數(shù)字邏輯系統(tǒng)設(shè)計(jì)中,一般常見的數(shù)字編碼方式有:二進(jìn)制碼(Binary碼)格雷碼(Gray碼)獨(dú)熱碼(One-hot碼)獨(dú)冷碼(One-cold碼)二-十進(jìn)制碼(BCD碼)等。7.5狀態(tài)編碼定義方式:VerilogHDL一般采用參數(shù)進(jìn)行狀態(tài)編碼,也可以采用`define宏定義的方式進(jìn)行編碼——但一般不推薦此方式。參數(shù)編碼的方式如下:parameter//theseparametersrepresentstatenamesIDLE=3’b000,DECISION=3’b001,READ1=3’b010,READ2=3’b011,READ3=3’b100,READ4=3’b101,WRITE=3’b110;7.5狀態(tài)編碼

SystemVerilog也可以采用參數(shù)和宏定義的方式進(jìn)行狀態(tài)編碼。但一般推薦采用枚舉類型進(jìn)行狀態(tài)編碼,如把上述的參數(shù)編碼修改為枚舉類型的編碼方式,如下:enum{IDLE,DECISION,READ1,READ2,READ3,READ4,WRITE}state;枚舉類型不僅列出了每一種狀態(tài),同時(shí)也列出了枚舉變量名稱,狀態(tài)編碼可以顯式聲明,也可以省略,因此更加容易對(duì)應(yīng)。但需要注意的是,枚舉變量默認(rèn)為int類型——32位,如果沒有顯式進(jìn)行位寬限制,則在綜合時(shí)會(huì)出現(xiàn)面積浪費(fèi)的現(xiàn)象,從而出現(xiàn)告警。因此,在采用枚舉類型進(jìn)行狀態(tài)編碼時(shí),需要限定枚舉變量位寬,如:enumlogic[2:0]{IDLE=3’b000,DECISION=3’b001,READ1=3’b010,READ2=3’b011,READ3=3’b100,READ4=3’b101,WRITE=3’b110}state;7.5狀態(tài)編碼7.5.1二進(jìn)制碼(Binary碼)

二進(jìn)制碼也叫順序碼(Sequential碼),是最簡(jiǎn)單也是最常用的狀態(tài)編碼方式。它的編碼是順序的,相鄰兩個(gè)狀態(tài)之間相差為1。狀態(tài)數(shù)量和編碼所需的位之間的關(guān)系是:其中,N代表編碼所需要的比特位,M表示狀態(tài)數(shù)量。在該狀態(tài)中,總計(jì)有7種狀態(tài),因此只需要三個(gè)比特位就可以實(shí)現(xiàn)狀態(tài)編碼。優(yōu)點(diǎn):所占的FPGA/CPLD面積最小缺點(diǎn):由于相鄰狀態(tài)進(jìn)行轉(zhuǎn)換時(shí)的狀態(tài)位翻轉(zhuǎn)的數(shù)量不確定7.5狀態(tài)編碼7.5.2格雷碼(Gray碼)格雷碼,也稱之為循環(huán)碼,也是一種壓縮編碼,格雷碼也是一種二-十進(jìn)制編碼,但它是一種無權(quán)碼,采用絕對(duì)編碼的方式。由于格雷碼只改變一位,因而可以降低數(shù)字電路的尖峰電流脈沖格雷碼一般應(yīng)用于對(duì)面積和速度都有一定要求的數(shù)字系統(tǒng)設(shè)計(jì)中。7.5狀態(tài)編碼格雷碼的聲明:采用SystemVerilog進(jìn)行格雷碼編碼聲明如下:enumlogic[2:0]{IDLE=3’b000,DECISION=3’b001,READ1=3’b011,READ2=3’b010,READ3=3’b110,READ4=3’b111,WRITE=3’b101}state;二進(jìn)制碼和格雷碼之間可以相互轉(zhuǎn)換:(1)二進(jìn)制碼轉(zhuǎn)換為格雷碼:其中,G表示格雷碼,B表示二進(jìn)制碼,i表示位號(hào)。7.5狀態(tài)編碼(2)格雷碼轉(zhuǎn)換為二進(jìn)制碼:其中,G表示格雷碼,B表示二進(jìn)制碼,i表示位號(hào)。7.5狀態(tài)編碼7.5.3獨(dú)熱碼(one-hot碼)和獨(dú)冷碼(one-cold碼)

獨(dú)熱碼和獨(dú)冷碼是相對(duì)的編碼方式,也是一種特殊的二進(jìn)制編碼方式,屬于非壓縮編碼。獨(dú)熱碼是每個(gè)狀態(tài)有且僅有一個(gè)1,而獨(dú)冷碼是每個(gè)狀態(tài)有且僅有一個(gè)0。因此采用獨(dú)熱碼或者獨(dú)冷碼進(jìn)行狀態(tài)編碼所需要的比特位和有限狀態(tài)機(jī)的狀態(tài)數(shù)量一一對(duì)應(yīng)。這種方式最大的缺點(diǎn)是:占用的FPGA/CPLD面積最大。優(yōu)點(diǎn)為:采用這種方式進(jìn)行編碼,其譯碼簡(jiǎn)單,狀態(tài)機(jī)的運(yùn)行速度會(huì)很快。因此,特別適合含有豐富觸發(fā)器的FPGA設(shè)計(jì)。7.5狀態(tài)編碼采用SystemVerilog進(jìn)行獨(dú)熱碼和獨(dú)冷碼編碼聲明如下:獨(dú)熱碼:enumlogic[6:0]{IDLE=7’b000_0001,DECISION=7’b000_0010,READ1=7’b000_0100,READ2=7’b000_1000,READ3=7’b001_0000,READ4=7’b010_0000,WRITE=7’b100_0000}state;獨(dú)冷碼:enumlogic[6:0]{IDLE=7’b111_1110,DECISION=7’b111_1101,READ1=7’b111_1011,READ2=7’b111_0111,READ3=7’b110_1111,READ4=7’b101_1111,WRITE=7’b011_1111}state;7.5狀態(tài)編碼7.5.4狀態(tài)編碼原則和編譯指導(dǎo)

通常來說,狀態(tài)編碼基本原則是:(1)有足夠的觸發(fā)器邏輯,但需要滿足速度要求,則優(yōu)先采用獨(dú)熱碼、獨(dú)冷碼或者格雷碼進(jìn)行編碼(2)對(duì)面積和速度都有要求,則優(yōu)先考慮格雷碼進(jìn)行編碼(3)對(duì)速度沒有要求,但邏輯資源緊張,則優(yōu)先考慮格雷碼和二進(jìn)制碼進(jìn)行編碼7.6FullCase與ParallelCaseGRADUATIONTHESIS7.6FullCase與ParallelCase【例7-4】狀態(tài)跳轉(zhuǎn)圖如圖所示,采用VerilogHDL語(yǔ)言設(shè)計(jì)此有限狀態(tài)機(jī),并使用fullcase指導(dǎo)SynplifyPro綜合軟件進(jìn)行綜合。本例中有三個(gè)狀態(tài),分別是A、B和C,對(duì)其采用格雷碼編碼:parameterA=2’b00,B=2’b01,C=2’b11;而2’b10狀態(tài)為未定態(tài)。7.6FullCase與ParallelCase部分代碼如下:moduleFSM_full_case(inputclk,inputRESET,inputx,outputreg[1:0]z);parameterA=2'b00,B=2'b01,C=2'b11;reg[1:0]statealways@(posedgeclk,posedgeRESET)if(RESET)

begin

state<=A;

z<=2'b01;

endelsecase(state)/*synthesisfull_case*/

A:begin

z<=2'b01;

if(x)

state<=C;

else

state<=B;endB:begin

z<=2'b10;

state<=x?C:B;endC:begin

z<=2'b10;

state<=x?C:A;endendcaseendmodule7.6FullCase與ParallelCase例7-4并沒有default語(yǔ)句來表示其他狀態(tài)如何執(zhí)行狀態(tài)跳轉(zhuǎn),換句話說,當(dāng)狀態(tài)跳轉(zhuǎn)至2’b10時(shí),狀態(tài)機(jī)就出現(xiàn)了死鎖的狀態(tài),這是設(shè)計(jì)不能出現(xiàn)的狀況。但在本例中采用了fullcase的注釋,指導(dǎo)SynplifyPro軟件忽略掉2’b10狀態(tài),因而不會(huì)生成鎖存器,具體可以從圖7-9綜合后生成的邏輯電路看出7.6FullCase與ParallelCase【例7-5】針對(duì)例7-4所采用的狀態(tài)跳轉(zhuǎn)圖,采用VerilogHDL語(yǔ)言設(shè)計(jì)此有限狀態(tài)機(jī),并使用parallelcase指導(dǎo)SynplifyPro綜合軟件進(jìn)行綜合。elsecasez(state)/*synthesisparallel_case*/

A:begin

z<=2'b01;

if(x)

state<=C;

else

state<=B;

end

B:begin

z<=2'b10;

state<=x?C:B;

end

C:begin

z<=2'b10;

state<=x?C:A;endendcase7.6FullCase與ParallelCaseparallelcase指導(dǎo)SynplifyPro生成的邏輯電路圖會(huì)根據(jù)具體的硬件功能進(jìn)行優(yōu)化,其具體的邏輯電路如下7.7狀態(tài)機(jī)的描述GRADUATIONTHESIS7.7狀態(tài)機(jī)的描述

狀態(tài)機(jī)由各種描述方式,可以深入到門級(jí)邏輯設(shè)計(jì),也可以采用行為級(jí)描述。通常最常用的有三種描述方式:(1)一段式狀態(tài)機(jī)(2)兩段式狀態(tài)機(jī)(3)三段式狀態(tài)機(jī)。這三種方式各有特點(diǎn),在不同的場(chǎng)合有不同的應(yīng)用。7.7狀態(tài)機(jī)的描述7.7.1一段式狀態(tài)機(jī)概念:一段式狀態(tài)機(jī)是最原始的狀態(tài)機(jī),在該狀態(tài)機(jī)內(nèi),僅僅只有一個(gè)always或者always_ff語(yǔ)句塊,該語(yǔ)句塊內(nèi)不僅含有狀態(tài)跳轉(zhuǎn),還包含有組合邏輯的輸入輸出。特點(diǎn):一段式狀態(tài)機(jī)混合了時(shí)序邏輯和組合邏輯,代碼冗長(zhǎng),不利于代碼的維護(hù)和修改,也不利于時(shí)序約束,因此不推薦采用一段式狀態(tài)機(jī)進(jìn)行有限狀態(tài)機(jī)設(shè)計(jì)。7.7狀態(tài)機(jī)的描述【例7-6】采用一段式狀態(tài)機(jī)對(duì)圖7-11的狀態(tài)跳轉(zhuǎn)圖進(jìn)行有限狀態(tài)機(jī)設(shè)計(jì)7.7狀態(tài)機(jī)的描述代碼采用uniquecase,表示忽略沒有枚舉的狀態(tài)。代碼中的每一個(gè)狀態(tài),既有狀態(tài)跳轉(zhuǎn),也有邏輯輸出。程序很容易產(chǎn)生鎖存器。經(jīng)過SynplifyPro軟件綜合后生成的邏輯電路如下7.7狀態(tài)機(jī)的描述7.7.2兩段式狀態(tài)機(jī)概念:兩段式狀態(tài)機(jī)把時(shí)序邏輯和組合邏輯分開設(shè)計(jì),其中時(shí)序邏輯采用always_ff負(fù)責(zé)狀態(tài)初始化和狀態(tài)跳轉(zhuǎn),而組合邏輯則采用always_comb負(fù)責(zé)輸出信號(hào)的初始化和輸出邏輯設(shè)計(jì)。特點(diǎn):這樣的設(shè)計(jì)不僅符合代碼的風(fēng)格,同時(shí)也提高了代碼的可讀性,容易維護(hù)。7.7狀態(tài)機(jī)的描述【例7-7】采用兩段式狀態(tài)機(jī)對(duì)圖7-11的狀態(tài)跳轉(zhuǎn)圖進(jìn)行有限狀態(tài)機(jī)設(shè)計(jì)

程序含有兩個(gè)always語(yǔ)句塊,其中always_ff語(yǔ)句用于有限狀態(tài)機(jī)的異步復(fù)位和狀態(tài)跳轉(zhuǎn),不涉及任何的輸出信號(hào)邏輯。7.7狀態(tài)機(jī)的描述

兩段式狀態(tài)機(jī)還有兩種額外的設(shè)計(jì)方式。一種方式是把狀態(tài)機(jī)分為三部分進(jìn)行:狀態(tài)更新、下一個(gè)狀態(tài)邏輯以及輸出邏輯。因此,與例7-7不同在于,該狀態(tài)機(jī)設(shè)計(jì)中需要定義兩個(gè)枚舉類型:現(xiàn)態(tài)和次態(tài)。具體設(shè)計(jì)如例7-8所示?!纠?-8】采用兩段式狀態(tài)機(jī)對(duì)圖7-11的狀態(tài)跳轉(zhuǎn)圖進(jìn)行有限狀態(tài)機(jī)設(shè)計(jì)//狀態(tài)更新邏輯always_ff@(posedgeclk,posedgeR)if(R)state<=SA;//狀態(tài)初始化elsestate<=next_state;

always_combbeginuniquecase(state)//次態(tài)更新邏輯SA:next_state=Start?SB:SA;SB:next_state=Read?SC:SD;SC:next_state=memDataAvail?SA:SC;SD:next_state=dataValid?SA:SD;endcaseendalways_combbegin//輸出信號(hào)邏輯ld_AddrUp=1'b0;ld_AddrLo=1'b0;dv=1'b0;en_Data=1'b0;ld_Data=1'b0;//輸出信號(hào)初始化if(state==SA)ld_AddrUp=Start?1'b1:ld_AddrUp;if(state==SB)ld_AddrLo=1'b1;if(state==SC)begindv=1'b1;en_Data=1'b1;endif(state==SD)ld_Data=1'b1;end7.7狀態(tài)機(jī)的描述另外的一類變體是采用一個(gè)always_comb語(yǔ)句把次態(tài)更新邏輯和輸出邏輯放在一起,這樣所有的基于狀態(tài)的組合邏輯都集中在一起,在代碼設(shè)計(jì)中經(jīng)常會(huì)用到此種方式?!纠?-9】采用兩段式狀態(tài)機(jī)對(duì)圖7-11的狀態(tài)跳轉(zhuǎn)圖進(jìn)行有限狀態(tài)機(jī)設(shè)計(jì)//狀態(tài)更新邏輯always_ff@(posedgeclk,posedgeR)if(R)state<=SA;//狀態(tài)初始化elsestate<=next_state;always_combbegin//基于狀態(tài)的組合邏輯輸出ld_AddrUp=1'b0;ld_AddrLo=1'b0;dv=1'b0;en_Data=1'b0;ld_Data=1'b0;//輸出信號(hào)初始化uniquecase(state)SA:beginnext_state=Start?SB:SA;ld_AddrUp=Start?1'b1:ld_AddrUp;endSB:beginnext_state=Read?SC:SD;ld_AddrLo=1'b1;endSC:beginnext_state=memDataAvail?SA:SC;dv=1'b1;en_Data=1'b1;endSD:beginnext_state=dataValid?SA:SD;ld_Data=1'b1;endendcase7.7狀態(tài)機(jī)的描述7.7.3三段式狀態(tài)機(jī)

嚴(yán)格意義上來說,不存在三段式狀態(tài)機(jī)。三段式狀態(tài)機(jī)主要是為了解決兩段式狀態(tài)機(jī)采用組合邏輯輸出所產(chǎn)生的毛刺問題,同時(shí)增加一級(jí)寄存器也可以有效地進(jìn)行時(shí)序計(jì)算和約束。對(duì)于總線來說,容易使得總線數(shù)據(jù)對(duì)其,從而減小總線數(shù)據(jù)之間的偏斜,減小接收端數(shù)據(jù)采樣出錯(cuò)的頻率。描述方式;三段式狀態(tài)機(jī)采用三個(gè)always語(yǔ)句塊,分別是采用always_ff語(yǔ)句塊實(shí)現(xiàn)狀態(tài)更新邏輯、采用always_comb語(yǔ)句塊實(shí)現(xiàn)組合邏輯,以及采用always_ff語(yǔ)句塊實(shí)現(xiàn)同步輸出。7.7狀態(tài)機(jī)的描述【例7-10】采用三段式狀態(tài)機(jī)對(duì)圖7-11的狀態(tài)跳轉(zhuǎn)圖進(jìn)行有限狀態(tài)機(jī)設(shè)計(jì)//狀態(tài)更新邏輯always_ff@(posedgeclk,posedgeR)if(R)state<=SA;//狀態(tài)初始化elsestate<=next_state;

always_combbeginuniquecase(state)//次態(tài)更新邏輯SA:next_state=Start?SB:SA;SB:next_state

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論