序列为10111,因此存在6个态,命名为S0~S5
题目要求:
1 非重叠检测,因此在状态转移中,任何一个态判断非将会返回S0
2 要求寄存器输出且同步输出结果,即检测到10111的时钟沿就要输出结果,因此需要使用三段式描述,且使用次态作为输出判断标准
两段式和三段式的描述方法主要是针对摩尔机来讲的,个人认为,写硬件代码不需要纠结于具体是哪一种状态机和哪一种段式分布,而应该注意实际需求:1、是否要求检测到后同步输出结果(否则结果晚一拍) 2、是否需要寄存器输出
`timescale 1ns/1ns
module sequence_test1(
input wire clk ,
input wire rst ,
input wire data ,
output reg flag
);
//*************code***********//
parameter S0 = 3'd0, S1 = 3'd1, S2 = 3'd2, S3 = 3'd3, S4 = 3'd4, S5 = 3'd5;
reg [2:0] c_state;
reg [2:0] n_state;
always@(posedge clk or negedge rst) begin: part1
if(~rst)
c_state <= S0;
else
c_state <= n_state;
end
always@(*) begin: part2
case(c_state)
S0: n_state <= data ? S1:S0;
S1: n_state <= data ? S0:S2;
S2: n_state <= data ? S3:S0;
S3: n_state <= data ? S4:S0;
S4: n_state <= data ? S5:S0;
default: n_state <= S0;
endcase
end
always@(posedge clk or negedge rst) begin: part3
if(~rst)
flag <= 0;
else if(n_state == S5)
flag <= 1;
else
flag <= 0;
end
//*************code***********//
endmodule