2016-05-20 268 views
3

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

你的代码没有分析,最后一个端口声明后还有一个额外的分号,并且你有没有声明的多余的敏感列表元素。解决这两件事和你的代码分析。 – user1155120

回答

2

你的问题是,这条线:

variable abs_n : signed(31 downto 0) := abs(n); 

在模拟开始初始化变量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; 

你需要:

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; 

我假设你已经削减下来的代码,使一个MCVE,这就是为什么有在许多其它信号灵敏度列表的过程trader。如果不是,您只需要在灵敏度列表中输入该进程的输入(在本例中仅为n)。

+1

有两个':='s的小错字。 ;) – PlayDough