Arrays can';t确定运算符的定义“&引用-&引用&引用;?

Arrays can';t确定运算符的定义“&引用-&引用&引用;?,arrays,vhdl,Arrays,Vhdl,我遇到错误:无法确定以下代码的运算符“-”的定义。我不确定如何访问数组中每个无符号的独立位。怎么了 library IEEE; use IEEE.STD_LOGIC_1164.ALL; use Ieee.numeric_std.all; use work.genetica_type.all; entity binario_fitness is Port ( clk : in std_logic; individuos: in genetica; adaptacao: out fitn

我遇到错误:无法确定以下代码的运算符“-”的定义。我不确定如何访问数组中每个无符号的独立位。怎么了

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use Ieee.numeric_std.all;

use work.genetica_type.all;

entity binario_fitness is
Port ( 
 clk : in std_logic;
 individuos: in genetica;
 adaptacao: out fitness;
 somafitness: out unsigned (7 downto 0)
 );
 end binario_fitness;


 architecture Behavioral of binario_fitness is
 begin



 process (clk)
 begin
 If (clk 'event and clk = '1') then

 for x in 0 to 49 loop

 adaptacao(x) <= individuos(x)(0)-individuos(x)(1) +individuos(x)(2)-       individuos(x)(3)+individuos(x)(4)- individuos(x)(5)+individuos(x)(6)-individuos(x)(7);
somafitness<=(others=>'0'); 
end loop;

end if  ;

end process;

end Behavioral;

您正在尝试对类型
std\u逻辑执行算术运算

type genetica is array(0 to 49) of unsigned(7 downto 0)
...
individuos: in genetica;
...
adaptacao(x) <= individuos(x)(0)-individuos(x)(1)...
这将起作用,因为一位切片
individualduos(x)(y向下到y)
将保留切片向量的类型,即在这种情况下
无符号

根据数字标准vhd的定义:

type UNSIGNED is array (NATURAL range <>) of STD_LOGIC;
类型UNSIGNED是STD_逻辑的数组(自然范围);

您正在尝试对类型
标准逻辑执行算术运算

type genetica is array(0 to 49) of unsigned(7 downto 0)
...
individuos: in genetica;
...
adaptacao(x) <= individuos(x)(0)-individuos(x)(1)...
这将起作用,因为一位切片
individualduos(x)(y向下到y)
将保留切片向量的类型,即在这种情况下
无符号

根据数字标准vhd的定义:

type UNSIGNED is array (NATURAL range <>) of STD_LOGIC;
类型UNSIGNED是STD_逻辑的数组(自然范围);

长度也必须处理,因为
adapteacao(x)
的结果是类型
无符号(2到0)
,因此长度为3,但是
individuos(x)(0到0)
的长度只有1,这也是
-
+
运算符之后的结果。因此,在计算开始时,在整个操作过程中预先设置
(“00”和…
)以对3位
无符号
进行操作,如
(“00”和individualduos(x)(0到0))-…
,由此,最终长度将与
adaptacao(x)的长度相匹配
,累加被处理。@Morten:我用您的更正修复了不受限制的行。除了在“00”前面加上前缀外,还可以使用resize()函数,它也是数字标准包的一部分。
“00”&individuos(x)(0到0)
将变成
resize(individuos(x)(0到0),3)
。使用
调整大小
也是一个好主意,因为它需要显式的括号,因此说
个体(x)(0到0)
调整大小,如果
“00”和…
是在没有偏执的情况下预先设置的,则情况并非如此,因为
-
更具约束力(更高的优先级),所以只需预先设置
“00”和
将应用于整个结果,而不是
individualduos(x)(0向下到0)
参数,这样就不会在额外的位中发生累加,这可能是有意的。最后,使用
length
属性会很好,比如
resize(individualduos(x)(0向下到0),adapteacao(x)length)
。也不太清楚按位减法的结果应该是什么,这听起来像NAND。还必须处理长度,因为
adaptacao(x)
中的结果是类型
无符号(2到0)
,因此长度为3,但
individualduos(x)(0到0)
的长度仅为1,这也是
-
+
运算符之后的结果。因此,在计算开始时,在整个操作过程中预先设置
(“00”和…
)以对3位
无符号
进行操作,如
(“00”)和individuos(x)(0到0))-…
,最终长度将与
Adapticao(x)
的长度相匹配,并处理累加。@Morten:我用您的更正修复了不受限制的行。除了预加“00”外,还可以使用resize()函数,它也是数值_std包的一部分。
“00”和individuos(x)(0到0)
将变成
resize(individualduos(x)(0向下到0),3)
。使用
resize
也是一个好主意,因为它需要显式的括号,因此表示
individualduos(x)(0向下到0)
已调整大小,如果
“00“&…
是不带偏执的前缀,因为
-
&
更具约束力(优先级更高),所以只需将
“00”和
前缀应用于整个结果,而不是
个体(x)(0到0)
参数,这样就不会在额外的位中发生累加,这可能是目的所在。最后,使用
length
属性会很好,比如
resize(individualduos(x)(0到0),adaptacao(x)length)
。按位减法的结果应该是什么也不是特别清楚,这听起来像NAND。