题解 | #状态机-非重叠的序列检测#
状态机-非重叠的序列检测
http://www.nowcoder.com/practice/2e35c5c0798249aaa2e1044dbaf218f2
`timescale 1ns/1ns
module sequence_test1(
input wire clk ,
input wire rst ,
input wire data ,
output reg flag
);
//*************code***********//
localparam idle = 4'b0000;
localparam s1 = 4'b0001;
localparam s2 = 4'b0010;
localparam s3 = 4'b0100;
localparam s4 = 4'b1000;
reg [3:0] cs,ns;
always @(posedge clk or negedge rst) begin
if(!rst) cs <= 4'b0;
else cs <= ns;
end
always @(*) begin
case (cs)
idle: begin
if(data) ns =s1;
else ns =idle;
end
s1: begin
if(data) ns =s1;
else ns =s2;
end
s2: begin
if(data) ns =s3;
else ns =idle;
end
s3: begin
if(data) ns =s4;
else ns =s2;
end
s4: begin
if(data) ns =idle;
else ns =s2;
end
default: ns = idle;
endcase
end
always @(posedge clk or negedge rst) begin
if(!rst) flag <= 'b0;
else if((cs==s4)&&(data==1)) flag<=1'b1;
//细节决定成败,,忘了加else flag <=0结果出错
else flag <= 0;
end
//*************code***********//
endmodule
module sequence_test1(
input wire clk ,
input wire rst ,
input wire data ,
output reg flag
);
//*************code***********//
localparam idle = 4'b0000;
localparam s1 = 4'b0001;
localparam s2 = 4'b0010;
localparam s3 = 4'b0100;
localparam s4 = 4'b1000;
reg [3:0] cs,ns;
always @(posedge clk or negedge rst) begin
if(!rst) cs <= 4'b0;
else cs <= ns;
end
always @(*) begin
case (cs)
idle: begin
if(data) ns =s1;
else ns =idle;
end
s1: begin
if(data) ns =s1;
else ns =s2;
end
s2: begin
if(data) ns =s3;
else ns =idle;
end
s3: begin
if(data) ns =s4;
else ns =s2;
end
s4: begin
if(data) ns =idle;
else ns =s2;
end
default: ns = idle;
endcase
end
always @(posedge clk or negedge rst) begin
if(!rst) flag <= 'b0;
else if((cs==s4)&&(data==1)) flag<=1'b1;
//细节决定成败,,忘了加else flag <=0结果出错
else flag <= 0;
end
//*************code***********//
endmodule
