`timescale 1ns/1ns
module sequence_detect(
input clk,
input rst_n,
input data,
input data_valid,
output reg match
);
parameter s0=3'd0,s1=3'd1,s2=3'd2,s3=3'd3,s4=3'd4;
reg [2:0] current_state,next_state;
always @(*)
begin
if(data_valid)
begin
case (current_state)
s0: next_state = data ? s0 : s1;
s1: next_state = data ? s2 : s1;
s2: next_state = data ? s3 : s1;
s3: next_state = data ? s0 : s4;
s4: next_state = data ? s2: s1;
default:next_state =s0;
endcase
end
else
begin
next_state =s0;
end
end
always @ (posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
current_state<=s0;
end
else
begin
current_state<=next_state;
end
end
always@(*)
begin
if(!rst_n)
begin
match=1'b0;
end
else
begin
match=(current_state==s4);
end
end
endmodule