【发布时间】: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