VHDL中生成的非推荐闩锁

VHDL中生成的非推荐闩锁,vhdl,Vhdl,作为一个学校项目的一部分,我们在做遗传学算法,我正在用VHDL编写一个叫做“交叉核心”的东西。该内核应该接收两个64位输入“父级”,两个输出“子级”应该包含两个输入的部分 此交叉的起始点基于输入随机数的值,其中6位值确定交叉起始位置的位号 例如,如果随机_数的值为7(以10为基数),且一个上的输入仅为0,另一个上的输入仅为1,则输出应如下所示: 000…0001111111和111…11100000000 (交叉从第7位开始) 这是VHDL代码: library IEEE; use IEEE.S

作为一个学校项目的一部分,我们在做遗传学算法,我正在用VHDL编写一个叫做“交叉核心”的东西。该内核应该接收两个64位输入“父级”,两个输出“子级”应该包含两个输入的部分

此交叉的起始点基于输入随机数的值,其中6位值确定交叉起始位置的位号

例如,如果随机_数的值为7(以10为基数),且一个上的输入仅为0,另一个上的输入仅为1,则输出应如下所示:

000…0001111111和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;
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
使用IEEE.NUMERIC_STD.ALL;
实体交叉_核心_分割为
一般的(
N:整数:=64;
R:整数:=6
);
港口(
随机数:在标准逻辑向量中(R-1向下至0);
parent1:in标准逻辑向量(N-1向下到0);
parent2:in标准逻辑向量(N-1到0);
child1:out标准逻辑向量(N-1向下到0);
child2:out标准逻辑向量(N-1到0)
);
端跨接(核心)(分裂);;
交叉_核心_分割的架构是
信号分割:整数:=0;
开始

split此代码不适合合成:子向量的长度不应变化,这可能是锁存的原因。 对我来说,最好的解决方案是从随机值创建一个掩码:您可以通过多种方式来实现(通常是二进制到温度计的转换)。例如(这不是最佳方案):

过程(随机数)
开始
对于0到63循环中的k

如果查看RTL查看器,可能会显示编译器对代码的解释。
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
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);