Ошибка добавления std_logic_vectors

Я хочу иметь простой модуль, который добавляет два std_logic_vectors. Однако при использовании приведенного ниже кода с оператором + он не синтезируется.

library IEEE; 
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;

entity add_module is
        port(
  pr_in1   : in std_logic_vector(31 downto 0);
  pr_in2   : in std_logic_vector(31 downto 0);
  pr_out   : out std_logic_vector(31 downto 0)  
        );
end add_module;

architecture Behavior of add_module is

begin

    pr_out <= pr_in1 + pr_in2;

end architecture Behavior;

Сообщение об ошибке, которое я получаю от XST

Строка 17. + не может иметь таких операндов в этом контексте.

Я скучаю по библиотеке? Если возможно, я не хочу преобразовывать входные данные в натуральные числа.

Большое спасибо


person Mike21    schedule 28.10.2010    source источник


Ответы (4)


Как вы хотите, чтобы компилятор знал, подписаны ваши std_logic_vectors или нет? Реализация сумматора в этих двух случаях не одинакова, поэтому вам нужно явно указать компилятору, что вы хотите, чтобы он сделал ;-)

Примечание. Подсветка синтаксиса VHDL в StackOverflow работает плохо. Скопируйте/вставьте этот код в предпочитаемый вами редактор VHDL, чтобы его было легче читать.

library IEEE; 
use IEEE.std_logic_1164.all;
-- use IEEE.std_logic_arith.all; -- don't use this
use IEEE.numeric_std.all; -- use that, it's a better coding guideline

-- Also, never ever use IEEE.std_unsigned.all or IEEE.std_signed.all, these
-- are the worst libraries ever. They automatically cast all your vectors
-- to signed or unsigned. Talk about maintainability and strong typed language...

entity add_module is
  port(
    pr_in1   : in std_logic_vector(31 downto 0);
    pr_in2   : in std_logic_vector(31 downto 0);
    pr_out   : out std_logic_vector(31 downto 0)  
  );
end add_module;

architecture Behavior of add_module is
begin

  -- Here, you first need to cast your input vectors to signed or unsigned 
  -- (according to your needs). Then, you will be allowed to add them.
  -- The result will be a signed or unsigned vector, so you won't be able
  -- to assign it directly to your output vector. You first need to cast
  -- the result to std_logic_vector.

  -- This is the safest and best way to do a computation in VHDL.

  pr_out <= std_logic_vector(unsigned(pr_in1) + unsigned(pr_in2));

end architecture Behavior;
person Aurelien Ribon    schedule 28.10.2010

Не используйте std_logic_arith — я написал об этом (по адресу какая-то длина :).

Используйте numeric_std — и используйте правильный тип для ваших портов объектов. Если вы занимаетесь арифметикой, используйте числовые типы (либо целые числа, либо (без)знаковые векторы, в зависимости от обстоятельств). Они прекрасно синтезируются.

std_logic_vector хороши для

  • когда вам не нужны числовые значения (набор битов управления, некоторые биты случайных данных)
  • когда вы не знаете о типе ввода (скажем, сумматор, который может работать как с числами со знаком, так и с числами без знака на основе контрольного флага).
person Martin Thompson    schedule 02.11.2010
comment
Я рекомендую проверить ссылку Мартина. - person George; 11.11.2010

Хороший совет от @Aurelien по использованию numeric_std.

Имейте в виду, что добавление двух 32-битных значений может привести к 33-битному значению и решить, как вы хотите обрабатывать переполнение.

person George    schedule 28.10.2010

Простой способ решить эту ошибку:
Добавьте библиотеку unsign,
После этого ваш код начнет работать.

Использовать

ieee.std_logic_unsigned.all;
pr_out <= pr_in1 + pr_in2;
person Josef Polin    schedule 21.09.2016
comment
как сказал @Martin Thompson, использование этой библиотеки не рекомендуется. - person grorel; 19.02.2018
comment
Вы можете объяснить? - person Josef Polin; 20.02.2018
comment
Все есть в ссылке в ответе Мартина Томпсона. std_logic_arith``std_logic_unsigned и std_logic_signed — нестандартные библиотеки, разработанные Synopsis. numeric_std — стандартная библиотека. - person grorel; 21.02.2018
comment
Кроме того, мои 2 цента по темам: использование numeric_std предотвращает несколько простых ошибок при написании кода из-за использования типов signed и unsigned вместо общего std_logic_vector при работе с числами. - person grorel; 21.02.2018