题解 | #状态机-非重叠的序列检测#
状态机-非重叠的序列检测
http://www.nowcoder.com/practice/2e35c5c0798249aaa2e1044dbaf218f2
五个状态六个状态应该都行吧,本菜鸟喜欢写全状态以免出错😥请各位老哥指点
`timescale 1ns/1ns
module sequence_test1(
input wire clk ,
input wire rst ,
input wire data ,
output reg flag
);
parameter IDLE=3'b000,S1=3'b001,S2=3'b010,S3=3'b011,
S4=3'b100,S5=3'b101;
reg [2:0] sta,nsta;
always@(posedge clk or negedge rst)
if(!rst)
sta <= IDLE;
else
sta <= nsta;
always@(*)begin
case(sta)
IDLE:nsta=data?S1:IDLE;
S1:nsta=!data?S2:S1;
S2:nsta=data?S3:IDLE;
S3:nsta=data?S4:S2;
S4:nsta=data?S5:S2;
S5:nsta=data?S1:IDLE;
default: nsta = IDLE;
endcase
end
always@(posedge clk or negedge rst)
if(!rst)
flag <= 0;
else if(sta==S4&&data)
flag <= 1;
else
flag <= 0;
endmodule
module sequence_test1(
input wire clk ,
input wire rst ,
input wire data ,
output reg flag
);
parameter IDLE=3'b000,S1=3'b001,S2=3'b010,S3=3'b011,
S4=3'b100,S5=3'b101;
reg [2:0] sta,nsta;
always@(posedge clk or negedge rst)
if(!rst)
sta <= IDLE;
else
sta <= nsta;
always@(*)begin
case(sta)
IDLE:nsta=data?S1:IDLE;
S1:nsta=!data?S2:S1;
S2:nsta=data?S3:IDLE;
S3:nsta=data?S4:S2;
S4:nsta=data?S5:S2;
S5:nsta=data?S1:IDLE;
default: nsta = IDLE;
endcase
end
always@(posedge clk or negedge rst)
if(!rst)
flag <= 0;
else if(sta==S4&&data)
flag <= 1;
else
flag <= 0;
endmodule