用VHDL生成的非推荐锁存器

时间:2013-11-06 16:02:50

标签: vhdl

作为我们进行遗传算法的学校项目的一部分,我正在编程称为"交叉核心"在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个锁存器,但不推荐使用它们。 关于如何避免锁存或至少减少它们的任何建议?

1 个答案:

答案 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);