Altifigence Academy

29 / 37 · 概念

综合设计:检测可重叠的 101 模式

在同一设计中应用状态最小化、输入有效性、寄存输出与独立参考验证。

先固定需求

在输入 valid=1 的上升沿上升沿 时钟从 0 变为 1 的瞬间。它不同于表示整个 CLK=1 区间的电平。了解更多接受一个 bit_in。若最近接受的比特以 101 结尾,则在该边沿后将 hit 置 1,持续一个周期。允许重叠模式,因此 10101 应在第三、第五个比特产生 hit。valid=0 时保持状态并令 hit=0;reset 有效时初始化状态与 hit。

只保存必要的历史信息

S0 表示无匹配前缀,S1 表示末尾为 1,S10 表示末尾为 10。完成 101 后,最后一个 1 可以作为下一模式的起点,因此返回 S1。

当前状态接受比特 0接受比特 1
S0S0, hit=0S1, hit=0
S1S10, hit=0S1, hit=0
S10S0, hit=0S1, hit=1

每列记录一个上升沿的观察结果。输入取自边沿前,名称带 after 的状态取自更新后。列的排列表示采样顺序,并非描绘物理传播延迟传播延迟 从输入变化到输出稳定为正确值所需的时间。逻辑表达式等价与时间特性是两回事。了解更多。复位后从 S0 开始,所有列的 valid 均为 1。第三位检测后保留 S1,因此第五位也能检测成功。

10101 中的两次重叠检测
查看波形数据
波形数据:每个字符表示一个区间,点表示保持前一状态,p 表示一个时钟周期。
信号波形总线值
accepted bit10101
state after23452S1 → S10 → S1 → S10 → S1
hit after0.101

实现寄存后的检测输出

SystemVerilog
module pattern_101 (
  input logic clk, rst, valid, bit_in,
  output logic hit
);
  typedef enum logic [1:0] {S0, S1, S10} state_t;
  state_t state;
  always_ff @(posedge clk) begin
    if (rst) begin
      state <= S0;
      hit <= 1'b0;
    end else begin
      hit <= 1'b0;
      if (valid) begin
        case (state)
          S0: state <= bit_in ? S1 : S0;
          S1: state <= bit_in ? S1 : S10;
          S10: begin
            state <= bit_in ? S1 : S0;
            hit <= bit_in;
          end
          default: state <= S0;
        endcase
      end
    end
  end
endmodule

hit 将依据状态与该边沿接受输入计算出的值存入寄存器寄存器 存储多位状态的电路。本课程中的同步寄存器在时钟边沿存储指定输入。了解更多,不会像纯组合 Mealy 输出那样,立即响应边沿之间的 bit_in 变化。本设计示例按通用 SystemVerilog 审查;所提供单时钟实验引擎支持的语法与执行证据,必须另行确认。

独立计算通过标准

只收集被接受的比特形成字符串,长度至少为三时比较最后三字符是否为 101,即可构造参考模型。无需把 FSM状态机 根据存储状态与输入确定下一状态和输出的模型。需同时定义状态转移、输出和复位规则。了解更多 的状态编码复制到参考模型中。

  • 101 → hit 位置 3
  • 10101 → hit 位置 3、5
  • 11101 → hit 位置 5
  • 1001 → 无检测
  • 输入 1、0 后 reset,再输入 1 → 无检测
  • 在 1、0 之间或之后插入 valid=0 → 按接受编号计的结果相同

下方位序列实验检查连续有效输入的功能。不要把它理解为已经验证 reset、valid 暂停或物理时序。

更改输入

自己试试

若将代码改为检测到 101 后返回 S0,哪个最短输入序列会与原规格不同?

阅读解释

最短差异出现在 10101。正确电路在第三、第五个输入检测成功。若返回 S0,就无法把第一次检测末尾的 1 复用为下一模式起点,因此漏掉第五位的检测。

你的选择适用于此浏览器,可随时在页脚更改。