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

VHDL仿真中clk1与clk2异或输出非零,是否与delta周期有关?

VHDL仿真异常:信号异或结果不符合预期的原因分析

我编写了一段VHDL测试代码(工作内容片段),原本预期信号y始终为低电平——因为clk2直接赋值为clk1,相同信号异或结果应为0,但仿真时出现异常波形:clk1与clk2的采样似乎存在微小时差,导致异或结果非零。请问这是否与delta周期有关?我使用的是Vivado 2020.2版本的XSim仿真工具。

测试代码如下:

library ieee;
use ieee.std_logic_1164.all;

entity tb_min_example is
end entity tb_min_example;

architecture arch of tb_min_example is
    signal clk1, clk2, slow_clk : std_logic;

    signal y : std_logic;

    procedure drive_clk(signal clk : out std_logic; constant period : time) is
    begin
        loop
            clk <= '1';
            wait for period / 2;
            clk <= '0';
            wait for period / 2;
        end loop;
    end procedure drive_clk;
begin

    drive_clk(clk1, period => 4 ns);
    drive_clk(slow_clk, period => (119.0 / 8.0) * 4 ns);
    clk2 <= clk1;

    process(slow_clk) is
    begin
        if rising_edge(slow_clk) then
            y <= clk1 xor clk2;
        end if;
    end process;

end architecture arch;

回答

确实和delta周期直接相关。

VHDL中,clk2 <= clk1属于默认的惯性赋值,这种赋值不会立即更新信号值:当clk1在某个delta周期内发生变化时,clk2的更新会被安排在当前delta周期结束后的下一个delta周期执行。

当slow_clk的上升沿触发进程时,进程会在当前delta周期内采样clk1和clk2的数值:此时clk1已经是当前delta周期的新值,但clk2还保持着上一个delta周期的旧值,二者存在“半步”的delta周期差异,异或后自然会出现非零结果。

如果要让clk2和clk1在同一delta周期内同步更新,可以把赋值语句改成传输赋值:

clk2 <= transport clk1;

transport关键字会强制信号立即传递,消除delta周期带来的延迟,这样clk1和clk2在任何时刻的采样值都会完全一致,y的输出就会始终为低电平。

内容的提问来源于stack exchange,提问作者Schottky

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 20:30:37