Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Digital PLL
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
Vengin
Здравствуйте товарищи форумчане.
Помогите пожалуйтса разрешить проблемку. Имеется 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:
Нажмите для просмотра прикрепленного файла

Вроде бы всё понятно: детектор фазы, фильтр, осциллятор и обратная связь. НО осциллятор (VCO) - внешний по отношению к FPGA. В других виденных мною решениях этот блок (VCO - Voltage Control Oscillator или NCO/DCO - Numerical/Digital Control Oscillator) тоже был или внешний, или основывается на принципе задержки сигнала в цепочке соединённых логических элементов (ring oscillato):
Нажмите для просмотра прикрепленного файла
Но по-моему такую штуку не очень то получится сделать в FPGA. Для этого нужно как-то учитыавть задержки индивидуальных LUT-ов и рутинга, и "зафиксировать" результат , чтобы он не менялся от раскладки к раскладке (partition? mapping constraints?).

Так вот собственно вопросы:
1. Правильно ли я вообще рассуждаю и в том ли направлении копаю?
2. Можно ли сделать DPLL только средствами FPGA, без использования внешних микросхем VCO/DCO.
3. Может можно как-то заставить работать встроенные DCM/PLL на более низких входных частотах?

Т.е. собственно главная задача это залочиться на входную частоту сэмплирования word_clock = (28KHz-200KHz) и сгенерировать сигнал с частотой x128 для индивидуальных битов в сэмпле.

Please help...
DmitryR
Цитата(Vengin @ Feb 28 2011, 13:33) *
на вход которой приходит word_clock = (28KHz-200KHz) - частота сэмплиролвания аудиоданных. Внутри FPGA необходимо залочиваться на этот сигнал и генерировать bit_clock = word_clock*128, т.е. частоту индивидуальных битов в сэмлпах.

Надо прежде всего понять, зачем это делать. Почему вы не можете тактировать внутренности тупо сигналом 30 МГц (это больше, чем 200кГц*128)?
Lmx2315
Цитата(DmitryR @ Feb 28 2011, 13:42) *
Надо прежде всего понять, зачем это делать. Почему вы не можете тактировать внутренности тупо сигналом 30 МГц (это больше, чем 200кГц*128)?


..наверное человек биты пришедшие параллельно , хочет обработать последовательно потому нужна тактовая синхронная с битами .
DmitryR
Цитата(Lmx2315 @ Feb 28 2011, 14:19) *
..наверное человек биты пришедшие параллельно , хочет обработать последовательно потому нужна тактовая синхронная с битами .

Для этого не нужна тактовая синхронизация с битами - есть enable.
Vengin
Цитата(DmitryR @ Feb 28 2011, 12:42) *
Надо прежде всего понять, зачем это делать. Почему вы не можете тактировать внутренности тупо сигналом 30 МГц (это больше, чем 200кГц*128)?

Речь идёт не о маскимальной частоте обработки данных, а о синхронности со входным потоком.

Цитата(Lmx2315)
..наверное человек биты пришедшие параллельно , хочет обработать последовательно потому нужна тактовая синхронная с битами .

Данные приходят вобщем-то тоже последовательно, и сохраняются в буфер. И вот уже из этого буфера их нужно забирать побитно и синхронно со входной частотой word_clock.

То есть грубо говоря есть 2 сигнала (word_clock и data) и нужно ещё "воссоздать" bit_clock:
Нажмите для просмотра прикрепленного файла
Shtirlits
А на плате еще какие-то источники клока есть?
DmitryR
Цитата(Vengin @ Feb 28 2011, 15:00) *
Данные приходят вобщем-то тоже последовательно, и сохраняются в буфер. И вот уже из этого буфера их нужно забирать побитно и синхронно со входной частотой word_clock.

То есть грубо говоря есть 2 сигнала (word_clock и data) и нужно ещё "воссоздать" bit_clock:

Еще интереснее. А буфер у вас на запись какой частотой тактируется, раз ему на вход данные приходят последовательно?
Vengin
Цитата(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).
Shtirlits
Имея высокую частоту можно получить "битовую" цифровым способом - несложная программистская задача.
Фронты будут немного несовпадать с идеальной, в пределах одного периода высокой частоты - в вашем случает это порядка 1%.
stoker
Цитата(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. Скорее всего нет, хотя могу ошибаться. Все это нестандартное использование.
DmitryR
Цитата(Vengin @ Feb 28 2011, 15:51) *
Есть, несколько разных: 22.579 MHz (44.1KHz*512), 24.576MHz (48KHz*512), 62.208MHz, 125MHz. Но я не совсем понимаю к чему вы клоните.

Зато я возможно понимаю. Похоже у вас на плате есть word_clock*512. Подайте его внутрь и поделите на 4.
Vengin
Цитата(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. По сути и те и другие на разных этапах обработки тактируют аудоданные, но прямой связи между ними нет.
Shtirlits
Какая погрешность устроит?
Можно ли применять такой клок как системный для ЦАП - зависит от ЦАП и приложения.
stoker
Цитата(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 часов.
Vengin
Цитата(stoker @ Feb 28 2011, 17:57) *
...А не надо ее трогать, DDS лучше самому написать, сделать довольно просто...
Спс за наводку, вроде идею понял, хотя детали ещё не до конца. Как получится постараюсь отписаться.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.