题解 | #输入序列不连续的序列检测#
输入序列不连续的序列检测
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检测队列中,被这个时序卡了很久
查看22道真题和解析