题解 | #不重叠序列检测#
不重叠序列检测
https://www.nowcoder.com/practice/9f91a38c74164f8dbdc5f953edcc49cc
`timescale 1ns/1ns
module sequence_detect(
input clk,
input rst_n,
input data,
output wire match,
output wire not_match
);
localparam idle = 6'b000000;
localparam s0 = 6'b000001;
localparam s1 = 6'b000010;
localparam s2 = 6'b000100;
localparam s3 = 6'b001000;
localparam s4 = 6'b010000;
localparam s5 = 6'b100000;
reg [5:0] cs,ns;
reg [2:0] cnt;
always @(posedge clk or negedge rst_n) begin
if(!rst_n) cs<='b0;
else cs<= ns;
end
always @(posedge clk or negedge rst_n) begin
if(!rst_n) cnt<='b0;
else if(cnt==3'd6) cnt<='b1;
else cnt<= cnt+1'b1;
end
/*
idle
s0 0
s1 01
s2 011
s3 0111
s4 01110
s5 011100
*/
always @(*) begin
case (cs)
idle: ns = data ? idle : s0;
s0 : ns = data ? s1 : idle;
s1 : ns = data ? s2 : idle;
s2 : ns = data ? s3 : idle;
s3 : ns = data ? idle : s4;
s4 : ns = data ? idle : s5;
s5 : ns = data ? idle : s0;
default: ns = idle;
endcase
end
/*
always @(posedge clk or negedge rst_n) begin
if(!rst_n) match <= 0;
else if((cs==s5)&(cnt==3'd6)) match<=1;
else match<=0;
end
*/
//assign match = (cs==s5)&(cnt==3'd6)?1'b1:1'b0;
//assign not_match = (cs==idle)&(cnt==3'd6)?1'b1:1'b0;
assign match = (cs==s5)&(cnt==3'd6)?1'b1:1'b0;
assign not_match = (cs!=s5 )&(cnt==3'd6)?1'b1:1'b0;
/*
always @(posedge clk or negedge rst_n) begin
if(!rst_n) not_match <= 0;
else if((cs==s5)&(cnt!=3'd6)) not_match<=1;
else not_match<=0;
end
*/
endmodule