реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Digital PLL, детали реализации на FPGA
Vengin
сообщение Feb 28 2011, 10:33
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 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...
Go to the top of the page
 
+Quote Post
DmitryR
сообщение Feb 28 2011, 10:42
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 535
Регистрация: 20-02-05
Из: Siegen
Пользователь №: 2 770



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

Надо прежде всего понять, зачем это делать. Почему вы не можете тактировать внутренности тупо сигналом 30 МГц (это больше, чем 200кГц*128)?
Go to the top of the page
 
+Quote Post
Lmx2315
сообщение Feb 28 2011, 11:19
Сообщение #3


отэц
*****

Группа: Свой
Сообщений: 1 729
Регистрация: 18-09-05
Из: Москва
Пользователь №: 8 684



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


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


--------------------
b4edbc0f854dda469460aa1aa a5ba2bd36cbe9d4bc8f92179f 8f3fec5d9da7f0
SHA-256
Go to the top of the page
 
+Quote Post
DmitryR
сообщение Feb 28 2011, 11:51
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 535
Регистрация: 20-02-05
Из: Siegen
Пользователь №: 2 770



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

Для этого не нужна тактовая синхронизация с битами - есть enable.
Go to the top of the page
 
+Quote Post
Vengin
сообщение Feb 28 2011, 12:00
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 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]
Go to the top of the page
 
+Quote Post
Shtirlits
сообщение Feb 28 2011, 12:11
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 845
Регистрация: 18-10-04
Из: Pereslavl-Zalessky, Russian Federation
Пользователь №: 905



А на плате еще какие-то источники клока есть?
Go to the top of the page
 
+Quote Post
DmitryR
сообщение Feb 28 2011, 12:13
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 535
Регистрация: 20-02-05
Из: Siegen
Пользователь №: 2 770



Цитата(Vengin @ Feb 28 2011, 15:00) *
Данные приходят вобщем-то тоже последовательно, и сохраняются в буфер. И вот уже из этого буфера их нужно забирать побитно и синхронно со входной частотой word_clock.

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

Еще интереснее. А буфер у вас на запись какой частотой тактируется, раз ему на вход данные приходят последовательно?
Go to the top of the page
 
+Quote Post
Vengin
сообщение Feb 28 2011, 12:51
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 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).
Go to the top of the page
 
+Quote Post
Shtirlits
сообщение Feb 28 2011, 12:59
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 845
Регистрация: 18-10-04
Из: Pereslavl-Zalessky, Russian Federation
Пользователь №: 905



Имея высокую частоту можно получить "битовую" цифровым способом - несложная программистская задача.
Фронты будут немного несовпадать с идеальной, в пределах одного периода высокой частоты - в вашем случает это порядка 1%.
Go to the top of the page
 
+Quote Post
stoker
сообщение Feb 28 2011, 13:13
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 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. Скорее всего нет, хотя могу ошибаться. Все это нестандартное использование.
Go to the top of the page
 
+Quote Post
DmitryR
сообщение Feb 28 2011, 13:26
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 535
Регистрация: 20-02-05
Из: Siegen
Пользователь №: 2 770



Цитата(Vengin @ Feb 28 2011, 15:51) *
Есть, несколько разных: 22.579 MHz (44.1KHz*512), 24.576MHz (48KHz*512), 62.208MHz, 125MHz. Но я не совсем понимаю к чему вы клоните.

Зато я возможно понимаю. Похоже у вас на плате есть word_clock*512. Подайте его внутрь и поделите на 4.
Go to the top of the page
 
+Quote Post
Vengin
сообщение Feb 28 2011, 14:23
Сообщение #12


Частый гость
**

Группа: Свой
Сообщений: 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. По сути и те и другие на разных этапах обработки тактируют аудоданные, но прямой связи между ними нет.
Go to the top of the page
 
+Quote Post
Shtirlits
сообщение Feb 28 2011, 15:00
Сообщение #13


Знающий
****

Группа: Свой
Сообщений: 845
Регистрация: 18-10-04
Из: Pereslavl-Zalessky, Russian Federation
Пользователь №: 905



Какая погрешность устроит?
Можно ли применять такой клок как системный для ЦАП - зависит от ЦАП и приложения.
Go to the top of the page
 
+Quote Post
stoker
сообщение Feb 28 2011, 15:57
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 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 часов.
Go to the top of the page
 
+Quote Post
Vengin
сообщение Mar 1 2011, 13:22
Сообщение #15


Частый гость
**

Группа: Свой
Сообщений: 82
Регистрация: 7-02-07
Из: Беларусь, г. Минск
Пользователь №: 25 149



Цитата(stoker @ Feb 28 2011, 17:57) *
...А не надо ее трогать, DDS лучше самому написать, сделать довольно просто...
Спс за наводку, вроде идею понял, хотя детали ещё не до конца. Как получится постараюсь отписаться.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th June 2025 - 10:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.01633 секунд с 7
ELECTRONIX ©2004-2016