Динамічний зсув фази частоти з pll
Динамічний зсув фази частоти з PLL
У нас на сайті вже була пара статей про PLL.
PLL - це, якщо говорити просто, вбудований в ПЛІС генератор тактових частот. Він дозволяє з одними вхідними тактової частоти синтезувати кілька інших з іншої заданої частотою, скважностью і, при бажанні, з деяким початковим зсувом фази.
Зараз я хочу розповісти про можливості динамічно зрушувати фазу тактової частоти PLL. Ця можливість є в PLL таких FPGA. як Cyclone III, Cyclone IV, в MAX10 та інших. Сказати по правді я і сам ось тільки що ознайомився з цією функцією в PLL. Просто раніше у мене в цьому не було ніякої необхідності, а зараз з'явився проект, де це може знадобитися. Зсув фази PLL - це схоже єдиний спосіб акуратно управляти затримками сигналів.
Отже, в Візард є закладка під номером 2: PLL Reconfiguration. там внизу ставимо галочку: Create optional inputs for dynamic phase reconfiguration.

Як тільки ставимо галочку, то зліва візард показує блок PLL і в ньому з'являються нові входи і виходи, яких раніше не було.
За допомогою цих сигналів можна управляти фазами будь-який вихідний тактової частоти PLL.
Сигнал phasecounterselect [2..0] дозволяє вибрати, який саме з внутрішніх лічильників PLL буде змінюватися. В документації на PLL ПЛІС MAX10 є ось така таблиця:

Таким чином, якщо потрібно зрушити фазу вихідний тактової частоти c0, то потрібно ставити phasecounterselect = 3'b010. Якщо зрушуємо по фазі тактову частоту c1, то phasecounterselect = 3'b011.
Фазовий зсув вихідний тактової частоти ініціюється установкою сигналу phasestep в логічну одиницю. Це буде початок транзакції по зрушенню фази. За одну "транзакцію" фаза обраної частоти зсувається на один крок фази (про це трохи пізніше). Після закінчення зсуву фази тактової частоти PLL виставляє сигнал phasedone. Якщо потрібно зрушити фазу ще, то потрібно спершу опустити phasestep в логічний нуль, і потім знову встановити в одиницю, починаючи наступну транзакцію.
Сигнал phaseupdown визначає напрямок зсуву фази, вперед або назад.
Тепер головне питання: а на скільки власне ми можемо зрушити фазу тактової частоти? У документації чітко написано, що крок фазового зсуву - це 1/8 періоду частоти VCO PLL. VCO - внутрішній генератор керований напругою. На жаль, в Візард PLL немає можливості явно виставляти бажану частоту Fvco. Її можна тільки подивитися яка вийде при наших налаштуваннях.
Наприклад: якщо вхідна частота на PLL 100 МГц і вихідну частоту PLL я ставлю 100МГц, то візард сам каже, що Fvco всередині PLL буде 600МГц.

Це означає, що дозвіл по фазі, один фазовий зсув тактової частоти можна зробити приблизно на 7,5 градусів, тобто можна зрушити фронт частоти на 208,33 пикосекунд. А чи можна підвищити дозвіл?
Мені вдалося підібрати ось такі коефіцієнти:
- вихід PLL c0, коефіцієнт множення 98, коефіцієнт ділення 99, результуюча частота

При цьому я бачу, що Fvco = 1286,666МГц, а дозвіл по фазі стало 97,15 пикосекунд. Це дуже висока роздільна здатність по фазі.
В документації на PLL є ось така тимчасова діаграма, що показує, як проводиться динамічний зсув фази:

Я пропоную, спробувати просімуліровать цю справу в ModelSim.
Роблю простий проект в Intel Quartus Prime Lite, де немає практично нічого, крім однієї PLL і найпростішої логіки, яка періодично зрушує фазу вихідний частоти c1. Модуль верхнього рівня проекту я написав на Verilog:
module top (
input wire KEY0,
input wire KEY1,
input wire CLK100MHZ,
inout wire [19: 0] IO,
output wire [7: 0] LED
);
wire wc0;
wire wc1;
wire wc2;
wire wlocked;
wire wpdone;
reg phase_step = 1'b0;
mypll mypll_ (
.areset (1'b0),
.inclk0 (CLK100MHZ),
.phasecounterselect (3'b011),
.phasestep (phase_step),
.phaseupdown (1'b1),
.scanclk (wc0),
.c0 (wc0),
.c1 (wc1),
.c2 (wc2),
.locked (wlocked),
.phasedone (wpdone)
);
reg [3: 0] cnt = 0;
always @ (posedge wc0)
cnt <= cnt + 1;
always @ (negedge wc0)
if (cnt == 4'hF)
phase_step <= 1'b1;
else
if (wpdone == 1'b0)
phase_step <= 1'b0;
assign LED = 0;
assign IO [0] = wc0;
assign IO [1] = wc1;
assign IO [19: 2] = 0;
Я роблю проект як би для плати Марсоход3bis і чіпом ПЛІС MAX10. Тому у мене тут є вхідні сигнали KEY0 і KEY1, які зараз не використовуються, але нехай будуть. Вихідні сигнали LED не використовуються, але на виходи IO [0] і IO [1] я вивів виходи c0 і c1 з PLL. Це щоб їх зручно було спостерігати в симуляторі.
Тут в проекті всі процеси відбуваються на частоті c0, і ця ж частота подається на scanclk. За спаду цієї ж частоти встановлюється і скидається phase_step.
Тестбенч для симуляції не робить нічого особливого, ну ось тільки подає на тестовий модуль вихідну тактову частоту 100 МГц.
`Timescale 1ns / 10ps
// assume basic clock is 100Mhz
reg clk;
initial clk = 0;
always
# 5 clk =
wire [7: 0] w_led;
wire [19: 0] w_io;
top top_inst (
.CLK100MHZ (clk),
.KEY0 (1'b1),
.KEY1 (1'b1),
.IO (w_io),
.LED (w_led)
);
Оскільки я хочу подивитися на досить малі зрушення фаз тактових частот, то я б, звичайно, хотів провести тимчасову симуляцію проекту в ModelSim. Для цього я вказав в настройках проекту, що я буду використовувати ModelSim-Altera для симуляції. При цьому я очікував побачити згенеровані вихідні файли проектів типу SDO або SDF.

На жаль мій Квартус іншої думки.
При компіляції проекту він видає повідомлення: Warning (10905): Generated the EDA functional simulation netlist because it is the only supported netlist type for this device. Виходить, що для мікросхем MAX10 поки можна зробити тільки функціональну симуляцію? Квартус згенерував мені тільки файл top.vo
Що я бачу на тимчасових діаграмах: Модуль top періодично виставляє сигнал phase_step і PLL відповідає коротким імпульсом в нуль сигналом phasedone.
Якщо зробити zoom і спробувати розглянути докладніше фази тактових частот, то відразу стає видно, що фаза сигналу IO [1], який у мене підключений до виходу PLL з1 йде вперед відразу після сигналу phasedone:
Виходить, що в симуляції я вже можу бачити як зсувається фаза тактової частоти. До речі, зверніть увагу, наскільки малий крок фази в порівнянні з періодом самої частоти. Ефект зсуву фази можна спробувати використовувати в схемах вимірювання затримки сіналов, в рефлектометром та інших вимірниках.
Я постараюся зробити проект простого вимірювача, який зможе оцінювати затримку поширення сигналу з точністю близько 100 пикосекунд.
Якщо в мегавізарде поставити галочку "enable phase shift step resolution", то легше управляти частотою VCO. Вихідну частоту можна вказати круглої - 100 МГц, а phase shift step resolution "- 96ps для 1300МГц VCO, 104ps для 1200МГц VCO, і тд. Зайві жмутки вводити не потрібно.
Ви можете додати свій тестбенч до проекту і встановити настройку NativeLink "Compile Test Bench". Тоді симуляція буде працювати в один клік (Tools -> Simulation Tool -> Run RTL Siumulation), не потрібно буде створювати проекти і додавати бібліотеки в ModelSim, все буде працювати "з коробки".
"Я постараюся зробити проект простого вимірювача, який зможе оцінювати затримку поширення сигналу з точністю близько 100 пикосекунд" - з нетерпінням чекаю!
10Гвиб / сек, але все руки не доходили.