如何在VHDL 2008中创建派生类型的抽象数据类型?

时间:2013-05-28 02:11:09

标签: generics types adt vhdl

使用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范围&lt;&gt;);

和T是任意抽象基类型。挑战是如何插入T_VECTOR的定义,它在引入T的通用之后但在需要T_VECTOR的端口之前依赖于T?两种类型如何保持通用和抽象,但有一种是另一种不受约束的数组?如果没有抽象类型,可以使用包来实现这一点,它将包含T和T_VECTOR的类型定义,但是如何在VHDL 2008中使用抽象类型呢?

我希望能够拥有许多派生类型,例如无约束数组,或者记录(例如,具有T类型的真实和虚构文件的复杂记录)仍然是抽象的,并使用它们来定义抽象组件,例如示例以上。

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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和“&lt;”在SORTER_PKG中的一个位置进行COMP_EXCH,其余的排序网络设计对任何内容进行排序,而无需对该代码进行任何更改。虽然它们不是真正的抽象类型,但T和T_VECTOR的行为类似于COMP_EXCH中的类型。唯一的缺点是,如果你需要在不同基本类型T的同一设计中使用多种分拣机,那么你运气不好 - “穷人的”抽象网络分拣机解决方案,它可以工作,但你只能使用一次。

这是解决初始问题的解决方法,但不是真正的解决方案。我仍然不知道在VHDL 2008中是否可以定义从类型通用基类型T派生的记录或数组,并在端口或信号声明中使用它而不具有T的实际值。如果您尝试使SORTER_PKG成为抽象通用pakage与泛型类型T然后你不能在COMP_EXCH中使用包,因为T没有实际值。 VHDL 2008非常接近真正的OOP硬件设计,但还没有。

答案 2 :(得分:0)

我遇到了类似的问题,我想将一个通用数据类型和一个相同数据类型的数组发送给一个实体。我的解决方案是通用的,但有点笨拙。我将T和T_VECTOR都发送给实体。有问题的部分是实体内部似乎没有理解T_VECTOR是一个数组,所以对于每个需要做一些数组操作的函数(比如从数组中获取一个元素,我也必须单独发送)函数。我认为这最好用一个实际的例子来证明,所以这里是RTL codetestbench。我认为这也适用于你的问题