“01110”双输入口序列检测器的Verilog设计

设计一个序列检测功能的时序电路,如图所示。其输入信号有clr、clk、A、 B,输出信号Z。其中clk为时钟信号, clr是低电平有效的异步复位信号,A、B是输入数据信号。有一个二进制串行数据D0D1D2D3……Dx,以两位为一组顺序送入电路,D0送入A,D1送到B,以此类推。电路检测此串行数据中是否存在“01110”序列,每发现一个序列则在Z输出一个时钟周期宽度的高电平脉冲。注意相邻 “01110” 序列数据位不重叠。

1.状态图

根据题意可定义5种状态,需要3个触发器(3位编码)。

S0:初始状态。编码000。

S1:输入0。编码001。

S2:输入01。编码010。

S3:输入011。编码011。

S4:输入0111。编码100。

2. 三段式代码

主代码:

module detector_01110(input wire      A,
	                                  B,
	                                clk,
	                                rst,
	                  output reg      Z);
	reg[2:0] Current_state, Next_state;
	parameter S0=3'b000, S1=3'b001, S2=3'b010, S3=3'b011, S4=3'b100;
	always@(posedge clk, negedge rst)
	begin
		if(!rst)
		Current_state<=S0;
		else 
		Current_state<=Next_state;
	end
	always@(Current_state, A, B)
	begin
		case(Current_state)
		S0: if(A==1&&B==1) Next_state=S0;
			else if(A==0&&B==1) Next_state=S2;
			else Next_state=S1;	 
		S1: if(A==0&&B==1) Next_state=S2;
			else if(A==1&&B==1) Next_state=S3;
			else Next_state=S1;
		S2: if(A==0&&B==1) Next_state=S2;
			else if(A==1&&B==1) Next_state=S4;
			else Next_state=S1;
		S3: if(A==0&&B==0) Next_state=S1;
			else if(A==0&&B==1) Next_state=S2;
			else Next_state=S0;
		S4: if(B==1) Next_state=S0;
			else Next_state=S1;
		endcase
	end
always@(posedge clk, negedge rst)
	begin
		if(!rst) Z<=0;
		else begin 
			case(Current_state)
				S0,S1,S2:Z<=0;
				S3:if(A==1&&B==0) Z<=1;
				   else Z<=0;
				S4:if(A==0) Z<=1;
				   else Z<=0;
			endcase
		end
	end				
endmodule

测试代码(输入AB分别为10,11,01,11,01,10,11,10,00):

module detector_01110_tb ();
	reg    A,
           B,
	     clk,
	     rst;
	wire Z;
detector_01110 udetector_01110(
	.A(A),
	.B(B),
	.clk(clk),
	.rst(rst),
	.Z(Z)
	);
always #5 clk =!clk;
	initial begin
		clk=0;
		rst=0;
		A=0;
		B=0;
	#10 rst=1;
	#5  A=1;
		B=0;
	#10 A=1;
		B=1;
	#10 A=0;
		B=1;
	#10 A=1;
		B=1;
	#10 A=0;
		B=1;
	#10 A=1;
	    B=0;
	#10 A=1;
		B=1;
	#10 A=1;
		B=0;
	#20 A=0;
		B=0;
	$finish;
	end
initial begin
  $dumpfile("detector_01110.vcd");
  $dumpvars() ;
	end
endmodule

 3.仿真结果

 

 输入信号中出现两次“01110”,输出波形也输出两次高电平。由波形可知,该设计满足序列检测的要求。

4. 总结

与常见的单输入序列检测器不同,本题要求设计的是双输入序列检测器,但分析和设计方法与单输入是一样的,都是先画状态图,再根据状态图写三段式代码,唯一区别在于要定义两个输入信号。

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 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
发出的红包

打赏作者

via amiko

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值