题解 | #不重叠序列检测#
不重叠序列检测
https://www.nowcoder.com/practice/9f91a38c74164f8dbdc5f953edcc49cc
题目中reg变量再always块中赋值
`timescale 1ns/1ns
module sequence_detect(
input clk,
input rst_n,
input data,
output reg match,
output reg not_match
);
//PARAMETER defined
parameter IDLE = 8'b00000001;
parameter S1 = 8'b00000010;
parameter S2 = 8'b00000100;
parameter S3 = 8'b00001000;
parameter S4 = 8'b00010000;
parameter S5 = 8'b00100000;
parameter S6 = 8'b01000000;
//reg defined
reg [7:0] curr_state;
reg [7:0] next_state;
reg [5:0] match_reg;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
curr_state <= IDLE;
end
else begin
curr_state <= next_state;
end
end
always @( *) begin
case (curr_state)
IDLE: next_state <= S1;
S1:begin
next_state = S2;
if (!data) begin
match_reg[5] = 1'd1;
end
else
match_reg[5] = 1'd0;
end
S2: begin
next_state <= S3;
if (data) begin
match_reg[4] = 1'd1;
end
else
match_reg[4] = 1'd0;
end
S3: begin
next_state <= S4;
if (data) begin
match_reg[3] = 1'd1;
end
else
match_reg[3] = 1'd0;
end
S4: begin
next_state <= S5;
if (data) begin
match_reg[2] = 1'd1;
end
else
match_reg[2] = 1'd0;
end
S5: begin
next_state <= S6;
if (!data) begin
match_reg[1] = 1'd1;
end
else
match_reg[1] = 1'd0;
end
S6: begin
next_state = S1;
if (!data) begin
match_reg[0] = 1'd1;
end
else
match_reg[0] = 1'd0;
end
endcase
end
always @(*) begin
if (curr_state == S6 ) begin
if (match_reg == 6'b111111) begin
match = 1'b1;
not_match = 1'b0;
end
else begin
match = 1'b0;
not_match = 1'b1;
end
end
else begin
match = 1'b0;
not_match = 1'b0;
end
end
endmodule
modelsim仿真结果
