第九章同步狀態(tài)機課件_第1頁
第九章同步狀態(tài)機課件_第2頁
第九章同步狀態(tài)機課件_第3頁
第九章同步狀態(tài)機課件_第4頁
第九章同步狀態(tài)機課件_第5頁
已閱讀5頁,還剩42頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第九章

同步狀態(tài)機設(shè)計9/23/20231周曉波北京交通大學電子信息學院

xbzhou@51683626內(nèi)容提要9/23/202329.1狀態(tài)機的結(jié)構(gòu)9.2

Mealy狀態(tài)機和Moore狀態(tài)機9.3描述可綜合的狀態(tài)機9.1

狀態(tài)機的結(jié)構(gòu)9/23/20233有限狀態(tài)機(FSM)設(shè)計是時序電路設(shè)計

中很常用的方式控制模塊case,if-else9.1

狀態(tài)機的結(jié)構(gòu)9/24/20234組合邏輯和時序邏輯的組合寄存器用于存貯狀態(tài)組合電路用于狀態(tài)譯碼和產(chǎn)生輸出信號狀態(tài)機的下一個狀態(tài)不僅和輸入信號相關(guān),而且和當前狀態(tài)相關(guān)同步時序表示方法:狀態(tài)圖、狀態(tài)表、流程圖狀態(tài)機邏輯表達式9/24/20235下一個狀態(tài)=F(當前狀態(tài),輸入信號);輸出信號=G(當前狀態(tài),輸入信號);狀態(tài)圖表示StateNext_Statein/outin/out9/24/20236內(nèi)容提要9/24/202379.1狀態(tài)機的結(jié)構(gòu)9.2

Mealy狀態(tài)機和Moore狀態(tài)機9.3描述可綜合的狀態(tài)機狀態(tài)機分類9/24/20238Mealy狀態(tài)機Moore狀態(tài)機Moore狀態(tài)機輸出信號=G(當前狀態(tài));G9/24/20239FMealy狀態(tài)機G9/24/202310F輸出信號=G(當前狀態(tài),當前輸入);內(nèi)容提要9/24/2023119.1狀態(tài)機的結(jié)構(gòu)9.2

Mealy狀態(tài)機和Moore狀態(tài)機9.3描述可綜合的狀態(tài)機可綜合的狀態(tài)機設(shè)計9/24/202312最常用:alwayscase狀態(tài)轉(zhuǎn)移圖Idle9/24/202313StartStopClearA/G=0!AA/F=1!Reset

/F=0G=0!Reset

/F=0G=0!Reset

|

!A/F=0

G=1狀態(tài)轉(zhuǎn)移圖!Reset

/F=0G=0狀態(tài)轉(zhuǎn)移圖9/24/202314上面的狀態(tài)轉(zhuǎn)移圖表示了一個四狀態(tài)的有限狀態(tài)機,它的同步時鐘是Clock,輸入

信號是A和Reset,輸出信號是F和G。狀態(tài)的轉(zhuǎn)移只能在同步時鐘(Clock)的上升沿時發(fā)生,往哪個狀態(tài)的轉(zhuǎn)移則取決于目前所在的狀態(tài)和輸入的信號(Reset

A)。Verilog

HDL中,狀態(tài)必須明確賦值,通

常使用參數(shù)(parameters)或宏定義(define)語句加上賦值語句來實現(xiàn)。使用參數(shù)(parameters)語句賦狀態(tài)值見下例:9/24/202315//把current

state設(shè)置9/24/202316parameter state1

=

2

'h1, state2

=

2

'h2;...current_state

=

state2;成2'h2...使用宏定義(define)語句賦狀態(tài)值見下例:`define

state1 2'h1`define

state2 2'h2...current_state

=

`state2;

//把current

state設(shè)置成

2

'h29.3.1

用可綜合的Verilog模塊設(shè)計狀態(tài)機的典型辦法9/24/202317module fsm

(Clock,

Reset,

A, F,

G);input

Clock,

Reset,A;output

F,G;reg

F,G;reg

[1:0]

state

;parameter

Idle =

2’b00,Start

=

2’b01,Stop

=2’b10,Clear

=

2’b11;例1always

@(posedge

Clock)if(!Reset)beginstate

<=

Idle; F<=0;

G<=0;endelsecase

(state)idle:

beginif

(A)

beginstate

<=

Start;G<=0;endelse state

<=

idle;endstart:

beginif

(!A)

state

<=

Stop;else

state

<=

start;end9/24/202318Stop:

beginif

(A)

beginstate

<=

Clear;F

<=

1;endelse state

<=

Stop;endClear:

beginif

(!A)

beginstate

<=Idle;F<=0;

G<=1;endelse state

<=

Clear;endendcaseendmodule狀態(tài)編碼9/2狀態(tài)編碼二進制Grayone-hotstate000000000000001state100100100000010state201001100000100state301101000001000state410011000010000state510110000100000state6110101010000004/2023state711111110000000199.3.2

獨熱碼表示狀態(tài)的狀態(tài)機module fsm

(Clock,

Reset,

A, F,

G);input

Clock,

Reset,

A;output

F,G;reg

F,G;reg

[3:0]

state

;parameter9/24/202320IdleStartStopClear=

4’b1000,=

4’b0100,=

4’b0010,=

4’b0001;例29.3.2

獨熱碼表示狀態(tài)的狀態(tài)機9/24/202321[例2]與[例1]的主要不同點是狀態(tài)編碼,[例2]采用了獨熱編碼,而[例1]則采用Gray碼,究竟采用哪一種編碼好要看具體情況而定。對于

用FPGA實現(xiàn)的有限狀態(tài)機建議采用獨熱碼,因為雖然采用獨熱編碼多用了兩個觸發(fā)器,但所用組合電路可省下許多,因而使電路的速度和可靠性有顯著提高,而總的單元數(shù)并無顯著增加。采用了獨熱編碼后有了多余的狀態(tài),就有一些不可到達的狀態(tài),為此在CASE語句的

最后需要增加default分支項,以確保多余狀態(tài)能回到Idle狀態(tài)。我們還可以再用另一種風格的VerilogHDL模型來表示同一個有限狀態(tài),在這個模型中,我們分別用沿觸發(fā)的always

語句和電平敏感的always語句把狀態(tài)機的觸發(fā)器部分和組合邏輯部分分成兩部分來描述。9/24/202322module fsm

(Clock,

Reset,

A, F,

G);input

Clock,

Reset,A;output

F,G;reg

[1:0]

state,

Nextstate;parameter

Idle =

2’b00, Start

=

2’b01,Stop

=

2’b10,

Clear

=

2’b11;always

@(posedge

Clock)beginif(!Reset)beginstate

<=

Idle;endelsestate

<=

Nextstate;end9/24/202323always

@(

state

or

A

)beginF=0;G=0;if

(state

==

Idle)beginif

(A)Nextstate

=

Start;elsebegin

Nextstate

=

Idle;G=1;endendelseif

(state

==

Start)if

(!A)Nextstate

=

Stop;elseNextstate

=

Start;elseif

(state

==

Stop)if

(A)Nextstate

=

Clear;elseNextstate

=

Stop;elseif

(state

==

Clear)beginif

(!A)Nextstate

=

Idle;elseNextstate

=

Clear;F=1;endelseNextstate=

Idle;endendmodule

黃色是我加的,懷疑老師寫錯了例39/24/2023249.3.3由輸出指定的碼

表示狀態(tài)的狀態(tài)機9/24/202325輸出直接指定為狀態(tài)碼狀態(tài)碼指定與狀態(tài)機控制的輸出聯(lián)系起來狀態(tài)變化=>輸出適用于高速狀態(tài)機設(shè)計9.3.3

由輸出指定的碼表示狀態(tài)的狀態(tài)機9/24/202326前面的例子當狀態(tài)轉(zhuǎn)移到clear時,輸出G=1當狀態(tài)轉(zhuǎn)移到idle時,輸出F=1因此,G=state[3];F=state[0];9.3.3

由輸出指定的碼表示狀態(tài)的狀態(tài)機assign

G=state[3];assign

F=state[0];parameter//G_

i_

j_

F//9/24/202327Zero=4’b0_0_0_0,Idle=4’b0_0_0_0,start=4’b0_0_0_0,stop=4’b0_0_0_0,clear=4’b0_0_0_0,例4上面四個例子是同一個狀態(tài)機的四種不

同的Verilog

HDL模型,它們都是可綜合的,在設(shè)計復(fù)雜程度不同的狀態(tài)機時有它們各自的優(yōu)勢。如用不同的綜合器對這四個例子進行綜合,綜合出的邏輯電路可能會有些不同,但邏輯功能是相同的。9/24/2023284.3.4

多輸出狀態(tài)機9/24/202329把狀態(tài)的變化與輸出信號的控制分成兩部分來考慮;還常常把每一個輸出信號

寫成一個獨立的always模塊來考慮。有限狀態(tài)機設(shè)計的一般步驟9/24/202330邏輯抽象,得出狀態(tài)轉(zhuǎn)換圖狀態(tài)化簡狀態(tài)分配選定觸發(fā)器的類型并求出狀態(tài)方程、驅(qū)動方程和輸出方程按照方程得出邏輯圖狀態(tài)機設(shè)計的一般原則9/24/202331狀態(tài)機的編碼one-hot消耗觸發(fā)器多,組合邏輯少:FPGAgray消耗觸發(fā)器少,組合邏輯多:CPLD三段式狀態(tài)機三段式狀態(tài)機

三段式建模描述FSM的狀態(tài)機輸出時,只需

指定case敏感表為次態(tài)寄存器,然后直接在每個次態(tài)的case分支中描述該狀態(tài)的輸出即可,不用考慮狀態(tài)轉(zhuǎn)移條件。

三段式描述方法雖然代碼結(jié)構(gòu)復(fù)雜了一些,

但是換來的優(yōu)勢是使FSM做到了同步寄存器輸出,消除了組合邏輯輸出的不穩(wěn)定與毛刺的隱患,而且更利于時序路徑分組,一般來說在

FPGA/CPLD等可編程邏輯器件上的綜合與布局布線效果更佳。9/24/202332三段式狀態(tài)機9/24/202333示列如下://第一個進程,同步時序always模塊,格式化描

述次態(tài)寄存器遷移到現(xiàn)態(tài)寄存器always

@

(posedge

clk

or

negedge

rst_n) //異步復(fù)位if(!rst_n)current_state

<=

IDLE;elsecurrent_state

<=

next_state;//注意,使用的是非

阻塞賦值三段式狀態(tài)機9/24/202334//第二個進程,組合邏輯always模塊,描述狀態(tài)

轉(zhuǎn)移條件判斷//電平觸發(fā)always

@

(current_state)begincase(current_state)S1:if(...)next_state

=

S2; //阻塞賦值...endcaseend三段式狀態(tài)機9/24/202335//第三個進程,同步時序always模塊,格式化描述次態(tài)寄存器輸出always

@

(posedge

clk

or

negedge

rst_n)...//初始化

case(next_state)S1:out1

<=1‘b1; //注意是非阻塞邏輯

S2:out2

<=1'b1;//default的作用是免除綜合工具綜合出鎖存器。default:...endcaseend用Verilog

HDL語言設(shè)計可綜合的狀態(tài)機的指導(dǎo)原則9/24/202336因為大多數(shù)FPGA內(nèi)部的觸發(fā)器數(shù)目相當

多,又加上獨熱碼狀態(tài)機(one

hot

statemachine)的譯碼邏輯最為簡單,所以在設(shè)計采用FPGA實現(xiàn)的狀態(tài)機時往往采用獨熱碼狀態(tài)機(即每個狀態(tài)只有一個寄存器置位的狀態(tài)機)。用Verilog

HDL語言設(shè)計可綜合的狀態(tài)機

的指導(dǎo)原則9/24/202337建議采用case,casex,或casez語句來建立狀態(tài)機

的模型,因為這些語句表達清晰明了,可以方便地從當前狀態(tài)分支轉(zhuǎn)向下一個狀態(tài)并設(shè)置輸出。不要忘記寫上case語句的最后一個分支

default,并將狀態(tài)變量設(shè)為'bx,這就等于告知綜合器:case語句已經(jīng)指定了所有的狀態(tài),這樣綜合器就可以刪除不需要的譯碼電路,使生成的電路簡潔,并與設(shè)計要求一致。用Verilog

HDL語言設(shè)計可綜合的狀態(tài)機的指導(dǎo)原則9/24/202338狀態(tài)機應(yīng)該有一個異步或同步復(fù)位端,以便在通電時將硬件電路復(fù)位到有效狀態(tài),也可以在操作中將硬件電路復(fù)位(大多數(shù)FPGA結(jié)構(gòu)都允許使用異步復(fù)位端)。同步設(shè)計(一個時鐘沿觸發(fā))狀態(tài)機的置位與復(fù)位狀態(tài)機的異步置位與復(fù)位狀態(tài)機的同步置位與復(fù)位9/24/202339狀態(tài)機的異步置位與復(fù)位9/24/202340異步置位與復(fù)位是與時鐘無關(guān)的.列入always塊的事件控制括號內(nèi)就能觸

發(fā)always塊的執(zhí)行事件控制語法@(

<沿關(guān)鍵詞時鐘信號or沿關(guān)鍵詞復(fù)位信號or沿關(guān)鍵詞置位信號>

)狀態(tài)機的異步置位與復(fù)位9/24/202341事件控制實例1)異步、高電平有效的置位(時鐘的上升沿) @(posedge

clk

or

posedge

set)2)異步低電平有效的復(fù)位(時鐘的上升沿) @(posedge

clk

or

negedge

reset)3)異步低電平有效的置位和高電平有效的復(fù)位(時鐘的上升沿)@(

posedge

clk

or

negedge

set

or

posedge

reset)狀態(tài)機的異步置位與復(fù)位4)帶異步高電平有效的置位與復(fù)位的always塊樣板always

@(posedge

clk

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論