显示状态机之序列检测器

1.1 简介

为了比较Mealy 状态机和Moore状态机的异同和许多书写上的注意事项,参考相关书籍,设计了一个111序列检测器,并用verilog代码实现。本文将介绍设计思路、一些小细节。并且比较了NRZ码和RZ(曼彻斯特编码)码的在Mealy 状态机和Moore状态机中的检测结果,发现Mealy 状态机在检测RZ码时候时会产生一定的毛刺。

1.2 原理介绍

用状态机书写序列检测器,可分为Mealy 状态机和Moore状态机,Mealy 状态机的输出取决于当前状态和和输入,但是Moore状态机的输出只取决于当前状态,所以这就导致了Mealy 状态机对输入响应快,Moore状态机对输入响应慢的特点,因此Mealy 状态机比Moore状态机的速度要快,并且状态更少,不过综合后的电路比较复杂,而Moore状态机的电路简单。还有一个需要注意的是Mealy 状态机的输出不是特别的稳定,由于输出可以直接被输入影响,所以不是特别的稳定。一旦输入改变,输出很可能会改变。
针对这个状态机的设计,增加了同步复位功能(高电位服务)、同步使能(高电位使能),设计了一个初始状态,
对于Mealy 状态机大致状态转换图:
在这里插入图片描述
对于Moore状态机大致状态转换图:
在这里插入图片描述

1.3 verilog代码

1.3.1 Mealy 状态机

// 设计一个mealy型111序列检测器。
// 有同步复位功能和使能信号端口
// 采用三段式写法
module detector_1111_mealy(bit_in,clk,rest,en,cout);
	// ports define
	input bit_in,clk,rest,en;
	output cout;

	reg cout;
	reg [1:0] state,next_state;

	// state define
	parameter Idele = 2'b00;//启动和初始化状态
	parameter state1 = 2'b01;//检测到0
	parameter state2 = 2'b10;// 检测到1
	parameter state3 = 2'b11;// 检测到11

	// state transform
	always @(negedge clk)begin
		if(rest)
			state <= Idele;
		else
			state <= next_state;
	end
	
	// state change
	always @(*)begin
		next_state = Idele;
		case (state)
			Idele : if((en==1)&&(bit_in==1))
					next_state = state2;
				else if((en ==1 )&&(bit_in==0))
					next_state = state1;
				else 
				       next_state = Idele;	
			state1 : if(bit_in==1)
					next_state = state2;
				else
					next_state = state1;
			state2 : if(bit_in==1)
					next_state = state3;
				else
					next_state = state1;
			state3 :  if(bit_in==1)     // 这里可以写带复位的还是不带复位的序列检测器。
   
					next_state = state3;
				else
					next_state = state1;		
			default: 	next_state = Idele;

			
		endcase
	end

	// ouput
	assign  cout = (state==state3&&bit_in==1)? 1'b1 :1'b0;

endmodule

1.3.2 Moore 状态机

//设计一个mealy型111序列检测器。
// 有同步复位功能和使能信号端口
// 采用三段式写法
module detector_1111_moore(bit_in,clk,rest,en,cout);
	// ports define
	input bit_in,clk,rest,en;
	output cout;

	reg cout;
	reg [2:0] state,next_state;

	// state define
	parameter Idele = 3'b000;
	parameter state1 = 3'b001;
	parameter state2 = 3'b010;
	parameter state3 = 3'b011;
	parameter state4 = 3'b100;
	

	// state transform
	always @(negedge clk)begin
		if(rest)
			state <= Idele;
		else
			state <= next_state;
	end
	
	// state change
	always @(*)begin
		next_state = Idele;
		case(state)
			Idele : if((en==1)&&(bit_in==1))
					next_state = state2;
				else if((en==1)&&(bit_in==0))
					next_state = state1;
				else
					next_state = Idele;
			state1: if(bit_in==1)
					next_state = state2;
				else
					next_state = state1;
			state2: if(bit_in==1)
					next_state = state3;
				else
					next_state = state1;
			state3: if(bit_in==1)
					next_state = state4;
				else
					next_state = state1;
			state4: if(bit_in==1)
					next_state = state4;
				else
					next_state = state1;
			default: next_state = Idele;	
		endcase
	end

	// ouput
	assign  cout = (state==state4)? 1'b1 :1'b0;

endmodule

1.3.3 testbench

// 测试模块
// NRZ码RZ码联合方针和
module detector_1111_tb();
	reg D_in_NRZ,D_in_RZ,rest,clk,en;
	wire Mealy_NRZ;
	wire Moore_NRZ;
	wire Mealy_RZ;
	wire Moore_RZ;
	// module
	detector_1111_mealy M1_NRZ(.bit_in(D_in_NRZ),.clk(clk),.rest(rest),.en(en),.cout(Mealy_NRZ));
	detector_1111_mealy M2_RZ(.bit_in(D_in_RZ),.clk(clk),.rest(rest),.en(en),.cout(Mealy_RZ));
	detector_1111_moore M3_NRZ(.bit_in(D_in_NRZ),.clk(clk),.rest(rest),.en(en),.cout(Moore_NRZ));
	detector_1111_moore M4_NRZ(.bit_in(D_in_RZ),.clk(clk),.rest(rest),.en(en),.cout(Moore_RZ));


	initial #275 $finish;
	initial begin
		 clk=0;
		forever #10 clk= ~clk;
	end
	initial begin
		#5 en =1;
		#50 en =0;
	end
	initial begin
		#5 rest=1;
	        #22 rest=0;	
	end

	initial fork
		begin
			#10 D_in_NRZ =0;
			#25 D_in_NRZ =1;
			#80 D_in_NRZ =0;
		end
		begin
			#135 D_in_NRZ =1;
			#40 D_in_NRZ =0;
		end
		begin
			#195 D_in_NRZ = 1'bx;
			#60 D_in_NRZ = 0;
		end
	

	join

	initial fork
		#10 D_in_RZ =0;
		#35 D_in_RZ =1;#45 D_in_RZ =0;
		#55 D_in_RZ =1;#65 D_in_RZ =0;
		#75 D_in_RZ =1;#85 D_in_RZ =0;
		#95 D_in_RZ =1;#105 D_in_RZ =0;
		#135 D_in_RZ =1;#145 D_in_RZ =0;
		#155 D_in_RZ =1;#165 D_in_RZ =0;
		#195 D_in_RZ =1;#250 D_in_RZ =0;


	join


	initial begin
		`ifdef DUMP_VPD
			$vcdpluson();
		`endif
	end

		
endmodule

1.4 编译结果

编译工具 VCS2016
在这里插入图片描述
可以看出在mealy_RZ状态机出会出现毛刺,这是由于输出跟随输入变换产生的。

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
课程设计任务书 学生姓名 胡俊 学生专业班级 计 算 机0801 指导教师 王莹 学 院 名 称 计算机科学与技术学院 一、题目:“1 1 1”序列检测器。 原始条件:使用D触发器( 74 LS 74 )、“与”门 ( 74 LS 08 )、“或”门( 74 LS 32 )、非门 ( 74 LS 04 ),设计“1 1 1”序列检测器。 二、要求完成设计的主要任务如下: 1.能够运用数字逻辑的理论和方法,把时序逻辑电路设计和组合逻辑电路设计相结合,设计一个有实际应用的数字逻辑电路。 2.使用同步时序逻辑电路的设计方法,设计“1 1 1”序列检测器。写出设计中的5个过程。画出课程设计图。 3.根据74 LS 74、74 LS 08、74 LS 32、74 LS 04集成电路引脚号,在设计好的“1 1 1”序列检测器电路图中标上引脚号。 4.在试验设备上,使用74 LS 74、74 LS 08、74 LS 32、74 LS 04集成电路连接、调试和测试“1 1 1”序列检测器电路。 三、实验设计过程: 第1步,画出原始状态图和状态表。 根据任务书要求,设计的序列检测器有一个外部输入x和一个外部输出Z。输入和输出的逻辑关系为:当外部输入x第一个为“1”,外部输出Z为“0”;当外部输入x第二个为“1”,外部输出Z为“0”;当外部输入x第三个为“1”,外部输出Z才为“1”。假定有一个外部输入x序列以及外部输出Z为: 输入x: 0 1 0 1 1 1 0 1 1 1 1 0 1 输出Z: 0 0 0 0 0 1 0 0 0 1 1 0 0 要判别序列检测器是否连续接收了“111”,电路必须用不同的状态记载外部输入x的值。假设电路的初始状态为A,x输入第一个“1”,检测器状态由A装换到B,用状态B记载检测器接受了111序列的第一个“1”,这时外部输出Z=0;x输入第二个“1”,检测器状态由B装换到C,用状态C记载检测器接受了111序列的第二个“1”,外部输出Z=0;x输入第三个“1”,检测器状态由C装换到D,外部输出Z=1。然后再根据外部输入及其他情况时的状态转移,写出相应的输出。以上分析了序列检测器工作,由此可画出图7-1所示的原始状态图。根据原始状态图可列出原始状态表,如表7-2所示。
一、实验目的: 1、深入了解与掌握同步时序逻辑电路的设计过程; 2、了解74LS74、74LS08、74LS32及74LS04芯片的功能; 3、能够根据电路图连接好实物图,并实现其功能。学会设计过程中的检验与完善。 二、实验内容描述: 题目:“1 1 1”序列检测器。 原始条件:使用D触发器( 74 LS 74 )、“与”门 ( 74 LS 08 )、“或”门( 74 LS 32 )、非门 ( 74 LS 04 ),设计“1 1 1”序列检测器。 集成电路引脚图: D触发器( 74 LS 74 ) “与”门 ( 74 LS 08 ) “或........ 三、实验设计过程: 第1步,画出原始状态图和状态表。 根据任务书要求,设计的序列检测器有一个外部输入x和一个外部输出Z。输入和输出的逻辑关系为:当外部输入x第一个为“1”,外部输出Z为“0”;当外部输入x第二个为“1”,外部输出Z为“0”;当外部输入x第三个为“1”,外部输出Z才为“1”。假定有一个外部输入x序列以及外部输出Z为: 输入x: 0 1 0 1 1 1 0 1 1 1 1 0 1 输出Z: 0 0 0 0 0 1 0 0 0 1 1 0 0 要判别序列检测器是否连续接收了“111”,电路必须用不同的状态记载外部输入x的值。假设电路的初始状态为A,x输入第一个“1”,检测器状态由A装换到B,用状态B记载检测器接受了111序列的第一个“1”,这时外部输出Z=0;x输入第二个“1”,检测器状态由B装换到C,用状态C记载检测器接受了111序列的第二个“1”,外部输出Z=0;x输入第三个“1”,检测器状态由C装换到D,外部输出Z=1。然后再根据外部输入及其他情况时的状态转移,写出相应的输出。以上分析了序列检测器工作,由此可画出图7-1所示的原始状态图。根据原始状态图可列出原始状态表,如表7-2所示。 现态 次态/输出 x = 0 x = 1 A A / 0 B / 0 B A / 0 C / 0 C A / 0 D / 1 D A / 0 D / 1 (表 7-2 原始状态表) (图

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值