Проблема многомерного массива в VHDL? - PullRequest
0 голосов
/ 26 февраля 2011

Я пытаюсь использовать многомерный массив в 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)

Ответы [ 2 ]

3 голосов
/ 26 февраля 2011

Как насчет:

TYPE reg512_type IS ARRAY(0 TO 15) OF STD_LOGIC_VECTOR (31 DOWNTO 0);
TYPE partial_pipeline_registers_type IS ARRAY(0 TO 16) OF reg512_type;

Код на этом сайте Xilinx явно не проверен. Поскольку ARRAY OF ... являются типами, а не подтипами, их код не должен компилироваться.

РЕДАКТИРОВАТЬ: Эти пользовательские типы не будут хорошо работать с существующими IP-компонентами, но это нормально, компилятор может легко вывести регистры. Попробуйте:

instantiate_h_m_qa_pipeline_registers: FOR i IN 1 TO 16 GENERATE

instantiate_h_pipelined_reg : PROCESS (clk)
BEGIN
    IF RISING_EDGE(clk) THEN
        h_blk_pipelined_input(i) <= h_blk_pipelined_input(i - 1);
    END IF;
END GENERATE instantiate_h_m_qa_pipeline_registers;   
1 голос
/ 26 февраля 2011

Чтобы заставить вещи играть правильно, мне пришлось использовать функцию для выравнивания и разглаживания моих данных, взаимодействующих с созданием экземпляров регистра.в большом векторе, который должен был иметь экземпляр реестра ... и затем регистр возвращал мне вектор, который мне нужно было поместить в массив векторов.отлично работает.

      input => blk2vec(h_blk_pipelined_input(i - 1)),                        
      vec2blk(output) => h_blk_pipelined_input(i));
...