Это мой компонент, тип и сигнал:
type t_data_bus_array is array(natural range<>, natural range<>) of std_logic;
component credit
generic (
CREDIT_WIDTH : natural := 4
);
port (
pi : in std_logic_vector(CREDIT_WIDTH-1 downto 0);
po : out std_logic_vector(CREDIT_WIDTH-1 downto 0)
);
end component;
signal pi_credit_array : t_data_bus_array(NUMBER_OF_INPUTS-1 downto 0, CREDIT_WIDTH-1 downto 0);
signal po_credit_array : t_data_bus_array(NUMBER_OF_INPUTS-1 downto 0, CREDIT_WIDTH-1 downto 0);
В моей архитектуре я бы попытался соединить их, но это не работает.
Credit_X : for I in 0 to NUMBER_OF_INPUTS-1 generate
Credit_I :
credit
generic map(
CREDIT_WIDTH => CREDIT_WIDTH
)
pi => pi_credit_array(I),
po => po_credit_array(I)
);
end generate;
Также попробуйте с функция:
-- select specifik row in 2d array
function sel_chunk(
data : t_data_bus_array; -- matrix of std_logic
num : natural; -- selected row
width : natural -- width of row
) return std_logic_vector is
variable data_ret_val : std_logic_vector(width-1 downto 0);
begin
for i in data_ret_val'range loop
data_ret_val(i) := data (num, i);
end loop;
return data_ret_val;
end sel_chunk;
И использовать функцию следующим образом:
Credit_calculator_X : for I in 0 to NUMBER_OF_INPUTS-1 generate
Credit_calculator_I :
credit_calculator
generic map(
CREDIT_WIDTH => CREDIT_WIDTH
)
pi => sel_chunk( pi_credit_array, I, CREDIT_WIDTH ),
po => sel_chunk( po_credit_array, I, CREDIT_WIDTH )
);
end generate;
Итак, как решить эту проблему и подключить 2D-массив в карте портов?