Умножать и добавлять операторы в vhdl

#vhdl #fpga

#vhdl #fpga

Вопрос:

Есть ли в vhdl какая-либо библиотека, которая определяет операторы * и ? Мне нужно умножить и добавить более 128-битных чисел. если да, являются ли они систематизируемыми?. Пожалуйста, помогите.

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

1. ДА. Numeric_std определяет такие операторы с 1993 года и синтезируется примерно столько же времени. Размер вектора не ограничен.

Ответ №1:

ДА. Например:

 library ieee;
use ieee.numeric_std.all;

...

  signal a : signed(31 downto 0); -- 32-bit signed value
  signal b : signed(7 downto 0);  -- 8-bit signed value
  signal c : signed(39 downto 0); -- 40-bit signed value

...

  c <= a * b;  -- Note 'c' is as wide as the sum of a's length and b's length
  

numeric_std Пакет определяет unsigned и signed вводит типы. Он также определяет операторы для них. Примечание также допустимо (с некоторыми ограничениями) смешивать signed and unsigned с integers and naturals . Например:

   signal a : signed(31 downto 0);
  signal b : signed(31 downto 0);

...

  b <= a * 17;  -- Multiply by a constant
  

В этих случаях необходимо соблюдать осторожность, чтобы избежать переполнения.

И они могут быть синтезированы (мы постоянно используем их в реальных проектах).

Ответ №2:

Для решения @PlayDough я бы рекомендовал использовать атрибуты VHDL для определения длины вектора результатов.

    library ieee;
   use ieee.numeric_std.all;

...

  signal a : signed(31 downto 0); -- 32-bit signed value
  signal b : signed(7 downto 0);  -- 8-bit signed value
  signal c : signed(a'length b'length-1 downto 0); -- 40-bit signed value
  signal d : signed(a'range);

...

  c <= a * b;  -- Note 'c' is as wide as the sum of a's length and b's length
  d <= a   b;  -- Note 'd' is as wide as the widest term in addition
  

Использование целочисленных констант сложно, поскольку длина вектора результата не определена. вы должны преобразовать их в векторы со знаком / без знака перед арифметической операцией.

   signal a : signed(31 downto 0);
  signal b : signed(a'length 5 downto 0);

...

  b <= a * to_signed(17, 6);  -- Multiply by a constant