Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Мультиплексирование шины и клока, Альтера, ТаймКвест
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
novartis
Здравствуйте.
В проекте под Альтеру в Квартусе имеется память. К этой памяти я хочу обращаться в разные моменты времени разными модулями на разных частотах.
На частоте 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;



В 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 выдает такие картинки:
Нажмите для просмотра прикрепленного файла

То есть данные приходят раньше, чем они требуются.

Как победить эту беду? Это вообще беда?






iosifk
Цитата(novartis @ Apr 17 2014, 13:57) *
Здравствуйте.
В проекте под Альтеру в Квартусе имеется память. К этой памяти я хочу обращаться в разные моменты времени разными модулями на разных частотах.
На частоте clk = 50МГц - хочу читать эту память Ниосом, на частоте clk_30MHz = 30МГц хочу работать с памятью модулем 1, на частоте clk_high = 100МГц хочу работать с памятью модулем 2.


Как победить эту беду? Это вообще беда?


Беда в том, что Вы применяете разные частоты в проекте. Сделайте единую, насколько это возможно, тактовую. А для всех блоков используйте сигнал enable.
Maverick
Цитата(novartis @ Apr 17 2014, 12:57) *
Здравствуйте.
В проекте под Альтеру в Квартусе имеется память. К этой памяти я хочу обращаться в разные моменты времени разными модулями на разных частотах.
На частоте 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;



В 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 выдает такие картинки:
Нажмите для просмотра прикрепленного файла

То есть данные приходят раньше, чем они требуются.

Как победить эту беду? Это вообще беда?

Сделайте синхронизацию доступа к памяти через фифо.
Bad0512
Цитата(Maverick @ Apr 17 2014, 17:35) *
Сделайте синхронизацию доступа к памяти через фифо.

Ваша "беда" называется "gated clock" - абсолютное зло, которое надо выжигать нещадно.
Бороться с этим можно с помощью (как уже выше заметили) CDC элементов таких как фифошки, двухпортовая память
и т.п.
Вообще клоки мультиплексировать в ПЛИС крайне не рекомендуется. В крайних случаях (когда мультиплексирование неизбежно)
используют спец. примтивы для этого (например BUFG_MUX у Ксайлинкса).
_Anatoliy
Для Альтеры это altclkctrl.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.