「Verilog学习笔记」不重叠序列检测

专栏前言

本专栏的内容主要是记录本人学习Verilog过程中的一些知识点,刷题网站用的是牛客网

「Verilog学习笔记」不重叠序列检测_第1张图片

「Verilog学习笔记」不重叠序列检测_第2张图片

        题目要求检测a的序列,a为单bit输入,每个时刻可能具有不同的值, 当连续的六个输入值符合目标序列表示序列匹配,当六个输入值的一个或多个不符合则表示序列不匹配。

        值得注意的是:题目要求以六位数据为一组,不同于常见的序列检测,要求检测重复序列,在画状态转移图时要注意,例如第一位不匹配,不应该返回到初始状态去进行第一位的判断,因为此时的输入是第二位数值,题目要求不对该数值做判断,而需要等到六个时钟周期之后,即第七位数据(第二组数值的第一位)再判断是否匹配目标序列的第一位。

「Verilog学习笔记」不重叠序列检测_第3张图片

`timescale 1ns/1ns
module sequence_detect(
	input clk,
	input rst_n,
	input data,
	output reg match,
	output reg not_match
	);
	// 011100
	reg [3:0] pstate, nstate ; // 当前状态、下一状态

	parameter idle = 4'b0,
			s1 = 4'd1,
			s2 = 4'd2,
			s3 = 4'd3,
			s4 = 4'd4,
			s5 = 4'd5,
			s6 = 4'd6,
			sf1 = 4'd7, 
			sf2 = 4'd8,
			sf3 = 4'd9, 
			sf4 = 4'd10,
			sf5 = 4'd11, 
			sf6 = 4'd12 ;
	
	always @ (posedge clk or negedge rst_n) begin 
		if (~rst_n) pstate <= idle ; 
		else pstate <= nstate ; 
	end
	
	always @ (pstate or data) begin // 对应状态转移图
		case (pstate) 
			idle : 
				if (data == 0) nstate = s1 ; //0
				else nstate = sf1 ; 
			s1 : 
				nstate = data ? s2 : sf2 ; //1
			s2 : 
				nstate = data ? s3 : sf3 ; //1
			s3 : 
				nstate = data ? s4 : sf4 ; //1
			s4 : 
				nstate = data ? sf5 : s5 ; //0
			s5 : 
				nstate = data ? sf6 : s6 ; //0
			s6 : 
				nstate = data ? sf1 : s1 ; 
			sf1 : 
				nstate = sf2 ;
			sf2 : 
				nstate = sf3 ;
			sf3 : 
				nstate = sf4 ;
			sf4 : 
				nstate = sf5 ;
			sf5 : 
				nstate = sf6 ;
			sf6 : 
				nstate = data ? sf1 : s1 ;
			default :
				nstate = idle ; 
		endcase
	end

	always @ (pstate or data or rst_n) begin  // 输出
		if (!rst_n) begin 
			match <= 1'b0 ; 
			not_match <= 1'b0 ; 
		end
		else if (pstate == s6) begin 
			match <= 1'b1 ;
			not_match <= 1'b0 ; 
		end
		else if (pstate == sf6) begin 
			match <= 1'b0 ; 
			not_match <= 1'b1 ; 
		end
		else begin 
			match <= 1'b0 ; 
			not_match <= 1'b0 ; 
		end
	end

endmodule

你可能感兴趣的:(Verilog学习笔记,学习,笔记,Verilog)