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

 
 
> Управляемый делитель тактовой частоты(клоков)
shamrel
сообщение Jan 14 2016, 05:28
Сообщение #1


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

Группа: Свой
Сообщений: 132
Регистрация: 10-10-07
Из: Новосибирск
Пользователь №: 31 229



Приветствую!
В системе есть тактовая частота Fclk = 200МГц. От этой частоты нужно тактировать АЦП, ЦАП и цепочки фильтров. Причем, частота выборки устанавливается из вне (передается параметр) и может быть любой из Fclk/N , где N -- целое число 16-битное число (включая 1).
Как можно это сделать? Делитель на счетчике с загрузкой? Выход не будет синхронным с основной частотой, да и минимальный коэффициент деления 2, а нужно 1 (нет деления). Использовать перестраиваемый PLL? Сильно громоздко получается (в Altera), или может я не до конца разобрался как это сделать. Или смириться с асинхронностью схемы?


--------------------
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 18)
Bad0512
сообщение Jan 14 2016, 05:39
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 802
Регистрация: 11-05-07
Из: Томск
Пользователь №: 27 650



Цитата(shamrel @ Jan 14 2016, 11:28) *
Приветствую!
В системе есть тактовая частота Fclk = 200МГц. От этой частоты нужно тактировать АЦП, ЦАП и цепочки фильтров. Причем, частота выборки устанавливается из вне (передается параметр) и может быть любой из Fclk/N , где N -- целое число 16-битное число (включая 1).
Как можно это сделать? Делитель на счетчике с загрузкой? Выход не будет синхронным с основной частотой, да и минимальный коэффициент деления 2, а нужно 1 (нет деления). Использовать перестраиваемый PLL? Сильно громоздко получается (в Altera), или может я не до конца разобрался как это сделать. Или смириться с асинхронностью схемы?

Использовать поделённую в ПЛИС частоту для тактирования АЦП и ЦАП неправильно, тема неоднократно обсуждалась. Ставьте внешню целочисленную PLL и управляйте её настройками.
Go to the top of the page
 
+Quote Post
Vascom
сообщение Jan 14 2016, 06:52
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 232
Регистрация: 2-08-07
Из: Москва
Пользователь №: 29 534



Чтобы был делитель на 1 - просто добавь мультиплексор, который будет либо от счётчика, либо напрямую пускать клок.
И выход счётчика естественно будет синхронным с основной частотой, если его тактировать ею же.
Go to the top of the page
 
+Quote Post
Dmitriyspb
сообщение Jan 14 2016, 07:20
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 397
Регистрация: 21-11-12
Из: Россия г. Санкт-Петербург
Пользователь №: 74 498



Цитата(shamrel @ Jan 14 2016, 08:28) *
Приветствую!
В системе есть тактовая частота Fclk = 200МГц. От этой частоты нужно тактировать АЦП, ЦАП и цепочки фильтров. Причем, частота выборки устанавливается из вне (передается параметр) и может быть любой из Fclk/N , где N -- целое число 16-битное число (включая 1).
Как можно это сделать? Делитель на счетчике с загрузкой? Выход не будет синхронным с основной частотой, да и минимальный коэффициент деления 2, а нужно 1 (нет деления). Использовать перестраиваемый PLL? Сильно громоздко получается (в Altera), или может я не до конца разобрался как это сделать. Или смириться с асинхронностью схемы?


Я делал это достаточно просто. АЦП и ЦАП тактируются максимальной частотой, а содержимое регистров АЦП и ЦАП обнавляются с различной (программируемой) частотой. Т.о. такты я не трогаю - это глобальные цепи с постоянным с фиксированной частотой.

Вот частота обновления входного (для АЦП) регистра и выходного (для ЦАП) регистра и задают период дискретизации.

Нарисую времянки

__/'''\__/'''\__/'''\__/'''\__/'''\__/'''\__/'''\__/'''\__/'''\__/'''\__/'''\__/'''\__/'''\__/'''\__ Fclk = 200МГц

_/''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' CLOCK ENABLE для регистров АЦП и ЦАП для N = 1;

__/''''''''\____/''''''''\____/''''''''\____/''''''''\____/''''''''\____/''''''''\____/''''''''\____/ CLOCK ENABLE для регистров АЦП и ЦАП для N = 2;

__/''''''''\_________/''''''''\________/''''''''\________/''''''''\_________/''''''''\____ CLOCK ENABLE для регистров АЦП и ЦАП для N = 4;



ПРАВДА ЭТО ВАМ НАВЕРНОЕ НЕ ПОДОЙДЕТ=)))) ТУТ ДЕЛИТЕЛЬ КРАТНЫЙ 2


Цитата(Bad0512 @ Jan 14 2016, 08:39) *
Ставьте внешню целочисленную PLL и управляйте её настройками.


ИМХО, это единственный надежный вариант.

В ПЛИС системная частота должна быть постоянная.


--------------------
Победа - это когда N раз упал и N+1 раз встал.
Go to the top of the page
 
+Quote Post
Vascom
сообщение Jan 14 2016, 07:54
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 232
Регистрация: 2-08-07
Из: Москва
Пользователь №: 29 534



В ПЛИС системная частота вовсе не обязана быть постоянной. Во встроенные PLL специально заложены возможности переконфигурации на лету, мультиплексоры и гейтеры клоковых сигналов.

Просто с постоянной частотой значительно надёжнее и проще получается проект.
Go to the top of the page
 
+Quote Post
shamrel
сообщение Jan 14 2016, 07:59
Сообщение #6


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

Группа: Свой
Сообщений: 132
Регистрация: 10-10-07
Из: Новосибирск
Пользователь №: 31 229



Vascom, имхо, мультиплексор внесет трудно прогнозируемую задержку. Особенно, если учесть, что исходные клоки (делитель 1) и клоки, после делителя (делитель на 2 и более) имеют всяко разную задержку. Да даже в идеале фаза будет смещена на 180.

Dmitriyspb, спасибо! Что-то похожее крутилось в голове, но не могло сформироваться! Собственно, делитель не кратный 2, думаю, не составит труда сделать. Главное, что б на выходе длительность разрешающего импульса была равна периоду задающего такта.

Внешний PLL -- наверное хорошо, но бюджет устройства крайне ограничен. Каждую лишнюю точку пайки считают.

P.S.: Dmitriyspb, отдельное вам спасибо, за то, что показали как в ASCII на диаграмме единичку рисовать, а то я все символом 'T' sm.gif



--------------------
Go to the top of the page
 
+Quote Post
Vascom
сообщение Jan 14 2016, 08:01
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 232
Регистрация: 2-08-07
Из: Москва
Пользователь №: 29 534



О задержках будет думать Timing Analyser при сборке. Ни каких проблем не возникнет, просто фазу PLL подвинет (если основной клок завести на PLL и от неё уже всё остальное делать, можно даже с делителем 1).

То есть свой внешний клок 200МГц заводишь на PLL, с неё берёшь тоже 200МГц и с ним уже работаешь. Все задержки будут выровнены и выставлены как надо. Мультиплексоры тоже не обычные а специальные клоковые используешь. Я так не помню как примитив называется, но он точно есть.
Go to the top of the page
 
+Quote Post
Dmitriyspb
сообщение Jan 14 2016, 08:13
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 397
Регистрация: 21-11-12
Из: Россия г. Санкт-Петербург
Пользователь №: 74 498



Цитата(shamrel @ Jan 14 2016, 10:59) *
Главное, что б на выходе длительность разрешающего импульса была равна периоду задающего такта.


Если правильно сделаете формирователь импульсов, то все будет ровненько стоять

Цитата(Vascom @ Jan 14 2016, 11:01) *
То есть свой внешний клок 200МГц заводишь на PLL, с неё берёшь тоже 200МГц и с ним уже работаешь. Все задержки будут выровнены и выставлены как надо. Мультиплексоры тоже не обычные а специальные клоковые используешь. Я так не помню как примитив называется, но он точно есть.


Не знаю про такой способ... Если это действительно можно, тогда хорошо. Но я бы так не стал делать

Цитата(Vascom @ Jan 14 2016, 10:54) *
Просто с постоянной частотой значительно надёжнее.


Любое устройство должно работать надежно=))))))))



--------------------
Победа - это когда N раз упал и N+1 раз встал.
Go to the top of the page
 
+Quote Post
Vascom
сообщение Jan 14 2016, 08:16
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 232
Регистрация: 2-08-07
Из: Москва
Пользователь №: 29 534



Цитата(Dmitriyspb @ Jan 14 2016, 11:13) *
Не знаю про такой способ... Если это действительно можно, тогда хорошо. Но я бы так не стал делать

Это единственный нормальный способ, если требуется от внешнего клока формировать ещё какие-то клоки, даже статически. PLL, подкручивая фазу, позволяет почти не заботиться о задержках клока от пина. Это сильно помогает разводить сложные проекты на высокой частоте.
Go to the top of the page
 
+Quote Post
dm.pogrebnoy
сообщение Jan 14 2016, 08:33
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 747
Регистрация: 11-04-07
Пользователь №: 26 933



И как обычно, никто не вспоминает, что ПЛИС для тактирования высокоскоростных АЦП является не лучшим решением ввиду большого джиттера их PLL.
blackfin приводил графики деградации SNR и ENOB:
http://electronix.ru/forum/index.php?showt...t&p=1389306


--------------------
Go to the top of the page
 
+Quote Post
Dmitriyspb
сообщение Jan 14 2016, 08:40
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 397
Регистрация: 21-11-12
Из: Россия г. Санкт-Петербург
Пользователь №: 74 498



Цитата(Vascom @ Jan 14 2016, 11:16) *
Это единственный нормальный способ

может бытьbiggrin.gif


Цитата(dm.pogrebnoy @ Jan 14 2016, 11:33) *
И как обычно, никто не вспоминает, что ПЛИС для тактирования высокоскоростных АЦП является не лучшим решением ввиду большого джиттера их PLL.
blackfin приводил графики деградации SNR и ENOB:
http://electronix.ru/forum/index.php?showt...t&p=1389306


Думаю, что дело говорит.... Где клоки, там надо быть внимательнее=))) 200 МГц не мало
Причина редактирования: поправил мат (с) модератор


--------------------
Победа - это когда N раз упал и N+1 раз встал.
Go to the top of the page
 
+Quote Post
Anton1990
сообщение Jan 14 2016, 15:42
Сообщение #12


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

Группа: Участник
Сообщений: 155
Регистрация: 26-04-12
Пользователь №: 71 584



Цитата(shamrel @ Jan 14 2016, 08:28) *
Приветствую!
В системе есть тактовая частота Fclk = 200МГц. От этой частоты нужно тактировать АЦП, ЦАП и цепочки фильтров. Причем, частота выборки устанавливается из вне (передается параметр) и может быть любой из Fclk/N , где N -- целое число 16-битное число (включая 1).
Как можно это сделать? Делитель на счетчике с загрузкой? Выход не будет синхронным с основной частотой, да и минимальный коэффициент деления 2, а нужно 1 (нет деления). Использовать перестраиваемый PLL? Сильно громоздко получается (в Altera), или может я не до конца разобрался как это сделать. Или смириться с асинхронностью схемы?


У меня примерно такая же ситуация. Такт делиться на 1/2/4/8/16/32 на счетчике и все это идет на управляемый мультиплексор (m16_1) выход которого используется для ТАКТИРОВАНИЯ всей схемы. Максимальная входная частота 200 МГц. Все работает. НО ЭТО КРАЙНЕ НЕПРАВИЛЬНО. Но как говориться: Если нельзя, но очень хочется, то можно. Хочу заметить что проект серийный и проблем от ПЛИС к ПЛИС нет. Но на этапе разработки конечно геморройно.
Go to the top of the page
 
+Quote Post
AJIEKCEu
сообщение Jan 14 2016, 19:58
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 314
Регистрация: 7-12-05
Пользователь №: 11 917



Я не совсем понимаю схему (недостаточно данных), но если на АЦП клок заходит с плис то делаем следующую вещь: Опорный клок-> Делитель на целое число с учетом DDR триггера на выходе -> выходной DDRC триггер.

Отсутствие PLL (и выходного триггера (обязательно расположенного в блоке ввода вывода, у Xilinx это называется iob, у Altera возможно по-другому) даст более качественную выходную частоту нежели с PLL (хотя наверное чуть-чуть хуже, чем при использовании внешних компонентов). Использование DDR триггера позволит делить клок на числа некратные двойке.

По идее должно быть сильно лучше чем с PLL. Насколько возможно отсутствие PLL - Не совсем понял из условий задачи.

Ещё не совсем понял, как вы выбираете частоту дискретизации извне? У вас гарантированно только полезный сигнал приходит на АЦП? Уже отфильтрован внешними условиями/схемами?
Go to the top of the page
 
+Quote Post
Bad0512
сообщение Jan 15 2016, 04:24
Сообщение #14


Знающий
****

Группа: Свой
Сообщений: 802
Регистрация: 11-05-07
Из: Томск
Пользователь №: 27 650



Есть ещё вариант - АЦП и ЦАП работают на максимальной частоте 200МГц всегда, далее в ПЛИС реализуется целочисленный дециматор для сигналов с АЦП и соответственно целочисленный интерполятор в случае ЦАП.
По цифровой части получается довольно громоздко и затратно, зато минимум хардверных изменений в плате.
Go to the top of the page
 
+Quote Post
shamrel
сообщение Jan 15 2016, 04:48
Сообщение #15


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

Группа: Свой
Сообщений: 132
Регистрация: 10-10-07
Из: Новосибирск
Пользователь №: 31 229



Цитата(AJIEKCEu @ Jan 14 2016, 22:58) *
Я не совсем понимаю схему (недостаточно данных), но если на АЦП клок заходит с плис то делаем следующую вещь: Опорный клок-> Делитель на целое число с учетом DDR триггера на выходе -> выходной DDRC триггер.

Отсутствие PLL (и выходного триггера (обязательно расположенного в блоке ввода вывода, у Xilinx это называется iob, у Altera возможно по-другому) даст более качественную выходную частоту нежели с PLL (хотя наверное чуть-чуть хуже, чем при использовании внешних компонентов). Использование DDR триггера позволит делить клок на числа некратные двойке.

По идее должно быть сильно лучше чем с PLL. Насколько возможно отсутствие PLL - Не совсем понял из условий задачи.

Ещё не совсем понял, как вы выбираете частоту дискретизации извне? У вас гарантированно только полезный сигнал приходит на АЦП? Уже отфильтрован внешними условиями/схемами?

Собственно, система такая. Есть 4 АЦП, каждый АЦП работает на 50МГц. Тактируется с ПЛИС (Altera). Частота АЦП неизменна. Внутри ПЛИС на каждый канал установлен дециматор CIC. После фильтра данные идут на мультиплексор. Выходы 4 каналов складываются в один большой FIFO. С другой стороны FIFO данные передаются в компьютер. Для работы CIC нужна опорная частота, которая будет определять коэффициент децимации, а по сути эквивалентную частоту дискретизации канала. Этот коэффициент децимации скидывается управляющей программой с компьютера. Таким образом, управление мультиплексоров должно выполнятся на частоте в 4 раза больше, чем частота CIC, и достигать максимума в 200МГц, когда децимация не требуется. На плату приходит 50МГц с внешнего генератора.
В кристалле 2 PLL, одна используется для High speed USB, вторую планирую использовать для опроса АЦП.
По поводу DDR триггера. Я не знаю как это реализовать. С ПЛИС работаю недавно.


--------------------
Go to the top of the page
 
+Quote Post
Maverick
сообщение Jan 15 2016, 05:11
Сообщение #16


я только учусь...
******

Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839



Цитата(shamrel @ Jan 15 2016, 06:48) *
По поводу DDR триггера. Я не знаю как это реализовать. С ПЛИС работаю недавно.

Реализовывать не надо, нужно использовать из схемотехнической библиотекив взять готовый DDR триггер


--------------------
If it doesn't work in simulation, it won't work on the board.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post
AJIEKCEu
сообщение Jan 16 2016, 02:37
Сообщение #17


Местный
***

Группа: Свой
Сообщений: 314
Регистрация: 7-12-05
Пользователь №: 11 917



Мне кажется, без минимальной схемы - тут никуда. Я имею ввиду функциональной.
Если у вас частота на АЦП неизменна(50 МГц) - какой клок вам нужен на CIC? По идее данные заходят на CIC с частотой работы (дискретизации) АЦП. А вот выходят из CIC - на меньшей частоте. Но обычно это реализуется не другой частотой, а значимостью сигнала. То есть на входе - каждый такт значимый, а на выходе есть некий отдельный признак значимых данных. Который возникает раз в 1/2/4/8 и т.д. тактов.
Go to the top of the page
 
+Quote Post
shamrel
сообщение Jan 16 2016, 04:07
Сообщение #18


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

Группа: Свой
Сообщений: 132
Регистрация: 10-10-07
Из: Новосибирск
Пользователь №: 31 229



Цитата(AJIEKCEu @ Jan 16 2016, 05:37) *
Мне кажется, без минимальной схемы - тут никуда. Я имею ввиду функциональной.
Если у вас частота на АЦП неизменна(50 МГц) - какой клок вам нужен на CIC? По идее данные заходят на CIC с частотой работы (дискретизации) АЦП. А вот выходят из CIC - на меньшей частоте. Но обычно это реализуется не другой частотой, а значимостью сигнала. То есть на входе - каждый такт значимый, а на выходе есть некий отдельный признак значимых данных. Который возникает раз в 1/2/4/8 и т.д. тактов.

Все верно. Все в соответствии с вашей идеей. sm.gif Только термин "значимость" слышу первый раз.
CIC состоит из двух частей, первая часть работает на частоте DAC (50 МГц) . Вторая часть должна работать на пониженной частоте. Разработчик, который вел проект до меня, сделал это через тактирование. Клоки для второй части CIC брались от делителя (на счетчике) от клоков DAC. Проект был реализован в редакторе Schematic и без всяких sdc. Проект успешно (!) прошел тестирования и пошел в серию. Пока не понадобилось внести изменение в функционал и перевести на другую элементную базу. Небольшие изменения вносимые в произвольную часть схемы нарушали работоспособность. Когда добавил .sdc и прогнал в TimeQuest получил сплошные слаки. Исходная прошивка перестала быть работоспособной. Было принято решение переписать на Verilog.
Что еще добавить? Пожалуй, то что я с ПЛИС до этого серьезно не работал.
Возвращаясь к теме. Dmitriyspb предложил идею, которую сейчас прорабатываю. Первая и вторая часть тактируется одной, системной частотой, а понижение частоты происходит посредствам "пропускания" тактов. Типа:

always @(posedge clk)
....
if(sample)...

где clk -- клоки высокочастотные (200МГц), а sample -- разрешение.


--------------------
Go to the top of the page
 
+Quote Post
des00
сообщение Jan 16 2016, 06:55
Сообщение #19


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(shamrel @ Jan 16 2016, 11:07) *
CIC состоит из двух частей, первая часть работает на частоте DAC (50 МГц) . Вторая часть должна работать на пониженной частоте. Разработчик, который вел проект до меня, сделал это через тактирование. Клоки для

Код
  always_ff @(posedge iclk) begin
    cnt <= cnt + 1'b1;
    //
    cic_comb__ival <= get_decim_factor(ibw, cnt);
    cic_comb__idat <= cic_acc__odat;
  end

  //------------------------------------------------------------------------------------------------------
  //
  //------------------------------------------------------------------------------------------------------

  generate
    genvar i;
    for (i = 0; i < 2; i++) begin : cic_array_inst
      cic_acc_array
      #(
        .pDAT_W ( cDAT_W      ) ,
        .pNUM   ( cRX_CIC_NUM )
      )
      cic_acc
      (
        .iclk    ( iclk    ) ,
        .ireset  ( ireset  ) ,
        .iclkena ( iclkena ) ,
        //
        .ival    ( 1'b1              ) ,
        .idat    ( cic_acc__idat [i] ) ,
        .oval    (                   ) ,
        .odat    ( cic_acc__odat [i] )
      );

      cic_comb_array
      #(
        .pDAT_W ( cDAT_W      ) ,
        .pNUM   ( cRX_CIC_NUM )
      )
      cic_comb
      (
        .iclk    ( iclk    ) ,
        .ireset  ( ireset  ) ,
        .iclkena ( iclkena ) ,
        //
        .ival    ( cic_comb__ival     ) ,
        .idat    ( cic_comb__idat [i] ) ,
        .oval    ( cic_comb__oval [i] ) ,
        .odat    ( cic_comb__odat [i] )
      );
    end
  endgenerate
..................
  //
  // decimate 1/2/4/8/16/32
  function logic get_decim_factor(input bit [3 : 0] bw, input bit[4 : 0] cnt);
    get_decim_factor = 1'b1;
    case (bw)
      0       : get_decim_factor = 1'b1;
      1       : get_decim_factor = &cnt[0 : 0];
      2       : get_decim_factor = &cnt[1 : 0];
      3       : get_decim_factor = &cnt[2 : 0];
      4       : get_decim_factor = &cnt[3 : 0];
      5       : get_decim_factor = &cnt[4 : 0];
      default : get_decim_factor = 1'b1;
    endcase
  endfunction



--------------------
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 3rd August 2025 - 16:28
Рейтинг@Mail.ru


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