Vhdl 使用'时处理溢出*';IEEE.numeric_标准中的运算符

Vhdl 使用'时处理溢出*';IEEE.numeric_标准中的运算符,vhdl,Vhdl,我正在Xilinx Vivado上测试定制的协处理器IP。当使用*运算符对2个32位向量执行无符号乘法时,我意识到当结果占用超过32位时,它不会反映在更重要的32位中,即更具体地说,高32位都是0,低32位显示其结果部分 16449 * 4171239345 gives 613432305 我读了numeric\u std库,它的内容如下: -- Id: A.15 function "*" (L, R: UNSIGNED) return UNSIGNED; -- Result su

我正在Xilinx Vivado上测试定制的协处理器IP。当使用
*
运算符对2个32位向量执行无符号乘法时,我意识到当结果占用超过32位时,它不会反映在更重要的32位中,即更具体地说,高32位都是0,低32位显示其结果部分

16449 * 4171239345 gives 613432305
我读了
numeric\u std
库,它的内容如下:

  -- Id: A.15
  function "*" (L, R: UNSIGNED) return UNSIGNED;
  -- Result subtype: UNSIGNED((L'LENGTH+R'LENGTH-1) downto 0).
  -- Result: Performs the multiplication operation on two UNSIGNED vectors
  -- that may possibly be of different lengths.
*
运算符是否不适合大于32位的乘法


提前谢谢

显示的乘法似乎是整数乘法。在vhdl中,整数限制为32位,并且通常是有符号的。因此,第二个数字太大,无法表示(十六进制:
0xf8a00fb1
)。如果没有任何特定的代码示例,我将假设即使这个值也不会被模拟器正确解释

无符号的数值不限于任何宽度。对每个值使用
unsigned
类型可以避免任何混淆。例如,如果您需要在信号上执行此操作,请声明:

signal a: unsigned(31 downto 0);
signal b: unsigned(31 downto 0);
signal y: unsigned(63 downto 0);
正文:


a不客气。你可能想在你的问题中添加更多关于你是如何进行乘法运算的细节,这样其他人如果有类似的问题也可以找到。让我们看一个演示这种行为的MCVE。没有理由将ieee.numeric_std.unsigned.“*”
运算符限制为32位。
a <= x"00004041";
b <= x"f8a00fb1";
y <= a*b;