Умножьте и добавьте операторы в VHDL - PullRequest
0 голосов
/ 11 апреля 2019

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

Ответы [ 2 ]

1 голос
/ 21 апреля 2019

Для решения @ 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
1 голос
/ 19 апреля 2019

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

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 и unsigned с integers и naturals.Например:

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

...

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

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

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

...