输入序列不连续的序列检测
题目描述
请编写一个序列检测模块,输入信号端口为data,表示数据有效的指示信号端口为data_valid。当data_valid信号为高时,表示此刻的输入信号data有效,参与序列检测;当data_valid为低时,data无效,抛弃该时刻的输入。当输入序列的有效信号满足0110时,拉高序列匹配信号match。
模块的接口信号图如下:
模块的时序图如下:
`timescale 1ns/1ns
module sequence_detect(
input clk,
input rst_n,
input data,
input data_valid,
output reg match
);
reg [0:1]cnt;
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
cnt <= 2'b0;
else if(data_valid)
cnt <= cnt + 1'b1;
else
cnt <= 2'b0;
end
reg [3:0] data_reg;
always@(*)
begin
if(data_valid)
begin
case(cnt)
2'd0:data_reg[3] = data;
2'd1:data_reg[2] = data;
2'd2:data_reg[1] = data;
2'd3:data_reg[0] = data;
default:data_reg = 4'b0;
endcase
end
else
data_reg = 4'b0;
end
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
match <= 1'b0;
else if(data_reg == 4'b0110 && cnt == 2'd3)
match <= 1'b1;
else
match <= 1'b0;
end
endmodule