不知道拿data_valid当使能行不行,当data_valid无效时,当前状态不转移开始保持
`timescale 1ns/1ns
module sequence_detect(input clk,
input rst_n,
input data,
input data_valid,
output reg match
);
parameter IDLE = 3'b000,
S1=3'b001,
S2=3'b010,
S3=3'b011,
S4=3'b100;
reg [2:0] sta,nsta;
always@(posedge clk or negedge rst_n)
if(!rst_n)
sta <= IDLE;
else if(data_valid)
sta <= nsta;
else
sta <= sta;
always@(*)begin
if(data_valid)
case(sta)
IDLE:nsta = !data?S1:IDLE;
S1:nsta = data?S2:S1;
S2:nsta = data?S3:S1;
S3:nsta = !data?S4:IDLE;
S4:nsta = data?S2:S1;
default:nsta = IDLE;
endcase
else
nsta = IDLE;
end
always@(posedge clk or negedge rst_n)
if(data_valid)
if(!data&&sta==S3)
match <= 1;
else
match <= 0;
else
match <= 0;
endmodule