我是 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;
Run Code Online (Sandbox Code Playgroud)
亲切的问候, RincewindWizzard
你的问题是这一行:
variable abs_n : signed(31 downto 0) := abs(n);
Run Code Online (Sandbox Code Playgroud)
被初始化的变量abs_n 一旦在模拟开始时(技术上期间阐述)。此时,信号n将具有值'U'并且abs('U')将是'X',因此变量abs_n被初始化为该值'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;
Run Code Online (Sandbox Code Playgroud)
你需要:
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;
Run Code Online (Sandbox Code Playgroud)
我假设您已经精简了代码以制作MCVE,这就是为什么在该过程的敏感度列表中有许多其他信号的原因trader。如果没有,您只需要敏感列表中该进程的输入(在这种情况下只需要n)。