功能實現:檢測一段序列碼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