|
|
  |
Приём LVDS с динамической подстройкой фазы, Как это реализовать на Altera, не имея спец. блоков DPA |
|
|
|
Aug 4 2017, 10:27
|

В поисках себя...
   
Группа: Свой
Сообщений: 729
Регистрация: 11-06-13
Из: Санкт-Петербург
Пользователь №: 77 140

|
Цитата(Magnum @ Aug 4 2017, 13:22)  Вы требуете слишком повышенных обязательств от lvds, даже сама альтера обязуется работать не более чем на 800МГц. Если надо больше придумали пользуйте GX-трансиверы и pcml Так я и не требую работать со скоростью более 800Mbs. Про скорость выше 800Mbs - это я сказал к слову. На данный момент я хочу правильно обконстрейнить проект. Ведь неправильно, что Timequest говорит, что выше 400Mbs работать не будет, а реальная железка работает на 800Mbs +, очевидно что заданы неправильные временные ограничения. Вот я и хочу разобраться, как задать их правильно. Но, к сожалению, примера констрейнов при динамической подстройки я не нашел. UPD. Я не знаю как: 1. Задать констрейны на входные данные, поскольку временные отношения между данными и клоком могут быть абсолютно любые. Более того, они могут быть разные при каждом включении питания. 2. Задать констрейн на клок чтения(приёма данных), поскольку фаза этого клока не фиксированная и подстраивается при включении питания.
Сообщение отредактировал Flip-fl0p - Aug 4 2017, 11:22
|
|
|
|
|
Aug 4 2017, 12:50
|

В поисках себя...
   
Группа: Свой
Сообщений: 729
Регистрация: 11-06-13
Из: Санкт-Петербург
Пользователь №: 77 140

|
Цитата(Flip-fl0p @ Jul 27 2017, 10:59)  Сейчас в процессе написания собственного приёмника LVDS на DDR регистрах. В процессе написания приёмника столкнулся с непонятной работой PLL. При динамическом сдвиге фазы необходимо указывать адрес частоты , которую надо двигать. Т.е: CLK0 - Адрес B"00000" CLK1 - Адрес B"00001" CLK2 - Адрес B"00010" И.Т.Д. Но столкнулся с тем, что при указании адреса CLK0 у меня ещё одновременно с этой частотой двигается частота CLK2.... А при указании адреса CLK2 частота не двигается вообще. Кто сталкивался с подобным поведением ? И вообще, где указана максимально возможная частота работы регистров. В частности модуль ALT_LVDS_RX может принять максимум 840 Mbps А если его писать собственный приёмник, чем я сейчас и занимаюсь, то как подсчитать максимально возможную теоретическую скорость на DDR регистрах ? Забыл написать. Проблема была не там где я её искал. Поскольку про сдвиг частоты я определяю по косвенным признакам - изменение приёма данных по линиям, на видео это видно визуально. То оказалось всё гораздо интереснее. Проблема не в том, что частота не двигалась, а в том, что частота не создавалась. Т.е на RTL видно все частоты которые я создаю на PLL, но в technology map этой частоты уже нет. Более того, TimeQuest не видит этих частот. При чем Quartus удаляет частоты с одинаковым сдвигом фаз. Т.е когда у меня были указаны частоты CLK0 - 200 Mhz - сдвиг фаз 0 градусов CLK1 - 200 Mhz - сдвиг фаз 0 градусов CLK2 - 200 Mhz - сдвиг фаз 0 градусов Quartus удалил частоты CLK1, CLK2. И даже не выдал сообщение об этом, гад такой. А на RTL все красиво. Все частоты есть. Если же указать каждой из частоты разные сдвиги фаз, то он их не удаляет.
Сообщение отредактировал Flip-fl0p - Aug 4 2017, 12:51
|
|
|
|
|
Aug 4 2017, 12:56
|
Профессионал
    
Группа: Свой
Сообщений: 1 088
Регистрация: 20-10-09
Из: Химки
Пользователь №: 53 082

|
Цитата(Flip-fl0p @ Aug 4 2017, 13:27)  Я не знаю как: 1. Задать констрейны на входные данные, поскольку временные отношения между данными и клоком могут быть абсолютно любые. Более того, они могут быть разные при каждом включении питания. 2. Задать констрейн на клок чтения(приёма данных), поскольку фаза этого клока не фиксированная и подстраивается при включении питания. Насколько я помню, эти ограничения и не нужно задавать, почитайте документацию. Требуется только прописать входную частоту, а все остальное через set_false_patch. Узкое место - переход из одного клокового домена в другой (если дальше принятые данные работают на другой частоте) - там fifo с обвязкой ставить придется и, опять же, закрывать пути для анализа.
|
|
|
|
|
Aug 4 2017, 13:10
|

В поисках себя...
   
Группа: Свой
Сообщений: 729
Регистрация: 11-06-13
Из: Санкт-Петербург
Пользователь №: 77 140

|
Цитата почитайте документацию - А какую именно из большого множества документов ? Читал AN433, https://www.alteraforum.com/forum/showthread.php?t=4806, и ещё несколько. Но тут скорее связано в неполном понимании самого процесса расчета Timequest временных ограничений. Сейчас как раз читаю и пытаюсь понять как вообще происходит расчет временных ограничений, и пытаюсь разобраться как временные ограничения влияют на этот расчет. Цитата Узкое место - переход из одного клокового домена в другой (если дальше принятые данные работают на другой частоте) - там fifo с обвязкой ставить придется и, опять же, закрывать пути для анализа. Именно так и делаю. Каждый раз как я принял 10 бит по LVDS я их отправляю в FIFO. А читаю с FIFO уже на нормальной частоте.
Сообщение отредактировал Flip-fl0p - Aug 4 2017, 13:11
|
|
|
|
|
Aug 4 2017, 13:42
|
Профессионал
    
Группа: Свой
Сообщений: 1 088
Регистрация: 20-10-09
Из: Химки
Пользователь №: 53 082

|
Цитата(Flip-fl0p @ Aug 4 2017, 16:10)  А какую именно из большого множества документов ? Читал AN433, https://www.alteraforum.com/forum/showthread.php?t=4806, и ещё несколько. Но тут скорее связано в неполном понимании самого процесса расчета Timequest временных ограничений. Сейчас как раз читаю и пытаюсь понять как вообще происходит расчет временных ограничений, и пытаюсь разобраться как временные ограничения влияют на этот расчет. Именно так и делаю. Каждый раз как я принял 10 бит по LVDS я их отправляю в FIFO. А читаю с FIFO уже на нормальной частоте. Посмотрите, что они советуют прописывать при разных настройках корки lvds serdes https://www.altera.com/content/dam/altera-w.../ug_altlvds.pdfНа какой частоте пишете, на какой считываете - источник один, а фаза произвольная? Каким образом происходит пересинхронизация - банально пишете на одной, а считываете на другой?
|
|
|
|
|
Aug 4 2017, 14:15
|

В поисках себя...
   
Группа: Свой
Сообщений: 729
Регистрация: 11-06-13
Из: Санкт-Петербург
Пользователь №: 77 140

|
Цитата(bogaev_roman @ Aug 4 2017, 16:42)  Посмотрите, что они советуют прописывать при разных настройках корки lvds serdes https://www.altera.com/content/dam/altera-w.../ug_altlvds.pdfНа какой частоте пишете, на какой считываете - источник один, а фаза произвольная? Каким образом происходит пересинхронизация - банально пишете на одной, а считываете на другой? На опорной частоте TMDS_CLK - 40 МГц я запускаю PLL. PLL в режиме source synchronous, хотя в моем случае это никак не влияет на результат. Поскольку у меня прием идет на DDR регистрах то на PLL я формирую следующие частоты: CLK_40MHz - 40 МГц RX0_CLK -200 МГц RX1_CLK -200 МГц RX2_CLK -200 МГц Частоты RX0_CLK, RX1_CLK, RX2_CLK изначально имеют разные сдвиги фаз. Иначе Quartus удаляет частоты RX1_CLK и RX2_CLK. Но на начальный сдвиг фаз нам наплевать, поскольку всё равно мы их двигаем блоком подстройки фазы. Запрос на чтение FIFO у меня постоянно разрешен и частота чтения FIFO - это частота CLK_40MHz. Принимаю данные на частоте дессерилизации. Т.е для приёма данных по линии RX0 я применяю частоту RX0_CLK, которую блоком подстройки фазы я устанавливаю в центр окна. Каждые 5 тактов частоты RX0_CLK я формирую запрос на запись данных в FIFO. Частота записи у меня естественно RX0_CLK . Для каждой линии приёма у меня свой FIFO буфер. Общее для них это частота чтения - CLK_40MHz Лучше конечно выложить сюда проект, многие вопросы отпадут сами собой и появятся новые. Но у меня проект ещё очень сырой и мне просто стыдно такое выкладывать на всеобщее обозрение.
Сообщение отредактировал Flip-fl0p - Aug 4 2017, 14:19
|
|
|
|
|
Aug 7 2017, 13:36
|

В поисках себя...
   
Группа: Свой
Сообщений: 729
Регистрация: 11-06-13
Из: Санкт-Петербург
Пользователь №: 77 140

|
Цитата(Corner @ Aug 7 2017, 15:58)  Частота 800 МГц вытекает из 2 x максимальная частота тактирования регистров. Для этой ПЛИС 400 МГц потолок. А где Вы нашли это если не секрет ? Я весь даташит прочитал, и нашёл только: Global clock and Regional clock 550 MHZ (стр.39) Максимальная скорость встроенного LVDS приёмника 875Mbs (стр.48) А вот с какой скоростью могут работать регистры в ячейках я не увидел. Если что у меня speedgrade -C6 (5CSEMA5F31C6). Да я и не собираюсь выжимать больше, поскольку у меня согласователь уровней CML -> LVDS ограничен скоростью 800 Mbs. Сейчас основная задача разобраться с временными ограничениями и задать констрейны, чтобы реальная железка соответствовала тому, что говорит Timequest.
|
|
|
|
|
Aug 8 2017, 07:39
|
Профессионал
    
Группа: Свой
Сообщений: 1 088
Регистрация: 20-10-09
Из: Химки
Пользователь №: 53 082

|
Цитата(Flip-fl0p @ Aug 7 2017, 16:36)  А где Вы нашли это если не секрет ? Я весь даташит прочитал, и нашёл только: Global clock and Regional clock 550 MHZ (стр.39) Максимальная скорость встроенного LVDS приёмника 875Mbs (стр.48) А вот с какой скоростью могут работать регистры в ячейках я не увидел. Если что у меня speedgrade -C6 (5CSEMA5F31C6). Мне тоже интересно, откуда такие цифры. Согласно документации https://www.altera.com/content/dam/altera-w...-v/av_51002.pdfGlobal clock and Regional clock 525MHz (1-43) SERDES factor J = 1 to 2, Uses DDR Registers (1-51, (79*) - The maximum ideal data rate is the SERDES factor (J) x the PLL maximum output frequency (fOUT), provided you can close the design timing and the signal integrity simulation is clean) Далее, кстати, на 1-44 fOUT_max=400MHz (This specification is limited by the lower of the two: I/O fMAX or FOUT of the PLL). Но это в случае без DPA, для DPA фактор сериализации начинается от 4. Цитата Каждые 5 тактов частоты RX0_CLK я формирую запрос на запись данных в FIFO. Частота записи у меня естественно RX0_CLK . Для каждой линии приёма у меня свой FIFO буфер. Общее для них это частота чтения - CLK_40MHz У Вас нет никакой пересинхронизации и т.к. фазовые соотношения между стробом на запись и частотой на чтение могут быть любые, в общем случае схема работать стабильно не будет. Кстати, а что там за временные ошибки timequest рисует, этот переход из одного клокового домена в другой там тоже скорее всего есть. Еще второй момент - канальная синхронизация - Вы пишете в отдельные буфера в общем случае в разные моменты времени, если чтение произойдет посредине между записями, то слово на канальном уровне разобьется на два такта ну или опять же будут временные ошибки.
|
|
|
|
|
Aug 8 2017, 07:52
|

В поисках себя...
   
Группа: Свой
Сообщений: 729
Регистрация: 11-06-13
Из: Санкт-Петербург
Пользователь №: 77 140

|
Цитата(bogaev_roman @ Aug 8 2017, 10:39)  Мне тоже интересно, откуда такие цифры. Согласно документации https://www.altera.com/content/dam/altera-w...-v/av_51002.pdfGlobal clock and Regional clock 525MHz (1-43) SERDES factor J = 1 to 2, Uses DDR Registers (1-51, (79*) - The maximum ideal data rate is the SERDES factor (J) x the PLL maximum output frequency (fOUT), provided you can close the design timing and the signal integrity simulation is clean) Далее, кстати, на 1-44 fOUT_max=400MHz (This specification is limited by the lower of the two: I/O fMAX or FOUT of the PLL). Но это в случае без DPA, для DPA фактор сериализации начинается от 4. У Вас нет никакой пересинхронизации и т.к. фазовые соотношения между стробом на запись и частотой на чтение могут быть любые, в общем случае схема работать стабильно не будет. Кстати, а что там за временные ошибки timequest рисует, этот переход из одного клокового домена в другой там тоже скорее всего есть. Еще второй момент - канальная синхронизация - Вы пишете в отдельные буфера в общем случае в разные моменты времени, если чтение произойдет посредине между записями, то слово на канальном уровне разобьется на два такта ну или опять же будут временные ошибки. Так у меня CYCLONE V а не ARRIA V А зачем мне делать пересинхронизацию, если я принятые данные отправляю в DC FIFO буфер ? Я принял слово и отдал в FIFO буфер. Сам буфер обеспечит синхронизацию, для этого его и ставил. Я сейчас привожу проект к тому виду, чтобы можно было показать общественности. Думаю, после того как проект выложу (ну и фиг с ним, что сырой), диалог будет более конструктивный. Пока выложу структуру приемника по одной линии. А слаки возникают из-за того, что данные слишком долго идут от выводов DDR регистра до регистра-приёмника. Ну и заодно вопрос про мультициклы. Является ли путь от SHREG до PARALEL_REG мультицикловым или нет.
Сообщение отредактировал Flip-fl0p - Aug 8 2017, 07:56
|
|
|
|
|
Aug 8 2017, 08:29
|
Профессионал
    
Группа: Свой
Сообщений: 1 088
Регистрация: 20-10-09
Из: Химки
Пользователь №: 53 082

|
Цитата(Flip-fl0p @ Aug 8 2017, 10:52)  Так у меня CYCLONE V а не ARRIA V  А, перепутал, извиняюсь. Цитата А слаки возникают из-за того, что данные слишком долго идут от выводов DDR регистра до регистра-приёмника. Крайний метод - прибить гвоздями поближе к пинам - Цитата set_location Цитата Ну и заодно вопрос про мультициклы. Является ли путь от SHREG до PARALEL_REG мультицикловым или нет. Хотел вначале написать да, но на самом деле нет - входные данные меняются каждый такт и актуальны они только один такт. А вот путь между parallel_reg/load_ena_reg и out_fifo в обещем случае да (если частоты от одного источника). Цитата А зачем мне делать пересинхронизацию, если я принятые данные отправляю в DC FIFO буфер ? Я принял слово и отдал в FIFO буфер. Сам буфер обеспечит синхронизацию, для этого его и ставил. Если буфер сделан с хорошей защитой от метастабильности и чтение происходит спустя несколько таков после записи, то пересинхронизацию делать не нужно.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|