设为首页 加入收藏

TOP

序列检测器(两种设计方法和四种检测模式|verilog代码|Testbench|仿真结果)(一)
2023-07-23 13:25:05 】 浏览:117
Tags:计方法 verilog 代码 Testbench

image



数字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状态。

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

image

第三步:根据状态机转移图用经典三段式(或者二段式)写出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
	    c
首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Xilinx GTH 简介 ,CoaXpress FPG.. 下一篇FPGA 开发详细流程你了解吗?

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目