题解 | #输入序列连续的序列检测#

输入序列连续的序列检测

https://www.nowcoder.com/practice/d65c2204fae944d2a6d9a3b32aa37b39

  • 题目名称:序列检测
  • 题解:就个人理解而言,输入一连串bit数,从这些bit中检测题目指出的序列。
  • 题目相对来说很好理解,解题的关键在于如何每到来一个bit,检测一次;
  • 检测顺序:前八个bit检测一次,与目标序列不一致,match输出为低;然后检测第二个到第九个共8bit,是否与目标一直,若一致,则match输出为高,若不一致,则match输出为低,然后继续检测第三个到第十个共8bit;同理以此检测下去,直到检测到与目标一致的序列,match输出为高,即二进制1。
  • 那么如何判断每个8bit数哪,最简单的方法则是使用移位拼接的方法。
  • 方法详细描述:
  1. 定义一个位宽为8bit的寄存器reg_a;
  2. 给定rag_a初始值(若检测的8bit数列第一位是1,初始值应该定义为8'b0000_0000,同理,若检测的8bit数列第一位为0,那么初始值应该定义为8'b1111_1111),注意括号内的注释,否则会发生误判。
  3. 每个时钟的上升沿,截断拼接得到信号数列,即reg_a <= {reg_a[6:0],a},把前一个数列的后七位与新传入的a拼接,组成序列,检测其是否是目标序列。
  4. 若检测到reg_a == “目标序列”,直接输出match = 1即可;
`timescale 1ns/1ns
module sequence_detect(
	input clk,
	input rst_n,
	input a,
	output reg match
	);
	reg	[7:0] r_a;

	always@(posedge clk or negedge rst_n)begin
		if(!rst_n) begin
			r_a <= 8'd0;
		end
		else begin
			r_a <= {r_a[6:0],a};
		end
	end
	always@(posedge clk or negedge rst_n)begin
		if(!rst_n) begin
			match <= 1'b0;
		end
		else if(r_a == 8'b0111_0001)begin
			match <= 1'b1;
		end
		else begin
			match <= 1'b0;
		end
	end

endmodule

#刷题找工作啊#
全部评论

相关推荐

数学转码崽:一直给我推,投了又不理,理了又秒挂
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务