题解 | #状态机-重叠序列检测#

状态机-重叠序列检测

https://www.nowcoder.com/practice/10be91c03f5a412cb26f67dbd24020a9

`timescale 1ns/1ns

module sequence_test2(
    input wire clk,
    input wire rst,
    input wire data,
    output reg flag
);

reg [2:0] current_state, next_state;

parameter IDLE = 3'd0,
          S1 = 3'd1,
          S10 = 3'd2,
          S101 = 3'd3,
          S1011 = 3'd4;

// 状态转换逻辑
always @(posedge clk or negedge rst) begin
    if (!rst)
        current_state <= IDLE;
    else
        current_state <= next_state;
end

// 状态机
always @(*) begin
    next_state = current_state;
    case (current_state)
        IDLE: begin
            if (data)
                next_state = S1;
            else
                next_state = IDLE;
        end
        S1: begin
            if (data)
                next_state = S1;
            else
                next_state = S10;
        end
        S10: begin
            if (data)
                next_state = S101;
            else
                next_state = IDLE;
        end
        S101: begin
            if (data)
                next_state = S1011;
            else
                next_state = S10;
        end
        S1011: begin
            if (data)
                next_state = S1; // 重叠检测
            else
                next_state = S10; // 重叠检测
        end
        default: begin
            next_state = IDLE;
        end
    endcase
end

// 输出逻辑
always @(posedge clk or negedge rst) begin
    if (!rst) begin
        flag <= 1'b0;
    end else begin
        if (current_state == S1011) begin
            flag <= 1'b1; // 在检测到1011的下一拍输出检测有效信号
        end else begin
            flag <= 1'b0;
        end
    end
end

endmodule

状态定义和转移关系:

  1. IDLE:初始状态,等待第一个 1。输入 1:转移到 S1。输入 0:保持在 IDLE。
  2. S1:检测到第一个 1。输入 1:保持在 S1(因为可能是多个连续的 1)。输入 0:转移到 S10。
  3. S10:检测到 10。输入 1:转移到 S101。输入 0:转移回 IDLE(因为 00 不匹配序列)。
  4. S101:检测到 101。输入 1:转移到 S1011。输入 0:转移到 S10(因为 1010 可以继续匹配 10)。
  5. S1011:检测到 1011,在下一拍输出检测有效信号。输入 1:转移到 S1(因为 1011 后的 1 可以是下一个序列的开始)。输入 0:转移到 S10(因为 10110 可以继续匹配 10)。

全部评论

相关推荐

03-05 17:03
已编辑
浙江工商大学 C++
陈好好wy:整体看下来有点空空的感觉,可以把每一段项目经历都再完善一下,然后用小标题的形式写个两到三条,目前看有点太简单了,不太能看出具体在这个项目里做了什么工作。还是要尽量把自己做的工作以量化的形式体现在简历上呢。
双非本科求职如何逆袭
点赞 评论 收藏
分享
钱嘛数字而已:辅导员肯定不能同意,不然你出事了,他要承担责任。但是,脚和脑子都长在你自己身上,使用它还需要向辅导员报告么? 辅导员必须按流程拒绝你,然后你拿出成年人的态度,做自己的选择。
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

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