alt

序列为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