题解 | #输入序列不连续的序列检测#
思路
序列检测通常有两种方法:序列缓存法和状态机法。状态机法看我的另一篇题解:牛客网 - 找工作神器|笔试题库|面试经验|实习招聘内推,求职就业一站解决_牛客网 (nowcoder.com)
这里介绍序列缓存法。
通过观察波形图可以发现,当data_valid为1时,就检测0110序列,当data_valid为0时,就不检测!
假设一种情况,在第一个cycle中data_valid为1,第二个cycle中data_valid为0,请问:第一个cycle的data可以用来判断0110序列吗?
答案是不可以哦。当data_valid不是连续的4个cycle为1,这这期间的data不能用来判断0110序列!
所以当data_valid为0时,就要清空缓存data的序列。
代码
`timescale 1ns/1ns
module sequence_detect(
input clk,
input rst_n,
input data,
input data_valid,
output reg match
);
reg [3:0]data_temp;
//当data_valid为1,就把data缓存 否则就清空data_temp
//改变data_temp
always @(posedge clk or negedge rst_n) begin
if (!rst_n)data_temp<=4'b0000;
else begin
if (data_valid)data_temp<={data_temp[2:0],data};
else data_temp<=4'b0000;
end
end
//检测data_temp
always @(posedge clk or negedge rst_n)begin
if (!rst_n)match<=1'b0;
else begin
if ({data_temp[2:0],data}==4'b0110)match<=1'b1;
else match<=1'b0;
end
end
endmodule
代码的注意事项
- 在第24行中,为什么用{data_temp[2:0],data}而不用data_temp?
如果用后者,则会发现match的变化比参考答案的变化延迟一拍!说明当检测到0110的最后一个数0时就要把match拉高!但是这和题目给的波形图不一样!所以说题目描述有问题。

查看1道真题和解析