3

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 が導入されたジェネリックの後、T_VECTOR が必要なポートの前に、T に依存する T_VECTOR の定義を挿入する方法です。両方の型を一般的かつ抽象的に保ちながら、一方をもう一方の制約のない配列にする方法は? 抽象型がなければ、T および T_VECTOR の型定義を含むパッケージを使用してこれを実現しますが、VHDL 2008 の抽象型でどのように行うことができますか?

制約のない配列やレコード (たとえば、T 型の実数フィールドと虚数フィールドを持つ複雑なレコード) などの多くの派生型を抽象のままにして、それらを使用して上記の例のように抽象コンポーネントを定義できるようにしたいと考えています。

4

3 に答える 3

1

私は今、自分の質問に答えています。この問題の部分的な解決策の 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 の 1 か所で T と「<」を再定義して、COMP_EXCH とその他の並べ替えネットワーク設計で、そのコードを変更することなくすべてを並べ替えることができるという意味で「一般的」です。これらは実際には抽象型ではありませんが、T と T_VECTOR は COMP_EXCH 内のもののように動作します。唯一の欠点は、同じ設計で異なる基本型 T を持つ複数の種類のソーターが必要な場合、運が悪いことです。「貧弱な」抽象的なネットワークソーターソリューションは機能しますが、一度しか使用できません。

これは最初の問題を解決するための回避策ですが、真の解決策ではありません。VHDL 2008 で、型ジェネリック基本型 T から派生したレコードまたは配列を定義し、T の実際の値を持たずにポートまたはシグナル宣言で使用できるかどうかはまだわかりません。SORTER_PKG をジェネリック型 T を持つ抽象ジェネリック パッケージを使用する場合、T には実際の値がないため、COMP_EXCH でパッケージを使用できません。VHDL 2008 は真の OOP ハードウェア設計に非常に近いですが、まだそこにはありません。

于 2013-05-28T20:09:37.883 に答える
0

汎用データ型と同じデータ型の配列をエンティティに送信したいという同様の問題がありました。私の解決策は一般的ですが、少し不器用です。T と T_VECTOR の両方をエンティティに送信しました。問題の部分は、エンティティ内で T_VECTOR が配列であることを理解していないように見えるため、配列操作 (配列から要素を取得するなど) を実行する必要があるすべての関数に対して、別の関数も送信する必要があったことです。これは実際の例で最もよく実証されていると思うので、RTL コードテストベンチを次に示します。これはあなたの問題にも当てはまるはずです。

于 2015-11-24T14:14:58.363 に答える