|
|
  |
Digital PLL, детали реализации на FPGA |
|
|
|
Feb 28 2011, 10:33
|
Частый гость
 
Группа: Свой
Сообщений: 82
Регистрация: 7-02-07
Из: Беларусь, г. Минск
Пользователь №: 25 149

|
Здравствуйте товарищи форумчане. Помогите пожалуйтса разрешить проблемку. Имеется FPGA Spartan6 (xc6slx100), на вход которой приходит word_clock = (28KHz-200KHz) - частота сэмплиролвания аудиоданных. Внутри FPGA необходимо залочиваться на этот сигнал и генерировать bit_clock = word_clock*128, т.е. частоту индивидуальных битов в сэмлпах. По сути классический PLL - Phase Locked Loop. Вроде бы ничего сложного. Берём внутренний PLL настраиваем как надо и готово. Но сразу же возникают нюансы. В Spartan6 для DCM минимальная входная частота 0,5Mhz, для PLL - 19MHz. Т.е. этот вариант отпадает, т.к. диапазон частот входного сигнала 28KHz-200KHz. Я тогда начал гуглить в сторону Digital PLL, т.е. фактически имплементации PLL на FPGA. Вроде бы даже накопал те же application notes от Xilinx: xapp854 "Digital Phase-Locked Loop (DPLL)", xapp250 "Clock and Data Recovery with Coded Data Streams". Вот структурная схемка DPLL из xapp854: [attachment=53823:DPLL_xapp854.png]
Вроде бы всё понятно: детектор фазы, фильтр, осциллятор и обратная связь. НО осциллятор (VCO) - внешний по отношению к FPGA. В других виденных мною решениях этот блок (VCO - Voltage Control Oscillator или NCO/DCO - Numerical/Digital Control Oscillator) тоже был или внешний, или основывается на принципе задержки сигнала в цепочке соединённых логических элементов (ring oscillato): [attachment=53824:DCO.png] Но по-моему такую штуку не очень то получится сделать в FPGA. Для этого нужно как-то учитыавть задержки индивидуальных LUT-ов и рутинга, и "зафиксировать" результат , чтобы он не менялся от раскладки к раскладке (partition? mapping constraints?).
Так вот собственно вопросы: 1. Правильно ли я вообще рассуждаю и в том ли направлении копаю? 2. Можно ли сделать DPLL только средствами FPGA, без использования внешних микросхем VCO/DCO. 3. Может можно как-то заставить работать встроенные DCM/PLL на более низких входных частотах?
Т.е. собственно главная задача это залочиться на входную частоту сэмплирования word_clock = (28KHz-200KHz) и сгенерировать сигнал с частотой x128 для индивидуальных битов в сэмпле.
Please help...
|
|
|
|
|
Feb 28 2011, 12:00
|
Частый гость
 
Группа: Свой
Сообщений: 82
Регистрация: 7-02-07
Из: Беларусь, г. Минск
Пользователь №: 25 149

|
Цитата(DmitryR @ Feb 28 2011, 12:42)  Надо прежде всего понять, зачем это делать. Почему вы не можете тактировать внутренности тупо сигналом 30 МГц (это больше, чем 200кГц*128)? Речь идёт не о маскимальной частоте обработки данных, а о синхронности со входным потоком. Цитата(Lmx2315) ..наверное человек биты пришедшие параллельно , хочет обработать последовательно потому нужна тактовая синхронная с битами . Данные приходят вобщем-то тоже последовательно, и сохраняются в буфер. И вот уже из этого буфера их нужно забирать побитно и синхронно со входной частотой word_clock. То есть грубо говоря есть 2 сигнала (word_clock и data) и нужно ещё "воссоздать" bit_clock: [attachment=53829:waveform_wclk_bclk.png]
|
|
|
|
|
Feb 28 2011, 12:51
|
Частый гость
 
Группа: Свой
Сообщений: 82
Регистрация: 7-02-07
Из: Беларусь, г. Минск
Пользователь №: 25 149

|
Цитата(Shtirlits @ Feb 28 2011, 14:11)  А на плате еще какие-то источники клока есть? Есть, несколько разных: 22.579 MHz (44.1KHz*512), 24.576MHz (48KHz*512), 62.208MHz, 125MHz. Но я не совсем понимаю к чему вы клоните. Цитата(DmitryR) Еще интереснее. А буфер у вас на запись какой частотой тактируется, раз ему на вход данные приходят последовательно? На запись тактируется частотой 125 MHz (физическая частота входдного потока). Но это не столь важно. Запись и чтение разделены во времени (ping-pong) и в разных клоковых доменах. Важно что дальше их нужно обрабатвыать по вышеуказанной схеме ( bit_clok = word_clock*128).
|
|
|
|
|
Feb 28 2011, 13:13
|

Местный
  
Группа: Свой
Сообщений: 340
Регистрация: 28-11-05
Из: Москва
Пользователь №: 11 469

|
Цитата(Vengin @ Feb 28 2011, 13:33)  1. Правильно ли я вообще рассуждаю и в том ли направлении копаю? 2. Можно ли сделать DPLL только средствами FPGA, без использования внешних микросхем VCO/DCO. 3. Может можно как-то заставить работать встроенные DCM/PLL на более низких входных частотах?
Please help... 1. В общем то правильно, метод с использованием внешнего аналогового VCO дает лучший результат. 2. Думаю можно. Если у вас есть возможность завести тактовую с частотой в несколько сотен Мгц. Можно сделать DDS, частота которого будет определяться как тактовая / 2^N - N разрядность счетчика. Потом делитель на 128 и фазовый детектор. Это метод будет хуже так как будет большой джиттер, тут надо грамотно все рассчитать. Чем выше тактовая и больше N тем ниже джиттер. 3. Скорее всего нет, хотя могу ошибаться. Все это нестандартное использование.
|
|
|
|
|
Feb 28 2011, 14:23
|
Частый гость
 
Группа: Свой
Сообщений: 82
Регистрация: 7-02-07
Из: Беларусь, г. Минск
Пользователь №: 25 149

|
Цитата(stoker @ Feb 28 2011, 15:13)  2. Думаю можно. Если у вас есть возможность завести тактовую с частотой в несколько сотен Мгц. Можно сделать DDS, частота которого будет определяться как тактовая / 2^N - N разрядность счетчика. Потом делитель на 128 и фазовый детектор. Это метод будет хуже так как будет большой джиттер, тут надо грамотно все рассчитать. Чем выше тактовая и больше N тем ниже джиттер. Пока я только такой вариант вижу как едва ли ни единственно возможный. Но мне он не нравится из-за возможно недопустимо высокой погрешности. Точные значения не рассчитывал. Кстати по поводу DDS. Поковырял я корку Xilinx-а "DDS Compiler", но если честно так до конца и не понял, то ли это, что мне надо или нет. Цитата(DmitryR @ Feb 28 2011, 15:26)  Зато я возможно понимаю. Похоже у вас на плате есть word_clock*512. Подайте его внутрь и поделите на 4. Да уж, и с чего бы это мне уже вторую неделю голову ломать - бери готовенькое %). К сожалению у меня есть только фиксированные 22.579 MHz (44.1KHz*512), 24.576MHz (48KHz*512), и плавающий word_clock. По сути и те и другие на разных этапах обработки тактируют аудоданные, но прямой связи между ними нет.
|
|
|
|
|
Feb 28 2011, 15:57
|

Местный
  
Группа: Свой
Сообщений: 340
Регистрация: 28-11-05
Из: Москва
Пользователь №: 11 469

|
Цитата(Vengin @ Feb 28 2011, 17:23)  Кстати по поводу DDS. Поковырял я корку Xilinx-а "DDS Compiler", но если честно так до конца и не понял, то ли это, что мне надо или нет. А не надо ее трогать, DDS лучше самому написать, сделать довольно просто: Код signal DDSCounter : unsigned(7 + N Downto 0); .......... Ну а далее в процессе с частотой DDS(для 6-го спартана это будет более 200 Мгц.): Код DDSCounter <= DDSCounter + resize( to_unsigned(Code,N), 7+N ); ....... Вам нужен DDSCounter (7 + N); его и сравниваете с word_clock. как Code рассчитать думаю понятно? джиттер будет вроде не больше 5нс, для 200 МГц. Для 28 Кгц будет достаточно, а вот для 200 Кгц - не знаю. Надо проверять. Вообще попробуйте собрать, думаю займет не более 1-2 часов.
|
|
|
|
|
Mar 1 2011, 13:22
|
Частый гость
 
Группа: Свой
Сообщений: 82
Регистрация: 7-02-07
Из: Беларусь, г. Минск
Пользователь №: 25 149

|
Цитата(stoker @ Feb 28 2011, 17:57)  ...А не надо ее трогать, DDS лучше самому написать, сделать довольно просто... Спс за наводку, вроде идею понял, хотя детали ещё не до конца. Как получится постараюсь отписаться.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|