實現功能:檢測出串行輸入數據4位Data二進制序列0101,當檢測到該序列的時候,out=1,否則out=0
(1)給出狀態編碼,畫出狀態圖
(2)門電路實現
(3)verilog實現
首先規定Q3Q2Q1為剛輸入的三位數,接下來要輸入的數是A,Z為輸入A以后的狀態機的輸出結果,則可以畫出狀態轉換圖如下:
然后根據狀態圖,我們可以得到狀態表:
從而推導出激勵方程,根據卡諾圖化簡得到序列檢測的門級檢測電路如下:
(3)根據狀態圖寫出verilog代碼:
mealy型狀態機的輸出與其輸入以及當前狀態有關:
module xuliejiance(input clk,rst,q output out); reg [2:0]state,nexts; parameter s1=3'd0, s2=3'd1,s3=3'd2,s4=3'd3,s5=3'd4, s6=3'd5,s7=3'd6,s8=3'd7; always@(posedge clk ir negedge rst) begin if(~rst) state<=3'd0; else state<=nextstate; end always@(q,state) case(state) 0:if(q==1) nextstate=3'd1; else nextstate=3'd0; 1:if(q==1) nextstate=3'd3; else nextstate=3'd2; 2:if(q==1) nextstate=3'd5; else nextstate=3'd4; 3:if(q==1) nextstate=3'd5; else nextstate=3'd6; 4:if(q==1) nextstate=3'd0; else nextstate=3'd1; 5:if(q==1) nextstate=3'd0; else nextstate=3'd3; 6:if(q==1) nextstate=3'd0; else nextstate=3'd4; 7:if(q==1) nextstate=3'd7; else nextstate=3'd6; default: nextstate<=3'd0; endcase assign out=(state==3'd2)&&(x==0); endmodule
moore型狀態機的輸出只與其當前狀態有關:
module xuliejiance( input clk,rst,q, output out); reg [2:0] state,nextstate; parameter s0=3'd0,s1=3'd1,s2=3'd2,s3=3'd3,s4=3'd4; always @(posedge clk or negedge rst) begin if(~rst) state<=3'd0; else state<=nextstate; end always@(*) begin case(state) s0: begin if(q==0) nextstate=s1; else nextstate=s0; end s1: begin if(q==1) nextstate=s2; else nextstate=s0; end s2: begin if(q==1) nextstate=s2; else nextstate=s3; end s3: begin if(q==1) nextstate=s4; else nextstate=s0; end s4: begin if(q==1) nextstate=s0; else nextstate=s1; end end assign out=(state==s4)?1:0; endmodule
以上寫的都是兩段式的狀態機的實現,此外我們可以用更加正式的三段式的狀態機實現
以下是一個可以用與參考的狀態機的東西:
我們以1101序列檢測器為例:
1101序列檢測器Mealy狀態機狀態轉移圖
1101序列檢測器Moore狀態機狀態轉移圖
我們以Mealy狀態機為例
一段式狀態機(部分核心代碼):
兩段式狀態機(部分核心代碼):
三段式狀態機(部分核心代碼):