alt

状态机解法

alt

`timescale 1ns/1ns

module sequence_test2(
	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;
    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 ? S1 : S2;
            S2: n_state <= data ? S3 : S0;
            S3: n_state <= data ? S4 : S2;
            S4: n_state <= data ? S1 : S2;
            default: n_state <= S0;
        endcase
    end
    
    always@(posedge clk or negedge rst) begin: part3
        if(~rst)
            flag <= 0;
        else if(c_state == S4)
            flag <= 1;
        else
            flag <= 0;
    end

//*************code***********//
endmodule

移位寄存器解法

从波形来看,其实是序列全部到来之后的晚两拍才拉高flag信号,因此用移位寄存器存储全部的输入之后再判断,不需要在序列最后一个元素到来的当拍进行拼位判断。采用移位寄存器的实现方式,代码如下:

timescale 1ns/1ns

module sequence_test2(
	input wire clk  ,
	input wire rst  ,
	input wire data ,
	output reg flag
);
//*************code***********//
    reg [3:0] data_r;
    always@(posedge clk or negedge rst) begin: reg_data
        if(~rst)
            data_r <= 4'b0;
        else
            data_r <= {data_r[2:0], data};
    end
    
    always@(posedge clk or negedge rst) begin: gen_flag
        if(~rst)
            flag <= 0;
        else if(data_r == 4'b1011)
            flag <= 1;
        else
            flag <= 0;
    end

//*************code***********//
endmodule

```