使用VHDL 2008泛型类型功能创建伪动态类型

时间:2014-03-27 10:38:00

标签: vhdl modelsim

我试图创建一个可以容纳不同类型数据的记录,这是否可能以某种方式使用VDHL 2008的通用打字功能?我没有尝试合成该代码。

我的测试设置如下:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.math_real.all;

entity dynrec is

end entity dynrec;

architecture dyn of dynrec is

  type dynrec is record    -- this is a test record
    datatype : type;       -- type of the data field
    data     : datatype;
    someval  : natural;
  end record dynrec;

  signal testsig1, testsig2 : dynrec;

begin  -- architecture dyn

testsig1 <= (datatype => real,      data => 5.0, someval => 12);
testsig2 <= (datatype => std_logic, data => '1', someval => 12);

end architecture dyn;

你知道,我想要做的是拥有一个可以根据其中一个字段保存不同类型数据的记录。但是,它在编译时失败并出现以下错误:

# ** Error: dynrec.vhd(13): near "type": expecting STRING or IDENTIFIER or << or '('
# C:/Programme/Mentor/Modelsim10.0b/win32/vcom failed.

有没有办法让这样的工作成功?

我使用了mentorgraphics modelsim 10.0b,并使用vcom dynrec.vhd -2008编译。

1 个答案:

答案 0 :(得分:3)

据我所知,你必须做这样的事情:

package dynrec_pkg is
  generic (
    datatype : type
  );

  type dynrec_type is record
    data     : datatype;
    someval  : natural;
  end record dynrec_type;
end package dynrec_pkg;

---------------------

library ieee;
use ieee.math_real.all;

package dynrec_pkg_real is new work.dynrec_pkg generic map (datatype => real);

---------------------

library ieee;
use ieee.std_logic_1164.all;

package dynrec_pkg_sl is new work.dynrec_pkg generic map (datatype => std_logic);

---------------------

library ieee;
use ieee.std_logic_1164.all;
use ieee.math_real.all;

use work.dynrec_pkg_real.all;
use work.dynrec_pkg_sl.all;

entity dynrec is
end entity dynrec;

architecture dyn of dynrec is

  signal testsig1 : dynrec_pkg_real.dynrec_type;
  signal testsig2 : dynrec_pkg_sl.dynrec_type;

begin  -- architecture dyn

  testsig1 <= (data => 5.0, someval => 12);
  testsig2 <= (data => '1', someval => 12);

end architecture dyn;

由于您想要创建具有两种不同类型的记录实例,这似乎是最好的方法。否则,您可以使datatype成为实体本身的通用名称并避免使用额外的包,但是您只能向实体显示一个动态类型(当然,您可以使用多个泛型,如{{1} },datatype1等。)

最重要的是,您不能像使用内联泛型类型那样定义记录 - 像包和实体这样的设计元素可以有泛型,但记录不能。

请注意,无论如何,ModelSim似乎都不支持此功能(我使用的是10.2c),而且我没有方便的模拟器,因此欢迎语法更正。不过,我认为一般的想法是合理的。