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

CP-PLL Transient Simulation — Cycle Slip và Quá trình Acquisition

Linear model cho bandwidth và phase margin, nhưng không nói được PLL có lock được không khi frequency offset lớn. Bài này xây dựng behavioral model từ đầu, giải thích cycle slip bằng số, và chỉ ra cách đọc kết quả transient sim.

plltransientcycle-slipsimulationbehavioral-modelcharge-pump
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.

Hai bài trước — Loop Dynamics (transfer function, phase margin, chọn loop filter) và Locking Transient (settling/overshoot small-signal trong time-domain) — đều giả định PLL đã ở gần điểm lock và dao động nhỏ.

Nhưng khi VCO mới khởi động — hoặc khi channel switch làm reference nhảy tần số đột ngột — PLL phải kéo VCO từ ffreef_{free} về foutf_{out} qua một khoảng lệch lớn. Trong giai đoạn đó, tín hiệu không nhỏ, PFD ở chế độ phi tuyến, và linear model sai hoàn toàn.

Hai câu hỏi mà linear analysis không trả lời được:

  • PLL có lock được không khi Δf=foutffree=300 MHz\Delta f = f_{out} - f_{free} = 300\ \text{MHz}?
  • Lock mất bao lâu, và xảy ra bao nhiêu cycle slip trước đó?

Để trả lời, cần behavioral transient simulation — mô hình từng khối theo thời gian thực, giải ODE(Ordinary Differential Equation) qua từng chu kỳ reference.


Mục lục

  1. Behavioral model: từng khối
  2. Giải từng chu kỳ reference: hybrid ODE
  3. Cycle slip là gì và tại sao xảy ra?
  4. Thông số sim và kết quả
  5. Ringing sau mỗi cycle slip: nguyên nhân và công thức
  6. Pull-in range và giới hạn acquisition
  7. Bài học cho engineer

1. Behavioral model: từng khối

PLL gồm bốn khối. Mô hình behavioral thay mỗi khối bằng phương trình toán học — không mô tả transistor hay mạch chi tiết, nhưng đúng với hành vi large-signal.

PFD và Charge Pump

PFD so sánh phase của reference và feedback. Sai lệch phase thuần (unbounded) là:

ϕerr,raw=ϕrefϕVCON\phi_{err,raw} = \phi_{ref} - \frac{\phi_{VCO}}{N}

Nhưng PFD thực tế chỉ “nhìn” được sai lệch trong khoảng (π,+π)(-\pi, +\pi) — nó reset sau mỗi chu kỳ. Vì vậy:

ϕerr,pfd=[(ϕerr,raw+π)mod2π]π\phi_{err,pfd} = \left[(\phi_{err,raw} + \pi) \operatorname{mod} 2\pi\right] - \pi

Từ ϕerr,pfd\phi_{err,pfd} suy ra thời gian CP bơm và cực tính:

tpulse=ϕerr,pfd2πfref,ICP={+ICP,upϕerr,pfd0ICP,dnϕerr,pfd<0t_{pulse} = \frac{|\phi_{err,pfd}|}{2\pi f_{ref}}, \quad I_{CP} = \begin{cases} +I_{CP,up} & \phi_{err,pfd} \geq 0 \\ -I_{CP,dn} & \phi_{err,pfd} < 0 \end{cases}

tpulset_{pulse} bị clamp tại TrefT_{ref} — không thể bơm lâu hơn một chu kỳ reference.

Loop filter

Loop Filter

Loop filter dạng R-C1 nối tiếp song song C2 (type-II). Hai phương trình ODE:

dVtunedt=ICP(VtunevC1)/RC2\frac{dV_{tune}}{dt} = \frac{I_{CP} - (V_{tune} - v_{C1})/R}{C_2} dvC1dt=VtunevC1RC1\frac{dv_{C1}}{dt} = \frac{V_{tune} - v_{C1}}{R \cdot C_1}

VtuneV_{tune} là điện áp ngay tại nút nối R-C2 — thay đổi nhanh khi CP bơm. vC1v_{C1} là điện áp trên tụ C1 — biến đổi chậm hơn với hằng số thời gian τ=RC1\tau = R C_1. Điện áp vào VCO là VtuneV_{tune}.

VCO

VCO chuyển điện áp thành tần số, tần số thành phase:

dϕVCOdt=2π(ffree+KVCOVtune)\frac{d\phi_{VCO}}{dt} = 2\pi \left(f_{free} + K_{VCO} \cdot V_{tune}\right)

Đây là ODE thứ ba trong hệ. State vector đầy đủ: y=[ϕVCO, Vtune, vC1]\mathbf{y} = [\phi_{VCO},\ V_{tune},\ v_{C1}].


2. Giải từng chu kỳ reference: hybrid ODE

CP không bơm dòng liên tục — nó bơm đúng tpulset_{pulse} giây sau mỗi cạnh lên của reference, rồi tắt. Vì vậy mỗi chu kỳ reference TrefT_{ref} chia thành hai phase với ODE khác nhau:

Phase 1 [0, tpulse][0,\ t_{pulse}]: CP bật, ICP0I_{CP} \neq 0

Phase 2 [tpulse, Tref][t_{pulse},\ T_{ref}]: CP tắt, ICP=0I_{CP} = 0

Gọi đây là hybrid ODE — hệ liên tục nhưng input không liên tục. Giải tuần tự: dùng trạng thái cuối phase 1 làm điều kiện đầu cho phase 2.

def sim_one_cycle(state, t_pulse, Icp_signed, T_ref):
    y = list(state)

    # Phase 1: CP on
    if t_pulse > 1e-15:
        sol = solve_ivp(odes, [0, t_pulse], y,
                        args=(Icp_signed,), method='Radau',
                        rtol=1e-8, atol=1e-12)
        y = sol.y[:, -1].tolist()

    # Phase 2: CP off
    t_off = T_ref - t_pulse
    if t_off > 1e-15:
        sol = solve_ivp(odes, [0, t_off], y,
                        args=(0.0,), method='Radau',
                        rtol=1e-8, atol=1e-12)
        y = sol.y[:, -1].tolist()

    return np.array(y)

Đây chỉ là phần lõi. Code đầy đủ của behavioral model (config, solver, PFD/CP, VCO, loop filter, plot) ở repo ams-models/pll.

Tại sao Radau? Loop filter có hai hằng số thời gian rất khác nhau: τC2=RC2=75 ns\tau_{C2} = R C_2 = 75\ \text{ns}τC1=RC1=750 ns\tau_{C1} = R C_1 = 750\ \text{ns}. Tỉ số 10× tạo ra stiff system — solver explicit (RK45, DOP853) phải dùng step rất nhỏ để ổn định, chạy rất chậm. Radau là solver implicit, xử lý stiff tốt hơn nhiều.

Thứ tự “VCO first”: Trong mỗi vòng lặp, VCO chạy trước (ODE), sau đó reference edge đến, rồi mới tính phase error và PFD. Thứ tự này tránh artifact khởi tạo: nếu tính PFD trước khi VCO chạy, cycle đầu tiên sẽ có ϕref=2π\phi_{ref} = 2\pi trước khi VCO tích lũy bất kỳ phase nào — ϕerr,raw\phi_{err,raw} sẽ nhảy vọt lên 1 cycle ngay từ đầu, sai về mặt vật lý.


3. Cycle slip là gì và tại sao xảy ra?

Cycle slip xảy ra khi ϕerr,raw\phi_{err,raw} vượt qua bội số của 2π2\pi — tức là floor(ϕerr,raw/2π\phi_{err,raw}/2\pi) thay đổi giữa hai chu kỳ liên tiếp.

Để hiểu tại sao, hãy theo dõi ϕerr,pfd\phi_{err,pfd} qua một slip:

  1. PLL chưa lock, VCO chạy chậm hơn target: ϕerr,raw\phi_{err,raw} tăng dần
  2. ϕerr,pfd+π\phi_{err,pfd} \to +\pi: CP bơm UP hết công suất, tpulse=Treft_{pulse} = T_{ref}
  3. ϕerr,raw\phi_{err,raw} vượt 2π2\pi: ϕerr,pfd\phi_{err,pfd} wrap từ +π+\pi về π-\pi đột ngột
  4. CP lập tức đổi sang DN — cực tính lật 180°
  5. DN bơm trong vài chu kỳ → ϕerr,raw\phi_{err,raw} không tăng nữa, thậm chí giảm
  6. Rồi lại tăng, và slip tiếp theo xảy ra

Mỗi lần ϕerr,raw\phi_{err,raw} vượt thêm 2π2\pi là một cycle slip. Nhìn trên đồ thị, ϕerr,raw\phi_{err,raw} vẽ thành bậc thang — mỗi bậc là một slip. Số bậc = số cycle slip.


4. Thông số sim và kết quả

Thông số

Tham sốGiá trịGhi chú
freff_{ref}50 MHz
foutf_{out}2.4 GHz
NN48
ICPI_{CP}130 µA
KVCOK_{VCO}200 MHz/V
ffreef_{free}2.1 GHzΔf=300 MHz\Delta f = 300\ \text{MHz}, Vtune=1500 mVV_{tune} = 1500\ \text{mV}
C1C_115 pF
RR16kΩζ=R2ICPKVCOC1/N0.72\zeta = \frac{R}{2}\sqrt{I_{CP} K_{VCO} C_1 / N} \approx 0.72. Hơi underdamped, chấp nhận được
C2C_21.5 pF
Vtune,lockV_{tune,lock}1500 mV(foutffree)/KVCO(f_{out} - f_{free})/K_{VCO}. Con số này không thực tế lắm, nhưng để show cycle slip

Chú ý: ICPI_{CP} = 130 µA — nhỏ hơn thiết kế ở bài trước . Lý do chọn như vậy để thấy cycle slip rõ ràng hơn: với ICPI_{CP} lớn, mỗi CP pulse làm Vtune nhảy lớn và Phase error được sửa trước khi quá 2π2\pi, không xảy ra cycle slip nhiều lần.

Kết quả sim

CP-PLL Transient Simulation — 5 cycle slips, lock at ~2µs

Panel 1 — Tần số VCO: Đường sáng (f_smooth) dùng vC1v_{C1} thay cho VtuneV_{tune} để lọc ripple nhanh. Thấy rõ quá trình VCO leo từ 2.1 GHz lên 2.4 GHz sau 5 cycle slips.

Panel 2 — Vtune VtuneV_{tune} ripple mỗi khi tpulse=10 nst_{pulse} = 10 \text{ ns}, tương đương với π\pi, đối với Tref=20 nsT_{ref} = 20\ \text{ns}.

Panel 3 — Phase error: ϕerr,raw\phi_{err,raw} (vàng, trục trái, đơn vị cycle) vẽ thành bậc thang đi lên — mỗi bậc là một cycle slip, đánh dấu bằng chấm cam. ϕerr,pfd\phi_{err,pfd} (xám, trục phải) dao động trong (π,+π)(-\pi, +\pi).

Panel 4 — CP pulse width: Dao động giữa 0 và TrefT_{ref}. Khi slip xảy ra, ϕerr,pfd\phi_{err,pfd} wrap về π-\pi → pulse width gần TrefT_{ref} theo chiều ngược lại.

Kết quả: 5 cycle slip (tại 0.2, 0.4, 0.6, 1.3, 2.0 µs), lock tại ~2.0 µs — ϕerr,raw\phi_{err,raw} settle ở 3 cycle, Vtune1500 mVV_{tune} \to 1500\ \text{mV}.


5. Ringing sau mỗi cycle slip

Nhìn panel 1 và 2 kỹ hơn: sau mỗi cycle slip, tần số và Vtune không tăng thẳng mà dao động tắt dần trước khi leo lên bậc tiếp theo. Đây không phải noise — đây là đáp ứng bậc hai của vòng lặp.

Chuỗi sự kiện tại mỗi slip:

  1. ϕerr,pfd\phi_{err,pfd} đang gần +π+\pi → CP bơm UP tối đa → VtuneV_{tune} đang tăng
  2. Slip: ϕerr,pfd\phi_{err,pfd} nhảy từ +π+\pi về π-\pi đột ngột
  3. CP lập tức đổi sang DN — một “step” thay đổi input từ +ICP+I_{CP} xuống ICP-I_{CP}
  4. Vòng lặp phản ứng theo đáp ứng bậc hai: overshoot rồi tắt dần

Tần số ringing xấp xỉ tần số tự nhiên của vòng lặp (bỏ qua zero và C2C_2). Lưu ý KVCOK_{VCO} tính bằng Hz/V thì hệ số 2π2\pi tự triệt tiêu:

ωnICPKVCONC1\omega_n \approx \sqrt{\frac{I_{CP} \cdot K_{VCO}}{N \cdot C_1}}

Thay số (ICP=130 μAI_{CP} = 130\ \mu\text{A}, KVCO=200 MHz/VK_{VCO} = 200\ \text{MHz/V}, C1=15 pFC_1 = 15\ \text{pF}):

ωn=130μ×200M48×15p6.0 Mrad/sfn0.96 MHz,Tn1.05 μs\omega_n = \sqrt{\frac{130\mu \times 200\text{M}}{48 \times 15\text{p}}} \approx 6.0\ \text{Mrad/s} \quad \Rightarrow \quad f_n \approx 0.96\ \text{MHz}, \quad T_n \approx 1.05\ \mu\text{s}

Hệ số tắt dần:

ζ=R2ICPKVCOC1N0.72\zeta = \frac{R}{2}\sqrt{\frac{I_{CP} \cdot K_{VCO} \cdot C_1}{N}} \approx 0.72

Với ζ0.72\zeta \approx 0.72, biên độ ringing tắt với hằng số thời gian 1/(ζωn)230 ns1/(\zeta \omega_n) \approx 230\ \text{ns}ngắn hơn một chu kỳ ringing Tn1.05 μsT_n \approx 1.05\ \mu\text{s}. Nghĩa là sau mỗi slip vòng lặp chỉ kịp một nhịp overshoot rồi tắt, chứ không dao động qua nhiều chu kỳ (số chu kỳ nhìn thấy được 1/(2πζ)0.2\approx 1/(2\pi\zeta) \approx 0.2). Khoảng cách giữa hai slip (\sim0.5 µs) cũng nhỏ hơn TnT_n, nên không đủ thời gian cho dao động nhiều vòng.

Muốn overshoot nhỏ hơn → tăng ζ\zeta (tăng RR). Muốn underdamped thật sự — ringing qua vài chu kỳ, bậc thang gồ ghề hơn → giảm RR mạnh để ζ0.2\zeta \lesssim 0.2.


6. Pull-in range và giới hạn acquisition

Không phải mọi Δf\Delta f đều lock được. Có hai ngưỡng quan trọng:

Lock-in range ΔωL\Delta \omega_L

Khoảng Δf\Delta f mà PLL lock được trong một chu kỳ beat — không qua cycle slip. Với type-II CP-PLL:

ΔωL=ICPKVCORN\Delta \omega_L = \frac{I_{CP} \cdot K_{VCO} \cdot R}{N}

Thay số (KVCOK_{VCO} tính bằng Hz/V, R=16 kΩR = 16\ \text{k}\Omega): ΔωL=130μ×200M×16k/488.7 Mrad/s=2π×1.38 MHz\Delta\omega_L = 130\mu \times 200\text{M} \times 16\text{k} / 48 \approx 8.7\ \text{Mrad/s} = 2\pi \times 1.38\ \text{MHz}.

Với Δf=300 MHz1.38 MHz\Delta f = 300\ \text{MHz} \gg 1.38\ \text{MHz}: PLL không lock ngay — phải đi qua cycle slip. Đây là lý do sim này có 5 slip.

Pull-in range ΔωP\Delta \omega_P

Khoảng Δf\Delta f tối đa mà PLL có thể lock được nếu cho đủ thời gian — qua nhiều cycle slip. Với type-II:

ΔωP2ICPKVCOωcN\Delta \omega_P \approx 2\sqrt{\frac{I_{CP} \cdot K_{VCO} \cdot \omega_c}{N}}

Pull-in range lớn hơn lock-in range nhiều. Khi Δf\Delta f nằm giữa hai ngưỡng này → PLL lock được nhưng cần thời gian và trải qua nhiều cycle slip. Với thông số sim, Δf=300 MHz\Delta f = 300\ \text{MHz} vẫn nằm trong pull-in range (lock sau 5 slip).

Tại sao Δf\Delta f quá lớn gây mất lock hoàn toàn?

Khi Δf\Delta f rất lớn, beat frequency cao đến mức trong mỗi chu kỳ reference ϕerr,pfd\phi_{err,pfd} wrap qua ±π\pm\pi nhiều lần — PFD chỉ lấy mẫu một lần mỗi TrefT_{ref} nên CP bơm UP rồi DN gần như cân bằng. Trung bình thời gian, dòng CP về zero → VtuneV_{tune} không tích lũy được → VCO không kéo về target.

Trong thực nghiệm (cùng thông số config): Δf=300 MHz\Delta f = 300\ \text{MHz} lock với 5 slip; Δf=350 MHz\Delta f = 350\ \text{MHz} vẫn lock nhưng cần 13 slip; còn Δf400 MHz\Delta f \gtrsim 400\ \text{MHz}: CP UP/DN cancel, VtuneV_{tune} không tích lũy, PLL không lock dù chạy bao lâu.


7. Bài học cho engineer

Behavioral sim bổ sung cho linear analysis, không thay thế. Linear model cho bandwidth, PM, noise — tất cả đúng khi đã lock. Behavioral sim cho acquisition, cycle slip, pull-in range — cần thiết khi spec có yêu cầu về lock time hoặc channel switch.

Chọn C lớn để thấy cycle slip rõ ràng khi debug. Với C nhỏ (pF): ΔVtune\Delta V_{tune} mỗi pulse lớn, PLL lock nhanh, ít slip. Nếu cần quan sát acquisition behavior, có thể tăng C tạm thời trong sim để xem rõ hơn — rồi scale lại về thông số thực.

Ringing sau slip là expected, không phải lỗi. Ringing là đáp ứng tự nhiên của second-order loop trước step đổi cực tính CP. Nếu ringing quá lớn (underdamped), tăng RR để tăng ζ\zeta. Nếu settle quá chậm, tăng ωn\omega_n (giảm CC hoặc tăng ICPI_{CP}).

Pull-in range phụ thuộc ICPI_{CP}, KVCOK_{VCO}, và ωc\omega_c. Khi spec yêu cầu lock nhanh từ Δf\Delta f lớn, các đòn bẩy là: tăng ICPI_{CP} (kéo rộng pull-in range và tăng ωn\omega_n), hoặc dùng frequency detector hỗ trợ CP trong giai đoạn acquisition.

Cycle slip count là metric cho acquisition. Số cycle slip phản ánh mức độ lệch pha phải “leo qua” để lock. Δf\Delta f càng lớn, ωc\omega_c càng nhỏ → càng nhiều slip. Đây là số liệu hữu ích khi so sánh các phương án thiết kế loop filter.


Tổng kết

Linear modelBehavioral sim
Dùng khiĐã lock, dao động nhỏAcquisition, large-signal
OutputBandwidth, PM, noiseLock time, cycle slip count
Giả địnhTuyến tính, steady-statePhi tuyến, time-domain
ToolBode plot, công thứcODE solver (Radau)

Bài này xây dựng behavioral model từ PFD/CP, loop filter ODE, đến VCO, giải bằng hybrid ODE (hai phase mỗi chu kỳ reference). Kết quả: 5 cycle slip, lock tại ~2.0 µs với Δf=300 MHz\Delta f = 300\ \text{MHz}ζ=0.72\zeta = 0.72.


Tham khảo

  • Razavi, Design of Analog CMOS Integrated Circuits, 2nd ed., Chương 15 — transient behavior và acquisition range của CP-PLL.

  • Best, Phase-Locked Loops: Design, Simulation, and Applications, 6th ed. — lock-in range, pull-in range, và cycle slip analysis với ví dụ số.

  • Gardner, Phaselock Techniques, 3rd ed. — phân tích rigorous về pull-in process và acquisition time.