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。