【问题标题】:How to create derived types of abstract data types in VHDL 2008?如何在 VHDL 2008 中创建抽象数据类型的派生类型?
【发布时间】:2013-05-28 02:11:09
【问题描述】:

使用 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 是:

type T_VECTOR 是 T 的数组(INTEGER range );

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

我希望能够让许多派生类型,如无约束数组或记录(例如具有 T 类型的实部和虚部的复杂记录)仍然保持抽象,并使用它们来定义抽象组件,如示例多于。

【问题讨论】:

  • 必须是实体吗?作为子程序实施是否可以接受?
  • 它必须是一个实体。这是通用排序网络设计的一部分。我想创建一个抽象的排序网络实体,它有一个抽象的基本类型 T、一个抽象的“
  • 您将通过提供类型 T、比较函数“

标签: generics types adt vhdl


【解决方案1】:

我现在正在回答我自己的问题,这里是这个问题的一个部分解决方案:

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;

解决方案是“通用的”,因为您可以在 SORTER_PKG 的一个位置重新定义 T 和“

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

【讨论】:

  • 这看起来差不多了 - 您现在可以为 T 创建一个泛型(而不是子类型),然后用不同的 T 实例化包。见books.google.co.uk/…
  • 其实我离解决我的问题还很远,我们只是在这里绕圈子。是的,在 VHDL 2008 中,您可以使 SORTER_PKG 具有通用类型 T 而不是实际的子类型定义,但是您不能在 COMP_EXCH 中使用该包,因为它是一个未实例化的包。您需要使用“package ... is new work.SORTER_PKG generic map(T=>...);”创建一个新包并在 COMP_EXCH 中使用它,但这只是一种更复杂的方式来完成我的 VHDL 2008 之前的解决方案已经以更简单的方式完成的工作。
  • 您仍然必须为您想要使用的每个 T 类型派生一个实际包,然后修改 COMP_EXCH 和所有其他文件以使用该包。您仍然可以一次只执行一种 T 类型,而无需更改抽象网络排序代码,因此基于泛型类型的 VHDL 2008 解决方案并不比我基于子类型的解决方案好,只是更复杂。也许我在这里遗漏了明显的东西,但我看不出如何在 COMP_EXCH 中使用 T_VECTOR 而不先实际定义 T 。如果您能提供解决此问题的示例,我将不胜感激。
【解决方案2】:

如果不创建包含 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;

【讨论】:

  • 这在 COMP_EXCH 的特殊情况下是可以的,它有一个已知大小的输出端口,但一般的排序器实体有不受约束的数组端口并且需要 T_VECTOR。很明显,T_VECTOR 定义需要一个包,但这是一个未实例化的包,因为尚未定义 T 和“
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2023-04-11
    • 2021-08-04
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    • 2013-11-30
    • 1970-01-01
    相关资源
    最近更新 更多