我是VHDL的新手,在阅读了很多教程后,我现在已经开始了。这是一个困扰我的代码示例。 trade_cell实体获得有符号信号n,其在获得绝对值之后被分配给变量abs_n。然后将结果分配给输出的信号量。
每次我模拟这个,金额都设置为X. 我在这里缺少什么?
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity trade_cell is
Port (
n: IN signed(31 downto 0);
amount: OUT signed(31 downto 0);
);
end trade_cell;
architecture Behavioral of trade_cell is
begin
trader: process(start, value, n, P, dP, delta, ddelta)
variable abs_n : signed(31 downto 0) := abs(n);
begin
amount <= abs_n;
end process;
end Behavioral;
友好的问候, RincewindWizzard
答案 0 :(得分:4)
你的问题是这一行:
variable abs_n : signed(31 downto 0) := abs(n);
在模拟开始时初始化变量abs_n
一次(技术上是在阐述期间)。此时,信号n
的值为'U'
,abs('U')
为'X'
,因此变量abs_n
的初始值为{{1}之后从未分配过任何值。
所以,而不是:
'X'
你需要:
trader: process(start, value, n, P, dP, delta, ddelta)
variable abs_n : signed(31 downto 0) := abs(n);
begin
amount <= abs_n;
end process;
我认为你已经削减了代码以制作MCVE,这就是为什么在流程 trader: process(start, value, n, P, dP, delta, ddelta)
variable abs_n : signed(31 downto 0);
begin
abs_n := abs(n); -- assign abs_n here...
amount <= abs_n; -- ...and use its value here
end process;
的灵敏度列表中还有许多其他信号的原因。如果没有,您只需要灵敏度列表中的该过程的输入(在这种情况下只是trader
)。