本质上和输入序列连续的序列检测,当data_valid
信号有效时,移位寄存器data_r
再进行移位即可。
本题的题目要求和Testbench有不相符的地方。题目中要求match
在序列匹配的下一个周期拉高,如上图。而Testbench则是在序列匹配的同周期拉高。下面的代码中,被注释掉的部分是符合题目要求的match
,没有注释的是符合Testbench的match
。
`timescale 1ns/1ns
module sequence_detect(
input clk,
input rst_n,
input data,
input data_valid,
output reg match
);
reg [3:0] data_r;
always@(posedge clk or negedge rst_n) begin
if(~rst_n)
data_r <= 4'b0;
else
data_r <= data_valid? {data_r[2:0], data}: data_r;
end
always@(posedge clk or negedge rst_n) begin
if(~rst_n)
match <= 0;
else
match <= data_r[2:0]==3'b011 && data==1'b0 && data_valid;
end
// always@(posedge clk or negedge rst_n) begin
// if(~rst_n)
// match <= 0;
// else
// match <= data_r==4'b0110;
// end
endmodule