Ошибка VHDL, беззнаковый с левой стороны, беззнаковый и оператор с правой стороны.

Вопрос или проблема

Это вызывает такую ошибку (компиляция с -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);

Причины ошибки

  1. Типы данных на левой (LHS) и правой (RHS) сторонах: Ваша ошибка заключена в том, что вы пытаетесь присвоить результат логической операции xnor, которая по своей природе возвращает тип std_logic в переменной типа unsigned. В этом случае возникает несоответствие типов данных.

  2. Упаковка в агрегат: Сообщение об ошибке в вашем коде указывает на то, что выражение с использованием оператора xnor рассматривается как агрегатное выражение. Это связано с тем, что вы использовали несколько логических операторов в цепочке, и компилятор интерпретирует их как попытку создать множество значений. Поскольку prbs_fb определён как unsigned(0 downto 0), он ожидает значение, которое может соответствовать типу unsigned, но выражение возвращает std_logic, вызывая конфликт.

Решение проблемы

Чтобы устранить ошибку, необходимо обеспечить соответствие типов данных. Вот несколько шагов, которые можно предпринять:

  1. Измените тип переменной:
    Один из наиболее простых способов — изменить тип сигнала prbs_fb на std_logic, что позволит избавиться от конфликтов типизации. Это один из вариантов, который вы уже использовали:

    signal prbs_fb : std_logic;
  2. Объединив типы данных:
    Если вы хотите оставить 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-кода.

Оцените материал
Добавить комментарий

Капча загружается...