设为首页 加入收藏

TOP

序列检测器(两种设计方法和四种检测模式|verilog代码|Testbench|仿真结果)(四)
2023-07-23 13:25:05 】 浏览:126
Tags:计方法 verilog 代码 Testbench
01”的序列检测器 //非重叠检测序列“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仿真结果

image

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

四、总结

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

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

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

最后修改日期:2023.4.22

软件版本:

仿真软件:Modelsim 10.6c

绘图软件:亿图图示

描述语言:verilog

首页 上一页 1 2 3 4 下一页 尾页 4/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Xilinx GTH 简介 ,CoaXpress FPG.. 下一篇FPGA 开发详细流程你了解吗?

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目