|
|
  |
Тактовая частота через PLL, три нагрузки, Spartan6 |
|
|
|
Dec 18 2016, 15:50
|

фанат Linux'а
    
Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008

|
Здравствуйте! Я всегда использовал PLL только для того чтобы изменить частоту внутри ПЛИС и это всегда было просто и легко. Теперь завяз в более сложной конфигурации. Требуется входную частоту 24 МГц превратить в 48 МГц и подать на три нагрузки: 1) внутренняя логика 2) выход однополярный клок ЦАП 3) выход дифференциальный клок АЦП Перед созданием темы произвел поиск по форуму, но решая одну проблему возникает прежняя. Сейчас схема такая: Код [Вход 24 МГц] -> [PLL из 24 в 48 МГц] -> [BUFG] -> (*) -> [такты внутриПЛИСной логики] (*) -> [OBUF тактовый выход ЦАП] (*) -> [OBUFDS дифф выход тактов АЦП] Схема не разводится ни при наличии BUFG после PLL ни при его отсутствии, ни если убрать OBUF для тактов ЦАП а задействовать просто assign. Что не правильно в этой схеме и как правильно делать? Презентацию spartan-6-clocking-resources.pptx от Xilinx смотрел, просветления не произошло.
--------------------
|
|
|
|
|
Dec 18 2016, 17:09
|

фанат Linux'а
    
Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008

|
Цитата(dm.pogrebnoy @ Dec 18 2016, 19:20)  Телепаты в отпуске. Проясните, что вы под этим подразумеваете? Компиляция завершается с ошибками на этапе map либо на этапе формирования файла прошивки. Какая именно ошибка - не имеет значения, каждая комбинация выдает свою ошибку. Мне кажется я уже перепробовал все мыслимые варианты. Честно, мне трудно сформулировать эту ситуацию... Попробую иными словами: нужно из входного тактового сигнала 24 МГц сделать 48 МГц и получившуюся частоту 48 МГц подать на три потребителя: внутренняя логика, выдать из ПЛИС однополярные такты на ЦАП, выдать из ПЛИС дифференциальные такты на АЦП. По отдельности, если 48 МГц подавать только на внутреннюю логику (always posedge), или на OBUFDS чтобы выдать такты АЦП, или только выводить для ЦАП - всё собирается. Когда же я хочу всё сразу одновременно, возникают ошибки. Либо это ограничения ПЛИС, либо могут выводы не позволять выводить такты (но отдельно то можно), либо я буферы неправильно использую, не там и не туда сую BUFG. Просто хотел бы попросить совета как это делать правильно, и вообще возможно ли выход PLL подать на три разные нагрузки? Может просто у PLL задействовать ТРИ выхода и на всех них будет одна частота по 48 МГц? (это я уже под конец додумался, надо проверить завтра)
--------------------
|
|
|
|
|
Dec 19 2016, 02:11
|
Знающий
   
Группа: Свой
Сообщений: 802
Регистрация: 11-05-07
Из: Томск
Пользователь №: 27 650

|
Цитата(AVR @ Dec 18 2016, 22:50)  2) выход однополярный клок ЦАП 3) выход дифференциальный клок АЦП Это очень плохая идея - прогонять тактирующие клоки для АЦП и ЦАП через ПЛИС. Угробите все характеристики за счёт адского джиттера по клоку. Не экономьте на клоковых буферах в следующий раз.
|
|
|
|
|
Dec 25 2016, 16:56
|

фанат Linux'а
    
Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008

|
Цитата(TRILLER @ Dec 18 2016, 23:22)  Используйте ODDR. Благодарю за совет. Если честно, столь короткий комментарий был мной решительно проигнорирован - не ясно как это могло помочь, а напрасно. Дополнительное чтение ошибок компилятора, а также UG382 привело к пониманию что ODDR2 ведь расположен у самого выхода из ПЛИС, и если дать данные 1 и 0 и заклокать их - будет тот же самый клок на выходе, о чем и пишут в UG382 если я правильно понял суть этой ихней хитроумной задумки. Пока что вижу что проект хотя бы разводится! Спасибо за помощь и подсказки! Попробую его посимулить с задержками, будет ли всё хорошо. Код wire pll_fb; wire clock48m_logic; wire clock48m_dac; wire clock48m_adc; pll24to48 pll( .fb_in(pll_fb), .fb_out(pll_fb), .clock24m(clock24m), // три разные нагрузки .clock48m_1(clock48m_logic), .clock48m_2(clock48m_dac), .clock48m_3(clock48m_adc));
wire adc_clock; ODDR2 adc_clk( .D0(1), .D1(0), .C0(clock48m_adc), .C1(~clock48m_adc), .Q(adc_clock)); OBUFDS adc_clk_diff( // дифф клок на выходе - так правильно??? .I(adc_clock), .O(CLKP), .OB(CLKM));
ODDR2 dac_clk( .D0(1), .D1(0), .C0(clock48m_dac), .C1(~clock48m_dac), .Q(dac_clock)); // клок ЦАП always @(posedge clock48m_logic) begin dac <= dac + 10'b1; // просто тестовая пила end
always @(posedge clock48m_logic) begin // тут логика живет end Хотя тут же увидел ошибку - вход C1 у ODDR2 кажется уже сам по себе инвертирует. Цитата Это очень плохая идея - прогонять тактирующие клоки для АЦП и ЦАП через ПЛИС. Угробите все характеристики за счёт адского джиттера по клоку. Не экономьте на клоковых буферах в следующий раз. Вы предлагаете ставить полностью внешние клочья? Дело в том что у меня в одном режиме просто 24->48 МГц, а в другом режиме более экзотическая частота, которую ПЛИСный DCM вполне получает, внешнюю микросхему для решения такой задачи (да еще с тремя выходами, один из них дифф, хотя может еще один буфер это решает) по неопытности еще пока не присмотрел...
--------------------
|
|
|
|
|
Dec 26 2016, 07:01
|

фанат Linux'а
    
Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008

|
Цитата(dm.pogrebnoy @ Dec 25 2016, 23:31)  Если укажите модели ЦАП и АЦП, то можно прикинуть, но в общем случае идея очень плохая. Прошу прощения, какая идея плохая? Выше мне подсказывают что генерировать и распределять такты внутри ПЛИС это вредно для джиттера (хотя не сильно ясно почему, у меня только предположения). Другое мнение что правильнее всё же внешне генерировать и распределять клоки вне ПЛИС (используя клок-буферы, да?). ЦАП: AD8065ARZ АЦП: ADS5542 Цитата(ViKo @ Dec 26 2016, 08:37)  В Риголах и Теквэях с Циклона идут 8 тактов, сдвинутых по фазе, на АЦП, и получается 1 ГВыб/с. Кстати, не так ли работает SERDES? А то я в книжечке от Xilinx "Serial made simple" (как-то так) читал что именно так делают большую частоту в подобных блоках. В общем, мне понятен комментарий, в плане что выводить из ПЛИС так много тактовых сигналов это допустимо и это работает.
--------------------
|
|
|
|
|
Dec 26 2016, 12:00
|

фанат Linux'а
    
Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008

|
Цитата(Lmx2315 @ Dec 26 2016, 13:46)  http://www.ti.com/tool/jitter-snr-calc тут можно скачать архивчик с екселевским листочком для расчёта требуемого джиттера клоков в зависимости от ожидаемого качества сигнала и его частоты. А тут табличка есть с примерами: https://ru.wikipedia.org/wiki/%D0%90%D0%BD%...%B5%D0%BB%D1%8CОткуда следует что если у вас джитер клоков будет хуже чем 2 пс , то для измерений 10 МГц сигнала уже можно 16 битный АЦП не закладывать. Спасибо, это важная информация. Единицы пикосекунд мне кажутся жестким требованием, и похоже заложенный генератор хуже необходимого... Интересует тогда такой вопрос: DCM_SP блок в ПЛИС Spartan 6 он лишь ухудшает джиттер? Почему мне не стыдно задавать такие вопросы: в этой задаче я отвечаю за цифровую часть, аналоговой стороной занимается другой человек. Пожалуй, есть мысли как сделать следующую ревизию платы. Я так понимаю, лучше всего напрямую подавать такты с генератора. Каждому устройству - свой генератор с наименьшим джиттером. Правда как тогда решить задачу, что разность фазы между разными генераторами должна быть постоянной величиной. Мне известно что они не обладают точной настройкой и вообще плывут со временем и от температуры. Поэтому казалось логичным что они будут заклоканы через ПЛИС от одного генератора. Правильно ли я понимаю что наилучший вариант это сделать от одного генератора через "разветвитель клоков" (конкретных микросхем пока не знаю) - так будет постоянная разность фаз.
--------------------
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|