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++ 模板的情况不同,在 C++ 模板中,错误可能会潜伏多年,直到您以特定方式实例化它们(因为 C++ 模板比真正的通用元编程更接近宏)

示例:未经测试,但在上述书籍的第 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 回答