2011-10-28 65 views
7

我最近開始爲我的端口定義開始使用記錄,特別是如果我想對屬於某個接口的信號進行分組。然而,我在這裏面臨的問題是,我不能通過通用的方式將std_logic_vector的寬度傳遞給實體。所以我基本上想要做的是以下幾點:將泛型傳遞給記錄端口類型

library ieee; 
use ieee.std_logic_1164.all; 
use work.math_pkg.all; 

package fifo_pkg is 

    type fifo_in_type is record 
    data_in : std_logic_vector(DATA_WIDTH_??- 1 downto 0); 
    rd  : std_logic; 
    wr  : std_logic; 
    end record; 

    type fifo_out_type is record 
    data_out : std_logic_vector(DATA_WIDTH_?? - 1 downto 0); 
    empty : std_logic; 
    full  : std_logic; 
    end record; 

    component fifo is 
    generic 
     (
     MIN_DEPTH : integer; 
     DATA_WIDTH : integer 
     ); 
    port 
     (
     clk : in std_logic; 
     res_n : in std_logic; 
     i  : in fifo_in_type; 
     o  : out fifo_out_type 
     ); 
    end component fifo; 

end fifo_pkg; 

因此,理想的解決辦法是,當我可以使用相同的通用在我的紀錄,我在實體一樣。 (所以DATA_WIDTH與DATA_WIDTH_ ??相同)。我知道這應該以某種方式與VHDL 2008,但我的Quartus II 11sp1不支持記錄中的泛型。

是否有一種優雅的方式來實現可綜合的那種「泛型傳遞」?我知道可以在包中存儲常量,但是我不能使用相同的fifo包以不同的寬度實例化幾個fifo。

萬分感謝, 牛逼

回答

8

你可以使用泛型類型採用Quartus?

那麼你要離開的類型完全不確定,這樣就可以創建integers一個FIFO或任何其它數據類型:

package fifo_pkg is 
    generic (type element_type); 

    type fifo_in_type is record 
    data_in : element_type; 
    rd  : std_logic; 
    wr  : std_logic; 
    end record; 

    type fifo_out_type is record 
    data_out : element_type; 
    empty : std_logic; 
    full  : std_logic; 
    end record; 

    component fifo is 
    generic 
     (
     MIN_DEPTH : integer; 
     DATA_WIDTH : integer 
     ); 
    port 
     (
     clk : in std_logic; 
     res_n : in std_logic; 
     i  : in fifo_in_type; 
     o  : out fifo_out_type 
     ); 
    end component fifo; 

end fifo_pkg; 

然後,當你想使用它:

package wide_fifo_pkg is new fifo_pkg 
    generic map (type => std_logic_vector(31 downto 0)); 

和那麼你可以使用fifo_in_typefifo_out_type

signal i : fifo_in_type; 

如果您有一個設計單位不止一個FIFO,您可以創建包的幾個版本,並使用包前綴得到正確的類型:

package narrow_fifo_pkg is new fifo_pkg 
    generic map (type => std_logic_vector(3 downto 0)); 

signal i32 : wide_fifo_pkg.fifo_in_type; 
signal i4 : narrow_fifo_pkg.fifo_in_type; 

另一個VHDL 2008年選擇:你可以有一個不受約束的記錄類型:

type fifo_in_type is record 
    data_in : std_logic_vector; 
    rd  : std_logic; 
    wr  : std_logic; 
    end record; 

然後你就可以創建subtype S的爲您的各種用途:

subtype fifo1_data_type is fifo_in_type(data_in(31 downto 0)); 
subtype fifo2_data_type is fifo_in_type(data_in(15 downto 0)); 

不知道Quartus是否支持這兩種選擇 - 請讓我們知道!

+0

嗨馬丁,感謝您的建議,這兩個都漂亮和優雅。然而,這在Quartus 11.0 SP1中不起作用。似乎quartus目前只支持vhdl 2008非常有限的子集。任何其他想法來完成這個任務?我想知道這是否會與Synplify一起工作...謝謝,T – user1017739

+0

這是一個遺憾(關於Quartus),但並非完全沒有預料之外。 Synplify幫助文件意味着它知道有無約束數組*和*類型泛型的記錄。 –

+0

確實,這有點令人失望:( – user1017739