?
4.6??典型實(shí)例6:狀態(tài)機(jī)應(yīng)用
4.6.1??實(shí)例的內(nèi)容及目標(biāo)
1.實(shí)例的主要內(nèi)容
狀態(tài)機(jī)設(shè)計(jì)是HDL設(shè)計(jì)里面的精華,幾乎所有的設(shè)計(jì)里面都或多或少地使用了狀態(tài)機(jī)的思想。狀態(tài)機(jī),顧名思義,就是一系列狀態(tài)組成的一個(gè)循環(huán)機(jī)制,這樣的結(jié)構(gòu)使得編程人員能夠更好地使用HDL語言,同時(shí)具有特定風(fēng)格的狀態(tài)機(jī)也能提高程序的可讀性和調(diào)試性。
本實(shí)例通過設(shè)計(jì)一個(gè)狀態(tài)機(jī)來控制紅色颶風(fēng)II代Xilinx開發(fā)板上面的8個(gè)LED燈循環(huán)閃爍。在本實(shí)例狀態(tài)機(jī)的設(shè)計(jì)過程中,讀者需要著重注意狀態(tài)機(jī)設(shè)計(jì)的一些特性。
·??FSM設(shè)計(jì)方法(米勒型和摩爾型)。
·??狀態(tài)機(jī)的編碼(Binary、gray-code、one-hot等)。
·??狀態(tài)機(jī)的初始化狀態(tài)和默認(rèn)狀態(tài)(完整狀態(tài)機(jī)設(shè)計(jì))。
·??狀態(tài)機(jī)的狀態(tài)定義風(fēng)格(使用parameter參數(shù)定義狀態(tài))。
·??狀態(tài)機(jī)的編寫風(fēng)格(狀態(tài)任務(wù)與狀態(tài)轉(zhuǎn)換分離)
2.實(shí)例目的
通過本實(shí)例,讀者應(yīng)達(dá)到下面的目標(biāo)。
·??熟悉Xilinx?ISE開發(fā)環(huán)境。
·??熟悉紅色颶風(fēng)II代Xilinx開發(fā)板的使用。
·??了解狀態(tài)機(jī)設(shè)計(jì)輸入方法。
·??掌握狀態(tài)機(jī)在系統(tǒng)設(shè)計(jì)中的應(yīng)用。
4.6.2??實(shí)例詳解
本實(shí)例的具體步驟可參見2.6節(jié),在此不再詳述,僅給出主要的操作流程以及狀態(tài)機(jī)的設(shè)計(jì)輸入方法。
(1)啟動ISE軟件。
(2)創(chuàng)建新工程。
(3)編寫狀態(tài)機(jī)Verilog代碼。
狀態(tài)機(jī)的代碼可以直接進(jìn)行手動編寫,如圖4.2所示。
圖4.2??手動編寫狀態(tài)機(jī)代碼
對于簡單的狀態(tài)機(jī),使用手動輸入的方式進(jìn)行編寫是最直接的。但是如果需要進(jìn)行復(fù)雜的狀態(tài)機(jī)設(shè)計(jì),使用狀態(tài)圖設(shè)計(jì)輸入方式則會更加方便。下面介紹使用狀態(tài)圖進(jìn)行狀態(tài)機(jī)設(shè)計(jì)的一般步驟。
使用ISE創(chuàng)建工程后,為工程添加新的設(shè)計(jì)輸入,選擇“State?Diagram”選項(xiàng),如圖4.3所示。
圖4.3??狀態(tài)圖設(shè)計(jì)輸入方式
此時(shí)ISE將打開如圖4.4所示的StateCAD工具進(jìn)行狀態(tài)機(jī)設(shè)計(jì)。
圖4.4??StateCAD狀態(tài)機(jī)設(shè)計(jì)工具
在這個(gè)專門的工具中,讀者就可以很方便地進(jìn)行狀態(tài)機(jī)的設(shè)計(jì)。使用這個(gè)工具進(jìn)行狀態(tài)機(jī)設(shè)計(jì)的步驟主要分為3個(gè),下面分別介紹。
(1)創(chuàng)建狀態(tài)機(jī)。
單擊工具欄上的圖標(biāo),打開狀態(tài)機(jī)輸入向?qū)В鐖D4.5所示。
在本實(shí)例中,我們在向?qū)У?頁設(shè)置一個(gè)8狀態(tài)的狀態(tài)機(jī),如圖4.5所示。在該頁中,還可以設(shè)置狀態(tài)機(jī)圖形的形狀。在對話框的右側(cè)有圖形的預(yù)覽效果,用戶可根據(jù)自己的喜好設(shè)置圖形的形狀。
在狀態(tài)機(jī)向?qū)У牡?頁,我們?yōu)闋顟B(tài)機(jī)使用同步復(fù)位模式,建立一個(gè)同步狀態(tài)機(jī),如圖4.6所示。
?? 圖4.5??狀態(tài)機(jī)向?qū)?????????????? 圖4.6??同步狀態(tài)機(jī)
?
在狀態(tài)機(jī)向?qū)У牡?頁,可以設(shè)置狀態(tài)機(jī)的轉(zhuǎn)換模式,本實(shí)例中使用Next轉(zhuǎn)換模式,如圖4.7所示。
圖4.7??狀態(tài)機(jī)轉(zhuǎn)換模式
設(shè)置完畢后,單擊“Finish”按鈕即可完成狀態(tài)機(jī)的創(chuàng)建。在StateCAD工具的工作區(qū)將出現(xiàn)如圖4.8所示的狀態(tài)機(jī)圖形。
?
(2)添加狀態(tài)任務(wù)。
創(chuàng)建狀態(tài)機(jī)后,就要為其中的每一個(gè)狀態(tài)添加狀態(tài)任務(wù)。首先,雙擊如圖4.8所示的圖形中的STATE0狀態(tài),為STATE0添加任務(wù)。此時(shí),將出現(xiàn)如圖4.9所示的狀態(tài)任務(wù)編輯器。
?
圖4.8??創(chuàng)建的狀態(tài)機(jī)
?
單擊“Output?Wizard”按鈕,打開輸出向?qū)υ捒颍鐖D4.10所示。
???????
???????????????? 圖4.9??狀態(tài)任務(wù)編輯器??????? 圖4.10??狀態(tài)輸出向?qū)υ捒?/p>
在輸出向?qū)υ捒蚶锩嬗泻芏嗫梢赃x擇的邏輯,根據(jù)不同的需要選擇邏輯資源,并輸入?yún)?shù)。單擊“OK”按鈕即可完成對STATE0的狀態(tài)任務(wù)編輯。
按照相同的方法分別為每個(gè)狀態(tài)加載任務(wù),得到如圖4.11所示的狀態(tài)機(jī)。
(3)添加狀態(tài)轉(zhuǎn)換條件。
設(shè)置完?duì)顟B(tài)任務(wù)后,還需要為狀態(tài)之間的轉(zhuǎn)換調(diào)價(jià)條件。可以雙擊兩個(gè)狀態(tài)之間的連線設(shè)定狀態(tài)轉(zhuǎn)移條件,此時(shí)將出現(xiàn)條件編輯器,如圖4.12所示。
在該對話框中,可以在“Condition”下面填寫轉(zhuǎn)移條件(例如:cnt=10),也可以單擊“Output?Wizard”按鈕打開輸出向?qū)нM(jìn)行設(shè)置。設(shè)置結(jié)束后,單擊“OK”按鈕,完成兩個(gè)狀態(tài)之間的轉(zhuǎn)換條件設(shè)置。
圖4.11??添加任務(wù)的狀態(tài)機(jī)圖形
??
???圖4.12??狀態(tài)轉(zhuǎn)換條件編輯器
按照同樣的方法為需要添加轉(zhuǎn)換條件的狀態(tài)連線加載狀態(tài)轉(zhuǎn)移條件。完成后,得到如圖4.13所示的狀態(tài)機(jī)。
至此,一個(gè)基本的狀態(tài)機(jī)已經(jīng)建立完畢。這樣的一個(gè)狀態(tài)機(jī)已經(jīng)可以在我們的系統(tǒng)中使用。不過在使用之前,我們還需要為StateCAD工具做一些設(shè)置,才能使圖形形式的狀態(tài)機(jī)轉(zhuǎn)化為HDL語言的形式。
?
1.優(yōu)化設(shè)置
首先對狀態(tài)機(jī)進(jìn)行優(yōu)化設(shè)置,選擇StateCAD工具條上的按鈕,打開優(yōu)化設(shè)置向?qū)?,如圖4.14所示。
圖4.13??添加狀態(tài)轉(zhuǎn)換條件的狀態(tài)機(jī)
圖4.14??優(yōu)化設(shè)置向?qū)?/p>
?
在如圖4.14所示的向?qū)е校崾緦⑦M(jìn)行5個(gè)步驟的設(shè)置,下面分別介紹。
①?選擇目標(biāo)器件。本實(shí)例中選擇FPGA,如圖4.15所示。
圖4.15??選擇目標(biāo)器件
?
②?選擇狀態(tài)機(jī)的優(yōu)化方向,用戶可以選擇速度優(yōu)先、占用面積優(yōu)先以及手動設(shè)置。在本實(shí)例中我們選擇速度優(yōu)先,如圖4.16所示。
③?對狀態(tài)機(jī)的性能改善方式進(jìn)行選擇,如圖4.17所示,本實(shí)例選擇保證覆蓋面積模式。
圖4.16??狀態(tài)機(jī)優(yōu)化方向
?
?圖4.17??狀態(tài)機(jī)性能改善模式
④?加載優(yōu)化參數(shù)設(shè)置,如圖4.18所示。
圖4.18??加載優(yōu)化參數(shù)設(shè)置
?
⑤?為狀態(tài)機(jī)選擇輸出的HDL語言形式以及綜合的EDA工具。在本實(shí)例中,選擇Verilog語言及Xilinx?XST綜合工具,如圖4.19所示。
圖4.19??選擇目標(biāo)HDL語言和EDA工具
經(jīng)過這5個(gè)步驟的設(shè)置,就完成了狀態(tài)機(jī)的優(yōu)化設(shè)置,可以開始生成Verilog語言形式的狀態(tài)機(jī)了。
選擇StateCAD工具欄上的按鈕,開始生成Verilog狀態(tài)機(jī)。如果設(shè)計(jì)沒有錯(cuò)誤,將出現(xiàn)如圖4.20所示的結(jié)果對話框。
圖4.20??狀態(tài)機(jī)生成結(jié)果
單擊“Close”按鈕后,就可以看見生成的與狀態(tài)機(jī)名稱相同、后綴為.v的源文件了。
2.添加設(shè)計(jì)輸入
將使用StateCAD生成的狀態(tài)機(jī)源文件加入工程中,即可查看并編輯相關(guān)的狀態(tài)機(jī)的代碼了。
3.設(shè)置器件及管腳約束
按照開發(fā)板的說明進(jìn)行相關(guān)的設(shè)置。
4.下載驗(yàn)證
本實(shí)例的狀態(tài)機(jī)在開發(fā)板上下載后,將能看到開發(fā)板上的8個(gè)LED循環(huán)變亮,即實(shí)現(xiàn)跑馬燈的功能。
4.6.3??參考設(shè)計(jì)
本實(shí)例相關(guān)參考設(shè)計(jì)文件在本書實(shí)例代碼的“典型實(shí)例6”文件夾。