2013-07-24 84 views
0

我是VHDL的新手。我試圖根據多個條件的狀態設置一個信號值。它在一個過程塊之外。我正在努力做甚麼?如果是這樣,我做錯了什麼?VHDL當聲明有多個條件時

這是我到目前爲止有:

signal1<= my_data 
WHEN (bit_cond_true 
AND (my_array /= X"00000") 
AND (my_array = another_array)) 
ELSE 
other_data; 

這是當我嘗試編譯它的ModelSim會發生什麼:

** Error: file.VHD(62): No feasible entries for infix operator "and". 
** Error: file.VHD(62): Bad expression in left operand of infix expression "and". 
** Error: file.VHD(62): Type error resolving infix expression "and" as type std.standard.boolean. 
** Error: file.VHD(67): No feasible entries for infix operator "and". 
** Error: file.VHD(66): Bad expression in left operand of infix expression "and". 
** Error: file.VHD(67): Type error resolving infix expression "and" as type std.standard.boolean. 
** Error: file.VHD(100): VHDL Compiler exiting 
+0

「延伸閱讀」聽......而*那麼*發生了什麼事?... –

+0

對不起!編輯爲包含編譯器錯誤。 – Austin

+0

請發佈您的信號定義。事實上,發佈一個**最小但可編譯的**測試用例 - 這將使我們無法猜測錯誤的細節。 [在VHDL代碼片段中獲得更好的反饋](http://www.sigasi.com/content/vetsmod-get-better-feedback-your-vhdl-code-snippets) –

回答

3

首先,你正在嘗試做的確實是可能的,用VHDL術語稱爲「條件信號賦值語句」。

您還沒有提供在表達式中使用的信號的聲明,但我會認爲他們都是STD_LOGIC或std_logic_vector,即:

signal signal1  : std_logic;      -- Result 
    signal my_data  : std_logic;      -- Value if TRUE condition 
    signal other_data : std_logic;      -- Value if FALSE condition 
    signal bit_cond_true : std_logic;      -- Condition part 
    signal my_array  : std_logic_vector(19 downto 0); -- --||-- 
    signal another_array : std_logic_vector(19 downto 0); -- --||-- 

所以,VHDL是強類型語言,和您無法解析時給出的條件,因爲bit_cond_true是std_logic,而(my_array /= X"00000")解析爲布爾值。因此,您將收到ModelSim錯誤中綴運算符「和」沒有可行條目。,因爲ModelSim嘗試使用{std_logic} and {boolean}來解析表達式,但它沒有使用參數組合定義and運算符。

有轉換bit_cond_true爲布爾不同的可能性,而這正好與兩個VHDL-2002和VHDL-2008:

signal1 <= my_data when ((bit_cond_true = '1') and 
          (my_array /= X"00000") and 
          (my_array = another_array)) else 
      other_data; 

在VHDL-2008只,你也可以使用??操作轉換std_logic值爲'1'或'H'爲TRUE,其他值爲FALSE。然後,代碼如下:

signal1 <= my_data when ((?? bit_cond_true) and 
          (my_array /= X"00000") and 
          (my_array = another_array)) else 
      other_data; 

爲了獲得更多進入VHDL語言,我建議你潛入一本書下的維基百科VHDL

+0

這是我正在尋找的答案!感謝您解釋它! – Austin