VL25 输入序列连续的序列检测

 经典三段式:

`timescale 1ns/1ns
module sequence_detect(
	input clk,
	input rst_n,
	input a,
	output reg match
	);
	parameter[3:0] IDLE = 4'd0;
	parameter[3:0] S1 = 4'd1;
	parameter[3:0] S2 = 4'd2;
  	parameter[3:0] S3 = 4'd3;
	parameter[3:0] S4 = 4'd4;
	parameter[3:0] S5 = 4'd5;
	parameter[3:0] S6 = 4'd6;
	parameter[3:0] S7 = 4'd7;
	parameter[3:0] S8 = 4'd8;	

	reg[3:0] c_state,n_state;
	always @(*) begin
		case(c_state)
			IDLE: n_state <= a?IDLE:S1;
			S1: n_state <= a?S2:S1;
			S2: n_state <= a?S3:S1;
			S3: n_state <= a?S4:S1;
			S4: n_state <= a?IDLE:S5;
			S5: n_state <= a?S2:S6;
			S6: n_state <= a?S2:S7;
			S7: n_state <= a?S8:S1;
			S8: n_state <= a?S3:S1;
			default : n_state <= IDLE;
		endcase
	end
	always @(posedge clk or negedge rst_n) begin
        if(!rst_n) begin
            c_state <= IDLE;
        end
        else begin
            c_state <= n_state;
        end
    end

	always @(posedge clk or negedge rst_n) begin
		if(!rst_n) begin
			match <=  0;
		end
		else if(c_state == S8 )begin
			match <=  1;
		end
		else begin
			match <= 0;
		end

	end
endmodule

循环移位检测:

`timescale 1ns/1ns
module sequence_detect(
	input clk,
	input rst_n,
	input a,
	output reg match
	);
    reg [7:0]    seq    ;
    always@(posedge clk&nbs***bsp;negedge rst_n)    begin
        if(!rst_n)    begin
                seq    <=    0    ;
                match  <=    0    ;
        end
        else begin
            seq    <=    {seq[6:0],a};
        end
    end
  
    always@(posedge clk )    begin
        if(seq == 8'b01110001)    
                match    <=    1    ;
        else
                match    <=    0    ;
    end
                
    
endmodule