使用' *'处理溢出时IEEE.numeric_std中的运算符

时间:2016-10-07 10:42:37

标签: vhdl

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

16449 * 4171239345 gives 613432305

我读了numeric_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位的乘法吗?

提前感谢!

1 个答案:

答案 0 :(得分:1)

您显示的乘法似乎乘以整数。 vhdl中的整数限制为32位,通常是签名。所以你的第二个数字太大而无法表示(以十六进制:0xf8a00fb1)。如果没有任何特定的代码示例,我将假设您的模拟器无法正确解释此值。

Numeric_std的unsigned值不限于任何宽度。对每个值使用unsigned类型将避免任何混淆。例如。如果您需要对信号进行此操作,请声明:

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

体:

a <= x"00004041";
b <= x"f8a00fb1";
y <= a*b;