题解 | #输入序列不连续的序列检测#

思路

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

全部评论

相关推荐

一名愚蠢的人类:多少games小鬼留下了羡慕的泪水
投递荣耀等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务