vhdl表达式有2个元素,但必须有3个元素

时间:2018-02-04 21:27:15

标签: vhdl

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;

1 个答案:

答案 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语义的综合,你可以通过模拟证明这些错误也会被报告。