这是一个非常简单的问题,但是我还没有能够完成这项工作,也没有在谷歌搜索任何实际有用的东西。
我要做的就是添加两个8位向量并将结果存储在9位向量中。
signal operand1, operand2 : STD_LOGIC_VECTOR(7 downto 0);
signal sum : STD_LOGIC_VECTOR(8 downto 0);
sum <= operand1 + operand2;
但是我得到了警告:
Width mismatch. <sum> has a width of 9 bits but assigned expression is 8-bit wide.
VHDL是否应该有某种内置例程才能知道额外的溢出需要额外的位?
我有这些包裹:
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
也许STD_LOGIC_VECTOR总是签名?如果是这样,那么我需要将它们明确定义为无符号?
答案 0 :(得分:13)
如果您的目标是对信号进行算术运算,那么养成使用更适合的工作类型声明它们的习惯:unsigned
或integer
在您的情况下是不错的选择。
请注意,为了防止溢出,您必须将前导'0'连接到每个操作数,而不是将其连接到结果:
sum <= ('0' & operand1) + ('0' & operand2);
答案 1 :(得分:3)
Use the standard ieee.numeric_std
library.
然后输入unsigned
或signed
类型的数字,并使用方便的调整大小功能:
answer <= resize(operand1, answer'length) + resize(operand2, answer'length);
请记住,很多时候使用整数更容易,不需要转换,算术也不需要你跳过任何调整大小的箍!
答案 2 :(得分:2)
上面的建议是正确的:在实现运算电路时使用 unsigned 或签名类型(请记住在代码中包含 numeric_std 包)。
因为在你的情况下 sum 有一个额外的位(与最大的操作数相比),可以完成以下操作:
1)如果系统未签名:
sum <= ('0' & operand1) + ('0' & operand2);
2)如果系统已签名(需要签名扩展名):
sum <= (operand1(N-1) & operand1) + (operand2(N-1) & operand2);
答案 3 :(得分:-6)
试试这个:在将结果写入较长的向量之前,将结果与'0'向量逻辑组合。对我而言,它有效。
sum <= '0' & (operand1 + operand2);
希望有所帮助:)