Вопрос или проблема
Это вызывает такую ошибку (компиляция с -2008 на EDA Playground)
-- Компиляция архитектуры rtl foo
** Ошибка: design.vhd(30): Ошибка типа при разрешении инфиксного выражения "xnor" как типа ieee.NUMERIC_STD.UNSIGNED.
** Примечание: design.vhd(30): (vcom-1499) Агрегат с ассоциацией единственного элемента должен использовать именованную ассоциацию.
для этого примера кода
library IEEE;
use IEEE.std_logic_1164.all;
use ieee.numeric_std.all;
entity foo is
port(
clk : in std_logic;
reset: in std_logic;
din : in std_logic;
dout: out unsigned(7 downto 0)
);
end entity foo;
architecture rtl of foo is
signal prbs_fb : unsigned(0 downto 0);
-- делает ошибку исчезающей signal prbs_fb : std_logic;
begin
process (clk)
begin
if reset="1" then
dout <= "00000000";
elsif rising_edge(clk) then
dout(7 downto 0) <= dout(6 downto 0) & prbs_fb;
end if;
end process;
-- ниже находится строка 30
prbs_fb <= dout(7) xnor dout(5) xnor dout(4) xnor dout(3);
end architecture;
Я могу исправить ошибку, изменив тип signal prbs_fb
на std_logic
.
Определение типа unsigned(0 downto 0)
имеет для меня больше смысла, потому что правая часть присваивания является беззнаковой. Похоже, что код выводит один бит беззнакового типа с левой стороны присваивания и один бит с правой стороны присваивания.
Почему строка 30 считается агрегатом? Выход логических операторов должен быть одним битом?
Ответ или решение
Ошибка VHDL: "unsigned on the LHS, unsigned and operator on the RHS"
При компиляции вашего кода на VHDL с использованием флага -2008 в EDA Playground возникает ошибка, связанная с несовпадением типов данных. Давайте подробно разберёмся в текущей ситуации, чтобы понять причины возникновения этого сообщения об ошибке и способы его устранения.
Контекст ошибки
Вы привели следующий фрагмент кода, в котором определён сигнал prbs_fb
типа unsigned
и происходит его назначение с использованием логического оператора xnor
:
prbs_fb <= dout(7) xnor dout(5) xnor dout(4) xnor dout(3);
Причины ошибки
-
Типы данных на левой (LHS) и правой (RHS) сторонах: Ваша ошибка заключена в том, что вы пытаетесь присвоить результат логической операции
xnor
, которая по своей природе возвращает типstd_logic
в переменной типаunsigned
. В этом случае возникает несоответствие типов данных. -
Упаковка в агрегат: Сообщение об ошибке в вашем коде указывает на то, что выражение с использованием оператора
xnor
рассматривается как агрегатное выражение. Это связано с тем, что вы использовали несколько логических операторов в цепочке, и компилятор интерпретирует их как попытку создать множество значений. Посколькуprbs_fb
определён какunsigned(0 downto 0)
, он ожидает значение, которое может соответствовать типуunsigned
, но выражение возвращаетstd_logic
, вызывая конфликт.
Решение проблемы
Чтобы устранить ошибку, необходимо обеспечить соответствие типов данных. Вот несколько шагов, которые можно предпринять:
-
Измените тип переменной:
Один из наиболее простых способов — изменить тип сигналаprbs_fb
наstd_logic
, что позволит избавиться от конфликтов типизации. Это один из вариантов, который вы уже использовали:signal prbs_fb : std_logic;
-
Объединив типы данных:
Если вы хотите оставитьprbs_fb
какunsigned
, вам необходимо обеспечить правильное преобразование типов. Тогда конструкция будет выглядеть следующим образом:prbs_fb <= to_unsigned(dout(7) xnor dout(5) xnor dout(4) xnor dout(3), 1);
Обратите внимание на использование функции to_unsigned
, которая позволяет преобразовать значение типа std_logic
в unsigned
. В данном случае мы также указываем размер, который равен 1, поскольку вы работаете с одиночным битом.
Заключение
В ходе работы с VHDL необходимо тщательно следить за соответствием типов данных при присвоении значений. Ошибки, подобные вашему случаю, часто возникают из-за использования логических операций в выражениях с несовпадающими типами. Убедитесь, что все типы на левой и правой сторонах присвоения соответствуют друг другу, чтобы избежать подобных проблем в будущем.
Следуя этим рекомендациям, вы сможете исправить ошибку и гарантировать правильный функционал вашего VHDL-кода.