2016-05-20 220 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