#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:
В вашем коде есть несколько проблем:
- Результат вашего вычисления преобразуется в
unsigned
, в то время как левая часть являетсяstd_logic_vector
- Возможно, что-то не так с типом данных
addr
, но вы не поделились этим с нами. - В присваивании отсутствует закрывающая скобка.
Будет проще, если вы будете использовать «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
.