题解 | #输入序列不连续的序列检测#
输入序列不连续的序列检测
https://www.nowcoder.com/practice/f96d0e94ec604592b502b0f1800ed8aa
`timescale 1ns/1ns module sequence_detect( input clk, input rst_n, input data, input data_valid, output reg match ); reg [3:0] data_r; always @ (posedge clk or negedge rst_n) if (!rst_n) data_r <= 3'b1111; else if (data_valid) data_r <= {data_r[2:0],data}; else data_r <= 3'b1111; always @ (posedge clk or negedge rst_n) if (!rst_n) match <= 0; else if ((data_r[2:0] == 3'b011) && (data == 0)) match <= 1; else match <= 0; endmodule
思路:将data数据通过4级移位寄存器,只有当data_valid上升沿有效的时候,移位寄存器才正常工作,当检测到data_r[2:0] == 3'b011并且即将输入的data数据为0时,拉高匹配信号match。
注意:
1.为啥匹配信号match拉高条件是(data_r[2:0] == 3'b011) && (data == 0)而不是(data_r[3:0] == 4'b0110)?
题目要求是匹配信号match的输出晚于输入信号data一拍,由于本身移位寄存器data_r的输出相对与输入信号data已经晚了一拍,如果用(data_r[3:0] == 4'b0110)得到的结果会晚两拍。
2.data_r的复位时为4'b1111,并不能写成4'b0000,如果data_r的复位值为4'b0000,假设一种情况:在复位结束后,立刻拉高data_valid,并且依次输入data信号 1 1 0 0 (或者 1 1 0 1)当data前两位被输入进移位寄存器data_r时,此时满足条件(data_r[2:0] == 3'b011) && (data == 0),匹配信号match被拉高,而此时的结果并不是预期的结果。