|
Синхронизация в ПЛИС, Работа с несколькими частотами |
|
|
|
Apr 12 2007, 10:25
|

Участник

Группа: Участник
Сообщений: 51
Регистрация: 19-10-05
Пользователь №: 9 839

|
Здравствуйте! При разработке проекта возникла такая проблема. Используем ПЛИС CyclonII, генератор на 16.384 Мгц. Фреймер DS21Q50. Тактовую частоту генератора завожу на глобальный клок Плис(использую четвертый банк). Там эта частота делится на 8 (получаем частоту 2048) и вывожу ее с ножки плис на MCLK фреймера. Для фреймера эта частота является опорной. С фреймера идет частота 16.384 Мгц тоже на глобальный клок ПЛИС (используем первый банк). Эта частота формируется самим фреймером. И она, возможно, может отличаться от частоты, которая идет с генератора. Так как в фреймере есть ФАПЧ и он подстраивает частоту под себя. На Плис реализуется FIFO. При такой организации сбиваются внутренние счетики. Получается рассинхронизация. Если подавать на фреймер частоту 2,048 МГц с генератора (т.е. с отдельного прибора) то все работает. При этом не используем делитель на ПЛИС. То есть получается что нельзя использовать делитель частоты или что то еще. Не могу разобраться в чем проблема. Прошу помощи, коллеги. Сколько разных частот можно заводить на ПЛИС. Так чтобы не было влияния. У нас получается, что мы подаем две разные частоты на ПЛИС. Если подавать с прибора частоту 16.384 МГц и подавать на делитель ПЛИС. Эффект такой же. Не работает.  На выходе все по честному. Частота делится. Не могу разобраться.
|
|
|
|
|
Apr 12 2007, 11:32
|

Участник

Группа: Участник
Сообщений: 51
Регистрация: 19-10-05
Пользователь №: 9 839

|
Цитата(Евгений Николаев @ Apr 12 2007, 12:04)  Скажите, а почему нельзя сделать так - оставить в покое исходную частоту 2,048МГц, получаемую Вами делением исходной, и только подавайть её на фреймер. Это я так и делаю. Только если подавать частоту с генератора без делителя то все синхронно работает. Если же подавать частоту с ПЛИС то происходит рассинхронизация. "А вот частоту фреймера 16.384МГц завести на PLL CycloneII, где сдвинуть на нужную фазу (компенсировать длину линии связи), а уж потом поделить на 8 и пользоваться этой частотой 2,048МГц, котороя будет строго кратной и сфазированной с частотой фреймера. " Идея конечно хорошая, но 2048 для фреймера является опорной. Без нее она не сформирует свои 16.384 Мгц.
|
|
|
|
|
Apr 12 2007, 12:15
|
Местный
  
Группа: Свой
Сообщений: 339
Регистрация: 26-10-04
Пользователь №: 985

|
Цитата(Kenav @ Apr 12 2007, 12:32)  Это я так и делаю. Только если подавать частоту с генератора без делителя то все синхронно работает. Если же подавать частоту с ПЛИС то происходит рассинхронизация. "А вот частоту фреймера 16.384МГц завести на PLL CycloneII, где сдвинуть на нужную фазу (компенсировать длину линии связи), а уж потом поделить на 8 и пользоваться этой частотой 2,048МГц, котороя будет строго кратной и сфазированной с частотой фреймера. " Идея конечно хорошая, но 2048 для фреймера является опорной. Без нее она не сформирует свои 16.384 Мгц.  Асинхронное ФИФО, Код Грея. Классика жанра.
|
|
|
|
|
Apr 12 2007, 12:19
|

Знающий
   
Группа: Свой
Сообщений: 597
Регистрация: 24-05-06
Из: г. Чебоксары
Пользователь №: 17 402

|
Кто-то из нас кого-то (опять-таки из нас :-) ) не понял. Я предлагаю: Частоту генератора Fген=16.384 поделить на 8 и получить Fген8=2.048, которую подать на фреймер и кроме как в этом фреймере нигде больше в ПЛИС её не использовать. Получиться эффект: Цитата Если подавать на фреймер частоту 2,048 МГц с генератора (т.е. с отдельного прибора) то все работает. С фреймера принимать в ПЛИС частоту Fфр=16.384 и именно её делить на 8, чтобы получать Fфр8=2.048, которую и использовать в ПЛИС. Таким образом, основная прошивка ПЛИС и "знать не будет" о существовании Fген и Fген8, а будет работать синхронно и в фазе с частотами фреймера Fфр и Fфр8. Или опять не то :-) --- И ещё... Не знаю - применяете или нет, но прямое без строба декодирование кода счётчика для выполнения какой-либо функции - вещь опасная, т.к. счётчики идеально синхронно все разряды не переключают, ну и декодеры идеально (по таблице истинности) во времени не декодируют. В динамике не работает.
Сообщение отредактировал Евгений Николаев - Apr 12 2007, 12:24
--------------------
Почему разработчики систем повышенной надёжности плохо справляются с простыми проектами? :)
|
|
|
|
|
Apr 12 2007, 13:12
|

Участник

Группа: Участник
Сообщений: 51
Регистрация: 19-10-05
Пользователь №: 9 839

|
Цитата(Евгений Николаев @ Apr 12 2007, 13:19)  Кто-то из нас кого-то (опять-таки из нас :-) ) не понял. Я предлагаю: Частоту генератора Fген=16.384 поделить на 8 и получить Fген8=2.048, которую подать на фреймер и кроме как в этом фреймере нигде больше в ПЛИС её не использовать. Получиться эффект:
С фреймера принимать в ПЛИС частоту Fфр=16.384 и именно её делить на 8, чтобы получать Fфр8=2.048, которую и использовать в ПЛИС. Таким образом, основная прошивка ПЛИС и "знать не будет" о существовании Fген и Fген8, а будет работать синхронно и в фазе с частотами фреймера Fфр и Fфр8. Или опять не то :-) --- И ещё... Не знаю - применяете или нет, но прямое без строба декодирование кода счётчика для выполнения какой-либо функции - вещь опасная, т.к. счётчики идеально синхронно все разряды не переключают, ну и декодеры идеально (по таблице истинности) во времени не декодируют. В динамике не работает. Скрее опять не то. Я все так и делаю. Я частоту генератора 16,384 делю на 8 в ПЛИС и подаю полученные 2048 на фреймер. Больше у меня эта частота (2048) кроме как на фреймер никуда не идет. С фреймера 16,384 я подаю на Плис. Проблема в том, что если подавать на фреймер 2048 с Плис, то происходит рассинхронизация. А если на прямую с прибора, то все работает. Тое есть получается, что что то с делителем не то. Хотя сигналы выходят все по честному.  Цитата(-=Sergei=- @ Apr 12 2007, 13:15)  Асинхронное ФИФО, Код Грея. Классика жанра. Да не, наверное не в этом деле. Все работает, если частоту с генератора брать, а не с ПЛИС. Все проверил уже. Не знаю что еще придумать.
|
|
|
|
|
Apr 12 2007, 14:49
|

Участник

Группа: Участник
Сообщений: 51
Регистрация: 19-10-05
Пользователь №: 9 839

|
Цитата(sazh @ Apr 12 2007, 15:16)  Проблема в том, что если подавать на фреймер 2048 с Плис, то происходит рассинхронизация. А если на прямую с прибора, то все работает. Тое есть получается, что что то с делителем не то. Хотя сигналы выходят все по честному. /////////////////////////////////////////////////////////////////// Надо полагать при двух вариантах подачи клока используется один и тот же проект. Значит дело в проекте, когда фактически используется две частоты. некорректный переход из одного клокового домена в другой. Странно, что фифо не помогло. По большому счету неограниченное число gate clk можно навесить на global clk. Один клоковый домен имеется ввиду банк ввода ввывода? Да у меня один проект. В нем одну частоту делим. И больше нигде не используем. А вторую частоту с фреймера используем для дальнейших преобразований. А что может быть с проектом?
|
|
|
|
|
Apr 12 2007, 15:20
|
Гуру
     
Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804

|
Один клоковый домен имеется ввиду банк ввода ввывода? /////////////////////////////////////////////////////////////////////// Можно и так сказать. У Вас два домена одной частоты, но не синхронны. И фифо как раз должно было помочь. Вот пример посмотрите (представьте, что эти два регистра одноклоковое фифо)
module in_out_data ( output reg [7:0] out_data, output out_clk, input global_clk, input [7:0] input_data, input in_clk_a, input in_clk_b );
reg [7:0] data_rg; reg [2:0] sdvig_in_rg; reg [2:0] sdvig_out_rg;
wire e_wr_rg; wire e_rd_rg;
assign out_clk = in_clk_b;
always @ (posedge global_clk) begin sdvig_in_rg <= {sdvig_in_rg[1:0], in_clk_a}; sdvig_out_rg <= {sdvig_out_rg[1:0], in_clk_b}; if (e_wr_rg) data_rg <= input_data; if (e_rd_rg) out_data <= data_rg; end
assign e_wr_rg = sdvig_in_rg[1] & ~sdvig_in_rg[2]; assign e_rd_rg = ~sdvig_out_rg[1] & sdvig_out_rg[2];
endmodule
|
|
|
|
|
Apr 13 2007, 10:03
|

МедвеД Инженер I
   
Группа: Свой
Сообщений: 816
Регистрация: 21-10-04
Пользователь №: 951

|
Цитата(DmitryR @ Apr 13 2007, 10:11)  Дело в том, что для PLL второго циклона 16 МГц - предельно низкая частота, а реализация делителя на счетчике думаю грязновата получается - все же фреймер требует 50 ppm. Поэтому мне кажется, что надо просто поставить на фреймер отдельный генератор, не пропуская его через ПЛИС. Если не удастся найти 2.048 - поставьте 16.384, ведь фреймер умеет сам делить опорную частоту на 2, 4 или 8. 1) предельно низкая не 16384 вообще то, для циклона2 смотрите в Table 5–51. PLL Specifications (Part 1 of 2) - 10 Мгц 2)если у вас генератор 50 ppm то эти самые ppm не могут прибавится за счёт делителя 3) проблемы возможно как раз в самом генераторе который тактирует плис - ведь насколько стало ясно "так работает" - это происходит при тактировании от внешнего источника
--------------------
Cogito ergo sum
|
|
|
|
|
Apr 13 2007, 10:55
|

МедвеД Инженер I
   
Группа: Свой
Сообщений: 816
Регистрация: 21-10-04
Пользователь №: 951

|
Цитата(DmitryR @ Apr 13 2007, 11:32)  Хорошо, скажем точнее - минимальная выходная частота тоже 10 МГц, а пытаются получить 2. По поводу делителя на счетчике - разные там могут быть проблемы, предлагаю признать такую реализацию недопустимой не углубляясь. Речь в моём посте шла про минимульную входную частоту так? а не про то что нельзя получить на выходе pll 2,048 МГц  . а получить эти самые 2,048 за счёт деления - нормальное явление. И уж будьте любезны привидите пжлста аргументы за то чтобы не применять делитель. и как он может изменить PPM? Я не могу такую реализацию признать недопустимой совершенно не углубляясь в проблемы форум для того существует - обсудить-поделитсья проблемами-опытом а если вы не желаете делиться - ваше право
--------------------
Cogito ergo sum
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|