2013-05-28 77 views
2

使用VHDL 2008有沒有一種方法可以定義一個抽象實體,該抽象實體的泛型類型具有該類型的端口以及不受約束的數組或從該基類型派生的記錄?是這樣的:如何在VHDL 2008中創建派生類型的抽象數據類型?

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 

entity COMP_EXCH is 
    generic(type T;        -- VHDL-2008 abstract generic base type 
      function "<"(L,R:T) return BOOLEAN; -- VHDL-2008 abstract generic function 
      LATENCY:INTEGER:=0); 
    port(I0,I1:in T; 
     O:out T_VECTOR(0 to 1)); 
end COMP_EXCH; 

architecture TEST of COMP_EXCH is 
begin 
    O<=(I1,I0) when I1<I0 else (I0,I1); 
end TEST; 

其中T_VECTOR是:

類型T_VECTOR爲T的陣列(INTEGER範圍<>);

和T是一個任意的抽象基類型。面臨的挑戰是如何插入T_VECTOR的定義,T_VECTOR的定義取決於引入了T的泛型之後但T_VECTOR需要的端口之前的T?這兩種類型如何保持通用和抽象,但其中一個是另一個不受約束的陣列?沒有抽象類型,人們會使用一個包來實現這一點,它將包含T和T_VECTOR的類型定義,但是如何在VHDL 2008中使用抽象類型來完成?

我想能夠有一些派生類型,如無約束數組或記錄(例如一個複雜的記錄類型T的實際和虛構文件)仍然是抽象的,並使用它們來定義抽象組件上面的例子。

+0

,它必須得到一個實體?會執行作爲子程序可以接受? –

+0

它必須是一個實體,這是通用分類網絡設計的一部分。我想創建一個具有抽象基類型T的抽象排序網絡實體,它是一個absract「<」函數,用於比較T類型的兩個項目和T類型的非約束陣列的輸入和輸出端口。該實體將實現排序網絡可以使用用戶定義的「<」函數對任何類型元素的數組進行排序。 – user2426721

+0

您可以通過提供類型T,比較函數「<」和輸入和輸出信號來實例化此實體,這些信號是T大小的數組,您將得到所需的排序網絡。 COMP_EXCH只是大型設計的基本組成部分。除了這個T和T_VECTOR問題外,我已經有其他所有工作了。 – user2426721

回答

0

我不認爲你可以在沒有創建T和T_VECTOR的中間包的情況下獲得所需的位置,那麼你可以實例化該實體包?

或者(這可能不適合您的最終目標)......可以工作嗎?

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 

entity COMP_EXCH is 
    generic(type T;        -- VHDL-2008 abstract generic base type 
      function "<"(L,R:T) return BOOLEAN; -- VHDL-2008 abstract generic function 
      LATENCY:INTEGER:=0); 
    port(I0,I1:in T; 
     O0,O1:out T); 
end COMP_EXCH; 

architecture TEST of COMP_EXCH is 
begin 
    O0<=I1 when I1<I0 else I0; 
    O1<=I0 when I1<I0 else I1; 
end TEST; 
+0

在COMP_EXCH的特殊情況下,這可能是確定的,COMP_EXCH具有已知大小的輸出端口,但一般的分揀機實體具有不受約束的陣列端口並且需要T_VECTOR。很顯然,T_VECTOR定義需要一個包,但這是一個沒有實際意義的包,因爲T和「<」還沒有定義。那麼如何在T尚未定義的情況下實例化它以使用T_VECTOR類型的定義?我似乎無法找到一種方法來創建一個同時使用T和從其派生的數組或記錄類型的抽象實體,而無需實際定義T. – user2426721

0

我現在回答我的問題,這裏是一個部分解決了這個問題:

library IEEE; 
use IEEE.STD_LOGIC_1164.all; 

package SORTER_PKG is 
    subtype T is INTEGER; -- define T here to make package "generic" 
    function "<"(L,R:T) return BOOLEAN; 
    type T_VECTOR is array(INTEGER range <>) of T; 
end SORTER_PKG; 

package body SORTER_PKG is 
    function "<"(L,R:T) return BOOLEAN is 
    begin 
    return L<R; -- overload "<" here for whatever T is 
    end; 
end SORTER_PKG; 

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 

use work.SORTER_PKG.all; 

entity COMP_EXCH is 
    port(I0,I1:in T; 
     O:out T_VECTOR(0 to 1)); 
end COMP_EXCH; 

architecture TEST of COMP_EXCH is 
    signal I:T_VECTOR(O'range); 
begin 
    I<=(I1,I0) when I1<I0 else (I0,I1); 
end TEST; 

的解決方案是在這個意義上的「通用」,你可以在重新定義T和「<」在SORTER_PKG中的一個地方做COMP_EXCH,排序網絡設計的其餘部分排序任何東西,而不必對該代碼進行任何更改。儘管它們不是真正的抽象類型,但T和T_VECTOR的行爲與COMP_EXCH中的類似。唯一的缺點是,如果在同一設計中需要多種類型的分揀機並且使用不同的基本類型T,那麼您運氣不好 - 「窮人的」抽象網絡分揀機解決方案可以工作,但只能使用一次。

這是解決初始問題的解決方法,但不是真正的解決方案。我仍然不知道在VHDL 2008中是否有可能定義從類型泛型基類型T派生的記錄或數組,並在端口或信號聲明中使用該記錄或數組而不具有T的實際值。如果嘗試使SORTER_PKG成爲使用泛型類型T抽象泛型pakage,則不能在COMP_EXCH中使用該包,因爲T沒有實際值。 VHDL 2008與真正的面向對象硬件設計非常接近,但仍然沒有。

+0

這看起來差不多 - 現在您可以爲T創建泛型(而不是一個子類型),然後用不同的Ts實例化這個包。請參閱http://books.google.co.uk/books?id=ETxLguPMEY0C&lpg=PA37&ots=qao2KsYUwR&dq=vhdl%202008%20generic%20package&pg=PA37#v=onepage&q=vhdl%202008%20generic%20package&f=false –

+0

其實我是遠遠沒有解決我的問題,我們只是在這裏圈選。是的,在VHDL 2008中,您可以使SORTER_PKG具有泛型類型T而不是實際的子類型定義,但是不能在COMP_EXCH中使用該包,因爲它是一個無法實現的包。您需要創建一個新的程序包「package ... is new work.SORTER_PKG generic map(T => ...);」並在COMP_EXCH中使用它,但這只是一種更加複雜的方式,即以我的VHDL 2008解決方案已經以更簡單的方式完成的工作。 – user2426721

+0

您仍然必須爲您想要使用的每個T類型派生一個實際包,然後修改COMP_EXCH和所有其他文件以使用該包。您仍然可以一次只做一個T類型,而無需更改抽象網絡排序代碼,因此基於泛型類型的VHDL 2008解決方案並不比我的基於子類型的解決方案好,但它更加複雜。也許我錯過了這裏的明顯,但我沒有看到如何在COMP_EXCH中使用T_VECTOR而沒有首先實際定義T。如果您可以提供解決此問題的示例,我將非常感激。 – user2426721

0

我剛剛有一個類似的問題,我想將通用數據類型和相同數據類型的數組發送到實體。我的解決方案是通用的,但有點笨拙。我同時將T和T_VECTOR發送給實體。有問題的部分是,在實體內部似乎不理解T_VECTOR是一個數組,因此對於每個需要進行數組操作的函數(例如從數組中獲取元素,我必須發送不同的函數。我覺得這是一個實際的例子最好的證明,所以這裏的RTL codetestbench,我想這應該適用於您的問題,以及