【问题标题】:Unsigned addition in VHDL resulting in incorrect length unsigned resultVHDL 中的无符号加法导致长度不正确的无符号结果
【发布时间】:2021-05-27 03:37:48
【问题描述】:

更新 @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 的学生许可证。

【问题讨论】:

  • 提供一个minimal reproducible example,这里是完整的条件信号赋值语句,而不是波浪形的注释。通过在条件信号赋值语句中添加语句结束分号,您的代码分析(编译)详细说明(链接和加载)并成功模拟。 (这告诉您错误在-- other assignments here 的某个地方,请提供完整且完整的错误消息。)
  • ERROR: Array sizes do not match, left array has 64 elements, right array has 128 elements 条件选择值 resize(A, 64) * resize(B, 64) 而不是 A * B 会发生这种情况。
  • 请提供minimal reproducible example。注意O 的信号分配是一个完整的语句。如果没有语法正确和语义上的错误,就无法复制您的问题。要进行故障排除,您可以一次注释掉条件信号分配中的其他替代方案,如果这不指向哪一个,一次两个,...虽然 DonFusili 基于我随后删除的评论的回答很可能本质上是正确(但可能是替代而不是独立作业)它不是基于您的读者可以在您的问题中看到的内容。
  • 问答旨在让未来读者遇到相同或相似的问题。当您的问题不允许重复问题时,就没有能力向他们学习。 Stack Overflow 的目的是创建一个问答库,在发现有用时通过投票进行验证。重点是复制结果。

标签: arrays vhdl unsigned hdl vivado


【解决方案1】:

你可能有

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

在您的代码中的某处较低的行,当您阅读错误时您弄乱了行号。当您将添加更改为错误时,第一行分析就会失败,您会得到现在看到的错误。

【讨论】:

  • 不是基于事实的答案被称为“猜测”。也许这个问题不应该像现在写的那样回答。
猜你喜欢
  • 2013-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-08
  • 2012-04-19
  • 2017-08-25
相关资源
最近更新 更多