`timescale 1ns/1ns module sequence_detect( input clk, input rst_n, input a, output reg match );

reg[7:0] n_state,c_state;

always @ (posedge clk or negedge rst_n)
    if (!rst_n)
         c_state <= 0;
    else 
         c_state <= n_state;





reg flag;

always @ (posedge clk or negedge rst_n)
    if(!rst_n)
    begin
        flag <= 0;
        n_state <= 0;
        end
    else 
        begin
            case(n_state)
                8'd0:     
                    if (a==0)
                        n_state <= 8'd1;
                    else
                        n_state <= 0;
                8'd1:     //0
                    if(a==1)
                        n_state <= 8'd2;
                    else
                        n_state <=  8'd1;
                8'd2:     //01
                    if(a==1)
                        n_state <= 8'd3;
                    else
                        n_state <= 8'd2;
                
                8'd3:     //011
                    if(a==1)
                        n_state <= 8'd4;
                    else
                        n_state <= 8'd3;
                
                
                
                8'd4:     //0111
                    if(a==0)
                        n_state <= 8'd5;
                    else
                        n_state <=8'd4;
                8'd5:     //0111 0
                    if(a==0)
                        n_state <= 8'd6;
                    else
                        n_state <= 8'd2;
                8'd6:     //0111 00
                    if(a==0)
                        n_state <= 8'd7;
                    else
                        n_state <= 8'd2;
                8'd7:     //0111 000
                    if(a==1)
                    begin
                        flag <= 1;
                        n_state <= 8'd8;
                     end
                    else
                        n_state <= 8'd2;
                 8'd8:     //0111 0001
                 begin
                        n_state <= 8'd0;
                        flag <= 0;
                        end
                default:  n_state <= 8'd0; 
            endcase
            
        end

    always @ (posedge clk or negedge rst_n)
    if (!rst_n)
         match <= 0;
     else if(flag)
          match <= 1;
     else
           match <= 0;

endmodule

经典三段式状态机,开始的时候进入误区,序列出现错误就回到初始状态就返回0,这样是错的,后四位一旦出错,也就是01,则应该回到第二个状态,前四位出错没辙; 还有一个错误,第二段状态机的flag信号因为第二段always是时钟检测,导致flag会落后一个时钟导致错误;如果采用always@()会出现啥情况我去试试;(好了,试了回来,因为tb给的信号是按时钟给的,会出错) 最后一段还不能用always@() 这样会领先答案一个时钟,我也是醉了。 正确的 alt 错误的 ![alt] (https://uploadfiles.nowcoder.com/images/20220406/902437400_1649250677697/086D7D2BBFB9CD57CEB0792016F74CB1)