В Artix-7 одна LUT - это 6-битный вход и 1-битный выход. Предположительно, любую функцию с 6-битным входом и 1-битным выходом я могу реализовать, используя только одну LUT.
Однако, когда я синтезирую следующий код, я получаю отчет, в котором говорится: 7 LUT были использованы. Мне интересно, почему?
Я использую Vivado 2019.2.
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.numeric_std_unsigned.all;
entity test is
port(
d_in : in std_logic_vector(5 downto 0);
d_out : out std_logic
);
end entity test;
architecture RTL of test is
type t_int_array is array (natural range<>) of integer;
constant primes : t_int_array(0 to 17) := (2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61);
begin
process(d_in)
begin
d_out <= '0';
for i in 0 to 17 loop
if (d_in(5 downto 4) * d_in(3 downto 0) - d_in(0) = primes(i)) then
d_out <= '1';
end if;
end loop;
end process;
end architecture RTL;
Вот синтезированная схема c.
Схемати c
Когда я изменяю код, чтобы просто пропустить одно вычитание:
if (d_in(5 downto 4) * d_in(3 downto 0) = primes(i)) then
d_out <= '1';
end if;
и синтезировать, я получаю ожидаемую 1 LUT использовано.