连续序列检测

题目描述

请编写一个序列检测模块,检测输入信号a是否满足01110001序列,当信号满足该序列,给出指示信号match。

模块的接口信号图如下:

模块的时序图如下:

请使用Verilog HDL实现以上功能

输入描述:

clk:系统时钟信号

rst_n:异步复位信号,低电平有效

a:单比特信号,待检测的数据

输出描述:

match:当输入信号a满足目标序列,该信号为1,其余时刻该信号为0

解题思路

要判断串行的序列等于目标序列,首先需要将串行序列转换成与目标序列位宽相等的数;

所以我们的思路是定义一个移位寄存器,用来接收串行输入的数据,然后用移位寄存器与目标序列做对比。具体实现代码如下   :

`timescale 1ns/1ns
module sequence_detect(
    input clk,
    input rst_n,
    input a,
    output reg match
    );

    parameter    GOAL_SER = 8'b01110001 ;
    reg  [7:0]   sft_reg ;
    always@(posedge clk or negedge rst_n)begin
        if(~rst_n)begin
            sft_reg     <= 8'hFF ;   // 复位值给全1
        end else begin
            sft_reg  <= {sft_reg[6:0],a};    
        end
    end

    always@(posedge clk or negedge rst_n)begin
        if(~rst_n)begin
            match     <= 1'd0 ;
        end else if(sft_reg == GOAL_SER ) begin
            match    <= 1'b1 ;    
        end else begin
            match     <= 1'd0 ;
        end
    end  
endmodule

这里注意一个细节,因为目标序列最高位是0,我们的移位寄存器是从低位往高位移;

如果复位给全0,那么复位后的第一个序列如果是111001x,此时其实是不满足目标序列的

但是会误判满足。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值