2014-03-13 107 views
1

問題
我正在寫一個函數轉換爲測試臺的一些值的包。我想檢查輸出是否超過最大值,如果是,我想將其設置爲最大值。我累了以下內容:VHDL:使用WHEN - ELSE語句與變量

-- vec_in: 0...1023, returns -14...23.5 dB 
    function conv_dac602_scale (
    vec_in : std_logic_vector) 
    return real is 
    variable val_in, dB : real := 0.0; 
    constant lower : real := -14.0; 
    constant upper : real := 23.5; 
    begin -- function conv_dac602_scale 
    val_in := real(to_integer(unsigned(vec_in))); 
    dB := (lower+(val_in*((upper-lower)/1024.0))); 
    return dB when dB <= upper else upper; -- this is the important line! (129) 
    end function conv_dac602_scale; 

當我嘗試編譯此我得到了以下錯誤:

** Error: myfile.vhd(129): near "when": expecting ';' 
** Error: myfile.vhd(260): VHDL Compiler exiting 

然後我第一次嘗試將其分配給一個變量r:

... 
    r := dB when dB <= upper else upper; -- this is the important line! (129) 
    return r; 
    end function conv_dac602_scale; 

這並沒有改變結果。我知道我可以使用簡單的if/else子句,但我的問題是爲什麼我不能使用when子句。

系統
的ModelSim SE 10.0b,VHDL 2008

回答

3

target <= signal when x是所謂的併發聲明,這是專爲方便進程之外建立信號分配的。您可以在體系結構中使用它,但不能在流程中使用。如果還有其他設計用於流程中的順序語句。在你的情況下,你將不得不使用if/else。

編輯: 似乎這隻適用於2008年Vhdl。由於fru1tbat pointet出,這是有效的vhdl 2008代碼和問題是由Modelsim編譯器不支持的功能。

+1

採用VHDL-2008,併發任務的順序過程中不允許。問題可能是ModelSim 10.0b不支持這種構造(我沒有10.0b方便,但10.1編譯它就好了)。 – fru1tbat

+0

不知道。我必須查找它,聽起來很整齊,以便用於某些情況:) – MatthiasB

+0

@ fru1tbat我必須用aldec來嘗試它。 –

0

我會重新考慮改變你回電的方式,因爲它看起來像你的語法使用WHEN是不正確的。

明確你想要做什麼:

return dB when dB <= upper else upper; 

這本質上是「迴歸dBdB小於或等於upper,否則上」,其中upper將不予退還因路你做出返回聲明。您可能要說:... else return upper

我寧願一個if聲明在這種情況下:

if (dB <= upper) then 
    return dB; 
else 
    return upper; 
end if; 
+0

它怎麼沒有做什麼?如果價值超過限制,它本質上是「回報上限」,這對我來說似乎是完全合理的(除了首先使用「迴歸」的問題)。 – fru1tbat

+0

由於他製作return語句的方式,它不會返回'upper'。 – Signus

+1

對不起,我把你的陳述解釋爲質疑這個想法,而不是語法。從概念上講,這是完全有效的。 – fru1tbat