verilog-"10101"狀態機序列檢測器的設計


首先,畫出狀態轉移圖
在這里插入圖片描述
代碼:

module xulie10101 #(
	parameter S0 = 3'b000,//狀態定義
	parameter S1 = 3'b001,
	parameter S2 = 3'b010,
	parameter S3 = 3'b011,
	parameter S4 = 3'b100
	)
	(
	input in,
	input clk,
	input reset,
	output out
	);
	
	input clk,reset,in;//輸入輸出
	output reg out;

	reg [2:0] state;
	reg [2:0] next_state;//寄存狀態
	
	always @ (posedge clk)//狀態切換
	if(reset) 
		state <= S0;
	else 
		state <= next_state;
	
	
	always @ (in or state)
	begin
		case(state)
		S0:
			begin
			if (in) 
				begin
				next_state <= S1;
				out = 1'b0;
				end
			else
			    begin
				next_state <= S0;
				out = 1'b0;
				end
		    end
		S1:begin
			if (in) begin
				next_state <= S1;
				out = 1'b0;
				end
			else begin
				next_state <= S2;
				out = 1'b0;
				end
		   end
		S2:begin
			if (in) begin 
				next_state <= S3;
				out = 1'b0;
				end
			else begin
				next_state <= S0;
				out = 1'b0;
				end
		   end
		S3:begin
			if (in) begin
				next_state <= S1;
				out = 1'b0;
				end
			else begin
				next_state <= S4;
				out = 1'b0;
				end
		   end
		S4:begin
			if (in) begin
				next_state <= S1;
				out = 1'b1;
				end
			else begin
				next_state <= S0;
				out = 1'b0;
				end
		   end
		endcase
	end
endmodule

測試代碼:

module xulie10101_tb();
	wire out;
	wire state,next_state;
	reg in;
	reg clk,reset;
	
	initial 
	begin //time
		clk = 0;
		forever #50 clk = ~clk;
	 end
	
	initial
		begin
			in = 0;
			reset = 1;
			#200 reset = 0;
			
			#50 in = 1;#100 in = 0;#100 in = 1;
			#100 in = 0;#100 in = 1;#100 in = 0;
			#100 in = 1;#100 in = 1;#100 in = 1;
			#100 in = 1;#100 in = 0;#100 in = 1;
			#100 in = 1;#100 in = 1;#100 in = 1;
			#100 in = 1;#100 in = 0;#100 in = 1;
			#100 in = 0;#100 in = 1;#100 in = 0;
		end
	xulie10101 m( 	.in(in),
			        .out(out),
                    .clk(clk),
			        .reset(reset));
endmodule

仿真結果:
在這里插入圖片描述

越是憧憬,越要風雨兼程


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM