序列检测器(两种设计方法和四种检测模式|verilog代码|Testbench|仿真结果)

这篇具有很好参考价值的文章主要介绍了序列检测器(两种设计方法和四种检测模式|verilog代码|Testbench|仿真结果)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录
  • 一、前言
  • 二、状态机法和寄存器法
    • 2.1状态机法
      • 2.11 使用状态机检测“1001”
      • 2.12 verilog代码
      • 2.13 testbench
      • 2.14仿真结果
    • 2.2移位寄存器法
      • 2.21 使用移位寄存器法检测1001
      • 2.22 verilog代码
      • 2.23 testbench
      • 2.24仿真结果
  • 三、重叠检测与非重叠检测(检测序列1001)
    • 3.1重叠检测
      • 3.11 重叠检测方法
      • 3.12verilog代码
      • 3.13Testbench
      • 3.14仿真结果
    • 3.2非重叠检测
      • 3.21 非重叠检测方法
      • 3.22verilog代码
      • 3.23Testbench
      • 3.24仿真结果
  • 四、总结

序列检测器(两种设计方法和四种检测模式|verilog代码|Testbench|仿真结果)



数字IC经典电路设计

经典电路设计是数字IC设计里基础中的基础,盖大房子的第一部是打造结实可靠的地基,每一篇笔者都会分门别类给出设计原理、设计方法、verilog代码、Testbench、仿真波形。然而实际的数字IC设计过程中考虑的问题远多于此,通过本系列希望大家对数字IC中一些经典电路的设计有初步入门了解。能力有限,纰漏难免,欢迎大家交流指正。

快速导航链接如下:

个人主页链接

1.数字分频器设计

2.序列检测器设计

3.序列发生器设计

4.序列模三检测器设计

5.奇偶校验器设计

6.自然二进制数与格雷码转换



一、前言

在数字电路中,序列检测器(Sequence Detector)是指一种特殊类型的电路,用于寻找输入信号中一定模式的子序列。该模式可以是任意模式,包括重复模式、连续模式、间隔模式等等。通常的序列检测方法有2种:有限状态机法(FSM);移位寄存器法。

为什么需要设计序列检测电路呢?

在数字集成电路中,序列检测电路可以用于检测输入信号序列中是否存在特定的模式和序列,以及判断实际输出和理论输出是否存在差异。序列检测器是确保数字系统的正确运行不可或缺的一部分!

那么数字IC中哪些部分需要设计呢?

数字集成电路(Digital Integrated Circuit,简称DIC)中需要设计序列检测电路的部分主要包括以下几个方面:
数据输入端:序列检测电路可以用于检测输入数据是否符合特定的格式要求,或者是否存在错误或干扰。在数字集成电路中,输入数据通常是通过输入端口输入的,因此需要在输入端口处设计序列检测电路。
控制信号:数字集成电路中的控制信号通常是用于控制数字系统的操作序列,以确保系统按照预期的顺序执行操作。在这种情况下,序列检测电路可以用于检测控制信号是否按照预期的序列进行。
数据输出端:序列检测电路还可以用于检测输出数据是否符合特定的格式要求,或者是否存在错误或干扰。在数字集成电路中,输出数据通常是通过输出端口输出的,因此需要在输出端口处设计序列检测电路。
内部信号:数字集成电路中的内部信号通常是在芯片内部传递的信号,例如时钟信号、地址信号、数据信号等。在这种情况下,序列检测电路可以用于检测内部信号是否按照预期的序列进行。

在IC设计的过程中,不同的部分的序列检测器检测的序列和发挥的具体作用不尽心相同。因此在数字集成电路中,需要根据具体的应用场景,针对不同的部分设计相应的序列检测电路。

二、状态机法和寄存器法

对于序列检测器的设计,常规的设计方法有两种:状态机法和移位寄存器法。

状态机法最重要的是明白状态机状态的转移过程:在数据输入之后判断是否匹配,若匹配则进入下一状态,不匹配则根据输入的数据具体判断进入的下一状态(也有可能保持在原来的状态)。状态机设计过程一定要注重状态的数量和状态转移以及状态转移条件,避免状态的缺失以及状态转移的不合理循环。

移位寄存器法法基本原理是数据的移位和移位数据的对比:首先将对应的初始数据缓存在寄存器中作为一个数组,数据输入后置于于数组的末尾,数组其它元素左移,把最早输入的数据移出,每输入一个数据后刷新一次。然后将数组和目标序列对比,如果数组和目标序列相等,则说明出现目标序列。

2.1状态机法

2.11 使用状态机检测“1001”

题目:设计一个序列检测器,用来检测序列1001,用_状态机完成电路,可重复检测_序列1001(即本文第三部分的重叠检测)。

第一步,分析状态机状态转移,分析如下:

IDLE: 初始状态,代表目前没有接收到满足要求的数据。
seq_in = 1时,等于1001中的第一个数,进入S1状态;

seq_in = 0时,保持状态。

S1:代表目前已经有了1个匹配的数据。

seq_in = 0时,当前序列为10,等于1001中的前两个数,进入S2状态;

seq_in = 1时,当前序列为11,不是1001的前两个数,但1是1001的第一个数,所以保持S1状态。

S2:代表目前已经有了2个匹配的数据。
seq_in = 0时,当前序列为100,等于1001中的前三个数,进入S3状态;

seq_in = 1时,当前序列为101,不是1001的前三个数,但1是1001的第一个数,所以进入S1状态。

S3:代表目前已经有了3个匹配的数据。
seq_in = 1时,当前序列为1001,与要求序列匹配,进入S4状态;

seq_in = 0时,当前序列为1000,与要求序列不配,0与初始状态匹配,所以进入IDLE状态。

S4:最终状态,代表目前已经得到了匹配的序列,输出信号翻转。
seq_in = 1时,当前序列为10011,1与要求序列的第一个数匹配,所以进入S1状态;

seq_in = 0时,当前序列为10010,10与要求的前两个数匹配,所以进入S2状态。

第二步:根据流程转换分析画出状态机的状态转移图,如下图所示:

序列检测器(两种设计方法和四种检测模式|verilog代码|Testbench|仿真结果)

第三步:根据状态机转移图用经典三段式(或者二段式)写出verilog代码

2.12 verilog代码

//使用状态机设计检测“1001”的序列检测器
//可重叠检测序列“1001”
module sequence_detect01(
     input  clk, 
     input  rst_n,
     input  seq_in, 
     output mismatch				//检验序列是否匹配,匹配输出0,不匹配输出0
     );

//采用独热码编译五个状态,初始IDLE状态为待机状态
//独热码相比二进制码和格雷码,方便电路设计判断、状态转移,且逻辑更简单        
parameter        IDLE = 5'b00001;
parameter        S1   = 5'b00010;
parameter 	     S2   = 5'b00100;
parameter        S3   = 5'b01000;
parameter        S4   = 5'b10000; 

//定义两个寄存器表示状态机的目前状态和下一状态
reg [4:0]		 curr_state;
reg [4:0] 		 next_state;

//第一段使用时序逻辑描述状态转移
always@(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
	    curr_state <= IDLE;
    end
    else begin
	    curr_state <= next_state;
    end
end

//第二段使用组合逻辑判断状态转移条件
always@(*) begin
    if(!rst_n) begin
	    next_state <= IDLE;
    end
    else begin
	    case(curr_state)
	        IDLE  :next_state = seq_in?S1:IDLE;
	        S1	  :next_state = seq_in?S1:S2;
	        S2	  :next_state = seq_in?S1:S3;
	        S3	  :next_state = seq_in?S4:IDLE;
	        S4	  :next_state = seq_in?S1:S2;
	        default:next_state = IDLE;	//养成良好代码风格,不能遗漏,防生成latch,也可以通过赋初值避免
	    endcase
    end
end

//第三段描述状态输出(可以使用组合逻辑,也可以用时序逻辑)
//此处采用组合逻辑,同时也提供时序逻辑代码示例
assign mismatch = (curr_state ==S4) ? 1'b0 : 1'b1;		//组合逻辑描述输出

/*
//时序逻辑描述输出
always@(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
	     mismatch <= 1'b1;
    end
         else if(next_state == S4) begin
	     mismatch <= 1'b0;
    end
    else begin
	     mismatch <= 1'b1;
    end
end
*/
endmodule

2.13 testbench

`timescale 1ns/1ps		//仿真时间单位1ns 仿真时间精度1ps
module sequence_detect01_tb();

//信号申明
reg		 clk;
reg 	 rst_n;
reg 	 seq_in;
wire 	 mismatch; 

//生成复位信号
//为时钟信号和复位信号赋初值
initial begin
    clk       = 0;
    rst_n     = 1;
    seq_in    = 1;
    #5  rst_n = 0;
    #10 rst_n = 1;
end

always #6  seq_in = $random;	//生成随机数作为信号输入
always #5  clk = ~clk;			//生成时钟信号

//模块实例化(将申明的信号连接起来即可)
sequence_detect01 u_sequence_detect01
    (.clk        	 (clk),
     .rst_n			 (rst_n), 
     .seq_in		 (seq_in),
     .mismatch		 (mismatch)
    );

endmodule

2.14仿真结果

序列检测器(两种设计方法和四种检测模式|verilog代码|Testbench|仿真结果)
)

Testbench中采用随机数来验证序列检测器的准确性,当时间来到705ns,随机数连续输出1001,mismatch在接收四位数字进行信号翻转。

2.2移位寄存器法

2.21 使用移位寄存器法检测1001

题目:设计一个序列检测器,用来检测序列 1001,用_移位寄存器_完成电路设计。

移位寄存器方法比较简单。设置一个和序列等长的寄存器,在数据输入后将输入移入寄存器的最低位,并判断寄存器中的值是否与序列相同。因为移位寄存器的工作原理,设计出来的序列检测器可以重叠检测序列。

2.22 verilog代码

//使用移位寄存器设计检测“1001”的序列检测器
//可重叠检测序列“1001”
module sequence_detect02(
    input    	clk,
    input    	rst_n,
    input    	seq_in,
    output reg	mismatch	//时序逻辑中需要定义为reg型
    );

reg [3:0]    	seq_in_r;	//定义一个寄存器缓存数据

//使用时序逻辑完成复位和移位寄存器移位过程
always@(posedge clk or negedge rst_n) begin
    if (!rst_n) begin 
	    seq_in_r <= 4'b0;							//中间寄存器复位
    end
    else begin
	    seq_in_r <= {seq_in_r[2:0],seq_in};			//输入数据置于数组右端,移位寄存器左移位
    end
end

//使用时序逻辑完成复位与输出	
always@(posedge clk or negedge rst_n) begin
    if (!rst_n) begin 
	    mismatch <= 1'b1;
    end
    else if (seq_in_r == 4'b1001) begin		//若检测到1001则将mismatch置1,表明检测到序列1001
	    mismatch <= 1'b0;
    end
    else begin	
	    mismatch <= 1'b1;					//养成良好代码风格,不能遗漏,防生成latch,可通过赋初值避免
    end 
end

endmodule

2.23 testbench

`timescale 1ns/1ps		//仿真时间单位1ns 仿真时间精度1ps
module sequence_detect02_tb;

//信号申明
reg		clk;
reg 	rst_n;
reg		seq_in;
wire 	mismatch; 

//复位信号生成
//时钟信号与复位信号赋初值
initial begin
    clk       = 0;
    rst_n     = 1;
    seq_in    = 1;
    #5  rst_n = 0;
    #10 rst_n = 1;
end

always #6  seq_in = $random;	//生成随机数作为信号输入
always #5  clk = ~clk;			//生成时钟信号

//模块实例化(将申明的信号连接起来即可)
sequence_detect01 u_sequence_detect01
    (.clk        	 (clk),
     .rst_n		 	 (rst_n), 
     .seq_in		 (seq_in),
     .mismatch		 (mismatch)
    );

endmodule

2.24仿真结果

序列检测器(两种设计方法和四种检测模式|verilog代码|Testbench|仿真结果)

Testbench中采用随机数来验证序列检测器的准确性,当时间来到705ns,随机数连续输出1001,mismatch在接收四位数字且在时钟上升沿进行信号翻转。

三、重叠检测与非重叠检测(检测序列1001)

数字IC序列检测中的重叠检测和非重叠检测是两种不同的检测方式。
重叠检测是指在一个序列中,子序列之间会有部分重叠的情况,而重叠区域也需要进行检测,并被判定为单独的子序列。
非重叠检测则是指在一个序列中,每个子序列之间没有重叠部分,因此只需要检测每个子序列本身是否满足特定的条件即可。

3.1重叠检测

3.11 重叠检测方法

题目:设计一个序列检测器,用来检测序列 1001,用_状态机完成电路,可重复检测_序列1001

第一步,分析状态机状态转移,分析如下:

IDLE: 初始状态,代表目前没有接收到满足要求的数据。
seq_in = 1时,等于1001中的第一个数,进入S1状态;

seq_in = 0时,保持状态。

S1:代表目前已经有了1个匹配的数据。

seq_in = 0时,当前序列为10,等于1001中的前两个数,进入S2状态;

seq_in = 1时,当前序列为11,不是1001的前两个数,但1是1001的第一个数,所以保持S1状态。

S2:代表目前已经有了2个匹配的数据。
seq_in = 0时,当前序列为100,等于1001中的前三个数,进入S3状态;

seq_in = 1时,当前序列为101,不是1001的前三个数,但1是1001的第一个数,所以进入S1状态。

S3:代表目前已经有了3个匹配的数据。
seq_in = 1时,当前序列为1001,与要求序列匹配,进入S4状态;

seq_in = 0时,当前序列为1000,与要求序列不配,0与初始状态匹配,所以进入IDLE状态。

S4:最终状态,代表目前已经得到了匹配的序列,输出信号翻转。
seq_in = 1时,当前序列为10011,1与要求序列的第一个数匹配,所以进入S1状态;

seq_in = 0时,当前序列为10010,10与要求的前两个数匹配,所以进入S2状态。

第二步:根据流程转换分析画出状态机的状态转移图,如下图所示:

序列检测器(两种设计方法和四种检测模式|verilog代码|Testbench|仿真结果)

第三步:根据状态机转移图用经典三段式(或者二段式)写出verilog代码

3.12verilog代码

//使用状态机设计检测“1001”的序列检测器
//可重叠检测序列“1001”
module sequence_detect03(
    input			clk ,
    input			rst_n,
    input			seq_in,
    output reg 		mismatch		//检验序列是否匹配,匹配输出0,不匹配输出0
    );

//采用独热码编译五个状态,初始IDLE状态为待机状态
//独热码相比二进制码和格雷码,方便电路设计判断、状态转移,且逻辑更简单  
parameter		IDLE = 5'b00001;
parameter 	 	S1 	 = 5'b00010;
parameter  		S2 	 = 5'b00100;
parameter  		S3   = 5'b01000;
parameter  		S4   = 5'b10000;

//定义两个寄存器表示状态机的目前状态和下一状态
reg [4:0] curr_state;
reg [4:0] next_state;

//第一段使用时序逻辑描述状态转移
always@(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
	    curr_state <= IDLE;
    end
    else begin
	    curr_state <= next_state;
    end
end

//第二段使用组合逻辑判断状态转移条件
always@(*) begin
    if(!rst_n) begin
	    next_state <= IDLE;
    end
    else begin
	    case(curr_state)
	        IDLE  :next_state = seq_in?S1:IDLE;
	        S1	  :next_state = seq_in?S1:S2;
	        S2	  :next_state = seq_in?S1:S3;
	        S3	  :next_state = seq_in?S4:IDLE;
	        S4	  :next_state = seq_in?S1:S2;
	        default:next_state = IDLE;		//养成良好代码风格,不能遗漏,防生成latch,也可以通过赋初值避免
	endcase
    end
end

//第三段描述状态输出(可以使用组合逻辑,也可以用时序逻辑)
//此处采用时序逻辑,同时也提供组合逻辑代码示例
always@(posedge clk or negedge rst_n) begin			//时序逻辑描述输出
    if(!rst_n) begin
	    mismatch <= 1'b1;
    end
    else if(next_state == S4) begin
	    mismatch <= 1'b0;
    end
    else begin
	    mismatch <= 1'b1;
    end
end

//assign mismatch = (curr_state ==S4) ? 1'b0 : 1'b1;	//组合逻辑描述输出

endmodule

3.13Testbench

`timescale 1ns/1ps		//仿真时间单位1ns 仿真时间精度1ps
module sequence_detect03_tb();

//信号申明
reg		clk;
reg		rst_n;
reg		seq_in;
wire	mismatch;

//复位信号生成
//输入信号生成,输入信号为“1001001001001”
//时钟信号与复位信号赋初值
initial begin 
    clk = 0;
    rst_n = 1;
    #5  rst_n = 0;
    #10 rst_n = 1;
    seq_in = 1;#10;
    seq_in = 0;#10;
    seq_in = 0;#10;
    seq_in = 1;#10;
    seq_in = 0;#10;
    seq_in = 0;#10;
    seq_in = 1;#10;
    seq_in = 0;#10;
    seq_in = 0;#10;
    seq_in = 1;#10;
    seq_in = 0;#10;
    seq_in = 0;#10;
    seq_in = 1;#10;
end 

//时钟信号生成
always #5 clk = ~clk;

//模块实例化(将申明的信号连接起来即可)
sequence_detect03 u_sequence_detect03(
    .clk			(clk),
    .rst_n			(rst_n),
    .seq_in			(seq_in),
    .mismatch		(mismatch)
    );

endmodule

3.14仿真结果

序列检测器(两种设计方法和四种检测模式|verilog代码|Testbench|仿真结果)

输入序列1001001001001,根据可重复检测理论上可检测四次信号翻转,从仿真结果可以看到mismatch发生四次翻转,且第二次翻转的1001中的第一个1来自第一组1001中最后一个1,即发生重叠亦可检测。

3.2非重叠检测

3.21 非重叠检测方法

题目:设计一个序列检测器,用来检测序列 1001,用状态机完成电路,可重复检测序列1001

第一步,分析状态机状态转移,分析如下:

IDLE: 初始状态,代表目前没有接收到满足要求的数据。
seq_in = 1时,等于1001中的第一个数,进入S1状态;

seq_in = 0时,保持状态。

S1:代表目前已经有了1个匹配的数据。

seq_in = 0时,当前序列为10,等于1001中的前两个数,进入S2状态;

seq_in = 1时,当前序列为11,不是1001的前两个数,但1是1001的第一个数,所以保持S1状态。

S2:代表目前已经有了2个匹配的数据。
seq_in = 0时,当前序列为100,等于1001中的前三个数,进入S3状态;

seq_in = 1时,当前序列为101,不是1001的前三个数,但1是1001的第一个数,所以进入S1状态。

S3:代表目前已经有了3个匹配的数据。
seq_in = 1时,当前序列为1001,与要求序列匹配,进入S4状态;

seq_in = 0时,当前序列为1000,与要求序列不配,0与初始状态匹配,所以进入IDLE状态。

S4:最终状态,代表目前已经得到了匹配的序列,输出信号翻转。
seq_in = 1时,当前序列为10011,1与要求序列的第一个数匹配,所以进入S1状态;

seq_in = 0时,当前序列为10010,10与要求的前两个数匹配,但是要求非重叠检测,所以进入IDLE状态。

第二步:根据流程转换分析画出状态机的状态转移图,如下图所示

序列检测器(两种设计方法和四种检测模式|verilog代码|Testbench|仿真结果)

第三步:根据状态机转移图用经典三段式(或者二段式)写出verilog代码

3.22verilog代码

//使用状态机设计检测“1001”的序列检测器
//非重叠检测序列“1001”
module sequence_detect04(
    input			clk ,
    input			rst_n,
    input			seq_in,
    output reg 		mismatch		//检验序列是否匹配,匹配输出0,不匹配输出0
    );

//采用独热码编译五个状态,初始IDLE状态为待机状态
//独热码相比二进制码和格雷码,方便电路设计判断、状态转移,且逻辑更简单  
parameter 		IDLE = 5'b00001;
parameter  		S1   = 5'b00010;
parameter  		S2   = 5'b00100;
parameter  		S3   = 5'b01000;
parameter 		S4   = 5'b10000;

//定义两个寄存器表示状态机的目前状态和下一状态
reg [4:0] curr_state;
reg [4:0] next_state;

//第一段使用时序逻辑描述状态转移
always@(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
	    curr_state <= IDLE;
    end
    else begin
	    curr_state <= next_state;
    end
end

//第二段使用组合逻辑判断状态转移条件
always@(*) begin
    if(!rst_n) begin
	    next_state <= IDLE;
    end
    else begin
	    case(curr_state)
	        IDLE  :next_state = seq_in?S1:IDLE;
	        S1	  :next_state = seq_in?S1:S2;
	        S2	  :next_state = seq_in?S1:S3;
	        S3	  :next_state = seq_in?S4:IDLE;
	        S4	  :next_state = seq_in?S1:IDLE;
	        default:next_state = IDLE;		//养成良好代码风格,不能遗漏,防生成latch,也可以通过赋初值避免
	endcase
    end
end

//第三段描述状态输出(可以使用组合逻辑,也可以用时序逻辑)
//此处采用时序逻辑,同时也提供组合逻辑代码示例
always@(posedge clk or negedge rst_n) begin			//时序逻辑描述输出
    if(!rst_n) begin
	    mismatch <= 1'b1;
    end
    else if(next_state == S4) begin
	    mismatch <= 1'b0;
    end
    else begin
	    mismatch <= 1'b1;
    end
end

//assign mismatch = (curr_state ==S4) ? 1'b0 : 1'b1;	//组合逻辑描述输出

endmodule

3.23Testbench

`timescale 1ns/1ps		//仿真时间单位1ns 仿真时间精度1ps
module sequence_detect04_tb();

//信号申明
reg		clk;
reg		rst_n;
reg		seq_in;
wire	mismatch;

//复位信号生成
//输入信号生成,输入信号为“1001001001001”
//时钟信号与复位信号赋初值
initial begin 
    clk = 0;
    rst_n = 1;
    #5  rst_n = 0;
    #10 rst_n = 1;
    seq_in = 1;#10;
    seq_in = 0;#10;
    seq_in = 0;#10;
    seq_in = 1;#10;
    seq_in = 0;#10;
    seq_in = 0;#10;
    seq_in = 1;#10;
    seq_in = 0;#10;
    seq_in = 0;#10;
    seq_in = 1;#10;
    seq_in = 0;#10;
    seq_in = 0;#10;
    seq_in = 1;#10;
end 

//时钟信号生成
always #5 clk = ~clk;

//模块实例化(将申明的信号连接起来即可)
sequence_detect04 u_sequence_detect04(
    .clk			(clk),
    .rst_n			(rst_n),
    .seq_in			(seq_in),
    .mismatch		(mismatch)
    );

endmodule

3.24仿真结果

序列检测器(两种设计方法和四种检测模式|verilog代码|Testbench|仿真结果)

输入序列1001001001001,根据可不重叠检测理论上可检测两次信号翻转,从仿真结果可以看到mismatch发生两次翻转,且第二组的1001中的第一个1来自第一组1001中最后一个1,即发生重叠不可检测,所以相比于重叠检测少了第二次翻转(同理第四次翻转同样不可发生)。

四、总结

状态机法序列检测器:一句话概括就是设计复杂、不易扩展但是检测模式灵活。相比使用移位寄存器来说的话,状态机稍稍复杂些,主要体现在不易扩展(重新检测不同序列需重新设计状态转移)和状态机的状态转移判断上;但是这样也给状态机带来了优点 ,就是灵活性好,可以灵活处理输入和输出,因为状态机具有可编程性。同时可以处理较为复杂的序列检测任务,因为状态机可以支持多个状态和转换。
移位寄存器法:一句话概括就是设计简单、易于扩展但是检测模式呆板。相比于使用状态机来说的话,只能处理简单的序列检测任务,因为它没有状态机的多状态和转换功能。且输入和输出的灵活性差,因为寄存器序列移位寄存器是固定的,检测模式固定。但是优势很明显,就是设计和开发相对简单,只需要几个寄存器和逻辑门。且易于扩展,如果要检测另一个序列,只需要修改输入数据。
模式选择:前言部分提到了检测模式包括重叠模式、连续模式、间隔模式等等。本文着重分析重叠与非重叠检测模式,结论是重叠检测模式可以用状态机和移位寄存器设计,非重叠检测模式可以用灵活的状态机设计;本文都是基于默认的连续检测模式设计,如果采用间隔检测模式,处理方法是添加指示信号使能端,可以用状态机和移位寄存器设计。因为设计逻辑简单,所以这部分省略,可自行参照第二部分代码设计。

综上所述,状态机序列检测器适用于处理较为复杂的序列检测任务,而寄存器序列移位寄存器适用于处理简单的序列检测任务。在实际应用中,应根据具体的需求来选择合适的序列检测方法。

不定期检查、补充、纠错,欢迎随时交流纠错

最后修改日期:2023.4.22

软件版本:

仿真软件:Modelsim 10.6c

绘图软件:亿图图示

描述语言:verilog文章来源地址https://www.toymoban.com/news/detail-445061.html

到了这里,关于序列检测器(两种设计方法和四种检测模式|verilog代码|Testbench|仿真结果)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数字IC手撕代码】Verilog模三检测器(判断输入序列能否被三整除)|题目|原理|设计|仿真

    芯片设计验证社区·芯片爱好者聚集地·硬件相关讨论社区·数字verifier星球 四社区 联合力荐 !近500篇 数字IC精品文章收录 ! 【数字IC精品文章收录】学习路线·基础知识·总线·脚本语言·芯片求职·EDA工具·低功耗设计Verilog·STA·设计·验证·FPGA·架构·AMBA·书籍 本系列旨在提

    2024年02月16日
    浏览(38)
  • 1001序列检测器

    multisim仿真文件:1001序列检测器(mealy机)-单片机文档类资源-CSDN下载 modelsim仿真文件:1001序列检测器modelsim仿真和测试文件-单片机文档类资源-CSDN下载 实验报告:1001序列检测器实验报告-单片机文档类资源-CSDN下载 电 子 科 技 大 学 课程设计名称:           1001 序列检

    2024年02月06日
    浏览(45)
  • 序列检测器的verilog实现

    设计一个序列检测同步时序逻辑电路,要实现的功能如下: 当已有输入码流出现序列 111000或101110时输出检测信号为1 ,否则输出为0。在时序上检测到完整序列的 下一个时钟周期 输出检测结果。输入信号有效为1时表示当前输入有效,否则表示无效。之前输入依旧计入序列中

    2024年02月06日
    浏览(53)
  • 利用Verilog HDL实现序列检测器,附上仿真程序。

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

    2024年02月06日
    浏览(62)
  • 实验四 用集成移位寄存器实现序列检测器

    一、实验要求 用移位寄存器和与非门设计一个 1101 序列检测器。电路连续不停地工作,对 串行输入的序列进行检测,当连续检测 4 个码元符合检测码 1101 时,检测器输出 为 1 ,指示灯亮,其他情况下输出为 0 ,指示灯灭。 二、实验设备 1 . Mini-FPGA 开发板( Cyclone IV 系列

    2024年02月03日
    浏览(43)
  • 【 FPGA 】序列检测器 11010 (mealy状态机,moore状态机)

            状态机是硬件电路设计的常用的描述工具,也是电路设计的重要思想。很早之前我就知道mealy状态机和moore状态机,但是对两者的差别不是非常的清楚,最近在学习系列检测器的设计时对这两种状态机和一段式、三段式状态机有了更深刻的了解,在这里分享自己的见解

    2024年02月05日
    浏览(40)
  • vivado序列检测器verilog代码ego1开发板验证

    名称:vivado序列检测器verilog代码ego1开发板验证 软件:VIVADO 语言:Verilog 代码功能: 设计一个111序列检测器。 要求:当检测到3个或3个以上的1时,输出为1,其他输入情况输出为0. 画出状态转移图,完成 Verilog描述。 本代码已在ego1开发板验证,开发板如下,其他开发板可以修改管

    2024年02月03日
    浏览(55)
  • Verilog设计“111”检测器与“01110”检测器并测试所有情况

    使用Quartus+modelsim完成本次设计 分析 分析题目,得到其有限状态机为下图: 代码实现 Testbench 结果 Modelsim结果如下图所示,分析可知实现了题目要求。 逻辑综合出来的电路如下图所示:即只有S3状态才会输出OUT=1。 其中的state的状态机如下图所示(RLT viewer中所示),可见其与

    2024年02月08日
    浏览(56)
  • 毕业设计 单片机心率检测器设计与实现 - stm32

    Hi,大家好,今天向大家介绍一个学长做的单片机项目 基于STM32的心率检测器的设计与实现 大家可用于 课程设计 或 毕业设计 主控:STM32F103C8T6 MAX30102传感器 OLED屏幕:用于显示实时心率波形 未测试时的状态:心率波形显为平稳直线,即0 将手指放上进行心率测试: 还可以把

    2024年02月07日
    浏览(42)
  • 跨时钟域方法(同步器、异步FIFO、边沿检测器、脉冲同步器、同步FIFO)

    目录 1、跨时钟域方法的原因 2、跨时钟处理的两种思路 3、跨时钟域分类——单比特信号跨时钟 3.1.1慢时钟———快时钟。(满足三边沿准则,有效事件可以被安全采样) 3.1.2慢时钟———快时钟。(不满足三边沿准则,有效事件可以被安全采样) 3.2.1有效事件传输背景下确

    2024年02月12日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包