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

 
 
> Передача данных между частотными доменами, как правильно ?
v1vas
сообщение Mar 30 2015, 18:58
Сообщение #1





Группа: Участник
Сообщений: 12
Регистрация: 5-01-07
Пользователь №: 24 120



Virtex 6
Есть два частотных домена, 50 MHz и 200 MHz
Клоки идут с Xilinx'го ClockWizard, утверждается, что они на 100% совпадают по фазе. Я так понимаю это не гарантированная фигня и из-за роутинга мы в некоторых местах плисины можем получить небольшое различие по времени прихода фронта волны ?
Соответственно логика моих рассуждений, раз во фронт медленного клока попадают два фронта быстрого, то во втором фронте быстрого мы можем сэмплить данные с медленного.

Код
constant MAINCLK_SAMPLE_STEP : integer := 1;
signal main_clk_cnt : integer range 0 to 3 := 0;

process (data_clock) --50 MHZ
begin
    if (rising_edge(data_clock)) then
        data_mainclk <= i_data;
        data_ready_mainclk <= i_data_ready;
        o_result <= result_mainclk;
    end if;
end process;

process (clock) --200MHZ
begin
    if (rising_edge(clock)) then
     if (reset = '0') then
    
     if (main_clk_cnt = 3) then main_clk_cnt <= 0; else main_clk_cnt <= main_clk_cnt + 1; end if;

        case SM_STATE is
         when SM_DATA_INPUT_FIRST_1 =>
            if (data_ready_mainclk = '1') and (main_clk_cnt = MAINCLK_SAMPLE_STEP) then
                dinp(63 downto 32) <= data_mainclk;                
                SM_STATE <= SM_DATA_INPUT_FIRST_2;
            end if;

............... и т.д.

Сиё творчество в симуляторе работает нормально.
Насколько вообще правилен такой подход ?
Интуитивно он мне не нравится, чувствую, что тут надо как-то по другому и все законстрейнить, но пока не могу понять как.
Ткните меня пожалуйста, как это нормально сделать ?

Сообщение отредактировал v1vas - Mar 30 2015, 19:43
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Timmy
сообщение Mar 30 2015, 21:14
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 835
Регистрация: 9-08-08
Из: Санкт-Петербург
Пользователь №: 39 515



Цитата(v1vas @ Mar 30 2015, 21:58) *
Virtex 6
Есть два частотных домена, 50 MHz и 200 MHz
Клоки идут с Xilinx'го ClockWizard, утверждается, что они на 100% совпадают по фазе. Я так понимаю это не гарантированная фигня и из-за роутинга мы в некоторых местах плисины можем получить небольшое различие по времени прихода фронта волны ?
Соответственно логика моих рассуждений, раз во фронт медленного клока попадают два фронта быстрого, то во втором фронте быстрого мы можем сэмплить данные с медленного.
Сиё творчество в симуляторе работает нормально.
Насколько вообще правилен такой подход ?
Интуитивно он мне не нравится, чувствую, что тут надо как-то по другому и все законстрейнить, но пока не могу понять как.
Ткните меня пожалуйста, как это нормально сделать ?

В вашем коде неправильно то, что main_clk_cnt не засинхронизирован с медленным клоком, от сброса к сбросу устройство может работать по-разному. Следует перевести медленный клок в логику(например, с помощью двух FF и xor), защёлкнуть его на FF быстрым клоком, выделить фронт, и привязать к этому фронту фазу чтения data_mainclk.
Достаточно, чтобы были правильно оконстрейнены клоки, и не была запрещена проверка путей между data_clock и clock, другие констрейны не нужны.
То, что советует Maverick, тоже в принципе правильно, но для случая синхронных клоков избыточно.
Это я предполагаю, что клоки выходят с одного PLL. Расхождение по фазе между ними тогда невелико, и его допустимость будет проверена при STA.
Go to the top of the page
 
+Quote Post
Maverick
сообщение Mar 30 2015, 21:38
Сообщение #3


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

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



Цитата(Timmy @ Mar 31 2015, 00:14) *
В вашем коде неправильно то, что main_clk_cnt не засинхронизирован с медленным клоком, от сброса к сбросу устройство может работать по-разному. Следует перевести медленный клок в логику(например, с помощью двух FF и xor), защёлкнуть его на FF быстрым клоком, выделить фронт, и привязать к этому фронту фазу чтения data_mainclk.
Достаточно, чтобы были правильно оконстрейнены клоки, и не была запрещена проверка путей между data_clock и clock, другие констрейны не нужны.
То, что советует Maverick, тоже в принципе правильно, но для случая синхронных клоков избыточно.
Это я предполагаю, что клоки выходят с одного PLL. Расхождение по фазе между ними тогда невелико, и его допустимость будет проверена при STA.

У меня был случай, проект вырос и мне пришлось использовать несколько PLL, а потом появились причины поменять генерируемые в PLL тактовые частоты с одного перекинуть на другой. Естественно я даже и не вспомнил про применяемую "упрощенную схему" синхронизацию.
Ох, потом я "наигрался" с этой упрощенной схемой, пока выявил этот баг.
Сейчас стараюсь так не делать, упрощенную схему не применяю - делаю полную синхронизацию по всем правилам - благо ПЛИС позволяют...


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

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



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

 


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


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