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

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

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

FPGA:狀態(tài)機(jī)簡(jiǎn)述

FPGA開(kāi)源工作室 ? 來(lái)源:FPGA開(kāi)源工作室 ? 作者:FreeZynq ? 2020-11-05 17:58 ? 次閱讀

本文目錄

前言

狀態(tài)機(jī)簡(jiǎn)介

狀態(tài)機(jī)分類(lèi)
Mealy 型狀態(tài)機(jī)
Moore 型狀態(tài)機(jī)

狀態(tài)機(jī)描述
一段式狀態(tài)機(jī)
二段式狀態(tài)機(jī)
三段式狀態(tài)機(jī)

狀態(tài)機(jī)優(yōu)缺點(diǎn)

總結(jié)

擴(kuò)展-四段式狀態(tài)機(jī)

01. 前言

狀態(tài)機(jī)是FPGA設(shè)計(jì)中一種非常重要、非常根基的設(shè)計(jì)思想,堪稱(chēng)FPGA的靈魂,貫穿FPGA設(shè)計(jì)的始終。

02. 狀態(tài)機(jī)簡(jiǎn)介

什么是狀態(tài)機(jī):狀態(tài)機(jī)通過(guò)不同的狀態(tài)遷移來(lái)完成特定的邏輯操作(時(shí)序操作)狀態(tài)機(jī)是許多數(shù)字系統(tǒng)的核心部件, 是一類(lèi)重要的時(shí)序邏輯電路。通常包括三個(gè)部分:
下一個(gè)狀態(tài)的邏輯電路
存儲(chǔ)狀態(tài)機(jī)當(dāng)前狀態(tài)的時(shí)序邏輯電路
輸出組合邏輯電路

03. 狀態(tài)機(jī)分類(lèi)

通常, 狀態(tài)機(jī)的狀態(tài)數(shù)量有限, 稱(chēng)為有限狀態(tài)機(jī)(FSM) 。由于狀態(tài)機(jī)所有觸發(fā)器的時(shí)鐘由同一脈沖邊沿觸發(fā), 故也稱(chēng)之為同步狀態(tài)機(jī)。

根據(jù)狀態(tài)機(jī)的輸出信號(hào)是否與電路的輸入有關(guān)分為 Mealy 型狀態(tài)機(jī)和 Moore 型狀態(tài)機(jī)

3.1,Mealy 型狀態(tài)機(jī)

電路的輸出信號(hào)不僅與電路當(dāng)前狀態(tài)有關(guān), 還與電路的輸入有關(guān)

3.2,Moore 型狀態(tài)機(jī)

電路的輸出僅僅與各觸發(fā)器的狀態(tài), 不受電路輸入信號(hào)影響或無(wú)輸入

狀態(tài)機(jī)的狀態(tài)轉(zhuǎn)移圖, 通常也可根據(jù)輸入和內(nèi)部條件畫(huà)出。一般來(lái)說(shuō), 狀態(tài)機(jī)的設(shè)計(jì)包含下列設(shè)計(jì)步驟:

根據(jù)需求和設(shè)計(jì)原則, 確定是 Moore 型還是 Mealy 型狀態(tài)機(jī);

分析狀態(tài)機(jī)的所有狀態(tài), 對(duì)每一狀態(tài)選擇合適的編碼方式, 進(jìn)行編碼;

根據(jù)狀態(tài)轉(zhuǎn)移關(guān)系和輸出繪出狀態(tài)轉(zhuǎn)移圖;

構(gòu)建合適的狀態(tài)機(jī)結(jié)構(gòu), 對(duì)狀態(tài)機(jī)進(jìn)行硬件描述。

04. 狀態(tài)機(jī)描述

狀態(tài)機(jī)的描述通常有三種方法, 稱(chēng)為一段式狀態(tài)機(jī), 二段式狀態(tài)機(jī)和三段式狀態(tài)機(jī)。
狀態(tài)機(jī)的描述通常包含以下四部分:

利用參數(shù)定義語(yǔ)句 parameter 描述狀態(tài)機(jī)各個(gè)狀態(tài)名稱(chēng), 即狀態(tài)編碼。狀態(tài)編碼通常有很多方法包含自然二進(jìn)制編碼, One-hot 編碼,格雷編碼碼等;

用時(shí)序的 always 塊描述狀態(tài)觸發(fā)器實(shí)現(xiàn)狀態(tài)存儲(chǔ);

使用敏感表和 case 語(yǔ)句(也采用 if-else 等價(jià)語(yǔ)句) 描述狀態(tài)轉(zhuǎn)換邏輯;

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

下面根據(jù)狀態(tài)機(jī)的三種方法來(lái)具體說(shuō)明

4.1,一段式狀態(tài)機(jī)

1moduledetect_1( 2inputclk_i, 3inputrst_n_i, 4outputout_o 5); 6regout_r; 7//狀態(tài)聲明和狀態(tài)編碼 8reg[1:0]state; 9parameter[1:0]S0=2'b00; 10parameter[1:0]S1=2'b01; 11parameter[1:0]S2=2'b10; 12parameter[1:0]S3=2'b11; 13always@(posedgeclk_i) 14begin 15if(!rst_n_i)begin 16state<=0; 17????out_r<=1'b0; 18??end 19??else 20????case(state) 21??????S0?: 22??????begin 23????????out_r<=1'b0; 24????????state<=?S1; 25??????end 26??????S1?: 27??????begin 28????????out_r<=1'b1; 29????????state<=?S2; 30??????end 31??????S2?: 32??????begin 33????????out_r<=1'b0; 34????????state<=?S3; 35??????end 36??????S3?: 37????????begin 38????????out_r<=1'b1; 39??????end 40????endcase 41end 42assign?out_o=out_r; 43endmodul 44

一段式狀態(tài)機(jī)是應(yīng)該避免使用的, 該寫(xiě)法僅僅適用于非常簡(jiǎn)單的狀態(tài)機(jī)設(shè)計(jì)。

4.2,兩段式狀態(tài)機(jī)

1moduledetect_2( 2inputclk_i, 3inputrst_n_i, 4outputout_o 5); 6regout_r; 7//狀態(tài)聲明和狀態(tài)編碼 8reg[1:0]Current_state; 9reg[1:0]Next_state; 10parameter[1:0]S0=2'b00; 11parameter[1:0]S1=2'b01; 12parameter[1:0]S2=2'b10; 13parameter[1:0]S3=2'b11; 14//時(shí)序邏輯:描述狀態(tài)轉(zhuǎn)換 15always@(posedgeclk_i) 16begin 17if(!rst_n_i) 18Current_state<=0; 19????else 20??????Current_state<=Next_state; 21??end 22??//組合邏輯:描述下一狀態(tài)和輸出 23??always@(*) 24??begin 25????out_r=1'b0; 26????case(Current_state) 27??????S0?: 28????????begin 29??????????out_r=1'b0; 30??????????Next_state=?S1; 31????????end 32??????S1?: 33????????begin 34??????????out_r=1'b1; 35??????????Next_state=?S2; 36????????end 37??????S2?: 38????????begin 39??????????out_r=1'b0; 40??????????Next_state=?S3; 41????????end 42??????S3?: 43????????begin 44??????????out_r=1'b1; 45??????????Next_state=Next_state; 46????????end 47????endcase 48??end 49??assign?out_o?=?out_r; 50endmodule 51

兩段式狀態(tài)機(jī)采用兩個(gè) always 模塊實(shí)現(xiàn)狀態(tài)機(jī)的功能, 其中一個(gè) always 采用同步時(shí)序邏輯描述狀態(tài)轉(zhuǎn)移, 另一個(gè) always 采用組合邏輯來(lái)判斷狀態(tài)條件轉(zhuǎn)移。

4.3,三段式狀態(tài)機(jī)

1moduledetect_3( 2inputclk_i, 3inputrst_n_i, 4outputout_o 5); 6regout_r; 7//狀態(tài)聲明和狀態(tài)編碼 8reg[1:0]Current_state; 9reg[1:0]Next_state; 10parameter[1:0]S0=2'b00; 11parameter[1:0]S1=2'b01; 12parameter[1:0]S2=2'b10; 13parameter[1:0]S3=2'b11; 14//時(shí)序邏輯:描述狀態(tài)轉(zhuǎn)換 15always@(posedgeclk_i) 16begin 17if(!rst_n_i) 18Current_state<=0; 19????else 20??????Current_state<=Next_state; 21??end 22??//組合邏輯:?描述下一狀態(tài) 23??always@(*) 24??begin 25????case(Current_state) 26??????S0: 27????????Next_state?=?S1; 28??????S1: 29????????Next_state?=?S2; 30??????S2: 31????????Next_state?=?S3; 32??????S3: 33????????begin 34??????????Next_state?=?Next_state; 35????????end 36??????default?: 37??????Next_state?=?S0; 38????endcase 39??end 40??//輸出邏輯:?讓輸出 out,?經(jīng)過(guò)寄存器 out_r 鎖存后輸出,?消除毛刺 41??always@(posedge?clk_i) 42??begin 43????if(!rst_n_i) 44??????out_r<=1'b0; 45????else 46??????begin 47????????case(Current_state) 48??????????S0,S2: 49????????????out_r<=1'b0; 50??????????S1,S3: 51????????????out_r<=1'b1; 52??????????default?: 53????????????out_r<=out_r; 54????????endcase 55??????end 56??end 57 58??assign?out_o=out_r; 59endmodule 60

三段式狀態(tài)機(jī)在第一個(gè) always 模塊采用同步時(shí)序邏輯方式描述狀態(tài)轉(zhuǎn)移, 第二個(gè)always 模塊采用組合邏輯方式描述狀態(tài)轉(zhuǎn)移規(guī)律, 第三個(gè) always 描述電路的輸出。通常讓輸出信號(hào)經(jīng)過(guò)寄存器緩存之后再輸出, 消除電路毛刺。

05. 狀態(tài)機(jī)優(yōu)缺點(diǎn)

1、一段式狀態(tài)機(jī)

只涉及時(shí)序電路,沒(méi)有競(jìng)爭(zhēng)與冒險(xiǎn),同時(shí)消耗邏輯比較少。

但是如果狀態(tài)非常多,一段式狀態(tài)機(jī)顯得比較臃腫,不利于維護(hù)。

2、兩段式狀態(tài)機(jī)

當(dāng)一個(gè)模塊采用時(shí)序(狀態(tài)轉(zhuǎn)移),一個(gè)模塊采用組合時(shí)候(狀態(tài)機(jī)輸出),組合邏輯電路容易造成競(jìng)爭(zhēng)與冒險(xiǎn);當(dāng)兩個(gè)模塊都采用時(shí)序,可以避免競(jìng)爭(zhēng)與冒險(xiǎn)的存在,但是整個(gè)狀態(tài)機(jī)的時(shí)序上會(huì)延時(shí)一個(gè)周期。

兩段式狀態(tài)機(jī)是推薦的狀態(tài)機(jī)設(shè)計(jì)方法。

3、三段式狀態(tài)機(jī)

三段式狀態(tài)機(jī)在狀態(tài)轉(zhuǎn)移時(shí)采用組合邏輯電路+格雷碼,避免了組合邏輯的競(jìng)爭(zhēng)與冒險(xiǎn);狀態(tài)機(jī)輸出采用了同步寄存器輸出,也可以避免組合邏輯電路的競(jìng)爭(zhēng)與冒險(xiǎn);采用這兩種方法極大的降低了競(jìng)爭(zhēng)冒險(xiǎn)。并且在狀態(tài)機(jī)的采用這種組合邏輯電路+次態(tài)寄存器輸出,避免了兩段式狀態(tài)機(jī)的延時(shí)一個(gè)周期(三段式狀態(tài)機(jī)在上一狀態(tài)中根據(jù)輸入條件判斷當(dāng)前狀態(tài)的輸出,從而在不插入額外時(shí)鐘節(jié)拍的前提下,實(shí)現(xiàn)寄存器的輸出)。

三段式狀態(tài)機(jī)也是比較推崇的,主要是由于維護(hù)方便, 組合邏輯與時(shí)序邏輯完全獨(dú)立。

06. 總結(jié)

靈活選擇狀態(tài)機(jī),不一定要拘泥理論,怎樣方便怎樣來(lái)

07.擴(kuò)展

四段式不是指三個(gè)always代碼,而是四段程序。使用四段式的寫(xiě)法,可參照明德?lián)PGVIM特色指令Ztj產(chǎn)生的狀態(tài)機(jī)模板。

明·德·揚(yáng)四段式狀態(tài)機(jī)符合一次只考慮一個(gè)因素的設(shè)計(jì)理念。

第一段代碼,照抄格式,完全不用想其他的。

第二段代碼,只考慮狀態(tài)之間的跳轉(zhuǎn),也就是說(shuō)各個(gè)狀態(tài)機(jī)之間跳轉(zhuǎn)關(guān)系。

第三段代碼,只考慮跳轉(zhuǎn)條件。

第四段,每個(gè)信號(hào)逐個(gè)設(shè)計(jì)。

有興趣的話(huà)可以自己去學(xué)習(xí)一下,或者h(yuǎn)ttp://www.mdyedu.com/product/299.html自行看視頻。

責(zé)任編輯:xj

原文標(biāo)題:FPGA 高手養(yǎng)成記-淺談狀態(tài)機(jī)

文章出處:【微信公眾號(hào):FPGA開(kāi)源工作室】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

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

    關(guān)注

    1620

    文章

    21510

    瀏覽量

    598877
  • 時(shí)鐘
    +關(guān)注

    關(guān)注

    10

    文章

    1673

    瀏覽量

    130946
  • 狀態(tài)機(jī)
    +關(guān)注

    關(guān)注

    2

    文章

    489

    瀏覽量

    27391

原文標(biāo)題:FPGA 高手養(yǎng)成記-淺談狀態(tài)機(jī)

文章出處:【微信號(hào):leezym0317,微信公眾號(hào):FPGA開(kāi)源工作室】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

    FPGA(現(xiàn)場(chǎng)可編程門(mén)陣列)中實(shí)現(xiàn)狀態(tài)機(jī)是一種常見(jiàn)的做法,用于控制復(fù)雜的數(shù)字系統(tǒng)行為。狀態(tài)機(jī)能夠根據(jù)當(dāng)前的輸入和系統(tǒng)狀態(tài),決定下一步的動(dòng)作和新的
    的頭像 發(fā)表于 07-18 15:57 ?260次閱讀

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

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

    在Verilog中實(shí)現(xiàn)Moore型和Mealy型狀態(tài)機(jī)的方法簡(jiǎn)析

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

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

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

    Verilog狀態(tài)機(jī)+設(shè)計(jì)實(shí)例

    在verilog中狀態(tài)機(jī)的一種很常用的邏輯結(jié)構(gòu),學(xué)習(xí)和理解狀態(tài)機(jī)的運(yùn)行規(guī)律能夠幫助我們更好地書(shū)寫(xiě)代碼,同時(shí)作為一種思想方法,在別的代碼設(shè)計(jì)中也會(huì)有所幫助。 一、簡(jiǎn)介 在使用過(guò)程中我們常說(shuō)
    的頭像 發(fā)表于 02-12 19:07 ?3160次閱讀
    Verilog<b class='flag-5'>狀態(tài)機(jī)</b>+設(shè)計(jì)實(shí)例

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

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

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

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

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

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

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

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

    狀態(tài)機(jī)怎么上來(lái)就錯(cuò)了?怎么解決?

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

    使用枚舉類(lèi)型表示狀態(tài)機(jī)進(jìn)入死循環(huán)

    在定義狀態(tài)機(jī)中的狀態(tài)時(shí),除了可以使用宏(define)或者參數(shù)(parameter)聲明定義外,還可以使用枚舉類(lèi)型
    的頭像 發(fā)表于 11-07 17:46 ?776次閱讀
    使用枚舉類(lèi)型表示<b class='flag-5'>狀態(tài)機(jī)</b>進(jìn)入死循環(huán)

    基于有限狀態(tài)機(jī)的車(chē)身防盜報(bào)警的實(shí)現(xiàn)

    電子發(fā)燒友網(wǎng)站提供《基于有限狀態(tài)機(jī)的車(chē)身防盜報(bào)警的實(shí)現(xiàn).pdf》資料免費(fèi)下載
    發(fā)表于 10-26 09:48 ?0次下載
    基于有限<b class='flag-5'>狀態(tài)機(jī)</b>的車(chē)身防盜報(bào)警的實(shí)現(xiàn)

    什么是狀態(tài)機(jī)狀態(tài)機(jī)的種類(lèi)與實(shí)現(xiàn)

    狀態(tài)機(jī),又稱(chēng)有限狀態(tài)機(jī)(Finite State Machine,F(xiàn)SM)或米利狀態(tài)機(jī)(Mealy Machine),是一種描述系統(tǒng)狀態(tài)變化的模型。在芯片設(shè)計(jì)中,
    的頭像 發(fā)表于 10-19 10:27 ?8041次閱讀

    有限狀態(tài)機(jī)分割設(shè)計(jì)

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

    BGP有限狀態(tài)機(jī)有哪幾種狀態(tài)?

    BGP有限狀態(tài)機(jī)共有六種狀態(tài),分別是Idle、Connect、Active、OpenSent、OpenConfirm和Established。
    的頭像 發(fā)表于 10-07 14:56 ?1883次閱讀