You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求非按键场景的Verilog亚稳态2-FF同步器测试示例代码

本地可测试的亚稳态对比(1-FF vs 2-FF)Verilog示例

要在本地仿真中对比1-FF和2-FF同步器的亚稳态抑制效果,你可以通过跨时钟域信号传递+人为引入建立/保持时间违例的方式模拟亚稳态场景,不需要依赖FPGA硬件。以下是完整的Verilog代码和测试步骤:

1. 同步器与顶层模块

这个模块包含1级触发器同步器、2级触发器同步器,以及用于生成异步跨域信号的逻辑:

module sync_compare (
    input  wire clk_fast,   // 快时钟,比如50MHz
    input  wire clk_slow,   // 慢时钟,比如10MHz
    input  wire rst_n,      // 低电平复位
    output reg  async_sig,  // 慢时钟域生成的异步信号
    output reg  sync_1ff,   // 1-FF同步后的信号
    output reg  sync_2ff    // 2-FF同步后的信号
);

// 慢时钟域生成异步信号:随机翻转,模拟按键/外部异步输入
always @(posedge clk_slow or negedge rst_n) begin
    if (!rst_n) begin
        async_sig <= 1'b0;
    end else begin
        // 用随机数模拟信号随机翻转,增加跨时钟域冲突概率
        async_sig <= $random() % 2;
    end
end

// 1级触发器同步
always @(posedge clk_fast or negedge rst_n) begin
    if (!rst_n) begin
        sync_1ff <= 1'b0;
    end else begin
        // 故意引入微小延迟,模拟建立时间违例,触发亚稳态
        #0.1 sync_1ff <= async_sig;
    end
end

// 2级触发器同步
reg sync_2ff_stage1;
always @(posedge clk_fast or negedge rst_n) begin
    if (!rst_n) begin
        sync_2ff_stage1 <= 1'b0;
        sync_2ff <= 1'b0;
    end else begin
        #0.1 sync_2ff_stage1 <= async_sig;
        sync_2ff <= sync_2ff_stage1;
    end
end

endmodule

2. 测试平台(Testbench)

用于生成时钟、复位,以及监测同步后的信号是否出现亚稳态(比如信号在时钟周期内多次跳变,或采样值异常):

module tb_sync_compare;

reg clk_fast;
reg clk_slow;
reg rst_n;

wire async_sig;
wire sync_1ff;
wire sync_2ff;

// 实例化顶层模块
sync_compare u_sync_compare (
    .clk_fast(clk_fast),
    .clk_slow(clk_slow),
    .rst_n(rst_n),
    .async_sig(async_sig),
    .sync_1ff(sync_1ff),
    .sync_2ff(sync_2ff)
);

// 生成快时钟:50MHz(周期20ns)
initial begin
    clk_fast = 1'b0;
    forever #10 clk_fast = ~clk_fast;
end

// 生成慢时钟:10MHz(周期100ns)
initial begin
    clk_slow = 1'b0;
    forever #50 clk_slow = ~clk_slow;
end

// 复位信号
initial begin
    rst_n = 1'b0;
    #200 rst_n = 1'b1;
    // 仿真10ms后结束
    #10000000 $finish;
end

// 监测亚稳态:检测同步信号在时钟周期内的毛刺或异常值
initial begin
    $monitor("Time: %0t | Async Sig: %b | 1-FF Sync: %b | 2-FF Sync: %b",
             $time, async_sig, sync_1ff, sync_2ff);
    // 打开波形文件,用于后续查看
    $dumpfile("sync_wave.vcd");
    $dumpvars(0, tb_sync_compare);
end

endmodule

3. 本地仿真步骤

  1. 编译仿真:使用开源工具iverilog和gtkwave,或商业工具ModelSim:
    • 编译:iverilog -o sync_tb tb_sync_compare.v sync_compare.v
    • 运行仿真:vvp sync_tb
    • 查看波形:gtkwave sync_wave.vcd
  2. 观察结果:
    • 1-FF同步器的输出sync_1ff会频繁出现毛刺、电平不稳定(模拟亚稳态传递)
    • 2-FF同步器的输出sync_2ff几乎不会出现异常,因为第一级触发器的亚稳态会在一个时钟周期内恢复,第二级触发器采样时信号已稳定

关键原理说明

  • 亚稳态本质是触发器在建立/保持时间窗口内被触发,导致输出处于0和1之间的不确定状态
  • 1-FF同步器无法过滤亚稳态,一旦第一级触发亚稳态,会直接传递到输出
  • 2-FF同步器通过增加一级触发器,利用亚稳态恢复时间:第一级触发器进入亚稳态后,经过一个时钟周期的时间,大概率会恢复到稳定电平,第二级触发器此时采样就能得到稳定信号

内容的提问来源于stack exchange,提问作者余昌翰

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 12:25:33