输入序列不连续的序列检测

本文介绍了如何使用状态机和VerilogHDL语言设计一个序列检测模块,接收data和data_valid信号,当输入序列满足0110时,match信号会被拉高。给出了两种实现方式,一种是按照题目要求的序列匹配延迟,另一种是与Testbench一致的匹配行为。
摘要由CSDN通过智能技术生成

描述

题目描述:

        请编写一个序列检测模块,输入信号端口为data,表示数据有效的指示信号端口为data_valid。当data_valid信号为高时,表示此刻的输入信号data有效,参与序列检测;当data_valid为低时,data无效,抛弃该时刻的输入。当输入序列的有效信号满足0110时,拉高序列匹配信号match。

        模块的接口信号图如下:

        模块的时序图如下:

        请使用状态机实现以上功能,画出状态转移图并使用Verilog HDL编写代码实现以上功能,并编写testbench验证模块的功能.

输入描述

        clk:系统时钟信号

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

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

        data_valid:输入信号有效标志,当该信号为1时,表示输入信号有效

输出描述

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

解题分析

        本质上和输入序列连续的序列检测​,当data_valid信号有效时,移位寄存器data_r再进行移位即可。

alt

         本题的题目要求和Testbench有不相符的地方。题目中要求match在序列匹配的下一个周期拉高,如上图。而Testbench则是在序列匹配的同周期拉高。下面的代码中,被注释掉的部分是符合题目要求的match,没有注释的是符合Testbench的match

 参考代码

`timescale 1ns/1ns
module sequence_detect(
	input clk,
	input rst_n,
	input data,
	input data_valid,
	output reg match
	);
    reg [3:0] data_r;
    
    always@(posedge clk or negedge rst_n) begin
        if(~rst_n)
            data_r <= 4'b0;
        else
            data_r <= data_valid? {data_r[2:0], data}: data_r;
    end
    
    always@(posedge clk or negedge rst_n) begin
        if(~rst_n)
            match <= 0;
        else
            match <= data_r[2:0]==3'b011 && data==1'b0 && data_valid;
    end
  
//  always@(posedge clk or negedge rst_n) begin
//     if(~rst_n)
//         match <= 0;
//     else
//         match <= data_r==4'b0110;
//  end
    
endmodule

方法二

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

reg [3:0] datareg;

always @(posedge clk or negedge rst_n)
	begin
		if(~rst_n)
			begin
				datareg <= 0;
			end
		else
			begin
				if(data_valid)
					datareg <= {datareg[2:0],data};
				else
					datareg <= datareg;
			end
	end

always @(posedge clk or negedge rst_n)
	begin
		if(~rst_n)
			begin
				match <= 0;
			end
		else
			begin
				if(datareg == 3'b011 && data ==0 && data_valid)
					match <= 1;
				else
					match <= 0;
			end
	end

endmodule

注:解题分析来源于网友,如有侵权,请告删之。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值