狀態機
1、狀態機是許多數字系統的核心部件,是一類重要的時序邏輯電路。通常包括三個部分:一是下一個狀態的邏輯電路,二是存儲狀態機當前狀態的時序邏輯電路,三是輸出組合邏輯電路。
2、根據狀態機的輸出信號是否與電路的輸入有關分為Mealy型狀態機和Moore型狀態機。電路的輸出信號不僅與電路當前狀態有關,還與電路的輸入有關,稱為 Mealy 型狀態機,而電路的輸出僅僅與各觸發器的狀態,不受電路輸入信號影響或無輸入,稱為
Moore 型狀態機。
3、狀態機的描述通常有三種方法,稱為一段式狀態機,二段式狀態機和三段式狀態機。狀態機的描述通常包含以下四部分:
1)利用參數定義語句 parameter 描述狀態機各個狀態名稱,即狀態編碼。狀態編碼通常有很多方法包含自然二進制編碼,One-hot 編碼,格雷編碼碼等;
2)用時序的 always 塊描述狀態觸發器實現狀態存儲;
3)使用敏感表和 case 語句(也采用 if-else 等價語句)描述狀態轉換邏輯;
4)描述狀態機的輸出邏輯。
4、(1)一段式狀態機
module detect_1( input clk_i, input rst_n_i, output out_o ); reg out_r; //狀態聲明和狀態編碼 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
一段式狀態機是應該避免使用的,該寫法僅僅適用于非常簡單的狀態機設計,不符合組
合邏輯與時序邏輯分開的原則,整個結構代碼也不清晰,不利用維護和修改。
(2)兩段式狀態機
//狀態聲明和狀態編碼 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; //時序邏輯:描述狀態轉換 always@(posedge clk_i) begin if(!rst_n_i) Current_state<=0; else Current_state<=Next_state; end //組合邏輯:描述下一狀態和輸出 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
兩段式狀態機采用兩個 always 模塊實現狀態機的功能,其中一個 always 采用同步時序邏輯描述狀態轉移,另一個 always 采用組合邏輯來判斷狀態條件轉移。兩段式狀態機是推薦的狀態機設計方法。
(3)三段式狀態機
module detect_3( input clk_i, input rst_n_i, output out_o ); reg out_r; //狀態聲明和狀態編碼 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; //時序邏輯:描述狀態轉換 always@(posedge clk_i) begin if(!rst_n_i) Current_state<=0; else Current_state<=Next_state; end //組合邏輯:描述下一狀態 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,經過寄存器 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;
三段式狀態機在第一個 always 模塊采用同步時序邏輯方式描述狀態轉移,第二個always 模塊采用組合邏輯方式描述狀態轉移規律,第三個 always 描述電路的輸出。通常讓輸出信號經過寄存器緩存之后再輸出,消除電路毛刺。這種狀態機也是比較推崇的,主要是由于維護方便,組合邏輯與時序邏輯完全獨立。
編輯:hfy
-
邏輯電路
+關注
關注
13文章
494瀏覽量
42618 -
Verilog
+關注
關注
28文章
1351瀏覽量
110095 -
觸發器
+關注
關注
14文章
2000瀏覽量
61153 -
狀態機
+關注
關注
2文章
492瀏覽量
27539
發布評論請先 登錄
相關推薦
評論