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

Generics 如何在VHDL 2008中创建抽象数据类型的派生类型?,generics,types,adt,vhdl,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 "<"

使用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;
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
实体公司是
泛型(类型T;--VHDL-2008抽象泛型基类型

函数“我认为如果不创建一个包含t和t_向量的中间包,您就无法到达需要的位置-那么您可以为实体实例化该包吗

或者(这可能不符合你的最终目标)…这能起作用吗

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;
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
实体公司是
泛型(类型T;--VHDL-2008抽象泛型基类型

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

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;
IEEE库;
使用IEEE.STD_LOGIC_1164.all;
包裹分拣机包装为
子类型T是整数;--在此处定义T以使包“通用”

作用"我只是遇到了一个类似的问题,我想向一个实体发送一个通用数据类型和一个相同数据类型的数组。我的解决方案是通用的,但有点笨拙。我向实体发送了T和T_向量。问题的部分是,实体内部似乎不理解T_向量是一个数组,因此对于每个需要o一些数组操作(例如从数组中获取一个元素,我还必须发送单独的函数。我认为这最好用一个实际示例来演示,因此这里是and。我认为这也应该适用于您的问题

它必须是一个实体吗?可以接受作为子程序实现吗?它必须是一个实体。这是通用排序的一部分网络设计。我想创建一个抽象的排序网络实体,它有一个抽象的基本类型T,一个缩写“你可以通过提供类型T,比较函数来实例化这个实体”这在COMP_EXCH的特定情况下是可以的,COMP_EXCH有一个已知大小的输出端口,但通用分拣机实体有无约束的阵列端口,并且需要T_向量。很明显,T_向量定义需要一个包,但这是一个未实例化的包,因为T和“这看起来就快到了-您现在可以为T创建泛型(而不是子类型)然后用不同的T实例化包。看,实际上我还远没有找到解决问题的方法,我们只是在这里循环运行。是的,在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。如果您能提供一个解决此问题的示例我将非常感激。