题解 | #不重叠序列检测#(两种方法 题目没错)
不重叠序列检测
https://www.nowcoder.com/practice/9f91a38c74164f8dbdc5f953edcc49cc
`timescale 1ns/1ns
module sequence_detect(
input clk,
input rst_n,
input data,
output wire match, //状态机方法改为reg型
output wire not_match //状态机方法改为reg型
);
/*
reg [7:0] cur_state;
reg [7:0] nex_state;
parameter IDLE = 8'b00_000_001 ,
S0 = 8'b00_000_010 ,
S1 = 8'b00_000_100 ,
S2 = 8'b00_001_000 ,
S3 = 8'b00_010_000 ,
S4 = 8'b00_100_000 ,
S5 = 8'b01_000_000 ,
error = 8'b10_000_000 ;
reg [2:0] cnt ;
always@(posedge clk or negedge rst_n)begin
if(!rst_n)
cnt <= 'd0;
else if(cnt == 'd5)
cnt <= 'd0;
else
cnt <= cnt + 1'b1 ;
end
//////三段式状态机/////////////////////////////
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 == 1'b0)
nex_state <= S0 ;
else
nex_state <= error ;
end
S0: begin
if(data == 1'b1)
nex_state <= S1 ;
else
nex_state <= error ;
end
S1: begin
if(data == 1'b1)
nex_state <= S2 ;
else
nex_state <= error ;
end
S2: begin
if(data == 1'b1)
nex_state <= S3 ;
else
nex_state <= error ;
end
S3: begin
if(data == 1'b0)
nex_state <= S4 ;
else
nex_state <= error ;
end
S4: begin
if(data == 1'b0)
nex_state <= S5 ;
else
nex_state <= error ;
end
S5: begin
if(data == 1'b0)
nex_state <= S0 ;
else
nex_state <= error ;
end
error: begin
if(cnt == 'd5)
nex_state <= IDLE ;
else
nex_state <= error ;
end
default: nex_state <= IDLE ;
endcase
end
always@(posedge clk or negedge rst_n)begin
if(!rst_n)begin
match <= 1'b0;
not_match <= 1'b0;
end
else if(cnt == 'd5)begin
if(nex_state == S5)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
*/
//题目没有错 移位实现 要考虑时序
reg [5:0] reg_num;
reg [2:0] cnt ;
//移位 + 拼接实现寄存
always@(posedge clk or negedge rst_n)begin
if(!rst_n)
reg_num <= 'd0;
else
reg_num <= {reg_num[4:0], data};
end
//计数器
always@(posedge clk or negedge rst_n)begin
if(!rst_n)
cnt <= 'd0;
else if(cnt == 'd6)
cnt <= 'd1;
else
cnt <= cnt + 1'b1;
end
/*
always@(posedge clk or negedge rst_n)begin
if(!rst_n)begin
match <= 1'b0;
not_match <= 1'b0;
end
else if(cnt == 'd6)begin
if(reg_num == 6'b011100)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
*/
assign match = (cnt == 'd6 & reg_num == 6'b011100)?1'b1:1'b0;
assign not_match = (cnt == 'd6 & reg_num != 6'b011100)?1'b1:1'b0;
endmodule



