牛客网刷题VL4 输入序列不连续的序列检测

本文介绍如何使用Verilog HDL设计一个序列检测模块,通过状态机来处理输入数据的有效性和序列匹配。模块根据0110序列规则,当输入data_valid信号有效且数据符合序列时,输出match信号为1。文章包括状态转移图绘制和代码实现,以及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

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

    parameter IDLE = 0;
    parameter s0 = 1;
    parameter s1 = 2;
    parameter s2 = 3;
    parameter s3 = 4;
    
    reg [3:0] state,nx_state;
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n)
            state <= IDLE;
        else 
            state <= nx_state;
    end
    
    always@(*)begin
        nx_state = IDLE;
        case(state)
            IDLE:
                if(data_valid && !data)
                    nx_state = s0;
                else if(data_valid && data)
                    nx_state = IDLE;
                else
                    nx_state = nx_state;
            s0:
                if(data_valid && data)
                    nx_state = s1;
                else if(data_valid && !data)
                    nx_state = s0;
                else
                    nx_state = nx_state;
            s1:
                if(data_valid && data)
                    nx_state = s2;
                else if(data_valid && !data)
                    nx_state = s0;
                else
                    nx_state = nx_state;
            s2:
                if(data_valid && data)
                    nx_state = IDLE;
                else if(data_valid && !data)
                    nx_state = s3;
                else
                    nx_state = nx_state;
            s3:
                if(data_valid && data)
                    nx_state = s1;
                else if(data_valid && !data)
                    nx_state = s0;
                else
                    nx_state = nx_state;
        default: nx_state = IDLE;
        endcase
    end
    
    always@(*)begin
        if(!rst_n)
            match <= 0;
        else begin
            if(state == s3)
                match <= 1'b1;
            else
                match <= 1'b0;
        end
    end
    
endmodule

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值