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

输入序列不连续的序列检测

https://www.nowcoder.com/practice/f96d0e94ec604592b502b0f1800ed8aa

`timescale 1ns/1ns
module sequence_detect(
	input clk,
	input rst_n,
	input data,
	input data_valid,
	output reg match
	);
//独热码
	parameter s0 = 4'b0001;
	parameter s1 = 4'b0010;
	parameter s2 = 4'b0100;
	parameter s3 = 4'b1000;

reg [3:0] curr_state;
reg [3:0] next_state;

//计数器,有四个数所以计数到3置零;
/*
reg [1:0] cnt;
always@(posedge clk or negedge rst_n)begin
	if(!rst_n) begin
		cnt <= 2'd0;
	end
	else if(data_valid)begin
		if(cnt==2'd3)
			cnt <= 2'd0;
		else 
			cnt <= cnt + 1'b1;
	end
end
*/

//FSM 1 step
always@(posedge clk or negedge rst_n)begin
	if(!rst_n) begin
		curr_state <= s0;
	end
	else 
		curr_state <= next_state;
end
//FSM 2 step
always@(*)begin
	case(curr_state)
		s0:
		if(data_valid)begin
			if(data==0)
				next_state = s1;
			else
				next_state = s0;
		end
		else 
			next_state = s0;
		s1:
		if(data_valid)begin
			if(data==1)
				next_state = s2;
			else
				next_state = s1;
		end
		else 
			next_state = s1;

		s2:
		if(data_valid)begin
			if(data==1)
				next_state = s3;
			else
				next_state = s2;
		end
		else 
			next_state = s2;

		s3:
		if(data_valid)begin
			if(data==0)
				next_state = s0;
			else
				next_state = s3;
		end
		else 
			next_state = s3;
		
		default:next_state = s0;
		endcase	
end




always@(posedge clk or negedge rst_n)begin
	if(!rst_n)
		match <= 1'b0;
	else if(curr_state == s3)begin
		match <= 1'b1;
	end
	else
		match <= 1'b0;
end

endmodule

全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务