狀態(tài)機(jī)
1、狀態(tài)機(jī)是許多數(shù)字系統(tǒng)的核心部件,是一類重要的時序邏輯電路。通常包括三個部分:一是下一個狀態(tài)的邏輯電路,二是存儲狀態(tài)機(jī)當(dāng)前狀態(tài)的時序邏輯電路,三是輸出組合邏輯電路。
2、根據(jù)狀態(tài)機(jī)的輸出信號是否與電路的輸入有關(guān)分為Mealy型狀態(tài)機(jī)和Moore型狀態(tài)機(jī)。電路的輸出信號不僅與電路當(dāng)前狀態(tài)有關(guān),還與電路的輸入有關(guān),稱為 Mealy 型狀態(tài)機(jī),而電路的輸出僅僅與各觸發(fā)器的狀態(tài),不受電路輸入信號影響或無輸入,稱為
Moore 型狀態(tài)機(jī)。
3、狀態(tài)機(jī)的描述通常有三種方法,稱為一段式狀態(tài)機(jī),二段式狀態(tài)機(jī)和三段式狀態(tài)機(jī)。狀態(tài)機(jī)的描述通常包含以下四部分:
1)利用參數(shù)定義語句 parameter 描述狀態(tài)機(jī)各個狀態(tài)名稱,即狀態(tài)編碼。狀態(tài)編碼通常有很多方法包含自然二進(jìn)制編碼,One-hot 編碼,格雷編碼碼等;
2)用時序的 always 塊描述狀態(tài)觸發(fā)器實現(xiàn)狀態(tài)存儲;
3)使用敏感表和 case 語句(也采用 if-else 等價語句)描述狀態(tài)轉(zhuǎn)換邏輯;
4)描述狀態(tài)機(jī)的輸出邏輯。
4、(1)一段式狀態(tài)機(jī)
module detect_1( input clk_i, input rst_n_i, output out_o ); reg out_r; //狀態(tài)聲明和狀態(tài)編碼 reg [1:0] state; parameter [1:0] S0=2'b00; parameter [1:0] S1=2'b01; parameter [1:0] S2=2'b10; parameter [1:0] S3=2'b11; always@(posedge clk_i) begin if(!rst_n_i)begin state<=0; out_r<=1'b0; end else case(state) S0 : begin out_r<=1'b0; state<= S1; end S1 : begin out_r<=1'b1; state<= S2; end S2 : begin out_r<=1'b0; state<= S3; end S3 : begin out_r<=1'b1; end endcase end assign out_o=out_r; endmodule
一段式狀態(tài)機(jī)是應(yīng)該避免使用的,該寫法僅僅適用于非常簡單的狀態(tài)機(jī)設(shè)計,不符合組
合邏輯與時序邏輯分開的原則,整個結(jié)構(gòu)代碼也不清晰,不利用維護(hù)和修改。
(2)兩段式狀態(tài)機(jī)
//狀態(tài)聲明和狀態(tài)編碼 reg [1:0] Current_state; reg [1:0] Next_state; parameter [1:0] S0=2'b00; parameter [1:0] S1=2'b01; parameter [1:0] S2=2'b10; parameter [1:0] S3=2'b11; //時序邏輯:描述狀態(tài)轉(zhuǎn)換 always@(posedge clk_i) begin if(!rst_n_i) Current_state<=0; else Current_state<=Next_state; end //組合邏輯:描述下一狀態(tài)和輸出 always@(*) begin out_r=1'b0; case(Current_state) S0 : begin out_r=1'b0; Next_state= S1; end S1 : begin out_r=1'b1; Next_state= S2; end S2 : begin out_r=1'b0; Next_state= S3; end S3 : begin out_r=1'b1; Next_state=Next_state; end endcase end assign out_o=out_r; endmodule
兩段式狀態(tài)機(jī)采用兩個 always 模塊實現(xiàn)狀態(tài)機(jī)的功能,其中一個 always 采用同步時序邏輯描述狀態(tài)轉(zhuǎn)移,另一個 always 采用組合邏輯來判斷狀態(tài)條件轉(zhuǎn)移。兩段式狀態(tài)機(jī)是推薦的狀態(tài)機(jī)設(shè)計方法。
(3)三段式狀態(tài)機(jī)
module detect_3( input clk_i, input rst_n_i, output out_o ); reg out_r; //狀態(tài)聲明和狀態(tài)編碼 reg [1:0] Current_state; reg [1:0] Next_state; parameter [1:0] S0=2'b00; parameter [1:0] S1=2'b01; parameter [1:0] S2=2'b10; parameter [1:0] S3=2'b11; //時序邏輯:描述狀態(tài)轉(zhuǎn)換 always@(posedge clk_i) begin if(!rst_n_i) Current_state<=0; else Current_state<=Next_state; end //組合邏輯:描述下一狀態(tài) always@(*) begin case(Current_state) S0: Next_state = S1; S1: Next_state = S2; S2: Next_state = S3; S3: begin Next_state = Next_state; end default : Next_state = S0; endcase end //輸出邏輯:讓輸出 out,經(jīng)過寄存器 out_r 鎖存后輸出,消除毛刺 always@(posedge clk_i) begin if(!rst_n_i) out_r<=1'b0; else begin case(Current_state) S0,S2: out_r<=1'b0; S1,S3: out_r<=1'b1; default : out_r<=out_r; endcase end end assign out_o=out_r;
三段式狀態(tài)機(jī)在第一個 always 模塊采用同步時序邏輯方式描述狀態(tài)轉(zhuǎn)移,第二個always 模塊采用組合邏輯方式描述狀態(tài)轉(zhuǎn)移規(guī)律,第三個 always 描述電路的輸出。通常讓輸出信號經(jīng)過寄存器緩存之后再輸出,消除電路毛刺。這種狀態(tài)機(jī)也是比較推崇的,主要是由于維護(hù)方便,組合邏輯與時序邏輯完全獨立。
編輯:hfy
-
邏輯電路
+關(guān)注
關(guān)注
13文章
502瀏覽量
43106 -
Verilog
+關(guān)注
關(guān)注
28文章
1364瀏覽量
111597 -
觸發(fā)器
+關(guān)注
關(guān)注
14文章
2029瀏覽量
61790 -
狀態(tài)機(jī)
+關(guān)注
關(guān)注
2文章
493瀏覽量
28004
發(fā)布評論請先 登錄
求助,關(guān)于srammaster.cydsn中狀態(tài)機(jī)的問題求解
Simulink中的狀態(tài)機(jī)建模方法 Simulink數(shù)據(jù)可視化與分析功能
基于狀態(tài)機(jī)和面向?qū)ο蟮乃枷朐O(shè)計按鍵檢測模塊

mosfet的三種工作狀態(tài)及工作條件是什么
晶體管的工作狀態(tài)判斷方法
時序邏輯電路的描述方法有哪些
NPN型晶體管三種狀態(tài)判斷方法
觸發(fā)器和狀態(tài)機(jī)的關(guān)系是什么
如何在FPGA中實現(xiàn)狀態(tài)機(jī)
三態(tài)緩沖器的三種狀態(tài)分別是什么
玩轉(zhuǎn)Spring狀態(tài)機(jī)

評論