2015-10-25 61 views
0

我得到這個錯誤在我的VHDL代碼:發現運營商的「0」的定義「=」無法確定「=」VHDL發現「0」操作的定義「=」

這裏確切超載匹配定義是我的代碼:

library IEEE; 
Use IEEE.STD_LOGIC_1164.ALL; 

entity simpleMux is 
    Port (i0 : in STD_LOGIC; 
      i1 : in STD_LOGIC; 
      i2 : in STD_LOGIC; 
      i3 : in STD_LOGIC; 
      s : in STD_LOGIC_VECTOR(1 downto 0); 
      o : out STD_LOGIC); 
end simpleMux; 

architecture Behavioral of simpleMux is 

begin 

o <= i0 when (s = "00") else 
     i1 when (s = "01") else 
     i2 when (s = "02") else 
     i3 when (s = "03"); 

end Behavioral; 

問題究竟在哪裏?

+0

查看'std_logic(_vector)'的有效值,並將它們與表達式中的值進行比較,然後將其計算出來... –

回答

2

信號s是std_logic_vector類型,它只是std_logic類型的一個數組。請記住,std_logic只能假設0和1的值(以及其他一些未定義的值)。因此,您只能在std_logic_vector中設置值,例如「00」,「10」等。您正在比較值「02」和「03」,這些值無效。

而不是你的表達應該是:

o <= i0 when (s = "00") else 
    i1 when (s = "01") else 
    i2 when (s = "10") else 
    i3 when (s = "11"); 
2

這是爲了補充替代anderswb的回答,並證明你可以做代表一個二進制值和一個數值文字表示值數組類型之間的比較表達式的數組類型。

它還提供了一個機會,可以指出有關評估具有比'9'和'1'更多值的元素基類型的類型中的表達式的內容。

有可能修改你的設計和比較數值,以s

library ieee; 
use ieee.std_logic_1164.all; 
use ieee.numeric_std.all; 

entity simplemux is 
    port ( 
     i0: in std_logic; 
     i1: in std_logic; 
     i2: in std_logic; 
     i3: in std_logic; 
     s: in std_logic_vector(1 downto 0); 
     o: out std_logic 
    ); 
end entity simplemux; 

architecture foo of simplemux is 
begin 
    o <= i0 when unsigned(s) = 0 else 
      i1 when unsigned(s) = 1 else 
      i2 when unsigned(s) = 2 else 
      i3 when unsigned(s) = 3 else 
      'X'; 
end architecture; 

這依賴於s類型轉換爲unsigned。您也可以在端口聲明中將s作爲無符號提供,以避免類型轉換,並在關聯列表中進行類型轉換(實例化simplemux的端口映射)。

在numeric_std軟件包中,有一個「=」函數爲等於運算符的重載定義,其簽名爲[unsigned,natural return boolean]。

這允許比較適合於無符號數的數值與無符號數進行比較。

這將分析,詳細闡述和模擬。注意我最後拋出了一個額外的元素來處理元值。爲什麼可以用一個簡單的測試平臺不會初始化任何輸入的值來證明simplemux:

library ieee; 
use ieee.std_logic_1164.all; 

entity tb_simplemux is 
end entity; 

architecture fum of tb_simplemux is 
    signal i0, i1, i2, i3: std_logic; -- default value = 'U' 
    signal s:    std_logic_vector (1 downto 0); -- default "UU" 
    signal o:    std_logic; 
begin 
DUT: 
    entity work.simplemux 
     port map (
      i0 => i0, 
      i1 => i1, 
      i2 => i2, 
      i3 => i3, 
      s => s, 
      o => o 
     ); 
MONITOR:   
    process 
    begin 
     wait on o; 
     report "o = " & std_logic'image(o); 
    end process; 

STIMULUS: 
    process 
    begin 
     wait; 
    end process; 
end architecture; 

如果我們分析和闡述,然後運行測試平臺:

ghdl -r tb_simplemux
../../../src/ieee/numeric_std-body.v93:1710:7:@0ms:(assertion warning):NUMERIC_STD。「=」:檢測到元值,返回FALSE
../ .. /../src/ieee/numeric_std-body.v93:1710:7:@0ms:(assertion warning):NUMERIC_STD。「=」:檢測到元值,返回FALSE
../../../src/ieee/numeric_std-body.v93:1710:7:@0ms:(assertion warning):NUMERIC_STD。「=」:檢測到元值,返回FALSE
../ .. /../src/ieee/numeric_std-body.v93:1710:7:@0ms:(assertion warning):NUMERIC_STD。「=」:檢測到元值,返回FALSE
simplemux。VHDL:50:9:@ 0毫秒:(報告注):O = 'X'

在監視處理的wait on o;消除0的默認值從顯示出來(這將是 'U')。註釋出來,並添加一個敏感列表與s,你會看到:

...
simplemux.vhdl:49:9:@ 0毫秒:(報告註釋):O = 'U'
simplemux.vhdl:49:9:@ 0ms :(報告說明):o ='X'

o的默認值也顯示出來。

s上有一個metavalue,你的simplemux在模擬過程中實際上不會給o分配任何值,但會合成得很好(只考慮二進制表示值)。

'X'是信息性的,在模擬目的上有s的元值。

我們可以在測試平臺刺激過程分配不同的值給i0i1i2i3(比如「9」,「1」,「L」和「H」,後兩個圖以二進制值中合成),然後遍歷矢量s的二進制值,並在賦值之間延遲,並證明simplemux是功能性的。您還可以設置一個與其他輸入值不同的輸入值,並通過s的二進制值進行選通,以顯示正確的輸入被選中,從而爲每個輸入執行此操作。

這樣做的關鍵在於std_ulogic是std_logic的基本類型,而std_logic_vector或unsigned的元素類型的基本類型是一個多級值邏輯信號,它提供的不僅僅是用於仿真目的的二進制信息,我們還可以在故障排除中使用附加信息。

我們可以編寫仿真模型,告訴我們有關模型正在做什麼的信息(如來自「=」的斷言警告),同時仍能正確合成。