在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;
那有什么用呢?在任何需要代码一致性的地方,我都必须在任何地方使用二进制吗?
答案 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));