|
Передача данных между частотными доменами, как правильно ? |
|
|
|
Mar 30 2015, 18:58
|
Группа: Участник
Сообщений: 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
|
|
|
|
|
 |
Ответов
|
Mar 30 2015, 21:14
|
Знающий
   
Группа: Участник
Сообщений: 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.
|
|
|
|
|
Mar 30 2015, 21:38
|

я только учусь...
     
Группа: Модераторы
Сообщений: 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.
"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
|
|
|
|
Сообщений в этой теме
v1vas Передача данных между частотными доменами Mar 30 2015, 18:58 Maverick Цитата(v1vas @ Mar 30 2015, 21:58) Virtex... Mar 30 2015, 20:22  Bad0512 Цитата(Maverick @ Mar 31 2015, 03:38) У м... Mar 31 2015, 04:23   Maverick Цитата(Bad0512 @ Mar 31 2015, 07:23) Ну э... Mar 31 2015, 05:25 v1vas Парни, просто хочу вас всех поблагодарить, за помо... Apr 1 2015, 15:29
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|