题解 | #不重叠序列检测#
不重叠序列检测
http://www.nowcoder.com/practice/9f91a38c74164f8dbdc5f953edcc49cc
用个计数器就可以啦,简简单单画个图~! nice
//一个0~5的循环计数器
//一个状态寄存器,如果当前状态是s0,先判断当前计数器是不是0,若不是0,根本不需要状态变化(因为6个为一个整体),如果是0,判断输入data是不是1
//判断计数器到5的时候,当前状态是不是s5,如果不是就不匹配,如果是还要考虑一下最后一个数是不是1
`timescale 1ns/1ns module sequence_detect( input clk, input rst_n, input data, output reg match, output reg not_match );
reg [2:0] current_state;
reg [2:0] next_state;
reg [2:0] cnt;
parameter S0=3'd0;
parameter S1=3'd1;
parameter S2=3'd2;
parameter S3=3'd3;
parameter S4=3'd4;
parameter S5=3'd5;
//一个0~5的循环计数器
always@(posedge clk or negedge rst_n)
if(!rst_n)
cnt <= 0;
else if(cnt == 5)
cnt <= 0;
else
cnt <= cnt +1;
//一个状态寄存器,如果当前状态是s0,先判断当前计数器是不是0,若不是0,根本不需要状态变化(因为6个为一个整体),如果是0,判断输入data是不是1
always@(posedge clk or negedge rst_n)
if(!rst_n)
current_state <= 0;
else
current_state <= next_state;
//如果当前状态是s0,先判断当前计数器是不是0,若不是0,根本不需要状态变化(因为6个为一个整体),如果是0,判断输入data是不是1
always@(*)
case(current_state)
S0:
if(cnt == 0)
if(data==0)
next_state = S1;
else
next_state = S0;
else
next_state = S0;
S1:
if(data==1)
next_state = S2;
else
next_state = S0;
S2:
if(data==1)
next_state = S3;
else
next_state = S0;
S3:
if(data==1)
next_state = S4;
else
next_state = S0;
S4:
if(data==0)
next_state = S5;
else
next_state = S0;
S5:
next_state = S0;
endcase
//判断计数器到5的时候,当前状态是不是s5,如果不是就不匹配,如果是还要考虑一下最后一个数是不是1
always@(posedge clk or negedge rst_n)
if(!rst_n)begin
match <=0;
not_match<=0;
end
else if(cnt == 5)
if(current_state == S5)
if(data==0)begin
match <=1;
not_match<=0;
end
else begin
match <=0;
not_match<=1;
end
else begin
match <=0;
not_match<=1;
end
else begin
match <=0;
not_match<=0;
end
endmodule