在 IEEE.numeric_std 中使用“*”运算符时处理溢出
Dealing with overflows when using the '*' operator in IEEE.numeric_std
我正在 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位的乘法吗?
提前致谢!
您显示的乘法似乎是 整数 的乘法。整数在 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;
我正在 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位的乘法吗?
提前致谢!
您显示的乘法似乎是 整数 的乘法。整数在 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;