VHDL - 将两个8位向量添加到9位向量中

时间:2013-11-26 17:24:26

标签: overflow vhdl

这是一个非常简单的问题,但是我还没有能够完成这项工作,也没有在谷歌搜索任何实际有用的东西。

我要做的就是添加两个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总是签名?如果是这样,那么我需要将它们明确定义为无符号?

4 个答案:

答案 0 :(得分:13)

如果您的目标是对信号进行算术运算,那么养成使用更适合的工作类型声明它们的习惯:unsignedinteger在您的情况下是不错的选择。

请注意,为了防止溢出,您必须将前导'0'连接到每个操作数,而不是将其连接到结果:

sum <= ('0' & operand1) + ('0' & operand2);

答案 1 :(得分:3)

Use the standard ieee.numeric_std library.

然后输入unsignedsigned类型的数字,并使用方便的调整大小功能:

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);

希望有所帮助:)