4

VHDL でジェネリック型を使用する方法はありますか? たとえば、プロシージャを呼び出したいのですが、パラメーターとして指定したい信号の型がわかりません。パラメーターをジェネリックとして宣言することは可能ですか? C++ と同様に、テンプレートを使用します。

procedure eq_checker(name : string; sig : ANYTHING); should : ANYTHING; at : time) is
  if (at = now) then
    if sig = should then
      report "has same value" severity note;
    else
      report "has not same value" severity note;
    end if;
  end if;
end checker;

少なくとも、さまざまな信号タイプを「sig」として使用できるはずです。

4

2 に答える 2

5

Peter Ashenden と Jim Lewis の著書「VHDL-2008 - Just the new stuff」は次のように始まります。

第 1 章 : 拡張ジェネリック
1.1 ジェネリック型

そのため、ツールが VHDL-2008 を適切にサポートしている場合は、ジェネリック型を宣言できるようになり、(エンティティだけでなく) サブプログラムでジェネリックを宣言できるようになりました。

また、それらが Ada モデルに従っている場合、ジェネリックは、インスタンス化するときではなく、最初にコンパイルするときにチェックされるため、コンパイルするインスタンス化はすべて機能します。それらを特定の方法でインスタンス化します (C++ テンプレートは真の汎用メタプログラミングよりもマクロに近いため)

例 : 未テストですが、前述の本の p.17 に次の例が書かれています...

procedure eq_checker
         generic  (type ANYTHING) 
         parameter(name : string; sig,should : ANYTHING; at : time) is
begin
  if (at = now) then
    if sig = should then
      report "has same value" severity note;
    else
      report "has not same value" severity note;
    end if;
  end if;
end procedure eq_checker;
于 2013-03-13T11:07:50.440 に答える
1

プロシージャなどを書いた瞬間にタイプがわからない場合は、サブタイプを使用できます。サブタイプは合成前にいつでも変更できます。わかりました、これは「やや一般的」ですが、それでも...次のようになります。

PACKAGE generics_pkg IS
-- type definition
subtype data_type is integer;

-- instantiation
COMPONENT generics IS
PORT(
    i: IN data_type;
    ii : in data_type;
    o: OUT std_logic    
);
END COMPONENT;

-- procedure
procedure comp (    signal x,y: in data_type; 
                    signal o: out std_logic);

END PACKAGE generics_pkg;

package body generics_pkg is
procedure comp (    signal x,y: in data_type; 
                    signal o: out std_logic) is
begin
    if x = y then
        o<='1';
        report "same value" severity note;
    else
        o<='0';
        report "not same value" severity note;
    end if;
end procedure comp;
于 2013-03-13T15:41:12.143 に答える