0

我正在尝试使用 VHDL,并且遇到了我无法摆脱的延迟。

我正在尝试在测试台上编写一个非常简单的 3 输入与门,该测试台循环遍历 AND3 的所有可能输入和后续输出。我将一个输入绑定到高电平以使其在模拟中的评估更简单。

我已经运行了在 3 个输入的 8 个值之间循环的模拟(忽略了第 3 个输入),但是,在迭代数字和将其分配给输入之间,尽管这些语句紧随其后,但仍有 100ns延迟 - 为什么?迭代之间的 100ns 延迟是可以理解的,因为这是故意的,但我不明白为什么当它们顺序运行时,下面所示的两条线之间会有 100ns 的延迟?

在此处输入图像描述

我把定义,测试台放在下面,

非常感谢!

--ENTITY AND3 (3 input AND gate) --
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity and3 is
    port(
        a, b, c : in  std_logic;
        o       : out std_logic
    );
end entity and3;
architecture RTL of and3 is
begin
    o <= (a and b and c) after 5 ns;
end architecture RTL;

--TESTBENCH FOR AND3 with 3rd input left open (tied high)
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity testAnd3 is
end entity testAnd3;                    -- no ports for a test bench

architecture io of testAnd3 is
    component And3 is
        port(x, y, z : in  std_logic:= '1'; --Sets default value if left open; 
             o       : out std_logic
        );
    end component And3;
    signal a, b, c   : std_logic:='0';
   signal iteration : unsigned(2 downto 0):= (others => '0');

begin
    g1 : And3 port map(x => a, y => b, z => open, o => c); --map signals to And ports 
    stim_process : process 
    begin
        iteration <= iteration + 1;     --//100 ns delay between here and next line!?
        a <= iteration(0);
        b <= iteration(1);
        wait for 100 ns;
    end process;

end architecture io;
4

1 回答 1

3

问题是<=分配:

iteration <= iteration + 1;

<=不会更新iteration直到在 delta 延迟之后的读取值,因此a <= iteration(0);不会立即看到增加的值,但会在下一次迭代中首先看到它,因此在wait for 100 ns;.

这可以通过以下任一方式解决:

  • 将分配移动到a流程b之外(建议的解决方案,因为它与可综合代码的编码风格相匹配)
  • 移动iteration <= iteration + 1;到 之前wait for 100 ns;,从而wait将“隐藏”iteration值更新的延迟(波形将是相同的;请参见下面的评论)
  • 更改iteration为 中的局部变量process,因为变量赋值使用:=立即发生。

请注意,更新分配的信号的延迟<=是 VHDL 的一个关键特性,因为它确保所有时钟进程将看到相同的值,而与评估顺序无关。考虑阅读这个相关的好答案:VHDL 中的进程是否可重入?.

于 2015-10-25T16:25:33.573 回答