“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. 总结

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

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

via amiko

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

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

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

打赏作者

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

抵扣说明:

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

余额充值