题解 | #不重叠序列检测#

不重叠序列检测

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

  1. FSM;
  2. 六个状态,s0,s1,s2,s3,s4,s5;
  3. 一个计数器cnt,从0计数到5;
  4. 状态转移条件按照题意011100决定;
  5. 计数器为0时进入s0状态,计数器为5时,判断状态是否在s5,是就是想要的序列,否则不是。
/*********************************************************************************************
Module Name: sequence_no 
Description: 检测的序列为011100
Time/Edition/Editor:
    2023.4.27/v1.0/HouXin
*********************************************************************************************/

`timescale 1ns/1ns
module sequence_detect(
	input clk,
	input rst_n,
	input data,
	output reg match,
	output reg not_match
	);
//定义各个状态
	parameter s0 	= 5'd0;
	parameter s1 	= 5'd1;
	parameter s2 	= 5'd2;
	parameter s3 	= 5'd3;
	parameter s4 	= 5'd4;
	parameter s5 	= 5'd5;

	
	reg [6:0]curr_state;
	reg [6:0]next_state;
//计数器:cnt
	reg [3:0] cnt;
	always@(posedge clk or negedge rst_n)begin
		if(!rst_n)begin
			cnt <= 4'd0;
		end
		else if (cnt == 4'd5)begin
			cnt <= 4'd0;
		end
		else begin
			cnt <= cnt +  1'b1;
		end
	end
	
//FSM one step 
	always@(posedge clk or negedge rst_n)begin
		if(!rst_n)begin
			curr_state <= s0;
		end
		else begin
			curr_state <= next_state;
		end
	end

//FSM second step  011100
	always@(*)begin
		case(curr_state)
			s0:
				if(cnt == 4'd0)begin
					if(data==0)begin
						next_state = s1;	//0
					end
					else begin
						next_state = s0;
					end
				end
			s1: 
				if(data==1)begin
					next_state = s2;	//1
				end
				else begin
					next_state = s0;
				end
			s2:
				if(data==1)begin
					next_state = s3;	//1
				end
				else begin
					next_state = s0;
				end
			s3:
				if(data==1)begin
					next_state = s4;	//1
				end
				else begin
					next_state = s0;	
				end
			s4: 
				if(data===0)begin
					next_state = s5;	//0
				end
				else begin
					next_state = s0;	
				end	
			s5: 
				if(data===0)begin
					next_state = s5;	//0
				end
				else begin
					next_state = s0;	
				end	
			default:next_state = s0;
		endcase
	end
	// FSM 3 step
	always@(posedge clk or negedge rst_n)begin
		if(!rst_n)begin
			match 		<= 1'b0;
			not_match	<= 1'b0;
		end
		else if(cnt==4'd5) begin
			if(curr_state == s5)begin
				match 		<= 1'b1;
				not_match	<= 1'b0;
			end
			else	begin
				match 		<= 1'b0;
				not_match	<= 1'b1;
			end
		end
		else 	begin
				match 		<= 1'b0;
				not_match	<= 1'b0;
		end
	end

	
endmodule

全部评论

相关推荐

那一天的Java_J...:他本来公司就是做这个的,不就是正常的游戏客户端和服务器开发,软硬件联动,有啥恶心不恶心的,提前告诉你就是怕你接受不了,接受不了就没必要再往后走流程浪费时间,虽然这公司是一坨。
点赞 评论 收藏
分享
06-16 15:04
黑龙江大学 Java
零OFFER战士:另一个版本查看图片
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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