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

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

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

FSM狀態(tài)機序列檢測的方法

冬至子 ? 來源:FPGA探索者 ? 作者:FPGA探索者 ? 2023-06-26 16:45 ? 次閱讀

(1)了解狀態(tài)機:什么是 摩爾型狀態(tài)機 ,什么是 米利型狀態(tài)機 ,兩者的區(qū)別是什么?一段式、二段式、三段式狀態(tài)機的區(qū)別?

(2)使用 狀態(tài)機產(chǎn)生序列 “11010110”,串行循環(huán)輸出該序列;

(3)使用 狀態(tài)機檢測“1101” ,串行輸入的測試序列為“11101101011010”,輸出信號為valid有效信號,檢測到時輸出高,否則為低, 考慮序列疊加情況 ,比如“1101101”,則有兩個“1101”,

即:

1.jpg

11101101011010,在第5個時鐘檢測到序列,下一個時鐘輸出高電平;

11101101011010,在第8個時鐘檢測到序列,下一個時鐘輸出高電平;

11101101011010,在第13個時鐘檢測到序列,下一個時鐘輸出高電平;

給出WORD或PDF版本的報告,包括但不限于文字說明、代碼、仿真測試圖等。

【解答】:

狀態(tài)機類型

狀態(tài)機由狀態(tài)寄存器和組合邏輯電路構(gòu)成,能夠根據(jù)控制信號按照預先設定的狀態(tài)進行狀態(tài)轉(zhuǎn)移,是協(xié)調(diào)相關(guān)信號動作、完成特定操作的控制中心。有限狀態(tài)機簡寫為 FSM(Finite State Machine) ,主要分為2大類:

第一類,輸出只和狀態(tài)有關(guān)而與輸入無關(guān),則稱為Moore狀態(tài)機;

第二類,輸出不僅和狀態(tài)有關(guān)而且和輸入有關(guān)系,則稱為Mealy狀態(tài)機。

** Mealy** :輸出信號不僅取決于當前狀態(tài),還取決于輸入;

** Moore** :輸出信號只取決于當前狀態(tài);

實現(xiàn)相同的功能時, Mealy型比Moore型能節(jié)省一個狀態(tài) (大部分情況下能夠節(jié)省一個觸發(fā)器資源,其余情況下使用的資源相同,視狀態(tài)數(shù)和狀態(tài)編碼方式?jīng)Q定), Mealy型比Moore型輸出超前一個時鐘周期 。

三段式狀態(tài)機

一段式一個****always ,既描述狀態(tài)轉(zhuǎn)移,又描述狀態(tài)的輸入輸出,當前狀態(tài)用寄存器輸出。一段式寫法簡單,但是不利于維護,狀態(tài)擴展麻煩,狀態(tài)復雜時易出錯,不推薦;

二段式兩個****always ,時序邏輯與組合邏輯分開,一個always塊采用同步時序描述狀態(tài)轉(zhuǎn)移;另一個always塊采用組合邏輯判斷狀態(tài)轉(zhuǎn)移條件,描述狀態(tài)轉(zhuǎn)移規(guī)律以及輸出, 當前狀態(tài)用組合邏輯輸出,可能出現(xiàn)競爭冒險,產(chǎn)生毛刺,而且不利于約束 ,不利于綜合器和布局布線器實現(xiàn)高性能的設計;

三段式三個****always ,一個always模塊采用同步時序描述狀態(tài)轉(zhuǎn)移;一個always采用組合邏輯判斷狀態(tài)轉(zhuǎn)移條件,描述狀態(tài)轉(zhuǎn)移規(guī)律;第三個always塊使用同步時序描述狀態(tài)輸出,寄存器輸出。

三段式與二段式相比,關(guān)鍵在于根據(jù)狀態(tài)轉(zhuǎn)移規(guī)律,在上一狀態(tài)根據(jù)輸入條件判斷出當前狀態(tài)的輸出,從而在不插入額外時鐘節(jié)拍的前提下,實現(xiàn)了寄存器輸出。

狀態(tài)機序列檢測

使用三段式FSM有限狀態(tài)機進行序列檢測 ,使用 摩爾型狀態(tài)機 ,最終輸出與輸入無關(guān)。

使用狀態(tài)機檢測“1101”,串行輸入的測試序列為“11101101011010”,輸出信號為valid有效信號,檢測到時輸出高,否則為低, 考慮序列疊加情況 ,比如“1101101”,則有兩個“1101”,

即:

1.jpg

11101101011010,在第5個時鐘檢測到序列,下一個時鐘輸出高電平;

11101101011010,在第8個時鐘檢測到序列,下一個時鐘輸出高電平;

11101101011010,在第13個時鐘檢測到序列,下一個時鐘輸出高電平;

根據(jù)待檢測的序列“1101”確定狀態(tài),其中:

S1為檢測到第1個有效位“1”;

S2為檢測到2個有效位“11”;

S3為檢測到3個有效位“110”;

S4位檢測到4個有效位“1101”;

IDLE為其他狀態(tài);

IDLE:初始狀態(tài),除S1~S4外的其他所有狀態(tài)

S1:1, 來1則到S2(11),否則回到IDLE;

S2:11, 來0則到S3(110),否則保持S2(11);

S3:110, 來1則到S4(1101),否則回到IDLE;

S4:1101, 來1則到S2(11),否則回到IDLE;

摩爾型,輸出和輸入無關(guān),S4時無論輸入什么,都輸出1

圖片

圖片

三段式FSM的代碼:

/************************************************************
**   Author    :FPGA探索者公眾號
**   Times      :2020-7-7
************************************************************/
module FSM_SequDetection_1(
       clk,
       rst_n,
       data_in,
       data_valid
);

input clk;
input rst_n;
input data_in;
output reg data_valid;

//定義狀態(tài),這里采用的獨熱碼(One-Hot),F(xiàn)PGA中推薦用獨熱碼和格雷碼(Gray)
//狀態(tài)較少時(4-24個狀態(tài))用獨熱碼效果好,狀態(tài)多時格雷碼(狀態(tài)數(shù)大于24)效果好
parameter IDLE = 5'b00001;
parameter S1       = 5'b00010;
parameter S2       = 5'b00100;
parameter S3       = 5'b01000;
parameter S4       = 5'b10000;

reg [4:0] current_state;             //現(xiàn)態(tài)
reg [4:0] next_state;                 //次態(tài)

//三段式FSM,第一段,同步時序邏輯,描述狀態(tài)切換,這里的寫法固定
always @ ( posedge clk )
begin
       if(!rst_n ) begin
              current_state<= IDLE;
       end
       elsebegin
              current_state<= next_state;
       end
end

//三段式FSM,第二段,組合邏輯,判斷狀態(tài)轉(zhuǎn)移條件,描述狀態(tài)轉(zhuǎn)移規(guī)律
//這里面用"="賦值和用"<="沒區(qū)別
always @ (*)
begin
       if(!rst_n ) begin
              next_state<= IDLE;
       end
       elsebegin
              case(current_state )
                     IDLE:    begin
                            if(data_in == 1 )
                                   next_state<= S1;
                            else
                                   next_state<= IDLE;
                     end
                     S1   :      begin
                            if(data_in == 1 )
                                   next_state<= S2;
                            else
                                   next_state<= IDLE;
                     end
                     S2   :      begin
                            if(data_in == 0 )
                                   next_state<= S3;
                            else
                                   next_state<= S2;
                     end
                     S3   :      begin
                            if(data_in == 1 )
                                   next_state<= S4;
                            else
                                   next_state<= IDLE;
                     end
                     S4   :      begin
                            if(data_in == 1 )
                                   next_state<= S2;
                            else
                                   next_state<= IDLE;
                     end
                     default   : begin
                            next_state<= IDLE;
                     end
              endcase
       end
end

//三段式FSM,第三段,同步時序邏輯,描述狀態(tài)輸出,摩爾型輸出
always @ ( posedge clk )
begin
       if(!rst_n ) begin
              data_valid<= 1'b0;
       end
       elsebegin
              case(next_state )
                     S4   : data_valid <= 1'b1;
                     default   : data_valid <= 1'b0;
              endcase
       end
end

endmodule

綜合后的RTL圖:

圖片

其中,狀態(tài)機部分為:

圖片

這里的狀態(tài)機考慮到復位的情況,不論處在哪個狀態(tài),當復位信號有效時,均回到IDLE初始狀態(tài)。

仿真測試文件(TestBench):

/************************************************************
**   Author    :FPGA探索者公眾號
**   Times      :2020-7-7
************************************************************/
`timescale 1 ns/1 ns


module FSM_2_tb();


reg clk;
reg rst_n;
reg data_in;
wire data_valid;


FSM_SequDetection   U1(
  .clk(clk),
  .rst_n(rst_n),
  .data_in(data_in),
  .data_valid(data_valid)
);


initial 
begin 
  clk = 0;
  rst_n = 0;
  #15;
  rst_n = 1;
  data_in = 1;#10;
  data_in = 1;#10;
  data_in = 1;#10;
  data_in = 0;#10;
  data_in = 1;#10;
  data_in = 1;#10;
  data_in = 0;#10;
  data_in = 1;#10;
  data_in = 0;#10;
  data_in = 1;#10;
  data_in = 1;#10;
  data_in = 0;#10;
  data_in = 1;#10;
  data_in = 0;#10;
  #50;
  $stop;  //停止仿真
end 


always #5 clk = ~clk;


endmodule

ModelSim仿真如下,輸入“1_1101101_0_1101”,檢測到3次有效的“1101”。

圖片

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

    關(guān)注

    1

    文章

    385

    瀏覽量

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

    關(guān)注

    2

    文章

    492

    瀏覽量

    27541
  • fsm
    fsm
    +關(guān)注

    關(guān)注

    0

    文章

    35

    瀏覽量

    12825
  • 狀態(tài)寄存器
    +關(guān)注

    關(guān)注

    0

    文章

    39

    瀏覽量

    7088
  • MODELSIM仿真
    +關(guān)注

    關(guān)注

    0

    文章

    15

    瀏覽量

    7295
收藏 人收藏

    評論

    相關(guān)推薦

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

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

    狀態(tài)機編程

    ,有限狀態(tài)機FSM)是實時系統(tǒng)設計中的一種數(shù)學模型,是一種重要的、易于建立的、應用比較廣泛的、以描述控制特性為主的建模方法,它可以應用于從系統(tǒng)分析到設計(包括硬件、軟件)的所有階段。很多實時系統(tǒng),特別是
    發(fā)表于 07-10 18:00

    淺談有限狀態(tài)機FSM——以序列檢測為例

    :1101序列檢測器Mealy狀態(tài)機狀態(tài)轉(zhuǎn)移圖1101序列檢測器Moore
    發(fā)表于 09-25 09:35

    如何去實現(xiàn)有限狀態(tài)機FSM的程序設計呢

    什么是有限狀態(tài)機FSM呢?如何去實現(xiàn)有限狀態(tài)機FSM的程序設計呢?
    發(fā)表于 01-21 07:04

    使用ModelSim自動生成狀態(tài)機FSM狀態(tài)轉(zhuǎn)換圖

    HDL代碼設計中重要的內(nèi)容之一就是設計程序的狀態(tài)機FSM,狀態(tài)轉(zhuǎn)換控制著整個程序的流程,為了理解程序,我們經(jīng)常需要把狀態(tài)機狀態(tài)轉(zhuǎn)換圖畫出來
    發(fā)表于 02-10 15:39 ?1.5w次閱讀
    使用ModelSim自動生成<b class='flag-5'>狀態(tài)機</b><b class='flag-5'>FSM</b>的<b class='flag-5'>狀態(tài)</b>轉(zhuǎn)換圖

    初學者對有限狀態(tài)機FSM)的設計的認識

    有限狀態(tài)機FSM)是一種常見的電路,由時序電路和組合電路組成。設計有限狀態(tài)機的第一步是確定采用Moore狀態(tài)機還是采用Mealy狀態(tài)機。
    發(fā)表于 02-11 13:51 ?4307次閱讀
    初學者對有限<b class='flag-5'>狀態(tài)機</b>(<b class='flag-5'>FSM</b>)的設計的認識

    Linux編程之有限狀態(tài)機FSM的理解與實現(xiàn)

    有限狀態(tài)機(finite state machine)簡稱FSM,表示有限個狀態(tài)及在這些狀態(tài)之間的轉(zhuǎn)移和動作等行為的數(shù)學模型,在計算機領(lǐng)域有著廣泛的應用。
    發(fā)表于 05-15 16:53 ?2020次閱讀
    Linux編程之有限<b class='flag-5'>狀態(tài)機</b><b class='flag-5'>FSM</b>的理解與實現(xiàn)

    使用函數(shù)指針的方法實現(xiàn)狀態(tài)機

    之前寫過一篇狀態(tài)機的實用文章,很多朋友說有幾個地方有點難度不易理解,今天給大家換種簡單寫法,使用函數(shù)指針的方法實現(xiàn)狀態(tài)機。 狀態(tài)機簡介 有限狀態(tài)機
    的頭像 發(fā)表于 10-19 09:36 ?2411次閱讀
    使用函數(shù)指針的<b class='flag-5'>方法</b>實現(xiàn)<b class='flag-5'>狀態(tài)機</b>

    摩爾型狀態(tài)機與米利型狀態(tài)機的區(qū)別是什么

    FSM有限狀態(tài)機序列產(chǎn)生,序列檢測,是FPGA和數(shù)字IC相關(guān)崗位必須要掌握的知識點,在筆試和面試中都非常常見。
    的頭像 發(fā)表于 03-14 17:42 ?1.7w次閱讀

    Verilog狀態(tài)機的類型

    有限狀態(tài)機(Finite-State Machine,FSM),簡稱狀態(tài)機,是表示有限個狀態(tài)以及在這些狀態(tài)之間的轉(zhuǎn)移和動作等行為的數(shù)學模型。
    的頭像 發(fā)表于 06-01 15:23 ?1882次閱讀
    Verilog<b class='flag-5'>狀態(tài)機</b>的類型

    序列檢測一定要用狀態(tài)機嗎?

    那些年,你總是不停的說序列檢測,每當有人談到序列檢測你便說自己會一、二、三段式moore、mealy型狀態(tài)機,茴字有幾種寫法...
    的頭像 發(fā)表于 06-26 16:52 ?802次閱讀
    <b class='flag-5'>序列</b><b class='flag-5'>檢測</b>一定要用<b class='flag-5'>狀態(tài)機</b>嗎?

    基于LSM6DSOX的FSM狀態(tài)機的腕部動作識別

    電子發(fā)燒友網(wǎng)站提供《基于LSM6DSOX的FSM狀態(tài)機的腕部動作識別.pdf》資料免費下載
    發(fā)表于 07-31 10:23 ?0次下載
    基于LSM6DSOX的<b class='flag-5'>FSM</b><b class='flag-5'>狀態(tài)機</b>的腕部動作識別

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

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

    什么是有限狀態(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 ?6254次閱讀
    什么是有限<b class='flag-5'>狀態(tài)機</b>?如何解決傳統(tǒng)有限<b class='flag-5'>狀態(tài)機</b>「<b class='flag-5'>狀態(tài)</b>爆炸」問題?

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

    編寫能夠被綜合工具識別的狀態(tài)機,首先需要理解狀態(tài)機的基本概念和分類。狀態(tài)機(FSM)是表示有限個狀態(tài)以及在這些
    的頭像 發(fā)表于 05-01 11:38 ?1621次閱讀