为什么有时VHDL中的乘法不能像预期的那样使用整数?

时间:2019-04-07 06:57:40

标签: vhdl

在VHDL中,在进行乘法运算时具有强类型输入,我希望以下语句以14位输出结束:

frame_addr  : out STD_LOGIC_VECTOR(13 downto 0);

...

signal  y_pos       : unsigned(4 downto 0);

...

frame_addr <= std_logic_vector(y_pos * 320);

但是我最终遇到了错误:

expression has 10 elements, but must have 14 elements

这对我毫无意义...因为320应该至少是9位(无符号),10位(是整数),并且与5位信号y_pos相乘时,我希望看到至少14位...

我还有另一段代码可以完美地完成工作:

ram_addr <= std_logic_vector(h_pos + (v_pos * 80))(14 downto 0);

与80的乘法工作正常,没有错误。

所以我尝试了一切,直到14位...而且,按照我的逻辑,乘法似乎没有发生... 所以我最后说了,好吧,如果我只用BINARY进行乘法运算,请告诉我我想要的是什么...

frame_addr <= std_logic_vector(y_pos * "101000000");

编译正常,没有错误... 逻辑开始按我期望的那样工作。

那么为什么会有这种不一致?两者都在相关性的体系结构内,而不是在流程之类的内。 我只是无法绕开为什么会有这些不一致的地方... 两者都使用相同的库:

library ieee;
use ieee.std_logic_1164.ALL;
use ieee.numeric_std.ALL;

那有什么用呢?在任何需要代码一致性的地方,我都必须在任何地方使用二进制吗?

1 个答案:

答案 0 :(得分:0)

由于整数没有按位长度,因此将其转换为与y_pos相同的长度。因此,在您的第一个示例中,Y_pos是5位。因此320也将转换为5位无符号-得到10位结果。对于有符号和无符号的所有算术运算符,此规则都是相同的。

VHDL中的整数没有按位定义,因此需要以某种方式进行转换。编译器无法进行智能大小调整,因此依赖用户正确调整大小。在您的示例中,将320转换为5位显然会截断该值,实际上您最终会得到“ 00000”并警告在仿真过程中会发生这种情况。

这里没有矛盾,“ 101000000”和320是完全不同且无关的类型。无符号不是整数-它是无符号整数的二进制表示。

您可能想对整数文字使用to_unsigned()函数以获取显式大小:

frame_addr <= std_logic_vector(y_pos * to_unsigned(320, 9));