求非按键场景的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. 本地仿真步骤
- 编译仿真:使用开源工具
iverilog和gtkwave,或商业工具ModelSim:- 编译:
iverilog -o sync_tb tb_sync_compare.v sync_compare.v - 运行仿真:
vvp sync_tb - 查看波形:
gtkwave sync_wave.vcd
- 编译:
- 观察结果:
- 1-FF同步器的输出
sync_1ff会频繁出现毛刺、电平不稳定(模拟亚稳态传递) - 2-FF同步器的输出
sync_2ff几乎不会出现异常,因为第一级触发器的亚稳态会在一个时钟周期内恢复,第二级触发器采样时信号已稳定
- 1-FF同步器的输出
关键原理说明
- 亚稳态本质是触发器在建立/保持时间窗口内被触发,导致输出处于0和1之间的不确定状态
- 1-FF同步器无法过滤亚稳态,一旦第一级触发亚稳态,会直接传递到输出
- 2-FF同步器通过增加一级触发器,利用亚稳态恢复时间:第一级触发器进入亚稳态后,经过一个时钟周期的时间,大概率会恢复到稳定电平,第二级触发器此时采样就能得到稳定信号
内容的提问来源于stack exchange,提问作者余昌翰
相关产品推荐
相关产品推荐

