VHDL生成10kHz时钟仿真出现80ps延迟:原因及解决方法
问题分析与解决:10kHz时钟仿真的80ps延迟
延迟成因
Clocking Wizard IP核的仿真延迟
Xilinx的Clocking Wizard IP核在仿真时会加载门级延迟模型,用来模拟实际硬件中时钟缓冲器、PLL的固有延迟,80ps属于这类IP核的典型仿真延迟值,是工具为贴近真实硬件行为而加入的。组合逻辑赋值的默认仿真延迟
你的代码中clk_out <= clk;是进程内的组合逻辑赋值(不在时钟沿触发分支里),仿真器会为这种信号传递添加极小的默认延迟(比如Xilinx Vivado仿真器的默认最小延迟),数值虽小,但高精度仿真下会被显示出来。未利用IP核的locked信号
代码未对Clocking Wizard的locked信号做处理,也未给reset赋值,IP核启动阶段的不稳定可能间接导致初始时钟的微小偏移,但这不是主要原因。
解决方法
1. 功能仿真可忽略该延迟
如果仅验证时钟分频的功能正确性,ps级延迟完全不影响逻辑验证,属于仿真模型的正常现象。实际硬件中这类延迟会存在,但只要满足时序约束就不会影响功能。
2. 使用IP核的理想仿真模型
在Clocking Wizard配置界面中,选择Simulation Options下的"Ideal Clock"模式,IP核输出的时钟会是零延迟的理想时钟,消除IP核带来的仿真延迟。
3. 优化代码消除组合逻辑延迟
将clk_out的赋值改为同步逻辑,避免组合逻辑带来的额外延迟。修改后的进程代码如下:
process(clk_out1) begin if rising_edge(clk_out1) then ctr <= ctr + 1; if ctr = 249 then clk <= not clk; elsif ctr = 999 then clk <= not clk; ctr <= 0; end if; -- 同步赋值clk_out,消除组合逻辑延迟 clk_out <= clk; end if; end process;
或者直接将clk信号作为clk_out输出,去掉中间的组合赋值:
-- 去掉进程内的clk_out<=clk;,直接在架构体中添加 clk_out <= clk;
4. 完善IP核的复位与锁定逻辑
为提升设计健壮性,利用locked信号控制计数器启动,避免IP核未锁定时的错误计数:
process(clk_out1) begin if rising_edge(clk_out1) then if locked = '0' then ctr <= 0; clk <= '1'; else ctr <= ctr + 1; if ctr = 249 then clk <= not clk; elsif ctr = 999 then clk <= not clk; ctr <= 0; end if; end if; clk_out <= clk; end if; end process; -- 给reset赋初始值 reset <= '0'; -- 可根据需求添加复位逻辑
内容的提问来源于stack exchange,提问作者A A
相关产品推荐
相关产品推荐

