作为我们进行遗传算法的学校项目的一部分,我正在编程称为"交叉核心"在VHDL中。这个核心应该接收两个64位输入"父母"和两个输出"孩子"应包含来自两个输入的部分。
此交叉的起点基于输入random_number的值,其中6位值确定了开始交叉的位置的位数。
例如,如果来自random_number的值是7(在基数10中),并且输入在一个上只有0,而在另一个上只有1,那么输出应该是像这样:
000 ..... 00011111111和111 ..... 11100000000
(交叉点从第7位开始)
这是VHDL代码:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity crossover_core_split is
generic (
N : integer := 64;
R : integer := 6
);
port (
random_number : in STD_LOGIC_VECTOR(R-1 downto 0);
parent1 : in STD_LOGIC_VECTOR(N-1 downto 0);
parent2 : in STD_LOGIC_VECTOR(N-1 downto 0);
child1 : out STD_LOGIC_VECTOR(N-1 downto 0);
child2 : out STD_LOGIC_VECTOR(N-1 downto 0)
);
end crossover_core_split;
architecture Behavioral of crossover_core_split is
signal split : INTEGER := 0;
begin
split <= TO_INTEGER(UNSIGNED(random_number));
child1 <= parent1(N-1 downto split+1) & parent2(split downto 0);
child2 <= parent2(N-1 downto split+1) & parent1(split downto 0);
end Behavioral;
代码在Xilinx ISE Project Navigator 12.4中编写和编译。 我在ModelSim中对此进行了测试,并验证了它的工作原理。但是,锁存器存在问题,我收到了这些警告:
WARNING:Xst:737 - Found 1-bit latch for signal <child1<62>>. Latches may be generated from incomplete case or if statements. We do not recommend the use of latches in FPGA/CPLD designs, as they may lead to timing problems.
WARNING:Xst:737 - Found 1-bit latch for signal <child1<61>>. Latches may be generated from incomplete case or if statements. We do not recommend the use of latches in FPGA/CPLD designs, as they may lead to timing problems.
ETC ETC ETC...
WARNING:Xst:1336 - (*) More than 100% of Device resources are used
总共生成128个锁存器,但不推荐使用它们。 关于如何避免锁存或至少减少它们的任何建议?
答案 0 :(得分:3)
这段代码不太适合合成:子矢量的长度不应该变化,也许这就是锁存器的原因。 对我来说,最好的解决方案是从随机值创建一个掩码:你可以用很多方式做到这一点(它通常是二进制到测温转换)。例如(它不是最佳的):
process(random_number)
begin
for k in 0 to 63 loop
if k <= to_integer(unsigned(random_number)) then
mask(k) <= '1';
else
mask(k) <= '0';
end if;
end loop;
end process;
然后一旦你有掩码值,你可以简单地写:
child1 <= (mask and parent1) or ((not mask) and parent2);
child2 <= (mask and parent2) or ((not mask) and parent1);