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

输入序列不连续的序列检测

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检测队列中,被这个时序卡了很久

全部评论

相关推荐

程序员饺子:正常 我沟通了200多个 15个要简历 面试2个 全投的成都的小厂。很多看我是27直接不会了😅
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务