Verilog设计“111”检测器与“01110”检测器并测试所有情况

Verilog实现“111”检测器与“01110”检测器的设计

使用Quartus+modelsim完成本次设计

1. "111"检测器

在这里插入图片描述

分析

分析题目,得到其有限状态机为下图:
在这里插入图片描述

代码实现

module detector111(
	input X,
	input rst,
	input clk,
	output OUT
);
	reg [1:0]state;
	reg [1:0]next_state;
	parameter S0=2'd0,S1=2'd1,S2=2'd2,S3=2'd3;
	
	assign OUT = (state==S3)?1:0;			//define OUT=1 when S3 state
	
	
	always @ (posedge clk or posedge rst) 
		if (rst)
			state  <=  S0;
		else
			state  <=  next_state;
	
	always@(*)
		case(state)
		S0:if(X) next_state <= S1;
			else 	next_state <= S0;
		S1:if(X)	next_state <= S2;
			else  next_state <= S0;
		S2:if(X)	next_state <= S3;
			else	next_state <= S0;
		S3:if(X) next_state <= S3;
			else  next_state <= S0;
		default: next_state <= S0;
		endcase

endmodule 

Testbench

`timescale 1 ns/ 1 ns
module detector111_vlg_tst();
reg X;
reg clk;
reg rst;                                            
wire OUT;
                      
detector111 i1 (
	.OUT(OUT),
	.X(X),
	.clk(clk),
	.rst(rst)
);
	always #10 clk = ~clk;
	initial                                                
		begin                                                  
			 rst = 1;
			 clk = 0;
			#10 rst = 0; 
			#20 X = 1;
			#20 X = 0;
			#20 X = 1;
			#20 X = 1;
			#20 X = 1;
			#20 X = 1;
			#20 X = 0;
			#20 X = 1;
			#20 X = 0;
			#20 X = 1;
			#20 X = 1;
			#20 X = 1;
			#20 X = 1;
			#20 $stop;
		end				
	initial $monitor($time,"X=%b,OUT=%b",X,OUT);
endmodule

结果

Modelsim结果如下图所示,分析可知实现了题目要求。

在这里插入图片描述

逻辑综合出来的电路如下图所示:即只有S3状态才会输出OUT=1。

在这里插入图片描述

其中的state的状态机如下图所示(RLT viewer中所示),可见其与分析中绘制的状态机一致。

在这里插入图片描述


2. "01110"检测器

在这里插入图片描述

分析

题目中关键点为一下几点:

  • 检测01110,且他们不重叠。意思为要求检测到一个01110,然后从一个新的开始检测。
  • 同时输入AB,那么考虑A和B哪个是01110的开始标志
  • Z输出的是一个时钟周期宽度的高电平脉冲,所以要在always里进行赋值

根据题目绘制状态机如下图所示,其中S0表示01110中的0,以此类推,特别注意S1表示第一位是1即没有意义。其中输出为1即检测出01110的状态用红色标出


如果要测试所有情况,那么就是讲detector01110模块中的所有case模块都遍历到,及遍历以下所有情况,需要修改的只有testbench。而如果遍历所有情况,通过分析知道,每次AB的状态为2bit数,可以理解为4种前进的方向,然后一共5个状态,那么要遍历的次数为4^5=1024种情况,遍历即可。

			case(state)
			S0:case({A,B})
				4'b00:state<=S0;
				4'b01:state<=S01;
				4'b10:state<=S0;
				4'b11:state<=S011;
			endcase
			S01:case({A,B})
				4'b00:state<=S0;
				4'b01:state<=S01;
				4'b10:state<=S0;
				4'b11:state<=S0111;
			endcase		
			S011:case({A,B})
				4'b00:state<=S0;
				4'b01:state<=S01;
				4'b10:state<=S1;
				4'b11:state<=S1;
			endcase			
			S0111:case({A,B})
				4'b00:state<=S0;
				4'b01:state<=S01;
				4'b10:state<=S0;
				4'b11:state<=S1;
			endcase
			S1:case({A,B})
				4'b00:state<=S0;
				4'b01:state<=S01;
				4'b10:state<=S0;
				4'b11:state<=S1;
			endcase	

代码实现

module detector01110(
	input clk,
	input clr,
	input A,
	input B,
	output reg Z	
);
	reg [3:0]state;
	parameter	S0 = 4'b0,
			  	S01 = 4'b01,
			  	S011 = 4'b011,
				S0111 = 4'b0111,
				S1 = 4'b10;//S1 is random because S01 has already existed
	always@(posedge clk or negedge clr)
	begin
	if(!clr) 
		begin 
		state <= S0;
		Z<=0;		
		end //for {A,B}=4'b00;
	else 
		begin
			Z = (state==S011&{A,B}==4'b10 | state==S0111&A==4'b0)?1:0;
			case(state)
			S0:case({A,B})
				4'b00:state<=S0;
				4'b01:state<=S01;
				4'b10:state<=S0;
				4'b11:state<=S011;
			endcase
			S01:case({A,B})
				4'b00:state<=S0;
				4'b01:state<=S01;
				4'b10:state<=S0;
				4'b11:state<=S0111;
			endcase		
			S011:case({A,B})
				4'b00:state<=S0;
				4'b01:state<=S01;
				4'b10:state<=S1;
				4'b11:state<=S1;
			endcase			
			S0111:case({A,B})
				4'b00:state<=S0;
				4'b01:state<=S01;
				4'b10:state<=S0;
				4'b11:state<=S1;
			endcase
			S1:case({A,B})
				4'b00:state<=S0;
				4'b01:state<=S01;
				4'b10:state<=S0;
				4'b11:state<=S1;
			endcase		
		endcase		
		end	
	end
endmodule 

Testbench

`timescale 1 ns/ 1 ns
module detector01110_vlg_tst();
reg A;
reg B;
reg clk;
reg clr;
// wires                                               
wire Z;
                      
detector01110 ins1 (
// port map - connection between master ports and signals/registers   
	.A(A),
	.B(B),
	.Z(Z),
	.clk(clk),
	.clr(clr)
);
	always #10 clk = ~clk;
	
	integer i0;
	integer i1;
	integer i2;
	integer i3;
	integer i4;
	//5 layers circulation
    //4^5=1024
	initial                                                
		begin                                                  
			clr = 0;
			clk = 0;
			{A,B} = 4'b00;
			#15 clr = 1; 
			for(i0=0;i0<4;i0=i0+1)
			begin
				#20 {A,B} = i0;
				for(i1=0;i1<4;i1=i1+1)
				begin
					#20 {A,B} = i1;
					for(i2=0;i2<4;i2=i2+1)
					begin 
						#20 {A,B} = i2;
						for(i3=0;i3<4;i3=i3+1)
						begin
							#20 {A,B} = i3;
							for(i4=0;i4<4;i4=i4+1)
								#20 {A,B} = i4;
						end		
					end	
				end	
			end					
			#50 $stop;
		end			
		
	initial $monitor($time,"Z=%b",Z);
endmodule

结果

Modelsim仿真结果如下所示,经分析与预期一致
在这里插入图片描述

在这里插入图片描述

逻辑综合后的结果如下图所示:

在这里插入图片描述

state里的状态机如下图所示,符合预期:

在这里插入图片描述

  • 7
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、实验目的: 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、付费专栏及课程。

余额充值