来自自身实体的VHDL数组
是否可以声明包含自己实体的数组 我试图获得16个寄存器(4位地址),并希望使用数组访问它们。我有一个“注册”实体和一个注册管理器实体,由ALU访问,地址为: 登记册:来自自身实体的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
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——您的寄存器管理器没有输出
);
终端生成;
注意:我引入了时钟,因为在同步逻辑中没有时钟的寄存器有点奇怪,您也应该添加一个重置。如果您正在执行异步逻辑,请忘记此注释