将信号分配给变量并将变量分配给信号

Rin*_*ard 4 vhdl

我是 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

Mat*_*lor 5

你的问题是这一行:

    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)。