vhdl中的乘加运算符

Multiply and add operators in vhdl

vhdl 中是否有定义 * 和 + 运算符的库?我需要乘法和加法超过 128 位数字。如果是,它们可以合成吗?请帮忙。

是的。例如:

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 包定义了 unsignedsigned 类型。它还为这些定义了运算符。请注意,将 signedunsignedintegersnaturals 混合也是允许的(受一些限制)。例如:

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

...

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

在这些情况下必须小心,以确保不会发生溢出。

并且这些可综合的(我们在实际设计中一直使用它们)。

对于@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

使用整数常量很棘手,因为结果的向量长度未定义。你应该在算术运算之前将它们转换为 signed/unsigned 向量。

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

...

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