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 |
|---|---|---|
| S0 | S0, hit=0 | S1, hit=0 |
| S1 | S10, hit=0 | S1, hit=0 |
| S10 | S0, hit=0 | S1, hit=1 |
每列记录一个上升沿的观察结果。输入取自边沿前,名称带 after 的状态取自更新后。列的排列表示采样顺序,并非描绘物理传播延迟传播延迟 从输入变化到输出稳定为正确值所需的时间。逻辑表达式等价与时间特性是两回事。了解更多。复位后从 S0 开始,所有列的 valid 均为 1。第三位检测后保留 S1,因此第五位也能检测成功。
查看波形数据
| 信号 | 波形 | 总线值 |
|---|---|---|
| accepted bit | 10101 | |
| state after | 23452 | S1 → S10 → S1 → S10 → S1 |
| hit after | 0.101 |
实现寄存后的检测输出
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
endmodulehit 将依据状态与该边沿接受输入计算出的值存入寄存器寄存器 存储多位状态的电路。本课程中的同步寄存器在时钟边沿存储指定输入。了解更多,不会像纯组合 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 复用为下一模式起点,因此漏掉第五位的检测。