0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

采用米利型的狀態(tài)機電路設計

西西 ? 來源:博客園 ? 作者: zxl2431 ? 2020-09-08 14:06 ? 次閱讀

1.0 序列檢測電路設計

設計一個序列檢測器電路,功能是:檢測出串行輸入數(shù)據(jù)Sin中的4位二進制序列0101(自左至右輸入),當檢測到該序列時,輸出Out=1;沒有檢測到該序列時,輸出Out=0(注意考慮序列重疊的可能性,如010101,相當于出現(xiàn)兩個0101序列)。

經(jīng)過分析,首先可以確定采用米利型狀態(tài)機設計該電路。因為該電路在連續(xù)收到信號0101時,輸出為1,其他情況下輸出為0,所以采用米利型狀態(tài)機。

其次,確定狀態(tài)機的狀態(tài)圖,該電路必須能記憶所收到的輸入數(shù)據(jù)0、連續(xù)收到前兩個數(shù)據(jù)01.。。可見至少要是個狀態(tài),分別用S1,S2,S3,S4,再加上電路初始態(tài)S0。根據(jù)要求可以畫出狀態(tài)圖:

采用米利型的狀態(tài)機電路設計

觀察該圖可以看出,當狀態(tài)機處以S2、S4的時候,如果輸入Sin = 1,則電路會轉(zhuǎn)移到相同的次態(tài)S0,如果輸入Sin = 0,則電路會轉(zhuǎn)移到相同的次態(tài)S3,且兩種情況下輸出Out都為0。所以,S2、S4為等價狀態(tài),可用S2代替S4,于是得到簡化的狀態(tài)圖:

如果用CPLD/FPGA器件實現(xiàn)狀態(tài)機,則邏輯綜合器會自動化簡狀態(tài)機。

利用Verilog HDL描述狀態(tài)圖主要包括:

(1) 利用參數(shù)定義語句parameter描述狀態(tài)機中各個狀態(tài)的名稱,并指定狀態(tài)編碼。

(2) 用時序的always塊描述狀態(tài)觸發(fā)器實現(xiàn)的狀態(tài)存儲。

(3) 使用敏感表和case語句(也可以采用if-else語句)描述狀態(tài)轉(zhuǎn)換邏輯。

(4) 描述狀態(tài)機的輸出邏輯。

這個電路我試著用3種方式來描述,看看他們的差別在哪里。

(1) 單個always塊描述狀態(tài)機方法(應該避免的寫法)

生成的RTL視圖:

采用米利型的狀態(tài)機電路設計

State模塊里面其實就是一個狀態(tài)機:

采用米利型的狀態(tài)機電路設計

仿真結(jié)果有時會出錯:

采用米利型的狀態(tài)機電路設計

在每個clk上升沿讀取數(shù)據(jù),可以看到是0101,在285ps時輸出oOut應該是高電平,但不是,這是為什么了?再看下面一張圖

采用米利型的狀態(tài)機電路設計

這張是對的,為什么有時對又是錯了,如果是這樣那就失去了它的意義了。

對序列檢測器電路用單個always塊的描述的邏輯存在一個隱含的錯誤,即輸出信號oOut的描述存在錯誤。其原因是:oOut信號是由狀態(tài)機的當前狀態(tài)和輸入信號共同決定的,它是一個純組合邏輯電路,如果當前狀態(tài)不變,而輸入信號變了,oOut信號應立即發(fā)生變化,而不是等到時鐘上升沿來了才變化。因此,單個always塊描述狀態(tài)機的寫法僅僅適用于穆爾型狀態(tài)機。這雖然是個問題,但是跟我出現(xiàn)的問題貌似沒有什么直接關(guān)系,郁悶。。。繼續(xù)思考。

在實際應用中,為了消除組合邏輯輸出信號中的毛刺,在時序允許的情況下,通常允許米利型狀態(tài)機中輸出信號通過寄存器輸出。但是單個的always塊的描述方法將狀態(tài)轉(zhuǎn)換判斷的組合邏輯和狀態(tài)觸發(fā)器轉(zhuǎn)移的時序邏輯混合編寫在同一個always塊中,不符合將時序和組合邏輯分開描述的代碼風格(Coding Style),而且在描述當前狀態(tài)時還要考慮下一個狀態(tài)的邏輯,整個代碼的結(jié)構(gòu)不清晰,不利于修改和維護,不利于時序約束條件的加入,不利于綜合器對設計的優(yōu)化。所以不推薦使用單個always塊的描述方式。

必須為自己的粗心大意買單,還說輸出有時會出錯原來狀態(tài)圖都是錯了,不經(jīng)意的一眼,看來不能隨便啊。case語句后的 S1:當條件滿足時(iSin == 1‘b1)時會跳到S2否則還會停留在S1。改過來看看正確的狀態(tài)機就不會出錯了。太粗心了!

正確的狀態(tài)機:

采用米利型的狀態(tài)機電路設計

(2) 兩個always塊描述狀態(tài)機的方法(推薦寫法)

值得注意的是Next_state = 2’bxx;對狀態(tài)的默認賦值有3種方式:(1) 全部設置成不定狀態(tài)(x); (2) 設置成預先規(guī)定的初始狀態(tài); (3) 設置成FSM中的某一有效狀態(tài)。設置成不定狀態(tài)(x)的好處是:(1) 在仿真時可以很好地考察所設計的FSM的完備性,若設計的FSM不完備,則進入任意狀態(tài),仿真時容易發(fā)現(xiàn);(2) 綜合器對代碼進行綜合時,會忽略沒有定義的狀態(tài)觸發(fā)器向量。

生成的RTL視圖:

采用米利型的狀態(tài)機電路設計

和上面的比較了一下,少了個D觸發(fā)器,這是為什么呢?并且仿真的結(jié)果也不一樣了。仿真圖:

采用米利型的狀態(tài)機電路設計

當然新的問題也就隨之而來:

采用米利型的狀態(tài)機電路設計

我們可以明顯的看到這種寫法和上面寫法的區(qū)別,最重要的是:輸出oOut不在是在clk上升沿來的時候才能發(fā)生變化,它是一個純組合邏輯電路只要輸入條件滿足輸出就立馬發(fā)生改變。隨著毛刺的出現(xiàn),毛刺是一個很重要的問題,很值得我們認真思考。為什么會出現(xiàn)毛刺了,我們可以清楚的看到這時次態(tài)是完全由組合邏輯電路決定的,時序電路做的事情僅僅是在clk上升沿來的時候把,把次態(tài)賦給現(xiàn)態(tài)。在445ps時在S1狀態(tài),輸出為0、在455ps時在S2狀態(tài),輸出為0、在465ps時在S3狀態(tài),此時就算clk的posedge不來,只要iSin == 1,輸出同樣會為1,正如上圖,但在這里,clk 的上升沿和iSin 的高電平是同時來的,所以,在 iSin 的高電平來的那一瞬間,輸出oOut = 1,就在同時狀態(tài)裝換到S2,輸出oOut = 0;

這就導致了上面毛刺的產(chǎn)生。怎么解決這個問題呢?我們來看看第三種方法。

(3) 3個always塊描述狀態(tài)機(推薦寫法)

分析一下代碼,我們很容易看出:第一個always塊采用同步時序邏輯方式描述狀態(tài)轉(zhuǎn)移(在電路框圖的中間框),第二個always塊采用組合邏輯方式描述狀態(tài)轉(zhuǎn)移規(guī)律(一般是第一個方框),第三個always塊描述電路的輸出信號,在時序允許的情況下,通常讓輸出信號經(jīng)過一個寄存器再輸出,保證輸出信號中沒有毛刺。

綜合后的RTL視圖,就跟第一版程序是一樣的了,又有了D觸發(fā)器,仿真結(jié)果和第一版也是一樣的,但是兩版代碼的風格(Coding Style)是不一樣的。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 邏輯電路
    +關(guān)注

    關(guān)注

    13

    文章

    490

    瀏覽量

    42455
  • 檢測器
    +關(guān)注

    關(guān)注

    1

    文章

    847

    瀏覽量

    47558
  • D觸發(fā)器
    +關(guān)注

    關(guān)注

    3

    文章

    164

    瀏覽量

    47738
  • 狀態(tài)機
    +關(guān)注

    關(guān)注

    2

    文章

    489

    瀏覽量

    27395
收藏 人收藏

    評論

    相關(guān)推薦

    觸發(fā)器和狀態(tài)機的關(guān)系是什么

    觸發(fā)器和狀態(tài)機在數(shù)字電路設計中有著緊密的關(guān)系,它們共同構(gòu)成了時序邏輯電路的基礎(chǔ),用于實現(xiàn)數(shù)據(jù)的存儲、處理和傳輸。
    的頭像 發(fā)表于 08-12 11:24 ?238次閱讀

    如何在FPGA中實現(xiàn)狀態(tài)機

    在FPGA(現(xiàn)場可編程門陣列)中實現(xiàn)狀態(tài)機是一種常見的做法,用于控制復雜的數(shù)字系統(tǒng)行為。狀態(tài)機能夠根據(jù)當前的輸入和系統(tǒng)狀態(tài),決定下一步的動作和新的狀態(tài)。這里,我們將詳細探討如何在FPG
    的頭像 發(fā)表于 07-18 15:57 ?261次閱讀

    玩轉(zhuǎn)Spring狀態(tài)機

    說起Spring狀態(tài)機,大家很容易聯(lián)想到這個狀態(tài)機和設計模式中狀態(tài)模式的區(qū)別是啥呢?沒錯,Spring狀態(tài)機就是狀態(tài)模式的一種實現(xiàn),在介紹S
    的頭像 發(fā)表于 06-25 14:21 ?749次閱讀
    玩轉(zhuǎn)Spring<b class='flag-5'>狀態(tài)機</b>

    在Verilog中實現(xiàn)Moore和Mealy狀態(tài)機的方法簡析

    編寫能夠被綜合工具識別的狀態(tài)機,首先需要理解狀態(tài)機的基本概念和分類。狀態(tài)機(FSM)是表示有限個狀態(tài)以及在這些狀態(tài)之間轉(zhuǎn)換的邏輯結(jié)構(gòu)。
    的頭像 發(fā)表于 05-01 11:38 ?1058次閱讀

    如何采用狀態(tài)機”解析UART數(shù)據(jù)幀

    如果一個系統(tǒng)接收上述“不定長度”的協(xié)議幀,將會有一個挑戰(zhàn)--如何高效接收與解析。 為簡化系統(tǒng)設計,我們強烈建議您采用狀態(tài)機”來解析UART數(shù)據(jù)幀。
    的頭像 發(fā)表于 03-25 14:29 ?472次閱讀
    如何<b class='flag-5'>采用</b>“<b class='flag-5'>狀態(tài)機</b>”解析UART數(shù)據(jù)幀

    什么是有限狀態(tài)機?如何解決傳統(tǒng)有限狀態(tài)機狀態(tài)爆炸」問題?

    有限狀態(tài)機(Finite State Machine,簡稱FSM)是一種用來進行對象行為建模的工具,其作用主要是描述對象在它的生命周期內(nèi)所經(jīng)歷的狀態(tài)序列以及如何響應來自外界的各種事件。
    的頭像 發(fā)表于 02-17 16:09 ?5350次閱讀
    什么是有限<b class='flag-5'>狀態(tài)機</b>?如何解決傳統(tǒng)有限<b class='flag-5'>狀態(tài)機</b>「<b class='flag-5'>狀態(tài)</b>爆炸」問題?

    Verilog狀態(tài)機+設計實例

    的是有限狀態(tài)機(Finite-State Machine,F(xiàn)SM),簡稱為狀態(tài)機,表示在有限個狀態(tài)以及這些狀態(tài)之間的轉(zhuǎn)移和動作等行為的數(shù)學模型。 二、分類 在verilog中常使用的
    的頭像 發(fā)表于 02-12 19:07 ?3175次閱讀
    Verilog<b class='flag-5'>狀態(tài)機</b>+設計實例

    狀態(tài)機該怎么監(jiān)控

    狀態(tài)機卡住的場景——通過狀態(tài)跳轉(zhuǎn)條件的DFX信號去判斷卡住的原因
    的頭像 發(fā)表于 01-15 10:03 ?316次閱讀
    <b class='flag-5'>狀態(tài)機</b>該怎么監(jiān)控

    Spring狀態(tài)機的實現(xiàn)原理和使用方法

    說起 Spring 狀態(tài)機,大家很容易聯(lián)想到這個狀態(tài)機和設計模式中狀態(tài)模式的區(qū)別是啥呢?沒錯,Spring 狀態(tài)機就是狀態(tài)模式的一種實現(xiàn),在
    的頭像 發(fā)表于 12-26 09:39 ?1718次閱讀
    Spring<b class='flag-5'>狀態(tài)機</b>的實現(xiàn)原理和使用方法

    SaberRD狀態(tài)機建模工具介紹(二)狀態(tài)機建模工具使用示例

    假設電阻阻值為r_normal,首先打開狀態(tài)機建模工具,添加電阻端口,電阻端口包含貫通變量電流和跨接變量電壓,使用分支端口。
    的頭像 發(fā)表于 12-05 09:53 ?755次閱讀
    SaberRD<b class='flag-5'>狀態(tài)機</b>建模工具介紹(二)<b class='flag-5'>狀態(tài)機</b>建模工具使用示例

    SaberRD狀態(tài)機建模工具介紹(一)什么是狀態(tài)機建模

    狀態(tài)機建模是使用狀態(tài)圖和方程式的手段,創(chuàng)建基于混合信號的有限狀態(tài)機模型的一種建模工具。
    的頭像 發(fā)表于 12-05 09:51 ?1293次閱讀
    SaberRD<b class='flag-5'>狀態(tài)機</b>建模工具介紹(一)什么是<b class='flag-5'>狀態(tài)機</b>建模

    狀態(tài)機怎么上來就錯了?怎么解決?

    狀態(tài)機本身很簡單,default也寫了,然后進行仿真時看到了這樣的波形:
    的頭像 發(fā)表于 12-04 10:43 ?300次閱讀
    <b class='flag-5'>狀態(tài)機</b>怎么上來就錯了?怎么解決?

    車載AM/FM收音機電路設計

    電子發(fā)燒友網(wǎng)站提供《車載AM/FM收音機電路設計.doc》資料免費下載
    發(fā)表于 11-20 11:33 ?4次下載
    車載AM/FM收音<b class='flag-5'>機電路設計</b>

    什么是狀態(tài)機?狀態(tài)機的種類與實現(xiàn)

    狀態(tài)機,又稱有限狀態(tài)機(Finite State Machine,F(xiàn)SM)或米利狀態(tài)機(Mealy Machine),是一種描述系統(tǒng)狀態(tài)變化
    的頭像 發(fā)表于 10-19 10:27 ?8063次閱讀

    有限狀態(tài)機分割設計

    有限狀態(tài)機分割設計,其實質(zhì)就是一個狀態(tài)機分割成多個狀態(tài)機
    的頭像 發(fā)表于 10-09 10:47 ?532次閱讀