来自自身实体的VHDL数组

来自自身实体的VHDL数组,vhdl,xilinx,hdl,vivado,Vhdl,Xilinx,Hdl,Vivado,是否可以声明包含自己实体的数组 我试图获得16个寄存器(4位地址),并希望使用数组访问它们。我有一个“注册”实体和一个注册管理器实体,由ALU访问,地址为: 登记册: entity register is port(en : in STD_LOGIC; d_in : in STD_LOGIC_VECTOR(7 downto 0); d_out : out STD_LOGIC_VECTOR(7 downto 0)); end register

是否可以声明包含自己实体的数组

我试图获得16个寄存器(4位地址),并希望使用数组访问它们。我有一个“注册”实体和一个注册管理器实体,由ALU访问,地址为:

登记册:

entity register is
    port(en    : in STD_LOGIC; 
         d_in  : in STD_LOGIC_VECTOR(7 downto 0); 
         d_out : out STD_LOGIC_VECTOR(7 downto 0));
end register;
注册管理器:

entity register_manager is
    port(en   : in STD_LOGIC; 
         addr : in STD_LOGIC_VECTOR(3 downto 0); 
         data : in STD_LOGIC_VECTOR(7 downto 0));
end register_manager;

如何实例化包含这些寄存器的数组?

您可以像这样使用进行生成:

type t_array is array (0 to 15) of STD_LOGIC_VECTOR(7 downto 0);
signal data_array : t_array;

...

process(clk)
begin

  if rising_edge(clk) then

    for I in 0 to 15 loop
      if to_integer(unsigned(addr)) = I then
        data_array(I)  <= data;
      end if;
    end loop;

  end if;

end process;

for I in 0 to 15 generate

  -- Synthetizer will instantiate 16 registers and each will have a different d_in
  inst_register : register
  port map
  (
    en    => en,
    clk   => clk,
    d_in  => data_array(I), 
    d_out => open           -- Your register_manager has no ouput
  );

end generate;
类型t_数组是标准_逻辑_向量(7到0)的数组(0到15);
信号数据_阵列:t_阵列;
...
过程(clk)
开始
如果上升沿(clk),则
对于0到15循环中的I
如果to_integer(unsigned(addr))=I,则
数据_数组(I)en,
时钟=>clk,
d_in=>数据_数组(I),
d_out=>open——您的寄存器管理器没有输出
);
终端生成;

注意:我引入了时钟,因为在同步逻辑中没有时钟的寄存器有点奇怪,您也应该添加一个重置。如果您正在执行一些异步逻辑,请忘记此注释。

您可以使用生成,如下所示:

type t_array is array (0 to 15) of STD_LOGIC_VECTOR(7 downto 0);
signal data_array : t_array;

...

process(clk)
begin

  if rising_edge(clk) then

    for I in 0 to 15 loop
      if to_integer(unsigned(addr)) = I then
        data_array(I)  <= data;
      end if;
    end loop;

  end if;

end process;

for I in 0 to 15 generate

  -- Synthetizer will instantiate 16 registers and each will have a different d_in
  inst_register : register
  port map
  (
    en    => en,
    clk   => clk,
    d_in  => data_array(I), 
    d_out => open           -- Your register_manager has no ouput
  );

end generate;
类型t_数组是标准_逻辑_向量(7到0)的数组(0到15);
信号数据_阵列:t_阵列;
...
过程(clk)
开始
如果上升沿(clk),则
对于0到15循环中的I
如果to_integer(unsigned(addr))=I,则
数据_数组(I)en,
时钟=>clk,
d_in=>数据_数组(I),
d_out=>open——您的寄存器管理器没有输出
);
终端生成;
注意:我引入了时钟,因为在同步逻辑中没有时钟的寄存器有点奇怪,您也应该添加一个重置。如果您正在执行异步逻辑,请忘记此注释