← Về trang chủ
Design 17 tháng 5, 2026 ⟳ 12 phút đọc

PLL Loop Dynamics: Stability và Bandwidth — Chọn thế nào cho đúng?

Hiểu transfer function của PLL, phase margin, và cách chọn loop bandwidth để cân bằng giữa jitter và tracking speed — kèm ví dụ số cụ thể.

pllloop-filterstabilityphase-marginbandwidth
Nhận bài viết mới

Không spam. Chỉ bài kỹ thuật AMS đáng đọc — gửi qua email khi có bài mới.

Có một câu hỏi mà hầu hết sinh viên không được hỏi trong trường, nhưng sẽ được hỏi khi đi làm: “Loop bandwidth chọn bao nhiêu, và tại sao?”

Nếu câu trả lời là “em lấy rule of thumb fref/10f_{ref}/10” — đó là điểm xuất phát, không phải câu trả lời. Engineer thực tế cần biết con số đó đến từ đâu, trade-off là gì, và khi nào rule of thumb đó sai.

Bài này đi từ câu hỏi đó: tại sao PLL cần loop filter, phase margin là gì và bao nhiêu thì đủ, bandwidth nên chọn thế nào — và một vài điều textbook hay bỏ qua.


Mục lục

  1. PLL nhìn từ góc độ control loop
  2. Transfer function của từng khối
  3. Open-loop gain và phase margin
  4. Chọn loop bandwidth: trade-off jitter vs. tracking
  5. Ví dụ thiết kế có số
  6. Bài học cho engineer

1. PLL nhìn từ góc độ control loop

PLL là một feedback loop — không khác gì op-amp feedback về mặt bản chất. Mục tiêu của nó là kéo phase của VCO bám theo phase của reference.

CPPLL Diagram

Ký hiệu thống nhất cho cả bài:

Tham sốKý hiệuĐơn vị
Phase detector / charge pump gainKϕK_\phiA/rad
VCO gainKVCOK_{VCO}rad/s/V
Divider ratioNN
Loop filter impedanceZ(s)Z(s)Ω

2. Từng khối làm gì trong vòng lặp?

Trước khi nhân tất cả lại thành open-loop gain, mình cần hiểu từng khối đang làm gì — và tại sao nó quan trọng với stability.

Charge pump + PFD — đơn giản là một gain

PFD nhìn vào phase của reference và phase của feedback, rồi ra lệnh cho charge pump bơm dòng vào hoặc hút dòng ra khỏi loop filter. Lệch bao nhiêu radian → bơm bấy nhiêu ampere. Quan hệ đó chỉ là một hằng số:

ICP=KϕθerrI_{CP} = K_\phi \cdot \theta_{err}

Với Kϕ=ICP,nominal/(2π)K_\phi = I_{CP,nominal} / (2\pi). Ví dụ ICP=200 μAI_{CP} = 200\ \mu\text{A} thì Kϕ31.8 μA/radK_\phi \approx 31.8\ \mu\text{A/rad} — khối này không tạo thêm pole hay zero gì cả, chỉ là gain thuần.

Loop filter — đây là nơi mọi thứ phức tạp bắt đầu

Loop filter có nhiệm vụ kép: vừa tích phân dòng CP thành điện áp điều khiển VCO, vừa phải làm vòng lặp ổn định. Cấu trúc phổ biến nhất là R nối tiếp C1, song song với C2 nhỏ hơn để lọc ripple.

Bỏ qua C2 trước để thấy ý tưởng chính: tụ C1 không cho điện áp thay đổi tức thì — nó tích phân dòng CP theo thời gian. Đây chính là integrator (pole tại DC), lý do PLL type-II có thể kéo phase error về zero hoàn toàn mà không cần error dư để duy trì dòng.

Vấn đề: integrator tạo ra −90° phase shift. Khi nhân với pole của VCO (cũng −90°), tổng phase là −180° ở mọi tần số → vòng lặp dao động. Điện trở R giải quyết việc này — nó tạo ra một zero ở tần số fz=1/(2πRC1)f_z = 1/(2\pi RC_1), kéo phase lên lại đúng chỗ cần.

Gom lại thành công thức (với C2C1C_2 \ll C_1):

Z(s)1+sτzsC1,τz=RC1Z(s) \approx \frac{1 + s\tau_z}{s C_1}, \quad \tau_z = RC_1

VCO — tích phân thêm một lần nữa

VCO nhận điện áp Vtune, output là tần số. Nhưng trong PLL mình quan tâm đến phase, không phải tần số — mà phase là tích phân của tần số theo thời gian:

ϕVCO(s)=KVCOsVtune(s)\phi_{VCO}(s) = \frac{K_{VCO}}{s} \cdot V_{tune}(s)

Cái 1/s1/s này là pole thứ hai tại DC. Kết hợp với pole của C1 trong loop filter → PLL type-II có hai integrator, hai pole tại DC, slope −40 dB/dec ở tần số thấp. Không có zero thì vòng lặp chắc chắn dao động.

Divider — chỉ là chia gain

ϕfb(s)=ϕVCO(s)N\phi_{fb}(s) = \frac{\phi_{VCO}(s)}{N}

Divider giảm phase gain xuống N lần trong đường feedback. Hệ quả thực tế: noise từ reference bị nhân lên N2N^2 lần ở output — cái này quan trọng khi tính phase noise, sẽ nói ở bài 3.


3. Open-loop gain và phase margin

Open-loop gain

Để phân tích stability, mình “cắt” vòng lặp tại điểm feedback — tưởng tượng bẻ gãy dây từ divider về PFD, bơm tín hiệu test vào một đầu và đo tín hiệu ra ở đầu kia. Tỉ số đó là open-loop gain L(s)L(s). Nếu L=1|L| = 1 tại tần số mà phase = −180°, vòng lặp dao động.

Nhân tất cả các khối lại (theo đường tín hiệu từ PFD → CP → LF → VCO → Divider):

L(s)=KϕZ(s)KVCOs1NL(s) = K_\phi \cdot Z(s) \cdot \frac{K_{VCO}}{s} \cdot \frac{1}{N}

Thay Z(s)Z(s) vào và bỏ qua τp\tau_p (pole bổ sung nhỏ) để thấy dạng cơ bản:

L(s)KϕKVCON1+sτzs2C1L(s) \approx \frac{K_\phi K_{VCO}}{N} \cdot \frac{1 + s\tau_z}{s^2 C_1}

Đây là hệ thống type-II — hai integrator, slope −40 dB/decade ở tần số thấp.

CPPLL Bode Plot

Phase margin

Phase margin là khoảng cách từ phase tại unity gain frequency (ωc\omega_c) đến 180°-180°:

PM=180°+L(jωc)PM = 180° + \angle L(j\omega_c)

Với type-II PLL không có zero thì phase tại ωc\omega_c180°-180° → PM = 0° → dao động. Zero τz\tau_z kéo phase lên, tạo ra phase margin dương.

Rule of thumb: PM = 45° là mức tối thiểu chấp nhận được. PM = 60° là target phổ biến — đủ ổn định và settling time không quá dài.

Tại sao PM < 45° nguy hiểm? Vòng lặp vẫn stable về mặt lý thuyết, nhưng step response sẽ có overshoot lớn và ring nhiều lần trước khi settle. Trong thực tế, process/temperature variation có thể đẩy PM xuống âm.


4. Chọn loop bandwidth: trade-off jitter vs. tracking

Loop bandwidth fcf_c (hay ωc=2πfc\omega_c = 2\pi f_c) là tần số unity gain của open-loop — và là tham số quan trọng nhất bạn cần chọn.

Bandwidth ảnh hưởng đến gì?

Jitter từ VCO bị lọc bởi high-pass function của closed loop. Bandwidth càng rộng → lọc được nhiều VCO noise hơn → jitter VCO ít hơn ở output.

Jitter từ reference bị lọc bởi low-pass function của closed loop. Bandwidth càng hẹp → lọc được nhiều reference noise hơn → jitter từ reference ít hơn ở output.

Hai yêu cầu này mâu thuẫn nhau — đây là trade-off cốt lõi của PLL design.

Để thấy rõ mức độ, lấy ví dụ với PLL 2.4 GHz, N = 48:

  • VCO free-running có phase noise −100 dBc/Hz @ 1 MHz offset
  • Reference noise −150 dBc/Hz, nhân lên 20log10(48)34 dB20\log_{10}(48) \approx 34\ \text{dB} → −116 dBc/Hz @ output

Nếu chọn fc=500 kHzf_c = 500\ \text{kHz}: out-of-band VCO noise không được lọc → jitter cao. Nếu chọn fc=5 MHzf_c = 5\ \text{MHz}: reference noise pass qua nhiều hơn → jitter từ reference tăng. Điểm tối ưu nằm ở đâu đó giữa — thường gần chỗ hai đường noise cắt nhau.

CPPLL VCO and Reference Noise Trade-off

Optimal bandwidth

Intuition đơn giản: PLL “chọn” noise source nào ít hơn ở từng vùng tần số. Dưới fcf_c → theo reference, trên fcf_c → theo VCO. Vậy nên đặt fcf_c tại điểm mà noise của hai nguồn bằng nhau — đó là điểm tối ưu.

Về mặt toán: bandwidth tối ưu là tần số mà:

LVCO(fc)=Lref(fc)+20log10(N)\mathcal{L}_{VCO}(f_c) = \mathcal{L}_{ref}(f_c) + 20\log_{10}(N)

Vế phải có +20logN+20\log N vì reference noise bị nhân lên NN lần khi đi qua divider. N càng lớn (tần số output càng cao so với reference) → reference noise contribution càng tệ → optimal bandwidth nên đẩy thấp hơn.

Trong thực tế, khi chưa có đủ phase noise data, hay chọn fcf_c trong khoảng fref/10f_{ref}/10 đến fref/20f_{ref}/20 — vừa tránh aliasing từ discrete-time effect của CP, vừa đảm bảo loop filter đủ thời gian lọc ripple.

Lock time

Lock time (thời gian để PLL bắt lock từ frequency khác) phụ thuộc vào bandwidth:

tlock20fct_{lock} \approx \frac{20}{f_c}

Với fc=1 MHzf_c = 1\ \text{MHz} thì tlock20 μst_{lock} \approx 20\ \mu\text{s}. Bandwidth càng rộng → lock nhanh hơn — nhưng jitter reference sẽ cao hơn.

Hình dung đơn giản: bandwidth rộng giống như mình cập nhật liên tục theo một nguồn bên ngoài — phản ứng nhanh, nhưng nếu nguồn đó có nhiễu thì nhiễu đó đi thẳng vào output. Bandwidth hẹp giống như mình tự quyết định nhiều hơn — ít bị ảnh hưởng bởi nguồn ngoài, nhưng nếu bản thân mình có drift (VCO noise) thì không ai kéo lại kịp.


5. Ví dụ thiết kế có số

Spec

  • Reference: fref=50 MHzf_{ref} = 50\ \text{MHz}
  • Output: fout=2.4 GHzf_{out} = 2.4\ \text{GHz}
  • Divider ratio: N=2400/50=48N = 2400/50 = 48
  • Target loop bandwidth: fc=2 MHzf_c = 2\ \text{MHz} (fref/25f_{ref}/25)
  • Target phase margin: PM ≥ 60°

Thông số khối

  • ICP=200 μAI_{CP} = 200\ \mu\text{A}Kϕ=200μ/(2π)31.8 μA/radK_\phi = 200\mu / (2\pi) \approx 31.8\ \mu\text{A/rad}
  • KVCO=200 MHz/V=2π×200×106 rad/s/VK_{VCO} = 200\ \text{MHz/V} = 2\pi \times 200 \times 10^6\ \text{rad/s/V}

Chọn loop filter — 3 bước

Bước 1: Đặt vị trí zero

Zero phải nằm dưới fcf_c để phase boost kịp tác dụng tại ωc\omega_c. Rule of thumb thực tế: đặt tại fc/3f_c/3.

fz=fc3=2 MHz3667 kHzf_z = \frac{f_c}{3} = \frac{2\ \text{MHz}}{3} \approx 667\ \text{kHz} τz=RC1=12πfz239 ns\tau_z = RC_1 = \frac{1}{2\pi f_z} \approx 239\ \text{ns}

Bước 2: Tính C1 từ điều kiện unity gain

Tại ωc\omega_c, open-loop gain phải bằng 1. Từ công thức L(s)L(s):

C1=KϕKVCONωc21+(ωcτz)2C_1 = \frac{K_\phi K_{VCO}}{N \omega_c^2} \cdot \sqrt{1 + (\omega_c \tau_z)^2}

Hai phần của công thức này có ý nghĩa rõ ràng: phần đầu KϕKVCO/(Nωc2)K_\phi K_{VCO} / (N\omega_c^2) là gain của vòng lặp nếu không có zero — cần C1 đủ lớn để kéo gain về 1. Phần sau 1+(ωcτz)2\sqrt{1+(\omega_c\tau_z)^2} là phase boost factor từ zero — zero càng thấp so với ωc\omega_c thì factor này càng lớn, C1 cần lớn hơn.

Thay số (ωcτz=2π×2M×239n3.0\omega_c\tau_z = 2\pi \times 2\text{M} \times 239\text{n} \approx 3.0):

C131.8μ×1.257G48×158M1+95.3 pF×3.1616.7 pFC_1 \approx \frac{31.8\mu \times 1.257G}{48 \times 158M} \cdot \sqrt{1 + 9} \approx 5.3\ \text{pF} \times 3.16 \approx 16.7\ \text{pF}

Làm tròn xuống giá trị chuẩn: C1=15 pFC_1 = 15\ \text{pF} (sẽ verify lại trong sim).

Bước 3: Tính R và C2

R=τzC1=239 ns15 pF16 kΩR = \frac{\tau_z}{C_1} = \frac{239\ \text{ns}}{15\ \text{pF}} \approx 16\ \text{k}\Omega

C2C_2 để lọc ripple — thường chọn C1/10C_1/10:

C2=1.5 pFfp=12πRC26.6 MHzC_2 = 1.5\ \text{pF} \quad \Rightarrow \quad f_p = \frac{1}{2\pi RC_2} \approx 6.6\ \text{MHz}

Pole fpf_p nằm trên fcf_c — đúng chỗ, không làm giảm PM đáng kể.

Kết quả

Tham sốGiá trị
C1C_115 pF
RR16 kΩ
C2C_21.5 pF
fzf_z~665 kHz
fpf_p (từ C2C_2)~6.6 MHz
fcf_c (target)2 MHz
PM (tính toán)~58°

Bài học: R=16 kΩR = 16\ \text{k}\Omega là hệ quả trực tiếp của KVCOK_{VCO} cao (200 MHz/V): C1C_1 nhỏ (15 pF) buộc R=τz/C1R = \tau_z/C_1 phải lớn để giữ τz=239 ns\tau_z = 239\ \text{ns}. Với IC on-chip có KVCOK_{VCO} hàng trăm MHz/V, C1C_1 pF và RR kΩ là bình thường. Nếu thấy RR chỉ vài Ω, hãy kiểm tra KVCOK_{VCO} hoặc ICPI_{CP} — có thể đang quá lớn.

Check worst-case

Loop bandwidth phụ thuộc KVCOK_{VCO} — tham số này thay đổi theo Vtune và nhiệt độ. Ở SS corner và nhiệt độ cao, KVCOK_{VCO} có thể giảm 30–40%.

fcKVCOf_c \propto \sqrt{K_{VCO}}

Nếu KVCOK_{VCO} giảm 40% → fcf_c giảm 0.622%\sqrt{0.6} \approx 22\% → từ 2 MHz xuống ~1.56 MHz. PM thay đổi không nhiều vì cả zero lẫn pole đều giữ nguyên vị trí tương đối.

Nguy hiểm hơn là khi KVCOK_{VCO} tăng ở FF corner — bandwidth tăng lên, zero có thể không còn đủ phase boost → PM giảm.


Tool: Verify loop filter của bạn

Nhập thông số PLL và loop filter vào tool bên dưới để xem ngay Bode plot và phase margin. Default values là ví dụ từ section 5.

PLL / VCO
ICP
µA
1 µA5 mA
KVCO
MHz/V
1 MHz/V5 GHz/V
N
1512
fref
MHz
1 MHz500 MHz
Loop Filter
C1
pF
1 pF1 nF
R
0.1 Ω1 MΩ
C2
pF
1 pF1 nF
● Type-II CP-PLL · Exact Z(s) · 500-pt log sweep
Output Metrics
fc
1.97MHz
PM
56.3°
fz
663kHz
fp
7.29MHz
fc / fref
0.039
fz / fc
0.34
fp / fc
3.7
Bode Plot — Open Loop L(jω)
* Type-II CP-PLL · Continuous-time model · Exact Z(s) — không bỏ C₂ trong mẫu số. Dải tần 1kHz–1GHz, 500 điểm log-uniform. Model chính xác khi fc < fref/10.

6. Bài học cho engineer

Chọn fc=fref/10f_c = f_{ref}/10 đến fref/20f_{ref}/20 là điểm xuất phát an toàn. Với fref=50 MHzf_{ref} = 50\ \text{MHz}, bandwidth 2.5–5 MHz là hợp lý — ví dụ section 5 chọn 2 MHz (fref/25f_{ref}/25) để có thêm margin.

Đặt zero tại fc/3f_c/3 đến fc/5f_c/5 để đảm bảo đủ phase boost. Zero quá gần fcf_c → phase margin không đủ. Zero quá xa → phase boost đến sớm, ít tác dụng tại fcf_c.

Simulate trước khi tape-out. Công thức tính C1C_1, RR, C2C_2 chỉ là điểm xuất phát — process variation và nonlinearity của charge pump sẽ làm PM thực tế khác 5–10° so với tính toán.

Đừng chỉ check nominal. Chạy corner simulation với KVCOK_{VCO} ±30%, ICPI_{CP} ±20%. PM < 45° ở bất kỳ corner nào là red flag cần redesign loop filter.


Ba điều textbook hay bỏ qua

① Giá trị R và C1 phụ thuộc vào KVCOK_{VCO} — không có rule “nhỏ” hay “lớn” cố định

C1KVCOC_1 \propto K_{VCO} (từ công thức unity-gain), còn R=τz/C1R = \tau_z/C_1. Vì vậy:

  • KVCOK_{VCO} cao (IC với ring oscillator hoặc LC-VCO gain lớn, hàng trăm MHz/V): C1C_1 nhỏ (pF) → RR lớn (kΩ). Ví dụ trên: C1=15 pFC_1 = 15\ \text{pF}, R=16 kΩR = 16\ \text{k}\Omega.
  • KVCOK_{VCO} thấp (discrete, TCXO-based, vài MHz/V): C1C_1 lớn (nF–µF) → RR nhỏ (Ω–kΩ).

Hệ quả thực tế: R lớn không có nghĩa là thiết kế kém — nó chỉ phản ánh KVCOK_{VCO}fcf_c mà bạn đang nhắm tới. Điều quan trọng hơn là τz=RC1\tau_z = RC_1 đúng chỗ so với fcf_c.

KVCOK_{VCO} không phải hằng số — và đây là nguồn gốc của nhiều bug

LC-VCO thực tế có KVCOK_{VCO} thay đổi theo Vtune. Ở giữa tuning range, KVCOK_{VCO} cao nhất. Ở hai đầu (Vtune gần rail), varactor vào chế độ bão hòa và KVCOK_{VCO} giảm 2–3x. Điều này có nghĩa:

  • Bandwidth thực tế tại edge của tuning range thấp hơn nominal 30–50%
  • Nếu lock point của PLL nằm gần edge, PM và lock time đều bị ảnh hưởng
  • PLL hay “mất lock” ở edge không phải vì mạch hỏng, mà vì KVCOK_{VCO} quá thấp làm bandwidth sụp

Cách xử lý: thiết kế loop filter với KVCO,minK_{VCO,min} (worst case), không phải KVCO,typicalK_{VCO,typical}.

③ Continuous-time model sai khi fcf_c quá gần freff_{ref}

Model L(s)L(s) mà mình dùng suốt bài này giả định CP bơm dòng liên tục — trên thực tế CP chỉ bơm theo từng pulse mỗi chu kỳ freff_{ref}. Khi fcf_c quá gần freff_{ref}, mỗi pulse CP chưa kịp được lọc đã tác động đến Vtune — discrete-time effect xuất hiện, PM thực tế thấp hơn tính toán có khi đến 10–20°.

Rule of thumb fc<fref/10f_c < f_{ref}/10 chính xác là để tránh vùng này — không phải con số tùy tiện. Nếu ai hỏi tại sao lại /10 chứ không phải /5 hay /20, đây là câu trả lời.


Lỗi hay gặp khi mới thiết kế PLL

LỗiHệ quảCách tránh
Chọn fcf_c xong không check fc/freff_c/f_{ref}PM thực tế thấp hơn tính toánLuôn verify fc<fref/10f_c < f_{ref}/10
Dùng KVCO,typicalK_{VCO,typical} để tính loop filterPLL mất lock ở edge tuning rangeDùng KVCO,minK_{VCO,min} để thiết kế
Chỉ sim ở nominal, không chạy cornerPM đẹp trên giấy, tệ trên siliconCorner với KVCOK_{VCO} ±30%, ICPI_{CP} ±20%
Đặt fzf_z quá gần fcf_c (> fc/2f_c/2)Phase boost không đủ, PM thấpfz=fc/3f_z = f_c/3 đến fc/5f_c/5
Bỏ qua C2C_2 khi tính PMfpf_p ảnh hưởng PM nếu C2C_2 lớnDùng công thức exact Z(s)Z(s) khi C2>C1/10C_2 > C_1/10

Tổng kết

  • PLL type-II có hai pole tại DC → cần zero trong loop filter để ổn định
  • Phase margin mục tiêu: 60°, tối thiểu 45°
  • Loop bandwidth điều khiển trade-off: bandwidth rộng → lọc VCO noise tốt, lock nhanh, nhưng reference jitter cao hơn
  • Bắt đầu với fc=fref/10f_c = f_{ref}/10fref/20f_{ref}/20, zero tại fc/3f_c/3fc/5f_c/5, rồi verify bằng simulation

Tham khảo

  • Razavi, Design of Analog CMOS Integrated Circuits, 2nd ed., Chương 15 — phân tích PLL từ góc độ circuit, transfer function và noise được trình bày rõ ràng với đầy đủ derivation. Đây là reference chính cho bài này.

  • Best, Phase-Locked Loops: Design, Simulation, and Applications, 6th ed. — tập trung vào lock time, acquisition, và loop filter design với nhiều ví dụ số thực tế. Tốt để đọc sau khi nắm được phần theory.

  • Gardner, Phaselock Techniques, 3rd ed. — classic reference về PLL theory, đặc biệt phần noise analysis và acquisition. Nặng về toán nhưng rất chặt chẽ.