2017-03-07 63 views
1

我知道這是可能創造一個定義的範圍的一個亞型,e.g:參數化VHDL亞型

subtype ADDRESS is UNSIGNED range (32 downto 0); 

是否有可能建立一個參數化類型/子類型?基本上保留'32'的值由用戶在製作ADDRESS類型的變量時定義。例如:

subtype ADDRESS is UNSIGNED range (f(x)) downto 0; 

其中f()是在另一個預定義包的功能,以及X是在創建ADDRESS的一個實例由用戶提供的自然數。

基本上我想縮短......

y : UNSIGNED(f(X) downto 0); 

y : ADDRESS(X); 

其中X是自然的。

回答

1

嗯,是的。但你不能寫:

subtype ADDRESS is UNSIGNED range (f(x)) downto 0; 

,因爲這是不正確的VHDL。你必須寫:

subtype ADDRESS is UNSIGNED (f(x) downto 0); 

其中x必須靜態。即x必須是文字,常量或通用。

您可以用這種方式使用函數來定義常量和其他靜態值的值。所有這些功能的輸入必須是靜態的。有趣的是,這樣的函數在精化過程中執行,這可能會使調試變得困難。如果你在調試這樣一個函數時遇到問題,你可以暫時將函數的返回值的目標改爲非靜態的東西(例如一個變量)。那麼該函數將在時間0之後執行,從而更易於調試。 下面是一個真實的例子:

package P is 
    function F(I : integer) return integer; 
end package P; 

package body P is 
    function F(I : integer) return integer is 
    begin 
    if I > 16 then 
     return I - 1; 
    else 
     return (I * 2) - 1; 
    end if; 
    end function F; 

end package body P; 

library IEEE; 
use IEEE.numeric_std.all; 
use work.P.all; 

entity E is 
    constant X : integer := 16; 
end entity E; 

architecture E of E is 
    subtype ADDRESS is UNSIGNED (f(x) downto 0); 
begin 

    process 
    begin 
    report "ADDRESS'left= " & integer'image(ADDRESS'left); 
    wait; 
    end process; 

end architecture E; 

這裏,它是EDA Playground

1

馬修·泰勒的答案已經是正確的,但我想回答你的最後一個問題

y : ADDRESS(X); 

在您使用宏C,但在VHDL這是不可能的。它需要函數ADDRESS返回一個子類型。 IEEE1076-2008定義:

function_specification ::= 
    [ pure | impure ] function designator 
     subprogram_header 
     [ [ parameter ] (formal_parameter_list) ] return type_mark 

其中:

type_mark ::= 
    type_name 
    | subtype_name 

即返回類型必須是已定義的類型。它不能是一個新的[sub]類型。 你可以做一些子類型的定義,如馬修解釋:

subtype ADDRESS_X is unsigned(f(X) downto 0); 
signal new_signal : ADDRESS_X;