题解 | #输入序列不连续的序列检测#
输入序列不连续的序列检测
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] state; reg [3:0] nstate; parameter S0 = 4'b0000; parameter S1 = 4'b0001; parameter S2 = 4'b0010; parameter S3 = 4'b0011; parameter S4 = 4'b0100; parameter S5 = 4'b0101; // 状态寄存器更新逻辑 always @(posedge clk or negedge rst_n) begin if (!rst_n) begin state <= S1; // 初始化状态 end else begin state <= nstate; end end // 状态转移逻辑 always @(*) begin nstate = state; // 默认不变状态 case (state) S1: begin if (data_valid) begin if (data == 0) nstate = S2; // 检测到第一个0,进入S2 else nstate = S1; // 继续等待下一个有效的输入 end else begin nstate = S1; end end S2: begin if (data_valid) begin if (data == 1) nstate = S3; // 检测到第一个1,进入S3 else nstate = S1; // 输入不匹配,返回初始状态 end else begin nstate = S2; end end S3: begin if (data_valid) begin if (data == 1) nstate = S4; // 检测到第二个1,进入S4 else nstate = S1; // 输入不匹配,返回初始状态 end else begin nstate = S3; end end S4: begin if (data_valid) begin if (data == 0) nstate = S5; // 检测到第二个0,进入S5(完成0110序列) else nstate = S1; // 输入不匹配,返回初始状态 end else begin nstate = S4; end end S5: begin if (data_valid) begin if (data == 1) nstate = S2; // 检测到第二个0,进入S5(完成0110序列) else nstate = S1; // 输入不匹配,返回初始状态 end else begin nstate = S5; end end endcase end // 控制 match 输出的同步逻辑 always @(posedge clk or negedge rst_n) begin if (!rst_n) begin match <= 1'b0; end else if (state == S4 && data_valid && data == 0) begin match <= 1'b1; // 当检测到完整的0110序列时,拉高match end else begin match <= 1'b0; // 其他情况下,保持match为低电平 end end endmodule
第一个0110检测完后,末尾的0需要马上加入0110检测队列中,被这个时序卡了很久