`timescale 1ns/1ns
module sequence_detect(
input clk,
input rst_n,
input data,
output reg match,
output reg not_match
);
parameter s0=4'd0;
parameter s1=4'd1, n_s1=4'd9;
parameter s2=4'd2, n_s2=4'd10;
parameter s3=4'd3, n_s3=4'd11;
parameter s4=4'd4, n_s4=4'd12;
parameter s5=4'd5, n_s5=4'd13;
parameter s6=4'd6, n_s6=4'd14;
reg [3:0] current_state,next_state;
reg[2:0] cnt;
always@(*)
begin
case(current_state)
n_s1:next_state=n_s2;
n_s2:next_state=n_s3;
n_s3:next_state=n_s4;
n_s4:next_state=n_s5;
n_s5:next_state=n_s6;
n_s6:next_state= data ? n_s1:s1;
s0:next_state= data ? n_s1:s1;
s1:next_state= data ? s2:n_s2;
s2:next_state= data ? s3:n_s3;
s3:next_state= data ? s4:n_s4;
s4:next_state= data ? n_s5:s5;
s5:next_state= data ? n_s6:s6;
s6:next_state= data ? n_s1:s1;
default:next_state=s0;
endcase
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;
not_match=1'b0;
end
else
begin
match = (current_state==s6);
not_match = (current_state==n_s6);
end
end
endmodule