2017-06-14 70 views
4

VHDL-2008定義如何約束VHDL-2008 integer_vector?

type integer_vector is array (natural range <>) of integer 

,它可以被用來創建不受約束整數數組就好:

signal sUnconsrainedIntA : integer_vector(0 to 1) := (others => 0); 

然而,如何聲明約束整數數組,例如:

-- does not work: 
-- signal sConstrainedTestIntA : integer_vector(0 to 1) range 0 to 3 := (others => 0); 
-- ** Error: filetest.vhd(65): Range constraints cannot be applied to array types. 
-- ** Error: filetest.vhd(65): Range expression is type Integer; expecting type std.STANDARD.INTEGER_VECTOR 

-- What you can do is: 
type my_int_array is array (natural range <>) of integer range 0 to 3; 
signal sConstrainedIntA : my_int_array(0 to 1) := (others => 0); 

有沒有一種方法來限制沒有自定義類型的數組中的整數?

+1

我猜不是。正如你寫的,'integer_vector'是一個包含全範圍的整數數組。如果你想改變它,你必須自己定義一個不同的類型。 – Juergen

+0

如何定義一個自定義類型,然後可以被約束,如 類型slv_array是std_logic_vector的數組(自然範圍<>); signal sSlvA:slv_array(0 to 1)(1 downto 0):=(others =>(others =>'0')); – FritzDC

+1

我不確定VHDL-2008,但之前,你不能做這樣的事情。我想VHDL-2008仍然不可能。 – Juergen

回答

2

VHDL 2008支持包通用參數。你可以嘗試這樣的:

package foo_pkg is 
    generic(l, h: integer); 
    subtype my_integer is integer range l to h; 
    type my_integer_vector is array(natural range <>) of my_integer; 
end package foo_pkg; 

package foo_pkg_m17_p39 is new work.foo_pkg 
    generic map(l => -17, h => 39); 

package foo_pkg_p57_p134 is new work.foo_pkg 
    generic map(l => 57, h => 134); 

entity foo is 
    port(iv1: work.foo_pkg_m17_p39.my_integer_vector(0 to 7); 
     iv2: work.foo_pkg_p57_p134.my_integer_vector(0 to 7) 
    ); 
end entity foo; 

不是非常用戶友好,因爲你需要每個整數約束一個包實例化聲明。但它是我發現的類似於大多數你所要求的...

即使它看起來比你所期望的更復雜,它仍然允許你將自定義代碼分解爲my_integer_vector的所有變體。