狀態機之二段式


功能實現:檢測一段序列碼A1011,如果檢測到1011輸出為1否則輸出為0

狀態機如圖所示:起始狀態為IDLE,當檢測到A[0]=1,進入state1狀態,當檢測到A[1]=1時,進入STATE2狀態,當檢測到A[2]=0時,進入STATE3狀態,當檢測到A[3]=1時,進入IDLE狀態。

狀態機可分為兩部分:第一部分是描述狀態條件轉移的判斷,第二部分描述的是輸出

parameter IDLE = 3'b000;//初始狀態
parameter STATE1=3'b001;//狀態1
parameter STATE2=3'b010;//狀態2
parameter STATE3=3'b100;//狀態3

狀態描述用的是獨熱碼編碼:優點是用的組合邏輯比二進制碼少,但是寄存器占用的多

第一個時序模塊用的是判斷條件轉移

always@(posedge CLK or negedge RSTn)
if(!RSTn)
begin
    State<=4'd0;
end
else
begin
    case(State)
        IDLE:if(A[0]==1'b1)
                    State<=STATE1;
                else
                    State<=IDLE;
        STATE1:if(A[1]==1'b1)
                    State<=STATE2;
                 else
                    State<=IDLE;
        STATE2:if(A[2]==0)
                    State<=STATE3;
                 else 
                    State<=IDLE;
        STATE3:if(A[3]==1'b1)
                    State<=IDLE;
                 else
                    State<=IDLE;
        default:State<=IDLE;
    endcase
end

第二個時序模塊用的是判斷輸入和現有的狀態來輸出

always@(posedge CLK or negedge RSTn)
if(!RSTn)
	rOut<=1'd0;
else if(State==STATE3&&A[3]==1'b1)
	rOut<=1'd1;
else
	rOut<=1'd0;

  test_beach 

initial 
begin
    begin
        RSTn=0;
        CLK=1;
        #10 RSTn=1;
    end
    while(1)
        #10 CLK=~CLK;//時鍾每10ns翻轉一次
end

initial
begin
    #60
    A=4'b1111;
    //#50 A=4'b1110;
    #100 A=4'b1011;
    #100$stop;//過100ns停
end

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM