Quartus一直告诉我"表达式有2个元素,但必须有3个元素"在"结果:= to_unsigned(1,1)+无符号(X)+无符号(Y);"线。 下面是我建立CLA的代码
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity cla2 is
port(
X, Y : in std_logic_vector(1 downto 0);
Cin : in std_logic;
S, BP, BG : out std_logic_vector(1 downto 0);
Cout : out std_logic
);
end cla2;
architecture Behavior of cla2 is
begin
process(X, Y, Cin)
variable result : unsigned (2 downto 0);
begin
if(Cin = '1') then
result:= to_unsigned(1, 1) + unsigned(X) + unsigned(Y);
else
result:= unsigned(X) + unsigned(Y);
end if;
S<= std_logic_vector(result(1 downto 0));
Cout<= result(2);
BP<=X or Y;
BG<=X and Y;
end process;
end Behavior;
答案 0 :(得分:3)
如果显示完整的错误消息将与
一致错误(10344):cla2.vhd(23)处的VHDL表达式错误:表达式有2个元素,但必须有3个元素
因实际文件名而异,并假设您已显示整个文件。
第23行是:
result:= to_unsigned(1, 1) + unsigned(X) + unsigned(Y);
我们在赋值的右侧看到一个表达式,包括在类型转换后将一位1和X和Y一起添加到unsigned类型。
如果我们看一下声明
X, Y : in std_logic_vector(1 downto 0);
和
variable result : unsigned (2 downto 0);
我们看到结果有3个元素,而表达式有2.(参见库IEEE中的包numeric_std,“+”[unsigned,unsigned return unsigned]返回最长操作数长度的值。
要求右侧的表达式具有目标result
的每个元素的元素。参见IEEE Std 1076-2008 10.6变量赋值语句,10.6.2.2复合变量赋值:
如果赋值语句的目标是表示复合变量(包括切片)的名称,则分配给目标的值将隐式转换为复合变量的子类型;此子类型转换的结果将成为复合变量的新值。
这意味着复合变量的每个元素的新值由匹配元素(见9.2.3)在通过表达式求值获得的相应复合值中指定。子类型转换检查复合变量的每个元素在复合值中是否存在匹配元素,反之亦然。如果此检查失败,则会发生错误。
告诉我们,如果变量赋值的两边都没有相同数量的元素,那就是错误。
我们可以解决这个问题:
result:= to_unsigned(1, 3) + unsigned(X) + unsigned(Y);
通过更改第一个“+”宽度的左操作数,并清除此错误。
但是,另一项任务在第25行也有同样的问题:
result:= unsigned(X) + unsigned(Y);
这需要修复。
修复很容易。我们可以在操作数上使用Resize或使用更高优先级的连接运算符“&amp;”暗示指定表达式宽度:
result:= unsigned('0' & X) + unsigned(Y);
最左边的表达式定义结果宽度。
这不是关于VHDL语义的综合,你可以通过模拟证明这些错误也会被报告。