Центральный модуль, включающий себя UART и подготовку данных.
Есть вычислительные модули, которые коннектятся к центральному, их интерфейс:
Код
(
clock : in std_logic;
reset : in std_logic;
data_input : in std_logic_vector(31 downto 0);
data_flag : in std_logic;
done : out std_logic;
data_ready : out std_logic
)
clock : in std_logic;
reset : in std_logic;
data_input : in std_logic_vector(31 downto 0);
data_flag : in std_logic;
done : out std_logic;
data_ready : out std_logic
)
С точки зрения использования ресурсов в плис влезает около 230 таких модулей + центральный.
При 64 модулях все это хорошо живет на 200Мгц, данная частота и является целью. При 128 модулях синтезатор уже выдаёт максимальную частоту 140MHz, что не устраивает.
Причем, PlanAhead показывает, что критические пути - это линии соединения вычислительных модулей с центральным.
Попробовал добавить регистры в эти линии:
Код
signal reset_corebuf : std_logic_vector(NCORES - 1 downto 0);
signal data_input_corebuf : std_logic_vector((NCORES * 32) - 1 downto 0);
signal data_flag_corebuf : std_logic_vector(NCORES - 1 downto 0);
signal done_corebuf : std_logic_vector(NCORES - 1 downto 0);
signal data_ready_corebuf : std_logic_vector(NCORES - 1 downto 0);
process (clk)
begin
if (rising_edge(clk)) then
for i in 0 to NCORES - 1 loop
reset_corebuf(i) <= reset;
data_input_corebuf((i + 1) * 32 - 1 downto i * 32) <= core_data;
data_flag_corebuf(i) <= data_core_flag(i);
core_done(i) <= done_corebuf(i);
data_core_ready(i) <= data_ready_corebuf(i);
end loop;
end if;
end process;
signal data_input_corebuf : std_logic_vector((NCORES * 32) - 1 downto 0);
signal data_flag_corebuf : std_logic_vector(NCORES - 1 downto 0);
signal done_corebuf : std_logic_vector(NCORES - 1 downto 0);
signal data_ready_corebuf : std_logic_vector(NCORES - 1 downto 0);
process (clk)
begin
if (rising_edge(clk)) then
for i in 0 to NCORES - 1 loop
reset_corebuf(i) <= reset;
data_input_corebuf((i + 1) * 32 - 1 downto i * 32) <= core_data;
data_flag_corebuf(i) <= data_core_flag(i);
core_done(i) <= done_corebuf(i);
data_core_ready(i) <= data_ready_corebuf(i);
end loop;
end if;
end process;
И вот эти промежуточные сигналы уже законнектил к вычислительным модулям. Лучше не стало, хотя по логике - должно.
Подскажите пожалуйста, что я делаю не так и куда копать)