FPGA 狀態機-序列檢測器verilog


實現功能:檢測出串行輸入數據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狀態機為例

一段式狀態機(部分核心代碼):

兩段式狀態機(部分核心代碼):

三段式狀態機(部分核心代碼):


免責聲明!

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



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