题解 | #不重叠序列检测#---状态机法

不重叠序列检测

https://www.nowcoder.com/practice/9f91a38c74164f8dbdc5f953edcc49cc

思路

状态机如下图所示:

解释一下这个状态机,为什么要这样画呢?

仔细观察波形图,会发现无论匹不匹配,match或者not_match都会隔6个clock cycle变化。所以这正是引入sf1,sf2,sf3....的原因。可以理解为s1,s2,s3....记录匹配的序列,sf1,sf2,sf3....记录不匹配的序列。这样到第6个周期,就能根据当前状态来判断match和not_match了。

代码

`timescale 1ns/1ns

module sequence_detect(
	input clk,
	input rst_n,
	input data,
	output reg match,
	output reg not_match
	);
	reg [3:0]state;
	reg [3:0]next_state;
	localparam 
		IDLE=4'd1,
		s1=4'd2,
		sf1=4'd3,
		s2=4'd4,
		sf2=4'd5,
		s3=4'd6,
		sf3=4'd7,
		s4=4'd8,
		sf4=4'd9,
		s5=4'd10,
		sf5=4'd11,
		s6=4'd12,
		sf6=4'd13;
	//三段式写法
	//第一段
	always @(posedge clk or negedge rst_n) begin
		if (!rst_n)state<=IDLE;
		else state<=next_state;
	end
	//第二段
	always @(*) begin//这里括号里应该是*
		if (!rst_n)next_state<=IDLE;
		else begin
			case(state)
				IDLE:next_state<=data?sf1:s1;
				s1:next_state<=data?s2:sf2;
				s2:next_state<=data?s3:sf3;
				s3:next_state<=data?s4:sf4;
				s4:next_state<=data?sf5:s5;
				s5:next_state<=data?sf6:s6;
				s6:next_state<=data?sf1:s1;
				sf1:next_state<=sf2;
				sf2:next_state<=sf3;
				sf3:next_state<=sf4;
				sf4:next_state<=sf5;
				sf5:next_state<=sf6;
				sf6:next_state<=data?sf1:s1;
				default:next_state<=IDLE;
			endcase
		end
	end
	//第三段
	always @(posedge clk or negedge rst_n) begin
		if (!rst_n)begin
			match<=1'b0;
			not_match<=1'b0;
		end
		else begin
			if (next_state==s6)begin//这里是next_state不是state
				match<=1'b1;
				not_match<=1'b0;
			end
			else if (next_state==sf6)begin
				match<=1'b0;
				not_match<=1'b1;
			end
			else begin
				match<=1'b0;
				not_match<=1'b0;
			end
		end
	end
	
	
endmodule

注意事项

  • 第33行,是always(*)不是always @(posedge clk or negedge rst_n)。可以当做三段式的固定写法吧!
  • 第61行,是next_state不是state。为什么呢?看下面波形图:

先看图中蓝色竖线左边,此时state是s5,next_state是s6,当蓝色处clk上升沿来时,代码的三段式的第三段和第一段就开始运行。在第三段时,如果第61行是state,而此时state在第一段来不及变化,所以第三段检测到state还是s5,就和我们想要的效果不一样。所以说用next_state不用state.

全部评论

相关推荐

友友们,我实在是不太明白,校招的话现在大多也是提前实习,然后转正也是需要考核的,考核通过才能转正,那这跟实习转正有什么区别啊
苦闷的仰泳鲈鱼刷了1...:提前实习,是让你提前熟悉业务的,后续是入职后可以减少试用期的(大部分是包入职的);转正实习,要是hc不够或者其他原因,让你正式offer可能都没有,这个风险很大。 ---个人看法和了解到的。
点赞 评论 收藏
分享
凌小云:问题太大了,首先把教育背景放前面。不然简历不用看就看被pass了。然后两个项目写了和没写一样,不如商城+点评的描述。那专业技能,前面来个技术名,后面一点都不见具体那些了。你说你熟练java,说说java反射实现方式,那些地方用,io都有那些。这让面试官怎么问。这份简历看下来,没一点问的希望。看着技术栈用的多,亮点也没解决什么实际问题。很差的一份简历,患上技术堆砌的毛病了
我的简历长这样
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务