Индексирование массивов в VHDL

#vhdl

#vhdl

Вопрос:

У меня есть массив:

 type offsets_type is array (4 downto 0) of std_logic_vector (4 downto 0); 
signal av     : offsets_type;
  

Я хочу сделать это, по сути: av[addr] = 1;
Но эта строка:

  av(to_integer(unsigned(addr))) <= unsigned(av(to_integer(unsigned(addr)))   1;
  

выдает эту ошибку:
to_integer can not have such operands in this context.

Я также пытался использовать conv_integer , но это выдает Wrong type of index ошибку.

Есть решения? Спасибо.

Комментарии:

1. Какой тип addr? Исходя из синтаксиса, я бы ожидал, что это будет std_logic_vector(4 downto 0) , но, судя по сообщению об ошибке, я предполагаю, что это может быть что-то другое?

Ответ №1:

В вашем коде есть несколько проблем:

  1. Результат вашего вычисления преобразуется в unsigned , в то время как левая часть является std_logic_vector
  2. Возможно, что-то не так с типом данных addr , но вы не поделились этим с нами.
  3. В присваивании отсутствует закрывающая скобка.

Будет проще, если вы будете использовать «unsigned» в своих определениях типов. Таким образом, вы выражаете, что битовый шаблон на самом деле является тем, что вы хотите использовать в целочисленной арифметике.

 type offsets_type is array (4 downto 0) of unsigned (4 downto 0);
signal av     : offsets_type;
signal addr :unsigned(2 downto 0);
  

Это сэкономит вам несколько преобразований типов:

 av(to_integer(addr)) <= av(to_integer(addr))   "1";
  

Редактировать: вы использовали ieee.numeric_std.all , не так ли?

Комментарии:

1. Я не могу изменить тип addr, поскольку это входные данные, но ваш ответ все равно помог мне. Это то, с чем я пошел: av(conv_integer(unsigned(addr))) <= av(conv_integer(unsigned(addr))) "1";

2. @Pwngulator Я бы посоветовал вам использовать ieee.numeric_std.all библиотеку (вместо std_logic_unsigned ). В этой библиотеке есть функция преобразования to_integer .