2016-01-30 35 views
2

我想如下VHDL類型轉換 - 發現4點可能的定義

LIBRARY IEEE; 
USE IEEE.std_logic_1164.ALL; 
USE IEEE.numeric_std.ALL; 

ENTITY TEST IS 
    PORT (sw1, sw0 : IN  std_logic; 
      x   : OUT  integer RANGE 3 DOWNTO 0); 
END ENTITY TEST; 

ARCHITECTURE dflow OF TEST IS 
    SIGNAL mes_sel : integer RANGE 3 DOWNTO 0; 
BEGIN 
    mes_sel <= to_integer(unsigned(std_logic_vector(SW1 & SW0))); 
    x <= mes_sel; 
END ARCHITECTURE dflow; 

但是編譯器不喜歡mes_sel分配2 STD_LOGIC位轉換爲整數。我得到以下編譯器錯誤信息:

錯誤(10327):在Q4.vhd VHDL錯誤(92):無法確定運營商 「」 & 「」 的定義 - 發現4點可能的定義

我可以不將2位std_logic連接到一個向量,然後轉換?或者是別的什麼? 關於 D

+1

它不喜歡什麼?它是否提供錯誤信息或其他內容? (順便說一下,你可以直接從兩個std_logics構成一個'unsigned',不需要通過std_logic_vector去做) –

回答

3

錯誤消息告訴你粗略出現了什麼問題,而且這與賦值沒有關係。

GHDL給出了一個更好的診斷:

ghdl -a test.vhd
test.vhd:13:57:無法解析重載運算符 「&」
test.vhd:13: 57:可能的解釋是:
../../src/ieee/numeric_std.v93:66:18:數組類型「signed」
../../src/ieee/numeric_std.v93:65:20 :數組類型「無符號」
../../src/ieee/std_logic_1164.v93:69:30:數組類型「std_logic_vector」
../../src/ieee/std_logic_1164.v93:54:31:數組類型 「std_ulogic_vector」
ghdl:編譯錯誤

VHDL允許重載操作符,由所述類型的其參數(區分在這種情況下,std_logic)和它們的返回類型(在這種情況下...以及...什麼?)

顯然有4種類型的std_logic_vector()類型轉換函數聲明,以及&運算符采用兩個std_logic參數;和ghdl(不像你使用的任何工具)有助於列出它們。

在這種情況下,VHDL(與其他一些語言不同)堅持認爲你選擇了一個,而不是爲你任意選擇一個隱藏的(可能是錯誤的)選擇。

你可以用類型標記做到這一點。正如你實際上想要一個unsigned,明顯的選擇是unsigned'()(注意「'」符號,也用於屬性)。

mes_sel <= to_integer(unsigned'(SW1 & SW0)); 

注意,如果允許VHDL簡單的事情,像to_integer(SW1 & SW0)它會因爲什麼符號和無符號的轉換來區分的,使得至少不明顯的轉換,而且很有可能是錯誤的積極危險。

+1

如果我正確地遵循,那麼綜合工具需要提示2 std_logic位串聯結果也一樣,在進行轉換之前,因爲在std lib中包含的重載函數中有4個定義?這聽起來像我正在以正確的方式思考這個問題嗎?一如既往感謝您的回覆。 – hoboBob

+1

你說得對。實際上,加載了3個軟件包:VHDL(library std)的缺省類型和函數,以及IEEE庫中的'std_logic_1164'和'numeric_std'。附:如果你的實體只是在做一個轉換,也許最好把這個代碼轉換成一個函數。 – Paebbels

+2

@DannyJ yes就是這樣 - 串聯是'&'函數返回的 - 並且有4個這樣的函數返回4種不同的類型。我正在做的不是*轉換爲*無符號*,而是*規範*,如果你喜歡,結果應該是無符號的,以消除模糊性。 (然後'to_integer'是一個轉換)。現在,如果我已將'SW1&SW0'分配給中間變量或信號,則其聲明將指定類型 - 因此沒有問題。 (順便說一下,它不會花費更多的硬件,所以這是一個可以接受的替代解決方案) –