遺伝学アルゴリズムを行う学校のプロジェクトの一環として、VHDL で「クロスオーバー コア」と呼ばれるものをプログラミングしています。このコアは、2 つの 64 ビット入力「親」を受け取り、2 つの出力「子」には両方の入力からの部分が含まれている必要があります。
このクロスオーバーの開始点は、入力 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 個のラッチが生成されますが、推奨されていないようです。ラッチを回避する方法、または少なくともそれらを減らす方法に関するアドバイスはありますか?