题解 | #不重叠序列检测#
不重叠序列检测
https://www.nowcoder.com/practice/9f91a38c74164f8dbdc5f953edcc49cc
`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;
parameter S2=4'd2;
parameter S3=4'd3;
parameter S4=4'd4;
parameter S5=4'd5;
parameter M1=4'd6;
parameter M2=4'd7;
parameter M3=4'd8;
parameter M4=4'd9;
parameter M5=4'd10;
reg [3:0] state;
reg [3:0] next_state;
always@(posedge clk or negedge rst_n)
begin
if(!rst_n) state<=S0;
else state<=next_state;
end
always@(state or data)
begin
case(state)
S0:
begin
if(data==1'b0) next_state=S1;
else next_state=M1;
end
S1:
begin
if(data==1'b0) next_state=M2;
else next_state=S2;
end
S2:
begin
if(data==1'b0) next_state=M3;
else next_state=S3;
end
S3:
begin
if(data==1'b0) next_state=M4;
else next_state=S4;
end
S4:
begin
if(data==1'b0) next_state=S5;
else next_state=M5;
end
S5:
begin
if(data==1'b0) next_state=S0;
else next_state=S0;
end
M1:
begin
next_state=M2;
end
M2:
begin
next_state=M3;
end
M3:
begin
next_state=M4 ;
end
M4:
begin
next_state=M5;
end
M5:
begin
next_state=S0;
end
default :next_state=S0;
endcase
end
always@(posedge clk or negedge rst_n)
begin
if(!rst_n) begin match<=0; not_match<=0; end
else
begin
case(state)
S0:
begin
match<=0; not_match<=0;
end
S1:
begin
match<=0; not_match<=0;
end
S2:
begin
match<=0; not_match<=0;
end
S3:
begin
match<=0; not_match<=0;
end
S4:
begin
match<=0; not_match<=0;
end
S5:
begin
if(data==0) begin match<=1; not_match<=0; end
else begin match<=0; not_match<=1; end
end
M1:
begin
match<=0; not_match<=0;
end
M2:
begin
match<=0; not_match<=0;
end
M3:
begin
match<=0; not_match<=0;
end
M4:
begin
match<=0; not_match<=0;
end
M5:
begin
match<=0; not_match<=1;
end
default: begin match<=0; not_match<=0; end
endcase
end
end
endmodule

