簡述狀態(tài)機(jī)的本質(zhì)和適應(yīng)的邏輯設(shè)計(jì)場合
狀態(tài)機(jī)的本質(zhì)就是對(duì)具有邏輯順序或時(shí)序規(guī)律事件的一種描述方法。這個(gè)論斷的最重要的兩個(gè)詞就是“邏輯順序”和“時(shí)序規(guī)律”,這兩點(diǎn)就是狀態(tài)機(jī)所要描述的核心和強(qiáng)項(xiàng),換言之,所有具有邏輯順序和時(shí)序規(guī)律的事情都適合用狀態(tài)機(jī)描述。對(duì)于邏輯電路而言,小到一個(gè)簡單的時(shí)序邏輯,大到復(fù)雜的微處理器,都適合用狀態(tài)機(jī)方法進(jìn)行描述。
狀態(tài)機(jī)的基本要素有哪些
它們是:狀態(tài)、輸出和輸入。
狀態(tài):也叫狀態(tài)變量。在邏輯設(shè)計(jì)中,使用狀態(tài)劃分邏輯順序和時(shí)序規(guī)律。比如,設(shè)計(jì)偽隨機(jī)碼發(fā)生器時(shí),可以用移位寄存器序列作為狀態(tài);在設(shè)計(jì)電機(jī)控制電路時(shí),可以以電機(jī)的不同轉(zhuǎn)速作為狀態(tài);在設(shè)計(jì)通信系統(tǒng)時(shí),可以用信號(hào)的狀態(tài)作為狀態(tài)變量等。
輸出:輸出指在某一個(gè)狀態(tài)時(shí)特定發(fā)生的事件。如設(shè)計(jì)電機(jī)控制電路中,如果電機(jī)轉(zhuǎn)速過高,則輸出為轉(zhuǎn)速過高報(bào)警,也可以伴隨減速指令或降溫措施等。
輸入:指狀態(tài)機(jī)中進(jìn)入每個(gè)狀態(tài)的條件,有的狀態(tài)機(jī)沒有輸入條件,其中的狀態(tài)轉(zhuǎn)移較為簡單,有的狀態(tài)機(jī)有輸入條件,當(dāng)某個(gè)輸入條件存在時(shí)才能轉(zhuǎn)移到相應(yīng)的狀態(tài)。根據(jù)狀態(tài)機(jī)的輸出是否與輸入條件相關(guān),可將狀態(tài)機(jī)分為兩大類:摩爾(Moore)型狀態(tài)機(jī)和米勒(Mealy)型狀態(tài)機(jī)。
摩爾狀態(tài)機(jī):摩爾狀態(tài)機(jī)的輸出僅僅依賴于當(dāng)前狀態(tài),而與輸入條件無關(guān)。米勒型狀態(tài)機(jī):米勒型狀態(tài)機(jī)的輸出不僅依賴于當(dāng)前狀態(tài),而且取決于該狀態(tài)的輸入條件。
兩段式、三段式FSM描述方法的基本結(jié)構(gòu)如何
狀態(tài)機(jī)描述時(shí)關(guān)鍵是要描述清楚幾個(gè)狀態(tài)機(jī)的要素,即如何進(jìn)行狀態(tài)轉(zhuǎn)移,每個(gè)狀態(tài)的輸出是什么,狀態(tài)轉(zhuǎn)移的條件等。具體描述時(shí)方法各種各樣,最常見的有三種描述方式。
一段式:整個(gè)狀態(tài)機(jī)寫到一個(gè)always模塊里面,在該模塊中既描述狀態(tài)轉(zhuǎn)移,又描述狀態(tài)的輸入和輸出。二段式:用兩個(gè)always模塊來描述狀態(tài)機(jī),其中一個(gè)always模塊采用同步時(shí)序描述狀態(tài)轉(zhuǎn)移;另一個(gè)模塊采用組合邏輯判斷狀態(tài)轉(zhuǎn)移條件,描述狀態(tài)轉(zhuǎn)移規(guī)律以及輸出。三段式:在兩個(gè)always模塊描述方法基礎(chǔ)上,使用三個(gè)always模塊,一個(gè)always模塊采用同步時(shí)序描述狀態(tài)轉(zhuǎn)移,一個(gè)always采用組合邏輯判斷狀態(tài)轉(zhuǎn)移條件,描述狀態(tài)轉(zhuǎn)移規(guī)律,另一個(gè)always模塊描述狀態(tài)輸出(可以用組合電路輸出,也可以時(shí)序電路輸出)。
一般而言,推薦的FSM 描述方法是后兩種。FSM和其他設(shè)計(jì)一樣,最好使用同步時(shí)序方式設(shè)計(jì),以提高設(shè)計(jì)的穩(wěn)定性,消除毛刺。狀態(tài)機(jī)實(shí)現(xiàn)后,一般來說,狀態(tài)轉(zhuǎn)移部分是同步時(shí)序電路而狀態(tài)的轉(zhuǎn)移條件的判斷是組合邏輯。
FSM描述何時(shí)使用阻塞賦值,何時(shí)使用非阻塞賦值
為了避免不必要的競爭冒險(xiǎn),不論是做兩段式還是三段式FSM 描述時(shí),必須遵循時(shí)序邏輯always模塊使用非阻塞賦值“<=”,即當(dāng)前狀態(tài)向下一狀態(tài)時(shí)序轉(zhuǎn)移,和寄存FSM 輸出等時(shí)序always模塊中都要使用非阻塞賦值;而組合邏輯always模塊使用阻塞賦值“=”,即狀態(tài)轉(zhuǎn)移條件判斷,組合邏輯輸出等always模塊中都要使用阻塞賦值。
一般非阻塞賦值用于時(shí)序邏輯,而阻塞賦值用于組合邏輯;非阻塞賦值語句是并行執(zhí)行的,等到一個(gè)時(shí)鐘完成后才完成賦值,而阻塞賦值是順序執(zhí)行的,下一條賦值語句要等到上一條賦值語句完成后才能賦值,并且阻塞賦值是立即完成的。
三段式FSM描述的兩個(gè)case結(jié)構(gòu)中判斷表達(dá)式與當(dāng)前狀態(tài)和下一個(gè)狀態(tài)寄存器的對(duì)應(yīng)關(guān)系如何
使用一段式建模FSM 的寄存器輸出的時(shí)候,必須要綜合考慮現(xiàn)態(tài)在何種狀態(tài)轉(zhuǎn)移條件下會(huì)進(jìn)入哪些次態(tài),然后在每個(gè)現(xiàn)態(tài)的case分支下分別描述每個(gè)次態(tài)的輸出,這顯然不符合思維習(xí)慣;而三段式建模描述FSM 的狀態(tài)機(jī)輸出時(shí),只需指定case敏感表為次態(tài)寄存器,然后直接在每個(gè)次態(tài)的case分支中描述該狀態(tài)的輸出即可,根本不用考慮狀態(tài)轉(zhuǎn)移條件。