VHDL中的无符号加法导致长度不正确的无符号结果



更新@user1155120下面的评论是正确的:

这告诉你错误在某个领域——其他任务在这里

我曾错误地认为乘法运算的作用与加法相同。我的错误。

我正在使用VHDL开发一个基本的ALU。

以下是引发错误的代码:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
use ieee.std_logic_misc.all;
entity alu is
port (
A, B : in unsigned(31 downto 0);
sel  : in unsigned(2 downto 0);
O    : out unsigned(63 downto 0));
end entity alu;
architecture Behavioral of alu is
begin
O <= resize(A, 64) + resize(B, 64) when sel = "000"
-- other assignments here
end Behavioral;

我对VHDL中无符号加法的理解是,和的长度将等于操作数的最长长度。然而,我的代码给出了以下错误:

错误:数组大小不匹配,左数组有64个元素,右数组有128个元素

奇怪。但是,如果我将调整大小的值更改为小于64位,则行为符合我的预期(宽度=操作数的最大宽度)。像这样:

O <= resize(A, 33) + resize(B, 33) when sel = "000"

我得到以下错误:

错误:数组大小不匹配,左数组有64个元素,右数组有33个元素

我最终感到非常困惑。为什么当我只调整到某个值时,输出的宽度会发生变化?

我正在使用Vivado 2020的学生许可证。

您可能有

O <= resize(A, 64) * resize(B, 64) when sel = whatever

在代码的某个地方,当你读到错误时,你把行号弄乱了。当您将添加更改为错误时,这是第一行分析失败,您现在看到的错误。

最新更新