狀態(tài)機
1、狀態(tài)機是許多數(shù)字系統(tǒng)的核心部件,是一類重要的時序邏輯電路。通常包括三個部分:一是下一個狀態(tài)的邏輯電路,二是存儲狀態(tài)機當(dāng)前狀態(tài)的時序邏輯電路,三是輸出組合邏輯電路。
2、根據(jù)狀態(tài)機的輸出信號是否與電路的輸入有關(guān)分為Mealy型狀態(tài)機和Moore型狀態(tài)機。電路的輸出信號不僅與電路當(dāng)前狀態(tài)有關(guān),還與電路的輸入有關(guān),稱為 Mealy 型狀態(tài)機,而電路的輸出僅僅與各觸發(fā)器的狀態(tài),不受電路輸入信號影響或無輸入,稱為
Moore 型狀態(tài)機。
3、狀態(tài)機的描述通常有三種方法,稱為一段式狀態(tài)機,二段式狀態(tài)機和三段式狀態(tài)機。狀態(tài)機的描述通常包含以下四部分:
1)利用參數(shù)定義語句 parameter 描述狀態(tài)機各個狀態(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)機的輸出邏輯。
4、(1)一段式狀態(tài)機
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)機是應(yīng)該避免使用的,該寫法僅僅適用于非常簡單的狀態(tài)機設(shè)計,不符合組
合邏輯與時序邏輯分開的原則,整個結(jié)構(gòu)代碼也不清晰,不利用維護(hù)和修改。
(2)兩段式狀態(tài)機
//狀態(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)機采用兩個 always 模塊實現(xiàn)狀態(tài)機的功能,其中一個 always 采用同步時序邏輯描述狀態(tài)轉(zhuǎn)移,另一個 always 采用組合邏輯來判斷狀態(tài)條件轉(zhuǎn)移。兩段式狀態(tài)機是推薦的狀態(tài)機設(shè)計方法。
(3)三段式狀態(tài)機
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)機在第一個 always 模塊采用同步時序邏輯方式描述狀態(tài)轉(zhuǎn)移,第二個always 模塊采用組合邏輯方式描述狀態(tài)轉(zhuǎn)移規(guī)律,第三個 always 描述電路的輸出。通常讓輸出信號經(jīng)過寄存器緩存之后再輸出,消除電路毛刺。這種狀態(tài)機也是比較推崇的,主要是由于維護(hù)方便,組合邏輯與時序邏輯完全獨立。
編輯:hfy
-
邏輯電路
+關(guān)注
關(guān)注
13文章
494瀏覽量
42609 -
Verilog
+關(guān)注
關(guān)注
28文章
1351瀏覽量
110075 -
觸發(fā)器
+關(guān)注
關(guān)注
14文章
2000瀏覽量
61132 -
狀態(tài)機
+關(guān)注
關(guān)注
2文章
492瀏覽量
27529
發(fā)布評論請先 登錄
相關(guān)推薦
評論