重温FPGA之序列检测器 verilog实现

1.题目

2.源码

三段式状态机

// *********************************************************************************
// Project Name : Sequence_detection
// Email        : [email protected]
// Website      : https://home.cnblogs.com/u/hqz68/
// Create Time  : 2019/12/14 
// File Name    : Sequence_detection.v
// Module Name  : Sequence_detection
// Abstract     :
// editor		: sublime text 3
// *********************************************************************************
// Modification History:
// Date         By              Version                 Change Description
// -----------------------------------------------------------------------
// 2019/12/14    宏强子           1.0                     Original
//  
// *********************************************************************************
`timescale      1ns/1ns
module Sequence_detection (
	//system signals
	input					sclk			, 		//10m
	input					s_rst_n			,
	//input
	input			[1:0]	s				,
	//output
	output	reg		[1:0]	z			
);

//========================================================================\
// =========== Define Parameter and Internal signals =========== 
//========================================================================/
localparam			s00	= 4'd0	;
localparam			s01	= 4'd1	;

localparam			s11	= 4'd2	;
localparam			s12	= 4'd3	;
localparam			s13	= 4'd4	;
localparam			s14	= 4'd5	;
localparam			s15	= 4'd6	;
localparam			s16	= 4'd7	;

localparam			s21	= 4'd8	;
localparam			s22	= 4'd10	;
localparam			s23	= 4'd11	;
localparam			s24	= 4'd12	;
localparam			s25	= 4'd13	;
localparam			s26	= 4'd14	;

reg		[3:0]		state		;
reg		[3:0]		next_state	;
//=============================================================================
//****************************     Main Code    *******************************
//=============================================================================
//使用三段式状态机
always @ (posedge sclk or negedge s_rst_n) begin
	if(s_rst_n == 1'b0)
		state <= s00;
	else
		state <= next_state;        
end

always @ (*) begin
        case(state)
        	s00:begin
        		if (s == 2'b00)
        			next_state = s01;
        		else
        			next_state = state;        		        
        	end
        	s01:begin
        		if (s == 2'b01)
        			next_state = s11;
        		else if (s == 2'b10)
        			next_state = s21;
        		else if (s == 2'b11)
        			next_state = s00;
        		else
        			next_state = state;       		        
        	end

        	s11:begin
        		if (s == 2'b11)
        			next_state = s12;
        		else if (s == 2'b00)
        			next_state = s01;
        		else if (s == 2'b10 | s == 2'b01)
        			next_state = s00;
        		else
        			next_state = state;        		                		                		        
        	end

        	s21:begin
        		if (s == 2'b11)
        			next_state = s22;
        		else if (s == 2'b00)
        			next_state = s01;
        		else if (s == 2'b10 | s == 2'b01)
        			next_state = s00;
        		else
        			next_state = state;        		                		                		        
        	end

        	s12:begin
        		if (s == 2'b10)
        			next_state = s13;
        		else if (s == 2'b00)
        			next_state = s01;
        		else if (s == 2'b11 | s == 2'b01)
        			next_state = s00;
        		else
        			next_state = state;         		        
        	end

        	s22:begin
        		if (s == 2'b01)
        			next_state = s23;
        		else if (s == 2'b00)
        			next_state = s01;
        		else if (s == 2'b11 | s == 2'b10)
        			next_state = s00;
        		else
        			next_state = state;         		        
        	end

        	s13:begin
        		if (s == 2'b00)
        			next_state = s14;
        		else if(s != 2'b00)
        			next_state = s00;
        		else
        		    next_state = state;        		        
        	end

        	s23:begin
        		if (s == 2'b00)
        			next_state = s24;
        		else if(s != 2'b00)
        			next_state = s00;
        		else
        		    next_state = state;        		        
        	end

        	s14:begin
        		if (s == 2'b01)
        			next_state = s15;
        		else if (s == 2'b00)
        			next_state = s01;
        		else if (s == 2'b11 | s == 2'b10)
        			next_state = s00;
        		else 
        			next_state = state;         		        
        	end

        	s24:begin
        		if (s == 2'b10)
        			next_state = s25;
        		else if (s == 2'b00)
        			next_state = s01;
        		else if (s == 2'b11 | s == 2'b01)
        			next_state = s00;
        		else 
        			next_state = state;         		        
        	end

        	s15:begin
        		if (s == 2'b11)
        			next_state = s16;
        		else if (s == 2'b00)
        			next_state = s01;
        		else if (s == 2'b01 | s == 2'b10)
        			next_state = s00;  
        		else 
        			next_state = state;      		               		               		        
        	end

        	s25:begin
        		if (s == 2'b11)
        			next_state = s26;
        		else if (s == 2'b00)
        			next_state = s01;
        		else if (s == 2'b01 | s == 2'b10)
        			next_state = s00;
        		else 
        			next_state = state;        		               		               		        
        	end

        	s16:begin
        		if (s == 2'b10)
        			next_state = s13;
        		else if (s == 2'b00)
        			next_state = s01;
        		else if (s == 2'b11 | s == 2'b01)
        			next_state = s00;
        		else
        			next_state = state;	        
        	end

        	s26:begin
        		if (s == 2'b01)
        			next_state = s23;
        		else if (s == 2'b00)
        			next_state = s01;
        		else if (s == 2'b11 | s == 2'b10)
        			next_state = s00;
        		else
        			next_state = state;	        
        	end
        
        	default : next_state = s00;
        endcase
end

always @ (posedge sclk or negedge s_rst_n) begin
	if(s_rst_n == 1'b0)
		z <= 2'b00;
	else if(next_state == s16)
		z <= 2'b10;
	else if(next_state == s26)
		z <= 2'b11;
	else
		z <= 2'b00;	        
end

endmodule

 3.测试平台

`timescale 1ns/1ns

module tb_sim();
reg				sclk		;
reg				s_rst_n		;
reg		[1:0]	s 			;

wire	[1:0]	z			;


initial begin
	sclk = 1;
	s_rst_n = 0;
	s = 2'b11;
	#200
	s_rst_n = 1;

	#100
	s = 2'b00;

	#100
	s = 2'b01;

	#100
	s = 2'b11;

	#100
	s = 2'b10;

	#100
	s = 2'b00;

	#100
	s = 2'b01;

	#100
	s = 2'b11;

	#100
	s = 2'b10;

	#100
	s = 2'b00;

	#100
	s = 2'b01;

	#100
	s = 2'b11;

	#100
	s = 2'b00;

	#100
	s = 2'b10;

	#100
	s = 2'b11;

	#100
	s = 2'b01;

	#100
	s = 2'b00;

	#100
	s = 2'b10;

	#100
	s = 2'b11;

	#100
	s = 2'b01;

	#100
	s = 2'b00;

	#100
	s = 2'b10;

	#100
	s = 2'b11;


end


always #50 sclk = ~sclk;

 Sequence_detection Sequence_detection_inst(
	//system signals
	.sclk				(sclk			), 		//10m
	.s_rst_n			(s_rst_n		),
	//input
	.s					(s 				),
	//output
	.z					(z				)
);
endmodule

4.仿真波形

发布了36 篇原创文章 · 获赞 28 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_40377195/article/details/103539079
今日推荐