zl程序教程

您现在的位置是:首页 >  后端

当前栏目

不重叠序列检测

序列 检测 重叠
2023-09-14 09:10:03 时间

不重叠序列检测

题目描述
请编写一个序列检测模块,检测输入信号(a)是否满足011100序列, 要求以每六个输入为一组,不检测重复序列,例如第一位数据不符合,则不考虑后五位。一直到第七位数据即下一组信号的第一位开始检测。当信号满足该序列,给出指示信号match。当不满足时给出指示信号not_match。

模块的接口信号图如下:
在这里插入图片描述
模块的时序图如下:
在这里插入图片描述

`timescale 1ns/1ns
module sequence_detect(
	input clk,
	input rst_n,
	input data,
	output reg match,
	output reg not_match
	);
    
        reg [0:2] cnt;//六个时钟的计数
    always@(posedge clk or negedge rst_n)
        begin
            if(!rst_n)
                cnt <= 3'b0;
            else if ( cnt == 3'd5)
                cnt <= 3'b0;
            else
                cnt <= cnt + 1'b1;
        end
    
    reg [5:0] data_reg;
    always@(*)
        begin
            case(cnt)
                3'd0:data_reg[5] = data;
                3'd1:data_reg[4] = data;
                3'd2:data_reg[3] = data;
                3'd3:data_reg[2] = data;
                3'd4:data_reg[1] = data;
                3'd5:data_reg[0] = data;
               default:data_reg = 6'b0;
            endcase
        end
  

    
    always@(posedge clk or negedge rst_n)
        begin
            if(!rst_n)
                match = 1'b0;
            else if(data_reg == 6'b011100 && cnt == 3'd5)
                match = 1'b1;
            else
                match = 1'b0;
        end
   always@(posedge clk or negedge rst_n)
        begin
            if(!rst_n)
                not_match = 1'b0;
            else if(data_reg != 6'b011100 && cnt == 3'd5)
                not_match = 1'b1;
            else
                not_match = 1'b0;
        end
endmodule

知识点
移位寄存器不仅能寄存数据,而且能在时钟信号的作用下使其中的数据依次左移或右移。