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
相关产品推荐
相关产品推荐

