将通用包传递给通用包以在VHDL中设置端口

时间:2019-10-21 14:29:00

标签: vhdl

我正在eda游乐场(https://www.edaplayground.com/x/6Mpm)中查看一个通用包装示例,并且我正在尝试做类似的事情。我试图通过实体中的通用字段从顶级获取一个整数,然后将通用值传递给通用包以设置记录的一部分的大小。然后,该记录类型将在泛型来源的实体的端口中使用。

这是否可行,还是必须像示例中那样在包装声明中对数字进行硬编码?尝试在实体中声明该软件包会给我错误,即该端口看不到记录类型。如示例中那样正常声明软件包,意味着该软件包在实体中看不到泛型。

我一直想使用一个常量包来规避“问题”,但是我想知道是否有可能使用泛型和一个通用包而不用对数字进行硬编码。这样一来,我在重用模块时不必记住要更改常量包。

包装:

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

-- pps_control_generic_pkg
package pps_control_generic_pkg is
  generic(
    -- Size of register. Max 32. Default 32
    g_reg_size : integer := 32
  );

type t_apb3_pif2core is record
  rw_config    : std_logic_vector(g_register_size-1 downto 0);
  rw_config_we : std_logic;
end record;

type t_apb3_core2pif is record
  rw_config    : std_logic_vector(g_register_size-1 downto 0);
end record;

end package pps_control_generic_pkg;

代码

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

-- Trying to declare this correctly
-----------------------------------------------------------
package pps_control_pkg is new work.pps_control_generic_pkg
generic map(
  g_reg_size => g_reg_size
);
use work.pps_control_pkg.all;
-----------------------------------------------------------

entity pps_control_core is
  generic(
    -- Size of register. Default 32
    g_register_size  : integer := 32;
  );
  port(
    csi_sys_clk   : in std_logic;
    rsi_sys_reset : in std_logic;

    -- Interface to access register
    p2c           : in  t_apb3_pif2core;
    c2p           : out t_apb3_core2pif;

    pps_in        : in  std_logic;
    pps_out       : out std_logic;
    pps_en_n      : out std_logic
  );
end entity;

architecture rtl of pps_control_core is
...
begin
...
end rtl;

1 个答案:

答案 0 :(得分:0)

具有记录约束的记录类型的不受约束的复合元素有效。感谢Tricky提及解决方案,而user1155120指出了解决方案。

library ieee;
use ieee.std_logic_1164.all;

package pps_control_generic_pkg is
  type t_apb3_pif2core is record
    rw_config    : std_logic_vector;
    rw_config_we : std_logic;
  end record;
  type t_apb3_core2pif is record
    rw_config    : std_logic_vector;
  end record;
end package pps_control_generic_pkg;

library ieee;
use ieee.std_logic_1164.all;
use work.pps_control_pkg.all;

entity pps_control_core is
  generic(
    g_register_size  : integer := 32;
  );
  port(
    csi_sys_clk   : in std_logic;
    rsi_sys_reset : in std_logic;
    p2c           : in  t_apb3_pif2core
                        (arw_config(g_register_size-1 downto 0));
    c2p           : out t_apb3_core2pif
                        (aro_config(g_register_size-1 downto 0));
    pps_in        : in  std_logic; --! External pps signal
    pps_out       : out std_logic; --! Outputted pulse
    pps_en_n      : out std_logic  --! Enable pps signal to instrument
  );
end entity;
相关问题