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

下載本文檔

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

文檔簡介

1、第第5章章 Verilog有限狀態(tài)機設計有限狀態(tài)機設計本章內(nèi)容o5.1、FSM概述o5.2、FSM設計方法 5.1 狀態(tài)機概述狀態(tài)機概述o 在數(shù)字系統(tǒng)中,有限狀態(tài)機(FSM,Finite State Machine)是一類十分重要的時序電路。微控制器的核心就是FSM。因此學習FSM的原理及設計方法對于學習數(shù)字系統(tǒng)設計和理解計算機原理都有重要意義。o 本章首先概要介紹FSM的相關理論知識,通過典型實例說明FSM的設計方法。1、FSM概念概念 有限狀態(tài)機由輸入和輸出和具有記憶功能的寄存器組有限狀態(tài)機由輸入和輸出和具有記憶功能的寄存器組成,寄存器用于寄存狀態(tài)機內(nèi)部狀態(tài),也稱成,寄存器用于寄存狀態(tài)機內(nèi)

2、部狀態(tài),也稱狀態(tài)寄存器狀態(tài)寄存器。 狀態(tài)機的下一個狀態(tài)不僅與輸入信號有關,還與該寄狀態(tài)機的下一個狀態(tài)不僅與輸入信號有關,還與該寄存器的當前狀態(tài)有關,因此有限狀態(tài)機可看作是存器的當前狀態(tài)有關,因此有限狀態(tài)機可看作是組合邏組合邏輯與時序邏輯的一種組合輯與時序邏輯的一種組合。其中的時序邏輯功能是存儲。其中的時序邏輯功能是存儲有限狀態(tài)機的內(nèi)部狀態(tài);而組合邏輯又可分為次態(tài)產(chǎn)生有限狀態(tài)機的內(nèi)部狀態(tài);而組合邏輯又可分為次態(tài)產(chǎn)生邏輯和輸出邏輯兩部分,次態(tài)產(chǎn)生邏輯的功能是確定有邏輯和輸出邏輯兩部分,次態(tài)產(chǎn)生邏輯的功能是確定有限狀態(tài)機的下一個狀態(tài),輸出邏輯功能是確定有限狀態(tài)限狀態(tài)機的下一個狀態(tài),輸出邏輯功能是確定

3、有限狀態(tài)機的輸出。機的輸出。由于由于FSM的描述較為復雜,因此不能使用原理圖方法的描述較為復雜,因此不能使用原理圖方法進行描述,而必須采用進行描述,而必須采用Verilog HDL語言進行行為級設語言進行行為級設計。計。1、FSM概念概念思考一下電梯運動控制過程?o 電梯從一樓到頂樓是一系列樓層,電梯到達每一層要顯示該層樓層信息,還要由乘坐人控制去那一層,在經(jīng)過的樓層還要判斷是否有相同方向的人乘坐,這一系列控制判斷過程如何設計呢?一層二層三層四層N層將整個電梯控制過程運行狀態(tài)分解為將整個電梯控制過程運行狀態(tài)分解為N個狀態(tài),在每個狀態(tài)下決定下一步個狀態(tài),在每個狀態(tài)下決定下一步如何控制,這就是將復

4、雜狀態(tài)的運動過程分解為一系列狀態(tài)過程,這就是如何控制,這就是將復雜狀態(tài)的運動過程分解為一系列狀態(tài)過程,這就是狀態(tài)機設計思想。狀態(tài)機設計思想。2、 有限狀態(tài)機有限狀態(tài)機FSM組成組成摩爾型(摩爾型(Moore)狀態(tài)機)狀態(tài)機 米里型(米里型(Mealy)狀態(tài)機)狀態(tài)機 單純的單純的Moore型或型或Mealy型比較少,常見是兩種混合型設計。型比較少,常見是兩種混合型設計。例如:例如: 狀態(tài)機的一般控制形式狀態(tài)機的一般控制形式 如圖狀態(tài)機的基本結構如圖狀態(tài)機的基本結構 7.1.1 狀態(tài)機的基本結構狀態(tài)機的基本結構 3. 主控組合過程主控組合過程 4. 輔助過程輔助過程 接下頁狀態(tài)機功能結構描述狀態(tài)

5、機功能結構描述3. 主控組合過程主控組合過程 狀態(tài)機功能結構描述狀態(tài)機功能結構描述狀態(tài)機狀態(tài)圖及仿真結果狀態(tài)機狀態(tài)圖及仿真結果 3、狀、狀 態(tài)態(tài) 機機 狀狀 態(tài)態(tài) 定定 義義 與與 編編 碼碼狀態(tài)機狀態(tài)定義方式狀態(tài)機狀態(tài)定義方式整數(shù)定義編碼方式:就是采用簡單的整數(shù)表示整數(shù)定義編碼方式:就是采用簡單的整數(shù)表示狀態(tài)機的各種狀態(tài)。優(yōu)點是簡單,但缺點是可讀狀態(tài)機的各種狀態(tài)。優(yōu)點是簡單,但缺點是可讀性差且不方便修改。性差且不方便修改。integer mealystate;/定義狀態(tài)變量定義狀態(tài)變量;case (mealystate)0:; /直接使用整型數(shù)狀態(tài)編碼直接使用整型數(shù)狀態(tài)編碼1:;;defau

6、lt:;endcase這種方式不可能例舉所有狀態(tài),所以必須使用這種方式不可能例舉所有狀態(tài),所以必須使用default語句避免綜合生成多余語句避免綜合生成多余的鎖存器。的鎖存器。采用參數(shù)語句聲明狀態(tài)方式:就是采用采用參數(shù)語句聲明狀態(tài)方式:就是采用parameter語句定義狀態(tài)。語句定義狀態(tài)。優(yōu)點是具有較好的優(yōu)點是具有較好的狀態(tài)可讀性,也易修改狀態(tài),狀態(tài)可讀性,也易修改狀態(tài),但缺點是綜合優(yōu)化但缺點是綜合優(yōu)化較差。較差。module mealyFSM(clk,reset,dout);integer mealystate;/定義狀態(tài)變量定義狀態(tài)變量parameter S0=0,S1=1,S2=2,S3

7、=3; /定義狀態(tài)編碼定義狀態(tài)編碼always(mealystate,din)case (mealystate)S0:;S1:;default:;endcaseendmodule3、狀狀 態(tài)態(tài) 機機 狀狀 態(tài)態(tài) 定義與編定義與編 碼碼采用編譯引導語句聲采用編譯引導語句聲明狀態(tài)方式:就是采用明狀態(tài)方式:就是采用define語句定義狀態(tài)。語句定義狀態(tài)。語句格式:語句格式:define 該語句在編譯時用該語句在編譯時用“宏文宏文本本”替代代碼中的替代代碼中的”宏宏名名”,這種方法可以提高,這種方法可以提高程序的可讀性,與上面的程序的可讀性,與上面的參數(shù)定義類似。參數(shù)定義類似。define S0 2b

8、00; /定義狀態(tài)編碼定義狀態(tài)編碼define S1 2b01;module mealyFSM(clk,din,reset,dout);integer mealystate;/;/定義狀態(tài)變量定義狀態(tài)變量always(mealystate,din)case (mealystate)S0:;S1:;default:;endcaseendmodule3、狀狀 態(tài)態(tài) 機機 狀狀 態(tài)態(tài) 定定 義義 與與 編編 碼碼復雜狀態(tài)機狀態(tài)編碼方式復雜狀態(tài)機狀態(tài)編碼方式二進制編碼:是二進制數(shù)連續(xù)編碼,這種方法在小型狀二進制編碼:是二進制數(shù)連續(xù)編碼,這種方法在小型狀態(tài)機中常用,較其它方法好。態(tài)機中常用,較其它方法好

9、。約翰遜編碼(約翰遜編碼(Johnson code):是在約翰遜計數(shù)器:是在約翰遜計數(shù)器基礎上引入的編碼,相鄰間的編碼也只有一個不同?;A上引入的編碼,相鄰間的編碼也只有一個不同。格雷編碼(格雷編碼(Gray code):碼間只有一位不同的編碼:碼間只有一位不同的編碼方式。方式。獨熱編碼(獨熱編碼(One-Hot code):每個編碼只有一位是:每個編碼只有一位是1,其它都是其它都是0。3、狀狀 態(tài)態(tài) 機機 狀狀 態(tài)態(tài) 編編 碼碼簡單狀態(tài)編碼直接可采用前面的簡單狀態(tài)編碼直接可采用前面的整數(shù)定義編碼方式整數(shù)定義編碼方式,但復,但復雜設計必須采用如下編碼方式進行。雜設計必須采用如下編碼方式進行。各

10、種編碼比較如描述如描述6個狀態(tài)的編碼:個狀態(tài)的編碼:二進制編碼:二進制編碼:000,001,010,011,100,101 獨熱編碼:獨熱編碼:000001,000010,000100,001000,010000,100000 格雷編碼:格雷編碼:000,001,011,010,110,100 每個二進制位占有一個觸發(fā)器,所以描述同樣的狀態(tài)數(shù),二每個二進制位占有一個觸發(fā)器,所以描述同樣的狀態(tài)數(shù),二進制編碼、格雷編碼和約翰遜編碼所需觸發(fā)器少,而獨熱編碼相進制編碼、格雷編碼和約翰遜編碼所需觸發(fā)器少,而獨熱編碼相對較多。但從編譯角度來看,獨熱碼相對其它三種簡單。對較多。但從編譯角度來看,獨熱碼相對其

11、它三種簡單。約翰遜編碼:約翰遜編碼:000,001,011,111,110,100 二進制編碼、格雷碼編碼和約翰遜編碼使用最少的觸發(fā)器,二進制編碼、格雷碼編碼和約翰遜編碼使用最少的觸發(fā)器,消耗較多的組合邏輯,而獨熱碼編碼反之。獨熱碼編碼的最大消耗較多的組合邏輯,而獨熱碼編碼反之。獨熱碼編碼的最大優(yōu)勢在于狀態(tài)比較時僅僅需要比較一個位,從而一定程度上簡優(yōu)勢在于狀態(tài)比較時僅僅需要比較一個位,從而一定程度上簡化了譯碼邏輯,減少復雜性,提高系統(tǒng)的速度,即工作時鐘頻化了譯碼邏輯,減少復雜性,提高系統(tǒng)的速度,即工作時鐘頻率可以做到最高率可以做到最高 。雖然在需要表示同樣的狀態(tài)數(shù)時,獨熱編。雖然在需要表示同樣

12、的狀態(tài)數(shù)時,獨熱編碼占用較多的位,也就是消耗較多的觸發(fā)器,但這些額外觸發(fā)碼占用較多的位,也就是消耗較多的觸發(fā)器,但這些額外觸發(fā)器占用的面積可與譯碼電路省下來的面積相抵消。器占用的面積可與譯碼電路省下來的面積相抵消。 在在CPLD中,由于器件擁有較多的提供組合邏輯資源,所中,由于器件擁有較多的提供組合邏輯資源,所以以CPLD多使用二進制編碼、約翰遜碼或格雷碼多使用二進制編碼、約翰遜碼或格雷碼,而,而FPGA更更多地提供觸發(fā)器資源,所以在多地提供觸發(fā)器資源,所以在FPGA中多使用獨熱碼編碼中多使用獨熱碼編碼。當。當然,這并不是說在然,這并不是說在FPGA中就非得用獨熱編碼,在中就非得用獨熱編碼,在

13、CPLD中不中不能用獨熱編碼,一般的,對于能用獨熱編碼,一般的,對于小型設計(狀態(tài)數(shù)小于小型設計(狀態(tài)數(shù)小于4)使用使用二進制編碼,當狀態(tài)數(shù)處于二進制編碼,當狀態(tài)數(shù)處于4-24之間時,宜采用獨熱碼編碼,之間時,宜采用獨熱碼編碼,而大型狀態(tài)機(而大型狀態(tài)機(狀態(tài)數(shù)大于狀態(tài)數(shù)大于24)使用格雷碼更高效。)使用格雷碼更高效。 各種編碼比較格雷編碼5.2 FSM狀態(tài)機設計方法1 1、采用、采用Verilog HDLVerilog HDL描述有限狀態(tài)機設計原則描述有限狀態(tài)機設計原則o 根據(jù)系統(tǒng)要求確定狀態(tài)數(shù)量、狀態(tài)轉移的條件和根據(jù)系統(tǒng)要求確定狀態(tài)數(shù)量、狀態(tài)轉移的條件和各狀態(tài)輸出信號的賦值、并畫出狀態(tài)轉移

14、圖。如下各狀態(tài)輸出信號的賦值、并畫出狀態(tài)轉移圖。如下圖:圖:o 按照狀態(tài)轉移圖編寫狀態(tài)機的按照狀態(tài)轉移圖編寫狀態(tài)機的Verilog HDL代代碼。碼。o 利用利用EDA工具對狀態(tài)機的功能進行仿真驗證。工具對狀態(tài)機的功能進行仿真驗證。(1)用三個過程描述:即現(xiàn)態(tài)()用三個過程描述:即現(xiàn)態(tài)(CS)、次態(tài)()、次態(tài)(NS)、)、輸出邏輯(輸出邏輯(OL)各用一個)各用一個always過程描述。過程描述。(2)雙過程描述()雙過程描述(CS+NS、OL雙過程描述):使用兩雙過程描述):使用兩個個always過程來描述有限狀態(tài)機,一個過程描述現(xiàn)態(tài)和次過程來描述有限狀態(tài)機,一個過程描述現(xiàn)態(tài)和次態(tài)時序邏輯(

15、態(tài)時序邏輯(CS+NS);另一個過程描述輸出邏輯();另一個過程描述輸出邏輯(OL)。)。(3)雙過程描述()雙過程描述(CS、NS+OL雙過程描述):一個過雙過程描述):一個過程用來描述現(xiàn)態(tài)(程用來描述現(xiàn)態(tài)(CS);另一個過程描述次態(tài)和輸出邏輯);另一個過程描述次態(tài)和輸出邏輯(NS+OL)。)。(4)單過程描述:在單過程描述方式中,將狀態(tài)機的現(xiàn))單過程描述:在單過程描述方式中,將狀態(tài)機的現(xiàn)態(tài)、次態(tài)和輸出態(tài)、次態(tài)和輸出邏輯(邏輯(CS+NS+OL)放在一個)放在一個always過程中進行描述。過程中進行描述。2、 有限狀態(tài)機的幾種描述方式有限狀態(tài)機的幾種描述方式3、幾種典型邏輯電路的狀態(tài)機設計

16、Moore型型FSM的設計的設計Moore型狀態(tài)機的輸出只與有限狀態(tài)機的當前狀態(tài)有關,型狀態(tài)機的輸出只與有限狀態(tài)機的當前狀態(tài)有關,與輸入信號的當前輸入無關,即可將與輸入信號的當前輸入無關,即可將Moore型有限狀態(tài)機型有限狀態(tài)機的輸出看成是當前狀態(tài)的函數(shù),次態(tài)的輸出看成是當前狀態(tài)的函數(shù),次態(tài)=f(現(xiàn)狀,輸入),(現(xiàn)狀,輸入),輸出輸出=f(現(xiàn)狀)。(現(xiàn)狀)。次態(tài)邏輯次態(tài)邏輯(組合邏輯)(組合邏輯)當前次態(tài)邏輯當前次態(tài)邏輯(寄存器)(寄存器)輸出邏輯輸出邏輯(組合邏輯)(組合邏輯)doutresetresetclkNext statecurrent statedin可見可見moore型有型有3部

17、分組成:次態(tài)邏輯、當前狀態(tài)邏輯和輸出邏輯。部分組成:次態(tài)邏輯、當前狀態(tài)邏輯和輸出邏輯。例如: Moore型狀態(tài)機設計型狀態(tài)機設計dinclkresetdoutS00S11S21S3000001111當前狀態(tài)當前狀態(tài)下一個狀態(tài)(次態(tài))下一個狀態(tài)(次態(tài))輸出輸出doutDin=0Din=1S0=0001S0S20S1=0010S0S21S2=0100S2S31S3=1000S3S10設計方式采用雙過程描述設計方式采用雙過程描述(CS、NS+OL雙過程雙過程描述):一個過程用來描描述):一個過程用來描述現(xiàn)態(tài)(述現(xiàn)態(tài)(CS);另一個);另一個過程描述次態(tài)和輸出邏輯過程描述次態(tài)和輸出邏輯(NS+OL)。

18、)。采用四種狀態(tài)描述采用四種狀態(tài)描述,在狀態(tài)控制下的輸在狀態(tài)控制下的輸出過程。出過程。而次態(tài)又而次態(tài)又由輸入和當前狀態(tài)由輸入和當前狀態(tài)決定決定。獨熱碼各狀態(tài)跳轉控制相對靈活,并且各狀態(tài)轉化控制速度基本相同。獨熱碼各狀態(tài)跳轉控制相對靈活,并且各狀態(tài)轉化控制速度基本相同。Moore型狀態(tài)機型狀態(tài)機Verilog描述程序描述程序module mooreFSM(clk,reset,din,dout,CS_state,NS_state);input clk,reset,din;output dout;output 3:0 dout,CS_state,NS_state;reg dout;/one-hot

19、codeparameter S0=4b0001,S1=4b0010,S2=4b0100,S3=4b1000;reg 3:0 CS,NS;assign CS_state=CS,NS_state=NS;always (posedge clk , posedge reset) begin if(reset=1b1) CS=S0; else CS=NS; endalways (CS or din or NS ) begincase(CS)S0: begin dout=1b0; if(din=1bx)NS=S0; else NS=(!din)?S0:S2; endS1: begin dout=1b1;

20、NS=(!din)?S0:S2; endS2: begin dout=1b1; NS=(!din)?S2:S3; endS3: begin dout=1b0; NS=(!din)?S3:S1; enddefault:begin dout=1b0; NS=S0; endendcase endendmoduleS00S11S21S3000001111仿真結果 可見可見dout輸出由當前狀態(tài)輸出由當前狀態(tài)CS_state(或或CS)決定,而現(xiàn)態(tài)的轉變只決定,而現(xiàn)態(tài)的轉變只能在時鐘控制下依次態(tài)而變,而次態(tài)能在時鐘控制下依次態(tài)而變,而次態(tài)NS_state(或或NS)由輸入由輸入din和當和當前狀態(tài)前狀態(tài)

21、CS決定。這就是決定。這就是mooreFSM狀態(tài)機工作特點。狀態(tài)機工作特點。Mealy型型FSM的設計的設計 Mealy型狀態(tài)機的輸出型狀態(tài)機的輸出不僅不僅與有限狀態(tài)機的當前狀態(tài)與有限狀態(tài)機的當前狀態(tài)有關,有關,還還與輸入信號與輸入信號有有關,即可將關,即可將Mealy型有限狀態(tài)機的型有限狀態(tài)機的輸出看成是當前狀態(tài)輸出看成是當前狀態(tài)和輸入和輸入的函數(shù),次態(tài)的函數(shù),次態(tài)=f(現(xiàn)(現(xiàn)態(tài)態(tài),輸,輸入),輸出入),輸出=f(現(xiàn)(現(xiàn)態(tài),輸入態(tài),輸入)。)。可見可見moore型有型有3部分組成:次態(tài)邏輯、當前狀態(tài)邏輯和輸出邏輯。部分組成:次態(tài)邏輯、當前狀態(tài)邏輯和輸出邏輯。次態(tài)邏輯次態(tài)邏輯(組合邏輯)(組合

22、邏輯)當前次態(tài)邏輯當前次態(tài)邏輯(寄存器)(寄存器)輸出邏輯輸出邏輯(組合邏輯)(組合邏輯)doutresetresetclkNext statecurrent statedin例如:由輸入信號中檢測010序列dinclkresetdoutS0S1S20/01/01/01/00/00/1當前狀態(tài)當前狀態(tài)下一狀態(tài)下一狀態(tài)din=0din=1s0=00s1,0s0,0s1=01s1,0s2,0s2=11s1,1s0,0由輸入信號檢測010序列Verilong程序module mealyfsm(clk,reset,din,dout, cs_state,ns_state);output dout;out

23、put 1:0 cs_state,ns_state;input clk,reset,din;reg dout;/用格雷碼編碼聲明狀態(tài)值用格雷碼編碼聲明狀態(tài)值parameter 1:0 s0=2b00,s1=2b10,s2=2b11;reg 1:0cs,ns;assign cs_state=cs,ns_state=ns;always(posedge clk,posedge reset)begin if(reset=1b1) /異步復位,高電平有效異步復位,高電平有效 cs=s0;else cs=ns; end/次態(tài)計算及輸出信號產(chǎn)生,次態(tài)計算及輸出信號產(chǎn)生,always(cs,din) case

24、(cs)s0:begin dout=1b0; if(din=1bx)ns=s0; else ns=(din)?s0:s1; end s1:begin dout=1b0; ns=(!din)?s1:s2; end s2:begin dout=(din)?1b0:1b1; ns=(din)?s0:s1; end default:begin dout=1b0; ns=s0; end endcaseendmodulemealy型狀態(tài)機仿真結果可見輸出可見輸出dout和次態(tài)和次態(tài)ns均由現(xiàn)態(tài)均由現(xiàn)態(tài)cs和輸入和輸入din共同決。這是共同決。這是mealy狀狀態(tài)機特點。態(tài)機特點。S0S1S20/01/01

25、/01/00/00/13序列檢測轉換圖檢測檢測011S0S1S20/01/01/11/00/00/0檢測檢測101S0S1S21/00/00/00/01/01/15序列狀態(tài)檢測序列圖作業(yè):設計檢測作業(yè):設計檢測10011數(shù)字序列的檢測器(采用兩種方法)。數(shù)字序列的檢測器(采用兩種方法)。檢測檢測10011StartAC1/00/00/01/01/00/0BDE1/00/01/00/11/10/0(采用(采用moore型)型)(采用(采用mealy型)型)檢測檢測10010Start0A0C0100110B0D0E1101010module seqdet(in,out,clk,reset,sta

26、te); output out;output 2:0 state; input in,clk,reset; reg2:0 cs,ns; parameter 2:0 start=3b000,A=3b001,B=3b010,C=3b011, D=3b100,E=3b101; assign out=(cs=E)?1:0; assign state=cs; always (posedge clk) if(reset) cs=start; else cs=ns; always (cs,in) case(cs) start: if(in=1bx) ns=start; else ns=(in)?A:star

27、t; A:ns=(in)?A:B; B:ns=(in)?A:C; C:ns=(in)?D:start; D:ns =(in)?A:E; E:ns =(in)?A:C; default: ns=start; endcaseendmodule檢測 10010 Verilog描述程序(moore型)檢測檢測10010Start0A0C0100110B0D0E1101010仿真結果10010010出現(xiàn)出現(xiàn)E(101)狀態(tài)時,必檢測到)狀態(tài)時,必檢測到10010數(shù)據(jù)串數(shù)據(jù)串 實現(xiàn)兩個實現(xiàn)兩個8位二進制數(shù)的乘法運算,被乘數(shù)(位二進制數(shù)的乘法運算,被乘數(shù)(mcnd)和和乘數(shù)(乘數(shù)(mplr)存放在寄存器存放

28、在寄存器mcnd_temp和和acc7:0中,乘積中,乘積為為16進制數(shù),運算完后存放在進制數(shù),運算完后存放在16位寄存器位寄存器acc15:0中。中。 二進制數(shù)乘法可以采用移位相加實現(xiàn),即乘法運算二進制數(shù)乘法可以采用移位相加實現(xiàn),即乘法運算Acc=mcndmplr可以通過把被乘數(shù)可以通過把被乘數(shù)mcnd移位相加得到結移位相加得到結果果acc,移位的次數(shù)由乘數(shù),移位的次數(shù)由乘數(shù)mplr位數(shù)決定。位數(shù)決定。 該乘法狀態(tài)機模型由該乘法狀態(tài)機模型由4個狀態(tài):個狀態(tài):init、add、shift和和comp1確定。它們分別為初始化、部分積與被乘數(shù)求和、確定。它們分別為初始化、部分積與被乘數(shù)求和、移位操

29、作和結果輸出,并輸出標識信號移位操作和結果輸出,并輸出標識信號done(高電平(高電平)。2、二進制乘法器設計:、二進制乘法器設計:其狀態(tài)轉換如下狀態(tài)圖:shiftaddcomp1initcount8遞增遞增countacc右移右移復位復位acc初始化初始化countreset=1reset=0如果如果acc0=1將將mcnd加到加到acc輸出輸出done=1count=8狀態(tài)機模型開始處于狀態(tài)機模型開始處于init狀態(tài),并且只要復位信號狀態(tài),并且只要復位信號reset為高電平,就停留在為高電平,就停留在該狀態(tài)。當該狀態(tài)。當reset為為0時,累加器時,累加器acc清零,計數(shù)器清零,計數(shù)器co

30、unt被復位,被乘數(shù)被復位,被乘數(shù)mcnd和乘數(shù)和乘數(shù)mplr被加載到寄存器被加載到寄存器mcnd_temp和和acc的低的低8位中,然后進入位中,然后進入add狀態(tài)。狀態(tài)。當處于當處于add狀態(tài)時,只要當乘數(shù)的最低位(狀態(tài)時,只要當乘數(shù)的最低位(acc0)為)為1時,將被乘數(shù)加到部時,將被乘數(shù)加到部分積(分積(acc的高八位)中,然后進入到的高八位)中,然后進入到shift狀態(tài)中。狀態(tài)中。在在shift狀態(tài)時,將部分積(狀態(tài)時,將部分積(acc)右移一位,并將計數(shù)器()右移一位,并將計數(shù)器(count)加)加1,如,如果計數(shù)器值為果計數(shù)器值為8,則進入,則進入compl狀態(tài);如果計數(shù)器值小于

31、狀態(tài);如果計數(shù)器值小于8,則返回到,則返回到add狀態(tài)狀態(tài)進行下一輪相加移位直到計數(shù)器值變?yōu)檫M行下一輪相加移位直到計數(shù)器值變?yōu)?。compl狀態(tài)表示運算完成,將輸出使能信號狀態(tài)表示運算完成,將輸出使能信號done置為高,此時置為高,此時acc內(nèi)存放的內(nèi)存放的即為乘法器運算的結果,然后返回即為乘法器運算的結果,然后返回init狀態(tài)。狀態(tài)。乘法器狀態(tài)機Verilog程序module multi8(mplr,mcnd,clk,reset,done,acc,count, mul_state,next_state); output done; output 15:0 acc; output 3:0 co

32、unt; output 1:0 mul_state,next_state; input 7:0 mplr,mcnd; input clk,reset; reg 15:0 acc; reg 1:0 cs,ns; reg7:0 mcnd_temp; reg3:0 count; reg done;/定義狀態(tài)編碼為格雷碼定義狀態(tài)編碼為格雷碼parameter 1:0 init=2b00,add=2b01,shift=2b11,compl=2b10;assign mul_state=cs;/方便查看狀態(tài)機狀態(tài)轉換過程方便查看狀態(tài)機狀態(tài)轉換過程assign next_state=ns;always (ne

33、gedge clk,posedge reset) if(reset) cs=init; else cs=ns;乘法器狀態(tài)機Verilog程序(moore型)/次態(tài)計算次態(tài)計算always(cs)begin case(cs) init:ns=add; add:ns=shift; shift:if(count=4b0111)ns=compl; else ns=add; compl:ns=init; endcaseend/產(chǎn)生輸出信號產(chǎn)生輸出信號always(negedge clk) case(cs) init:begin acc15:8=8b0000_0000; acc7:0=mplr; done

34、=1b0; mcnd_temp7:0=mcnd; count=3b000; end/判斷乘數(shù)最高位是否為判斷乘數(shù)最高位是否為1,則將被乘數(shù)加到部分積中,則將被乘數(shù)加到部分積中Add:if(acc0=1b1) acc=acc+mcnd_temp,8b0000_0000); else acc=acc;Shift:begin count=count+1b1; acc1b0,acc15:1 endCompl:done=1b1;Endcaseendmodule仿真結果作業(yè):仿真驗證作業(yè):仿真驗證8位二進制乘法器。位二進制乘法器。參考:用for語句實現(xiàn)兩位8位二進制相乘注意:多余狀態(tài)的處理注意:多余狀態(tài)的

35、處理一般有如下兩種處理多余狀態(tài)的方法:一般有如下兩種處理多余狀態(tài)的方法:(1)在)在case語句中用語句中用default分支決定如分支決定如果進入無效狀態(tài)所采取的措施;果進入無效狀態(tài)所采取的措施;(2)編寫必要的)編寫必要的Verilog源代碼明確定義進源代碼明確定義進入無效狀態(tài)所采取的行為。入無效狀態(tài)所采取的行為。例如:例如:用類似狀態(tài)機方法設計模用類似狀態(tài)機方法設計模5(5進制)計數(shù)器進制)計數(shù)器module fsm(clk,clr,z,qout);input clk,clr; output reg z; output reg2:0 qout;always (posedge clk or

36、 posedge clr) /此過程定義狀態(tài)轉換begin if(clr) qout=0; /異步復位else case(qout)3b000: qout=3b001;3b001: qout=3b010;3b010: qout=3b011;3b011: qout=3b100;3b100: qout=3b000;default: qout=3b000;/*default語句*/endcaseendalways (qout) /*此過程產(chǎn)生輸出邏輯*/begin case(qout)3b100: z=1b1;default:z=1b0;endcaseendendmodule五進制計數(shù)器仿真結果結束

37、結束“101”序列檢測器的序列檢測器的Verilog描述(描述(三個過程三個過程) module fsm1_seq101(clk,clr,x,z);input clk,clr,x; output reg z; reg1:0 state,next_state;parameter S0=2b00,S1=2b01,S2=2b11,S3=2b10; /*狀態(tài)編碼,采用格雷(狀態(tài)編碼,采用格雷(Gray)編碼方式)編碼方式*/always (posedge clk or posedge clr) /*該過程定義當前狀態(tài)該過程定義當前狀態(tài)*/beginif(clr) state=S0; /異步復位,異步復

38、位,s0為起始狀態(tài)為起始狀態(tài)else state=next_state;endalways (state or x) /*該過程定義次態(tài)該過程定義次態(tài)*/begincase (state)S0:begin if(x) next_state=S1;else next_state=S0; endS1:beginif(x) next_state=S1;else next_state=S2; endS2:beginif(x) next_state=S3;else next_state=S0; endS3:beginif(x) next_state=S1;else next_state=S2; endd

39、efault:next_state=S0; /*default語句語句*/endcaseendalways (state) /*該過程產(chǎn)生輸出邏輯該過程產(chǎn)生輸出邏輯*/begin case(state)S3: z=1b1;default:z=1b0;endcaseendendmodule“101”序列檢測器的序列檢測器的Verilog描述(描述(三個過程三個過程) “101”序列檢測器(序列檢測器(單過程描述單過程描述) module fsm4_seq101(clk,clr,x,z);input clk,clr,x; output reg z; reg1:0 state;parameter S

40、0=2b00,S1=2b01,S2=2b11,S3=2b10;/*狀態(tài)編碼,采用格雷(狀態(tài)編碼,采用格雷(Gray)編碼方式)編碼方式*/always (posedge clk or posedge clr)Begin if(clr) state=S0; /異步復位,異步復位,s0為起始狀態(tài)為起始狀態(tài)else case(state)S0:begin if(x) begin state=S1; z=1b0;endelse begin state=S0; z=1b0;end endS1:begin if(x) begin state=S1; z=1b0;endelse begin state=S2

41、; z=1b0;end endS2:beginif(x) begin state=S3; z=1b0;endelse begin state=S0; z=1b0;end endS3:begin if(x) begin state=S1; z=1b1;endelse begin state=S2; z=1b1;end enddefault:begin state=S0; z=1b0;end /*default語句語句*/endcaseendendmodule5.6 狀態(tài)機狀態(tài)機A/D采樣控制電路采樣控制電路ADC0809引腳圖引腳圖 ADC0809工作時序工作時序 5.1 設計一個設計一個“11

42、1”串行數(shù)據(jù)檢測器。要求是:當檢測到連串行數(shù)據(jù)檢測器。要求是:當檢測到連續(xù)續(xù)3個或個或3個以上的個以上的“1”時輸出為時輸出為1,其他輸入情況下輸出為,其他輸入情況下輸出為0。5.2 設計一個設計一個“1001”串行數(shù)據(jù)檢測器。其輸入、輸出如下所串行數(shù)據(jù)檢測器。其輸入、輸出如下所示:示:輸入輸入x:000 101 010 010 011 101 001 110 101輸出輸出z:000 000 000 010 010 000 001 000 0005.3 編寫一個編寫一個8路彩燈控制程序,要求彩燈有以下路彩燈控制程序,要求彩燈有以下3種演示花種演示花型。型。(1)8路彩燈同時亮滅;路彩燈同時亮

43、滅;(2)從左至右逐個亮(每次只有)從左至右逐個亮(每次只有1路亮);路亮);(3)8路彩燈每次路彩燈每次4路燈亮,路燈亮,4路燈滅,且亮滅相間,交替亮路燈滅,且亮滅相間,交替亮滅;在演示過程中,只有當一種花型演示完畢才能轉向其他演滅;在演示過程中,只有當一種花型演示完畢才能轉向其他演示花型。示花型。習習 題題 5習習 題題 55.4 用狀態(tài)機設計一個交通燈控制器,設計用狀態(tài)機設計一個交通燈控制器,設計要求:要求:A路和路和B路,每路都有紅、黃、綠三種路,每路都有紅、黃、綠三種燈,持續(xù)時間為:紅燈燈,持續(xù)時間為:紅燈45 s,黃燈,黃燈5 s,綠燈,綠燈40 s。A路和路和B路燈的狀態(tài)轉換是:

44、路燈的狀態(tài)轉換是:(1)A紅,紅,B綠(持續(xù)時間綠(持續(xù)時間40 s););(2)A紅,紅,B黃(持續(xù)時間黃(持續(xù)時間5 s););(3)A綠,綠,B紅(持續(xù)時間紅(持續(xù)時間40 s););(4)A黃,黃,B紅(持續(xù)時間紅(持續(xù)時間5 s)。)。5.5 設計一個汽車尾燈控制電路。已知汽車左右兩側各設計一個汽車尾燈控制電路。已知汽車左右兩側各有有3個尾燈,要求控制尾燈按如下規(guī)則亮滅。個尾燈,要求控制尾燈按如下規(guī)則亮滅。(1)汽車沿直線行駛時,兩側的指示燈全滅;)汽車沿直線行駛時,兩側的指示燈全滅; (2)右轉彎時,左側的指示燈全滅,右側的指示燈按)右轉彎時,左側的指示燈全滅,右側的指示燈按000

45、,100,010,001,000循環(huán)順序點亮;循環(huán)順序點亮;(3)左轉彎時,右側的指示燈全滅,左側的指示燈按與)左轉彎時,右側的指示燈全滅,左側的指示燈按與右側同樣的循環(huán)順序點亮;右側同樣的循環(huán)順序點亮;(4)如果在直行時剎車,兩側的指示燈全亮;如果在轉)如果在直行時剎車,兩側的指示燈全亮;如果在轉彎時剎車,轉彎這一側的指示燈按上述的循環(huán)順序點彎時剎車,轉彎這一側的指示燈按上述的循環(huán)順序點亮,另一側的指示燈全亮。亮,另一側的指示燈全亮。習習 題題 8補充補充函數(shù)與任務函數(shù)與任務1、函數(shù)的定義與調(diào)用、函數(shù)的定義與調(diào)用 函數(shù)是用于為不同變量進行相同運算時采用的一種方法,這種重復運算函數(shù)是用于為不同

46、變量進行相同運算時采用的一種方法,這種重復運算設計為一個函數(shù)模塊。運算后函數(shù)可以返回一個值,因此函數(shù)可出現(xiàn)在等號設計為一個函數(shù)模塊。運算后函數(shù)可以返回一個值,因此函數(shù)可出現(xiàn)在等號右邊的表達式中。右邊的表達式中。定義函數(shù)的語法如下所示:定義函數(shù)的語法如下所示:function 返回值類型或?qū)挾确祷刂殿愋突驅(qū)挾?; ; ;endfunction 函數(shù)的調(diào)用包含函數(shù)名和參數(shù)列表。函數(shù)通常在表達式中調(diào)用,其返函數(shù)的調(diào)用包含函數(shù)名和參數(shù)列表。函數(shù)通常在表達式中調(diào)用,其返回的結果可以用于表達式的進一步計算或者賦值給語句的左邊變量,如:回的結果可以用于表達式的進一步計算或者賦值給語句的左邊變量,如: = (

47、函數(shù)參數(shù)(函數(shù)參數(shù).););函數(shù)定義舉例function7:0 get0; /定義函數(shù)為定義函數(shù)為get0input7:0 x; reg7:0 count;integer i; begin count=0; /逐條執(zhí)行下面語句逐條執(zhí)行下面語句 for (i=0;i=7;i=i+1) /循環(huán)循環(huán)8次,判定次,判定0個數(shù)個數(shù) if(xi=1b0) count=count+1; /輸出給函數(shù)輸出給函數(shù)gat0 get0=count; endendfunction /上面的上面的get0函數(shù)循環(huán)核對輸入數(shù)據(jù)函數(shù)循環(huán)核對輸入數(shù)據(jù)x的每一位,計算出的每一位,計算出x中中0的個數(shù),的個數(shù),并返回一個適當?shù)闹?/p>

48、。并返回一個適當?shù)闹?。例:BCD編碼器函數(shù)設計程序module bcd_enc(in,out); input9:0in; output3:0out; assign out=func_enc(in); /函數(shù)調(diào)用 function 3:0 func_enc; /函數(shù)定義 input9:0 in; case(in) 10b00_0000_0001:func_enc=0; 10b00_0000_0010:func_enc=1; 10b00_0000_0100:func_enc=2; 10b00_0000_1000:func_enc=3; 10b00_0001_0000:func_enc=4; 10b

49、00_0010_0000:func_enc=5; 10b00_0100_0000:func_enc=6; 10b00_1000_0000:func_enc=7; 10b01_0000_0000:func_enc=8; 10b10_0000_0000:func_enc=9;endcaseendfunctionendmodule函數(shù)定義仿真結果例如:階乘運算器module tryfunc(result,n,reset,clk);output31:0 result;input3:0 n;input reset,clk;reg31:0 result;always (posedge clk)begin

50、if(!reset) result=0; else result=factorial(n);endfunction31:0 factorial;input3:0 operand;reg4:0 index;begin factorial=operand?1:0; for(index=2,indexy) begin tmp=x; x=y; y=tmp; endendtaskendmodule 比較過程的算法VaVbVcVda=3b=6c=2d=42634第一次調(diào)用第二次調(diào)用2436第三次調(diào)用2436第四次調(diào)用24362346第五次調(diào)用Va Vb Vc Vd Ve2 8 5 9 32 8 5 9 32 8 3 9 52 8 3 9 52 8 3 9 52 8 3 5 92 3 8 5 92 3 5 8 9比較每個位置關

溫馨提示

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

評論

0/150

提交評論