题解 | #状态机-重叠序列检测#
状态机-重叠序列检测
http://www.nowcoder.com/practice/10be91c03f5a412cb26f67dbd24020a9
重复检测是一般FSM应该具备的能力,根据画好的状态转换图,coding case部分。 需要注意题目检测输出是在下一个时钟周期,而非当前时钟周期。
完整代码:
`timescale 1ns/1ns
module sequence_test2(
input wire clk ,
input wire rst ,
input wire data ,
output reg flag
);
//*************code***********//
parameter IDLE=0, A=1, B=2, C=3, D=4;
reg [2:0]CS,NS;
always@(negedge rst or posedge clk)begin
if(~rst)
CS <= 0;
else
CS <= NS;
end
always@(negedge rst or posedge clk)begin
if(~rst)
flag <= 0;
else if(CS == D)
flag <= 1;
else
flag <= 0;
end
always@(*)begin
case(CS)
IDLE:if(data) NS = A; else NS = IDLE;
A:if(~data) NS = B; else NS = A;
B:if(data) NS = C; else NS = IDLE;
C:if(data) NS = D; else NS = B;
D:if(data) NS = A; else NS = B;
endcase
end
//*************code***********//
endmodule
若要求在当前周期输出状态机,有两种方式编写flag部分的always过程块。
- 当前周期输出方式一
always@(negedge rst or posedge clk)begin
if(~rst)
flag <= 0;
else if(CS == C && data == 1)
flag <= 1;
else
flag <= 0;
end
- 当前周期输出方式二
always@(*)begin
if(~rst)
flag = 0;
else if(CS == D)
flag = 1;
else
flag = 0;
end