首页 > 解决方案 > 不能将实数和整数相乘

问题描述

我在测试台中使用此代码,它按预期工作:

std_logic_vector(to_unsigned(integer(0.603205*(2**16)),16))

我想用同一文件中定义的函数替换它:

function convert_mult(mult : real) return std_logic_vector is
begin       
    
    return std_logic_vector(to_unsigned(integer(mult*(2**16)),16));
    
end function;

并这样称呼它:

convert_mult(0.603205)

该函数编译失败,并显示“无法找到带有“[REAL, UNIVERSAL_INTEGER]”签名的操作数的“*”运算符。”

我不知道这有什么问题,我认为支持真正的 * 整数?我应该使用另一种类型吗?

标签: vhdl

解决方案


TL;博士

您可以混合使用像 in 这样的实数和整数文字,0.603205*(2**16)但不能混合使用像 in 这样的非文字实数和整数文字mult*(2**16)。正如 Matthew 所指出的,real它们integer密切相关的类型,因此转换很容易。利用:

return std_logic_vector(to_unsigned(integer(mult*real(2**16)),16));

而且,顺便说一句,你写的我认为支持真正的 * 整数。嗯,你错了。不支持。您必须使用显式转换...除了文字。

细节

为什么它适用于文字而不适用于非文字?根据 VHDL 2008 语言参考手册(IEEE Std 1076-2008universal_integeruniversal_real分别是整数和浮点文字的类型。

0.603205是一个universal_real

2**16有点复杂,因为它是一个涉及整数文字 ( universal_integers) 的表达式。LRM 的9.3.6节类型转换解释了universal_integer在上下文需要时可以自动转换为另一种整数类型。我不确切知道发生了什么自动转换,因为 LRM 不太容易遵循这一点,但我怀疑它16会自动转换为integer第 9.3.6 节的相应规则,它允许使用universal_integer ** integerpackage 的操作STANDARD数返回 a universal_integer(参见第16.3 节 Package STANDARD,其中所有这些运算符都以其函数形式定义)。

最后,第 9.5 节通用表达式明确指出*运算符定义在universal_integer * universal_realand上universal_real * universal_integer。两者都返回一个universal_real.

注意:还有一个universal_real / universal_integer返回universal_real但没有universal_integer / universal_real


推荐阅读