реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Мультиплексирование шины и клока, Альтера, ТаймКвест
novartis
сообщение Apr 17 2014, 09:57
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 375
Регистрация: 9-10-09
Из: Свердловский регион
Пользователь №: 52 845



Здравствуйте.
В проекте под Альтеру в Квартусе имеется память. К этой памяти я хочу обращаться в разные моменты времени разными модулями на разных частотах.
На частоте 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 выдает такие картинки:

Прикрепленное изображение


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

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






Go to the top of the page
 
+Quote Post
iosifk
сообщение Apr 17 2014, 10:07
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



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


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


Беда в том, что Вы применяете разные частоты в проекте. Сделайте единую, насколько это возможно, тактовую. А для всех блоков используйте сигнал enable.


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
Maverick
сообщение Apr 17 2014, 10:35
Сообщение #3


я только учусь...
******

Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839



Цитата(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 выдает такие картинки:

Прикрепленное изображение


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

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

Сделайте синхронизацию доступа к памяти через фифо.


--------------------
If it doesn't work in simulation, it won't work on the board.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post
Bad0512
сообщение Apr 17 2014, 11:03
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 802
Регистрация: 11-05-07
Из: Томск
Пользователь №: 27 650



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

Ваша "беда" называется "gated clock" - абсолютное зло, которое надо выжигать нещадно.
Бороться с этим можно с помощью (как уже выше заметили) CDC элементов таких как фифошки, двухпортовая память
и т.п.
Вообще клоки мультиплексировать в ПЛИС крайне не рекомендуется. В крайних случаях (когда мультиплексирование неизбежно)
используют спец. примтивы для этого (например BUFG_MUX у Ксайлинкса).
Go to the top of the page
 
+Quote Post
_Anatoliy
сообщение Apr 17 2014, 11:17
Сообщение #5


Утомлённый солнцем
******

Группа: Свой
Сообщений: 2 646
Регистрация: 15-07-06
Из: г.Донецк ДНР
Пользователь №: 18 832



Для Альтеры это altclkctrl.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 04:32
Рейтинг@Mail.ru


Страница сгенерированна за 0.01399 секунд с 7
ELECTRONIX ©2004-2016