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