【问题标题】:VHDL - Adding two 8-bit vectors into a 9-bit vectorVHDL - 将两个 8 位向量添加到 9 位向量中
【发布时间】:2013-11-26 17:24:26
【问题描述】:

这是一个非常简单的问题,但我还没有完成这项工作,也没有在谷歌或这里进行任何搜索发现任何真正有用的东西。

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

【问题讨论】:

    标签: overflow vhdl


    【解决方案1】:

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

    请注意,为防止溢出,您必须将前导“0”连接到每个操作数,而不是对结果执行此操作:

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

    【讨论】:

    • 对于也适用于 SIGNED 类型的通用解决方案,您可以使用 numeric_std 库中的 RESIZE(例如 sum
    • @sbell +1 获取通用解决方案!
    【解决方案2】:

    Use the standard ieee.numeric_std library.

    然后将您的数字设为unsignedsigned 类型,并使用方便的调整大小功能:

    answer <= resize(operand1, answer'length) + resize(operand2, answer'length);
    

    请记住,很多时候只使用整数要容易得多,不需要转换,而且算术不需要您跳过任何调整大小的环节!

    【讨论】:

      【解决方案3】:

      上面的建议是正确的:在实现算术电路时使用 unsignedsigned 类型(记得在代码中包含 numeric_std 包)。

      由于您的情况 sum 有一个额外的位(与最大的操作数相比),因此可以执行以下操作:

      1) 如果系统是无符号的:

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

      2) 如果系统是签名的(需要签名扩展):

      sum <= (operand1(N-1) & operand1) + (operand2(N-1) & operand2);
      

      【讨论】:

      • 你也可以使用整数(你不必使用向量类型),它们也可以更快地模拟。
      • 出于兴趣...你是这个佩德罗尼吗:books.google.co.uk/books/about/…
      【解决方案4】:

      试试这个:在将结果写入更长的向量之前,将结果与“0”向量进行逻辑组合。对我来说它有效。

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

      希望有帮助:)

      【讨论】:

      • 之前我试过sum &lt;= "0" &amp; operand1 + "0" &amp; operand2,但这成功了!谢谢。如果值溢出到 9 位,VHDL 会做什么仍然让我感到困惑,但至少代码没有抱怨
      • 这段代码有一个问题:只要总和大于 255,它就会溢出并给出错误的结果。为防止溢出,您必须将前导 '0' 连接到每个操作数,而不是这样做结果:sum &lt;= ('0' &amp; operand1) + ('0' &amp; operand2);
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-27
      • 2017-08-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多