题解 | 状态机-重叠序列检测
状态机-重叠序列检测
https://www.nowcoder.com/practice/10be91c03f5a412cb26f67dbd24020a9
`timescale 1ns/1ns
module sequence_test2(
input wire clk ,
input wire rst ,
input wire data ,
output reg flag
);
//*************code***********//
parameter state0=4'b0000;
parameter state1=4'b0001;
parameter state2=4'b0010;
parameter state3=4'b0101;
parameter state4=4'b1011;
reg [3:0]state;
always @(posedge clk or negedge rst)
begin
if(!rst)
begin
flag<=1'b0;
state<=4'd0;
end
else
begin
case(state)
state0:
begin
if(data==1'b1)
begin
state<=state1;
flag<=1'b0;
end
else
begin
state<=state0;
flag<=1'b0;
end
end
state1:begin
if(data==1'b0)
begin
state<=state2;
flag<=1'b0;
end
else
begin
state<=state1;
flag<=1'b0;
end
end
state2:begin
if(data==1'b1)
begin
state<=state3;
flag<=1'b0;
end
else
begin
state<=state0;
flag<=1'b0;
end
end
state3:begin
if(data==1'b1)
begin
state<=state4;
flag<=1'b0;
end
else
begin
state<=state2;
flag<=1'b0;
end
end
state4:begin
if(data==1'b1)
begin
state<=state1;
flag<=1'b1;
end
else
begin
state<=state2;
flag<=1'b1;
end
end
endcase
end
end
//*************code***********//
endmodule
一开始想着通过定义两个寄存器对输入的data信号进行打拍子从而消除亚稳态的影响,结果代码无法通过,把消除亚稳态的逻辑代码去掉之后就可以正常通过,看来这个题目中默认外界输入的信号data是没有亚稳态的,并且和时钟域是同步信号。