我正在测试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位的乘法吗?
提前感谢!
答案 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;