序列连续的序列检测(牛客网)

题目如下: 

方法一:状态机的方法(注意match为时序逻辑,落后一个时钟周期) 

状态的转换如下图所示:

 

代码如下: 

注意:match是reg型变量,赋值时需要用时序逻辑进行赋值,或者将其改为wire型变量,然后用assign进行赋值。

`timescale 1ns/1ns
module sequence_detect(
	input clk,
	input rst_n,
	input a,
	output reg match
	);
	reg [3:0]state,next_state;
    wire    match_reg;
	
	parameter	IDLE	=4'd0,
				ONE		=4'd1,
				TWO		=4'd2,
				THREE	=4'd3,
				FOUR	=4'd4,
				FIVE	=4'd5,
				SIX		=4'd6,
				SEVEN	=4'd7,
				EIGHT	=4'd8;

always@(posedge clk or negedge rst_n)
	if(rst_n==1'b0)
		state<=IDLE;
	else
		state<=next_state;

    always@(*)    
    case(state)
		IDLE   :next_state<=a?IDLE:ONE;
		ONE	   :next_state<=a?TWO:ONE;
		TWO	   :next_state<=a?THREE:ONE;
		THREE  :next_state<=a?FOUR:ONE;
		FOUR   :next_state<=a?IDLE:FIVE;
		FIVE   :next_state<=a?IDLE:SIX;
		SIX	   :next_state<=a?IDLE:SEVEN;
		SEVEN  :next_state<=a?EIGHT:ONE;
		default:next_state<=IDLE;
	endcase

assign	match_reg=(state==EIGHT);	

always@(posedge clk or negedge rst_n)
	if(rst_n==1'b0)
        match<=1'b0;
     else
        match<=match_reg;

endmodule

 方法二:移位寄存器的方法

一种非常简单,节约代码的方法。 

`timescale 1ns/1ns
module sequence_detect(
	input clk,
	input rst_n,
	input a,
	output reg match
	);
    
    reg [7:0] din;
    
    always @(posedge clk or negedge rst_n) begin
        if(~rst_n)
            din <= 8'd0;
        else
            din <= {din[6:0],a};
    end
    
    always @(posedge clk or negedge rst_n) begin
        if(~rst_n)
            match <= 1'b0;
        else if(din == 8'b0111_0001)
            match <= 1'b1;
        else
            match <= 1'b0;
    end

  
endmodule

### 关于牛客网上反序数问题解决方案 对于反序数问题,在处理这类题目时可以采用多种方法来实现字符串或者整数的反转操作。下面提供一种常见的算法思路以及Python代码示例。 #### 方法一:通过转换成字符串再翻转 这种方法适用于大多数编程语言,其基本原理是将数字转化为字符串形式,利用内置函数完成字符序列的逆向排列后再变回数值型数据。 ```python def reverse_integer(n): sign = (n > 0) - (n < 0) # 获取符号位 reversed_str = str(abs(n))[::-1] # 将绝对值部分变成字符串并倒序 result = int(reversed_str) * sign # 转换成整形加上原来的正负号 if -(2**31) <= result <= 2**31 - 1: # 判断是否溢出 return result else: return 0 ``` 上述代码实现了对给定整数`n`进行安全有效的反转运算,并考虑到了可能存在的边界情况如输入超出范围等问题[^1]。 为了进一步提高效率和减少内存占用,也可以不依赖额外的数据结构而直接在原基础上做文章: #### 方法二:数学方式计算每一位上的新位置 这种方式不需要借助任何辅助空间就能达到目的,主要依靠取模(`%`)与除法(`/`)运算逐步提取最低有效位并将它们放置到新的高位上去构建最终的结果。 ```python def reverse_int_math(x): rev, remainder = 0, abs(x) while remainder != 0: last_digit = remainder % 10 new_rev = rev * 10 + last_digit # Check overflow/underflow before updating `rev` if not (-2 ** 31 <= new_rev <= 2 ** 31 - 1): return 0 rev = new_rev remainder //= 10 return rev if x >= 0 else -rev ``` 这段程序同样包含了必要的异常检测机制以防止因极端情况下产生的错误输出[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值