牛客网刷题记录(4)——序列检测器VL28

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

在这里插入图片描述
看题目我们可以发现,只有在检测到连续的0110序列的时候,才会拉高match信号,如果是单独的0—过一段周期又1–01这样是不被认为是match的,也就是说单独的信号都会跳转到IDLE。
这样说起来好像不是很明显,咱们这边画个图看看:
在这里插入图片描述
只有满足data_valid有效并且数值正确的时候才会往下跳转,其他情况直接跳IDLE重新检测。

这一题注意哈,牛课上给出的测试样例实际上match信号是要提前一个周期拉高的,match比图里需要提前一个周期,所以我这直接用组合逻辑给match赋值。

`timescale 1ns/1ns
module sequence_detect(
	input clk,
	input rst_n,
	input data,
	input data_valid,
	output reg match
	);
parameter     IDLE = 7'b000_0001,
				S1 = 7'b000_0010,
				S2 = 7'b000_0100,
				S3 = 7'b000_1000,
				S4 = 7'b001_0000,
				S5 = 7'b010_0000,
			  FAIL = 7'b100_0000;
	reg [6:0]state,next_state;
	reg [2:0]cnt;

	//状态机-1
	always@(posedge clk or negedge rst_n)
		begin
			if(!rst_n)
				state <= IDLE;
			else 
				state <= next_state;
		end
	//状态机-2
	always@(*)
		begin
			if(~rst_n)
				next_state <= IDLE;
			else 
				case(state)
				IDLE:next_state <= ((~data)&&data_valid)?S1:IDLE;
				S1:next_state <= ((data)&&data_valid)?S2:IDLE;
				S2:next_state <= ((data)&&data_valid)?S3:IDLE;
				S3:next_state <= data_valid?IDLE:S3;
				default:next_state <= IDLE;
				endcase
		end
	//状态机-3
	always@(*)
		begin
			if(~rst_n)
				match <= 1'b0;
			else if(~data && (state == S3))
				match <= 1'b1;
			else 
				match <= 1'b0;
		end


endmodule

完成!
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值