相邻语句之间的 VHDL 过程延迟
Delay in VHDL process between adjacent statements
我正在尝试使用 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;
问题是 <=
赋值于:
iteration <= iteration + 1;
这个<=
直到delta延迟后才更新iteration
的读取值,所以a <= iteration(0);
不会立即看到增加的值,而是会先看到它在下一次迭代中,因此在 wait for 100 ns;
.
之后
这可以通过以下任一方法解决:
- 将分配移动到进程外的
a
和 b
(建议的解决方案,因为它符合可综合代码的编码风格)
- 将
iteration <= iteration + 1;
移动到 wait for 100 ns;
之前,由此 wait
将 "hide" 延迟更新 iteration
值(波形将是相同;见下方评论)
- 将
iteration
更改为 process
中的局部变量,因为使用 :=
的变量分配会立即发生。
请注意,分配有 <=
的信号更新延迟是 VHDL 的一个关键特性,因为它确保所有计时进程将看到相同的值,与评估顺序无关。考虑阅读这个相关的好答案:Is process in VHDL reentrant?.
我正在尝试使用 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;
问题是 <=
赋值于:
iteration <= iteration + 1;
这个<=
直到delta延迟后才更新iteration
的读取值,所以a <= iteration(0);
不会立即看到增加的值,而是会先看到它在下一次迭代中,因此在 wait for 100 ns;
.
这可以通过以下任一方法解决:
- 将分配移动到进程外的
a
和b
(建议的解决方案,因为它符合可综合代码的编码风格) - 将
iteration <= iteration + 1;
移动到wait for 100 ns;
之前,由此wait
将 "hide" 延迟更新iteration
值(波形将是相同;见下方评论) - 将
iteration
更改为process
中的局部变量,因为使用:=
的变量分配会立即发生。
请注意,分配有 <=
的信号更新延迟是 VHDL 的一个关键特性,因为它确保所有计时进程将看到相同的值,与评估顺序无关。考虑阅读这个相关的好答案:Is process in VHDL reentrant?.