В проекте под Альтеру в Квартусе имеется память. К этой памяти я хочу обращаться в разные моменты времени разными модулями на разных частотах.
На частоте clk = 50МГц - хочу читать эту память Ниосом, на частоте clk_30MHz = 30МГц хочу работать с памятью модулем 1, на частоте clk_high = 100МГц хочу работать с памятью модулем 2.
Код приблизительно такой:
Код
ram_frame0_address <= ram_frame0_address_avs when state = ST_NULL
else mp_o_ram_frame_address when state = ST_MP_BUSY
else sv_o_frame_address when state = ST_SV_BUSY
else (others => '0');
ram_frame_clk <= clk when state = ST_NULL else clk_30MHz when state = ST_MP_BUSY else clk_high;
{по аналогии мультиплексирую другие сигналы для памяти}
...
process (clk)
begin
if (rising_edge(clk)) then
if (state = ST_NULL) then
...
if (...) then
state <= ST_MP_BUSY;
end if;
elsif (state = ST_MP_BUSY) then
...
if (...) then
state <= ST_SV_BUSY;
end if;
elsif (state = ST_SV_BUSY) then
...
if (...) then
state <= ST_NULL;
end if;
end if;
end if;
end process;
else mp_o_ram_frame_address when state = ST_MP_BUSY
else sv_o_frame_address when state = ST_SV_BUSY
else (others => '0');
ram_frame_clk <= clk when state = ST_NULL else clk_30MHz when state = ST_MP_BUSY else clk_high;
{по аналогии мультиплексирую другие сигналы для памяти}
...
process (clk)
begin
if (rising_edge(clk)) then
if (state = ST_NULL) then
...
if (...) then
state <= ST_MP_BUSY;
end if;
elsif (state = ST_MP_BUSY) then
...
if (...) then
state <= ST_SV_BUSY;
end if;
elsif (state = ST_SV_BUSY) then
...
if (...) then
state <= ST_NULL;
end if;
end if;
end if;
end process;
В sdc файле прописал, чтобы ТаймКвест не анализировал пути между этими тремя клоками:
set_clock_groups -exclusive -group {clk}
set_clock_groups -exclusive -group {clk_30MHz}
set_clock_groups -exclusive -group {clk_high}
После компиляции смотрю в ТаймКвест.
Fmax
78.11 MHz 78.11 MHz clk
112.46 MHz 112.46 MHz clk_30MHz
126.77 MHz 126.77 MHz clk_high
Требуемые частоты достигнуты, это радует.
А вот Failling Edge Paths выдает такие картинки:
Нажмите для просмотра прикрепленного файла
То есть данные приходят раньше, чем они требуются.
Как победить эту беду? Это вообще беда?