题解 | #输入序列不连续的序列检测#
思路
序列检测通常有两种方法:序列缓存法和状态机法。状态机法看我的另一篇题解:牛客网 - 找工作神器|笔试题库|面试经验|实习招聘内推,求职就业一站解决_牛客网 (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拉高!但是这和题目给的波形图不一样!所以说题目描述有问题。