`timescale 1ns/1ns module sequence_detect( input clk, input rst_n, input data, input data_valid, output reg match ); reg [4:0] cur_state; reg [4:0] nex_state; parameter IDLE = 5'b00_001, S0 = 5'b00_010, S1 = 5'b00_100, S2 = 5'b01_000, S3 = 5'b10_000; always@(posedge clk or negedge rst_n)begin if(!rst_n) cur_state <= IDLE ; else cur_state <= nex_state ; end always@(*)begin case(cur_state) IDLE:begin if(data_valid == 1'b1)begin if(data == 1'b0) nex_state = S0 ; else nex_state = IDLE ; end else begin nex_state = IDLE; end end S0:begin //data 序列:0 if(data_valid == 1'b1)begin if(data == 1'b1) nex_state = S1 ; else nex_state = S0 ; end else begin nex_state = S0; end end S1:begin //data 序列:01 if(data_valid == 1'b1)begin if(data == 1'b1) nex_state = S2 ; else nex_state = S0 ; end else begin nex_state = S1; end end S2:begin //data 序列:011 if(data_valid == 1'b1)begin if(data == 1'b0) nex_state = S3 ; else nex_state = IDLE ; end else begin nex_state = S1 ; end end S3:begin //data 序列:0110 if(data_valid == 1'b1)begin if(data == 1'b0) nex_state = S0 ; else nex_state = IDLE ; end else begin nex_state = IDLE ; end end default: nex_state = IDLE ; endcase end always@(posedge clk or negedge rst_n)begin if(!rst_n) match <= 1'b0; else begin case(nex_state) S3 : match <= 1'b1 ; default: match <= 1'b0 ; endcase end end endmodule