#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