利用Verilog HDL实现序列检测器,附上仿真程序。


一、序列检测器

序列检测器的逻辑功能就是将一个指定的比特序列从一串较长的比特流中识别出来。
例如:针对一个较长的比特流010010010011110101010…,我们希望能将比特序列为“10010”的序列检测出来,并且每次检测到10010就将输出置“1”.

注意:如序列”100100100…",根据以上的介绍,会在第六个比特的时刻输出会置1,但是,在第9个比特时输出不会被置”1“,虽然第4-8比特也构成了”10010“,但是却与第一次的”10010“重叠,因此不能算作有效检测。


二、状态转移图

在这里插入图片描述

设:
S0表示初始态,代表检测到第一个比特为0,即”0“;
S1是第二个状态,代表检测到第一个比特为1,即”1“;
S2是第三个状态,代表检测到的序列为”10“;
S3是第四个状态,代表检测到的序列为”100“;
S4是第五个状态,代表检测到的序列为”1001“;

注意:该状态的设定已经化简掉多余状态。

三、序列检测器Verilog HDL程序

1、源程序

代码如下:

module SeqDetecter(
	clk,
	reset_n,
	bits,
	Det_Done
	);
	
	input	clk;
	input	reset_n;
	input	bits;
	output	reg Det_Done;
	
	parameter	S0 = 5'b00001;
	parameter	S1 = 5'b00010;
	parameter	S2 = 5'b00100;
	parameter	S3 = 5'b01000;
	parameter	S4 = 5'b10000;
	
	reg		[4:0] state;
	
	always @(posedge clk,negedge reset_n)
	if(!reset_n) 
	   state <= 5'b00001;
	else begin
	   case(state)
	       S0:     if(bits == 0) state<=S0; else  state<=S1;
	       S1:     if(bits == 0) state<=S2; else  state<=S1;  
	       S2:     if(bits == 0) state<=S3; else  state<=S1;
           S3:     if(bits == 0) state<=S0; else  state<=S4;
           S4:     if(bits == 0) state<=S0; else  state<=S1;
           default:              state<=S0;
       endcase
    end
    
	always @(posedge clk,negedge reset_n)
	if(!reset_n)
	   Det_Done<=0;
	else begin
	   case(state)
	       S0:     Det_Done <= 1'b0;
	       S1:     Det_Done <= 1'b0;  
	       S2:     Det_Done <= 1'b0;
           S3:     Det_Done <= 1'b0;
           S4:     if(bits == 0) Det_Done<=1'b1; else  Det_Done<=1'b0;
           default:Det_Done <= 1'b0;
       endcase
    end
endmodule

2、测试平台程序

代码如下(示例):

`timescale 1ns / 1ns

module seq_detecter_tb;
    reg     sclk;
    reg     sreset_n;
    wire    oDet_Done;
    
    wire    x;
    reg     [23:0]seqs;

SeqDetecter inst0(
	.clk(sclk),
	.reset_n(sreset_n),
	.bits(x),
	.Det_Done(oDet_Done)
	);
	
	initial sclk = 0;
	always #10 sclk = ~sclk;
	
	assign x = seqs[23];
	
	initial begin
	sreset_n   = 1;
	seqs       = 23'b0; 
	#200;
	sreset_n   = 0;
	#20;
	sreset_n   = 1;
	seqs       = 20'b1100_1001_0000_1001_0100;
	#1000;
	$stop;
	end
	
	always @(posedge sclk)
	seqs = {seqs[22:0],seqs[23]};
	
endmodule

该处使用的url网络请求的数据。


四、仿真结果

在这里插入图片描述

五、总结

本博文实现了一个简单的基于状态机的序列检测器,并给出了仿真结果,可以作为Verilog HDL学习中,时序电路设计的练习题目。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

阿__星

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

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

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

打赏作者

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

抵扣说明:

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

余额充值