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

vhdl表达式有2个元素,但必须有3个元素,vhdl,Vhdl,Quartus一直告诉我“结果:=to_无符号(1,1)+无符号(X)+无符号(Y);”行上的“表达式有2个元素,但必须有3个元素”。 下面是我构建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,

Quartus一直告诉我“结果:=to_无符号(1,1)+无符号(X)+无符号(Y);”行上的“表达式有2个元素,但必须有3个元素”。 下面是我构建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;
ieee库;
使用ieee.std_logic_1164.all;
使用ieee.numeric_std.all;
实体cla2是
港口(
十、 Y:标准逻辑向量(1到0);
Cin:标准逻辑;
S、 BP,BG:输出标准逻辑向量(1到0);
Cout:out标准逻辑
);
末端cla2;
cla2的体系结构行为是
开始
过程(X、Y、Cin)
变量结果:无符号(2到0);
开始
如果(Cin='1'),则
结果:=to_无符号(1,1)+无符号(X)+无符号(Y);
其他的
结果:=无符号(X)+无符号(Y);
如果结束;

S如果显示完整的错误信息,则会沿着

错误(10344):cla2处的VHDL表达式错误。vhd(23):表达式有2个元素,但必须有3个元素

根据实际文件名变化,并假设已显示整个文件

第23行是:

    result:= to_unsigned(1, 1) + unsigned(X) + unsigned(Y);
其中,我们在赋值的右侧看到一个表达式,该表达式包括在类型转换为无符号类型后,将一位1、X和Y加在一起

如果我们看看这些声明

    X, Y : in std_logic_vector(1 downto 0);

我们看到结果有3个元素,而表达式有2个元素。(请参阅IEEE库中的package numeric_std,“+”[unsigned,unsigned return unsigned]返回最长操作数长度的值

要求右侧的表达式对于目标
结果
的每个元素都有一个元素。请参见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或使用更高优先级的串联运算符“&”来暗示指定表达式宽度:

    result:= unsigned('0' & X) + unsigned(Y);
最左边的表达式定义结果宽度


这不是关于合成,而是关于VHDL语义,您可以通过模拟演示在何处也会报告这些错误。

如果显示完整的错误消息,将按照

错误(10344):cla2处的VHDL表达式错误。vhd(23):表达式有2个元素,但必须有3个元素

根据实际文件名变化,并假设已显示整个文件

第23行是:

    result:= to_unsigned(1, 1) + unsigned(X) + unsigned(Y);
其中,我们在赋值的右侧看到一个表达式,该表达式包括在类型转换为无符号类型后,将一位1、X和Y加在一起

如果我们看看这些声明

    X, Y : in std_logic_vector(1 downto 0);

我们看到结果有3个元素,而表达式有2个元素。(请参阅IEEE库中的软件包numeric_std,“+”[unsigned,unsigned return unsigned]返回最长操作数的长度值

要求右侧的表达式对于目标
结果
的每个元素都有一个元素。请参见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或使用更高优先级的串联运算符“&”来暗示指定表达式宽度:

    result:= unsigned('0' & X) + unsigned(Y);
最左边的表达式定义结果宽度

这不是关于合成,而是关于VHDL语义,您可以通过模拟演示,在哪里也会报告这些错误