Я пытаюсь использовать многомерный массив в VHDL, и у меня много проблем, чтобы заставить его работать должным образом.Моя проблема в том, что у меня есть массив из 17, из 16 векторов, данного размера.Что я хочу сделать, это создать 17 регистров, которые являются массивом из 16 * std_logic_vector 32 бит (что = мой b, 512).Итак, я пытаюсь передать что-то для ввода и вывода в экземпляре регистра, который сообщает компилятору / синтезатору, что я хочу передать что-то, что стоит 512 бит ... Аналогично в C, если у меня было:
int var[COLS][ROWS][ELEMENTS];
memcpy(&var[3].. // I'm talking about 3rd COL here, passing in memory that is ROWS*ELEMENTS long
(мое фактическое объявление здесь:)
typepart__pipeline_registers_type это массив (от 0 до 16, от 0 до 15) std_logic_vector (iw - от 1 до 0);сигнал h_blk_pipelined_input: частичный_pipeline_registers_type;
Я пытался просто использовать h_blk_pipelined_input (0) .. до (16), но это не работает.Я получаю следующую ошибку, которая заставляет меня видеть, что мне нужно удвоить индекс в массиве:
ERROR:HDLParsers:821 - (at the register) Wrong index type for h_blk_pipelined_input.
Итак, я попробовал то, что ниже, и я получаю эту ошибку:
ERROR:HDLParsers:164 - (at the register code). parse error, unexpected TO, expecting COMMA or CLOSEPAR
instantiate_h_pipelined_reg : regn
generic map ( N=> b, init => bzeros )
port map ( clk => clk , rst => '0', en => '1',
input => h_blk_pipelined_input((i - 1), 0 to 15),
output=> h_blk_pipelined_input((i), 0 to 15));
-- Changing 0 to 15 to (0 to 15) has no effect...
Я использую XST, и из их документации (http://www.xilinx.com/itp/xilinx6/books/data/docs/xst/xst0067_9.html), должно работать вышеупомянутое:
...declaration:
subtype MATRIX15 is array(4 downto 0, 2 downto 0)
of STD_LOGIC_VECTOR (7 downto 0);
A multi-dimensional array signal or variable can be completely used:
Just a slice of one row can be specified:
MATRIX15 (4,4 downto 1) <= TAB_B (3 downto 0);
Одна альтернатива - я могу создать больше регистров, которые в 16 раз меньше, и вместо попыткичтобы сделать все от 0 до 15 одновременно, я бы сделал это еще 15 раз, однако я думаю, что это может привести к неэффективности синтеза, и я не чувствую, что это правильное решение.
РЕДАКТИРОВАТЬ:
Попробовал то, что сказал Бен,
instantiate_h_m_qa_pipeline_registers: for i in 1 to 16 generate
instantiate_h_pipelined_reg : regn
generic map ( N=> b, init => bzeros )
port map ( clk => clk , rst => '0', en => '1',
input => h_blk_pipelined_input(i - 1),
output=> h_blk_pipelined_input(i));
end generate instantiate_h_m_qa_pipeline_registers;
Сигналы теперь определены как:
type std_logic_block is array (0 to 15) of std_logic_vector(iw - 1 downto 0) ;
type partial_pipeline_registers_type is array (0 to 16) of std_logic_block;
signal h_blk_pipelined_input : partial_pipeline_registers_type;
И ошибка, которую я получаю отXST:
ОШИБКА: HDLParsers: 800 - ((где часть регистра)) Тип ввода несовместим с типом h_blk_pipelined_input.
Я могучтобы сделать все, что я мог сделать раньше, используя синтаксис () () вместо (,), чтобы я ничего не потерялЭто все еще не решает мою проблему.
РЕДАКТИРОВАТЬ:
Сделал еще один шаг и использовал функцию преобразования на входе => иoutput => аргументы для создания экземпляра регистра, используя функцию для преобразования между типом массива и просто std_logic_vector нужного мне размера.Исправлена часть 'input =>', но ..
Фактически связанная с режимом формального OUT Выходной сигнал не может быть преобразованием типа или вызовом функции.(LRM 4.3.2.2)