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