2013-05-28 53 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,我想这应该适用于您的问题,以及