← Về trang chủ
Cơ bản IC 04 tháng 8, 2026 ⟳ 18 phút đọc

Ghép con SAR ADC 10-bit lại: ENOB thật là bao nhiêu — và khối nào ăn mất bit thứ 10

Bốn bài trước mổ bốn khối của cùng một con SAR ADC 10-bit, mỗi khối bị chặn bởi một thứ khác nhau. Bài này ghép lại, tính ENOB thật (9.93), rồi lộ ra: cái ăn mất bit thứ 10 không phải matching, settling hay kickback — mà là flicker của op-amp buffer, thứ không khối nào 'sở hữu'.

SAR ADCENOBSNDRnoise budgetmixed-signal180nmsystem design
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.

Bốn bài vừa rồi trên blog thực ra là bốn góc nhìn vào cùng một con chip: một SAR ADC 10-bit, 1.8 V, 1 MHz. Bài op-amp thiết kế con buffer lấy mẫu; bài kickback mổ cái comparator; bài kT/C tính noise của khâu sampling; bài mismatch tính offset và matching của CDAC.

Điều thú vị là mỗi khối bị chặn bởi một thứ hoàn toàn khác nhau: op-amp bởi GBW/settling, kickback bởi ngưỡng CsC_s, kT/C bởi matching của CDAC, offset bởi định luật Pelgrom. Bốn ràng buộc, bốn thế giới.

Giờ ghép cả bốn lại thành một con ADC chạy được và hỏi câu hệ thống: nó thật sự đạt bao nhiêu bit? Và nếu không phải đủ 10 — thì khối nào ăn mất cái bit cuối? Câu trả lời hoá ra không phải khối nào trong bốn khối “được thiết kế để chặn” gì cả.


Mục lục

  1. SAR ADC làm gì — bản tóm tắt một phút
  2. Một lần chuyển đổi tốn bao lâu
  3. Ghép budget noise
  4. Distortion từ matching CDAC
  5. Offset và settling — hai thứ gần như miễn phí
  6. ENOB waterfall: ai ăn mất bit thứ 10
  7. Muốn nhiều hơn thì sửa ở đâu
  8. Bài học

1. SAR ADC làm gì — bản tóm tắt một phút

Nếu bạn đã quen SAR thì lướt qua mục này. SAR (successive-approximation) chuyển đổi bằng tìm nhị phân: đoán từng bit từ MSB xuống LSB, mỗi bit một lần so sánh.

Sơ đồ khối SAR ADC: S/H buffer, CDAC, comparator, SAR logic

Điểm cần nhớ là cái CDAC — mảng tụ nhị phân — đóng hai vai cùng lúc: lúc đầu nó là sampling cap giữ điện áp vào, rồi trong các bit-trial nó là DAC phản hồi. Vòng lặp: comparator so điện áp vào với điện áp DAC hiện tại; SAR logic đọc kết quả, đặt bit đó, rồi lật một bottom-plate của CDAC để ra điện áp thử tiếp theo.

Hai mức điện áp trên hình dễ lẫn:

  • VrefV_{ref} — điện áp tham chiếu, là “cây thước” của DAC. Bottom-plate mỗi tụ được switch nối vào VrefV_{ref} hoặc GND; cắm lên VrefV_{ref} sẽ bơm một bước điện tích tỉ lệ trọng số nhị phân của tụ đó (512CVref/2512C \to V_{ref}/2, …, CVref/210C \to V_{ref}/2^{10}). Nó định luôn full-scale (Vref\approx V_{ref}) và 1 LSB =Vref/2N= V_{ref}/2^{N}. Vì mọi ripple/sụt áp của VrefV_{ref} biến thẳng thành sai số DAC, nó phải cực ổn định — một lý do khiến buffer/reference hay ngốn bit trong budget.
  • VcmV_{cm} — common-mode, là mốc so sánh cố định ở input còn lại của comparator. Mỗi bit-trial, node top-plate nhảy lên/xuống theo lựa chọn VrefV_{ref}/GND, và comparator chỉ hỏi “top-plate đang cao hay thấp hơn VcmV_{cm}?” — câu trả lời chính là bit. VcmV_{cm} không định dải đo (đó là việc của VrefV_{ref}); nó chỉ là đường mốc để binary search hội tụ về, thường đặt giữa dải để comparator chạy ở vùng tối ưu.
Waveform binary search: DAC hội tụ về Vin qua 10 bit-trial

Điện áp DAC nhảy nửa khoảng mỗi lần, kẹp dần lấy VinV_{in} vào giữa. Sau N=10N = 10 bit-trial, sai số còn dưới nửa LSB và mười bit đã chốt. Đó là toàn bộ thuật toán — phần còn lại của bài là chuyện mỗi bước ấy tốn gì.


2. Một lần chuyển đổi tốn bao lâu

Với fs=1f_s = 1 MHz, mỗi lần chuyển đổi có đúng 1 µs. Ngân sách thời gian đó chia làm hai:

Timing một chu kỳ SAR: sample 300 ns + 10 bit-trial, mỗi bit DAC settle

Pha sample lấy 300 ns — chính là con số bài op-amp đã dẫn (tACQ300t_{ACQ} \approx 300 ns, gồm slew rồi settle của buffer để nạp CsC_s). Còn lại 700 ns cho 10 bit-trial, tức 70 ns mỗi bit.

Trong mỗi bit-trial, thứ phải kịp ổn định không phải comparator mà là bản thân cái DAC: mỗi lần SAR lật một bottom-plate giữa GND và VrefV_{ref}, cả mảng tụ nạp lại qua điện trở switch tham chiếu. Bài kickback đã tính hằng số này:

τ=RswCs=500 Ω×5 pF=2.5 ns,tsettle=τln(2N+1)=7.6τ=19 ns\tau = R_{sw}\,C_s = 500\ \Omega \times 5\ \text{pF} = 2.5\ \text{ns}, \qquad t_{settle} = \tau\ln(2^{N+1}) = 7.6\,\tau = 19\ \text{ns}

19 ns để settle trong ô 70 ns — dư 3.7 lần. Nên ở 1 MHz, thời gian không phải thứ ăn bit. (Ở 100 MS/s thì câu chuyện đảo ngược hoàn toàn, và đó đúng là lúc CsC_s lớn cứu kickback nhưng giết settling — xung đột mà bài kickback đã mổ.)

Ghi nhận cho phần budget: settling error ở tốc độ này nằm sâu dưới 0.5 LSB, coi như không đóng góp vào sai số.


3. Ghép budget noise

Phần noise thì bài kT/C đã làm gần hết, ở đây chỉ gom lại. Ba nguồn noise, cộng theo bình phương vì không tương quan:

Nguồnrms (input-referred)Theo LSB
Quantization σq=LSB/12\sigma_q = \text{LSB}/\sqrt{12}507 µV0.29 LSB
Buffer op-amp140 µV0.080 LSB
kT/C @ 5 pF28.8 µV0.016 LSB
Tổng527 µV0.30 LSB
vn,tot=5072+1402+28.82=527 μVv_{n,tot} = \sqrt{507^2 + 140^2 + 28.8^2} = 527\ \mu\text{V}

Đổi ra SNR, lấy tín hiệu full-scale sine Vrms=VFS/(22)=636V_{rms} = V_{FS}/(2\sqrt{2}) = 636 mV:

SNR=20log10636 mV527 μV=61.6 dB\text{SNR} = 20\log_{10}\frac{636\ \text{mV}}{527\ \mu\text{V}} = 61.6\ \text{dB}

So với SNR lý tưởng của 10-bit (6.02×10+1.76=61.966.02\times10 + 1.76 = 61.96 dB), noise mới ăn mất 0.3 dB. Chi tiết vì sao buffer chiếm 140 µV còn kT/C chỉ 28.8 µV thì bài kT/C mục 6 đã dẫn — điểm cần mang sang đây: trong ba nguồn noise, buffer op-amp áp đảo (gấp 4.9 lần kT/C).


4. Distortion từ matching CDAC

SNR mới chỉ là noise. Con ADC còn một loại sai số khác hẳn: méo phi tuyến từ mismatch của mảng tụ. Nó không phải noise ngẫu nhiên mỗi mẫu, mà là một đường cong INL cố định trên mỗi chip — nhưng với tín hiệu sine full-scale, INL biến thành méo hài, và méo hài thì trừ thẳng vào chất lượng như noise.

Bài mismatch đã chốt matching của CDAC: σ(Cu)/Cu<0.52%\sigma(C_u)/C_u < 0.52\% để DNL ở 3σ3\sigma dưới 0.5 LSB. INL là tổng dồn của DNL, độ lệch chuẩn cực đại của nó:

σ(INL)max=2N12σ(Cu)Cu=16×0.52%=0.083 LSB\sigma(\text{INL})_{\max} = \frac{\sqrt{2^N-1}}{2}\,\frac{\sigma(C_u)}{C_u} = 16 \times 0.52\% = 0.083\ \text{LSB}

Với layout common-centroid (khử gradient hệ thống — bài mismatch mục 5), phần INL còn lại là ngẫu nhiên, trải đều phổ như noise chứ không dồn thành một spur trội. Con σ(INL)max\sigma(\text{INL})_{\max} ở trên là giá trị đỉnh (tại mid-scale); rms trên toàn dải mã của một đường INL ngẫu nhiên nhỏ hơn đỉnh khoảng một nửa, nên distortion đóng góp cỡ 0.04 LSB ≈ 73 µV — dưới cả buffer noise. (Đây là ước lượng cỡ độ lớn; con số chính xác phụ thuộc hình dạng INL và tần số tín hiệu vào, và cách chắc chắn duy nhất vẫn là FFT trên netlist extract.) Cộng vào tổng để ra SNDR:

SNDR=20log10636 mV5272+732 μV=61.5 dB\text{SNDR} = 20\log_{10}\frac{636\ \text{mV}}{\sqrt{527^2 + 73^2}\ \mu\text{V}} = 61.5\ \text{dB}

Distortion kéo SNDR xuống thêm khoảng 0.1 dB so với SNR — có mặt, nhưng nhỏ hơn phần noise. Điều này chỉ đúng khi matching được thiết kế và layout tử tế; nếu bỏ common-centroid, gradient hệ thống sẽ dựng INL thành hài và distortion có thể vượt lên nuốt luôn thesis của bài này.


5. Offset và settling — hai thứ gần như miễn phí

Còn hai sai số nữa mà trực giác hay lo, nhưng ở con ADC này gần như không ăn bit.

Offset. Bài mismatch tính offset input-referred của buffer là 4.3 mV — nghe khổng lồ (2.4 LSB), to hơn mọi nguồn noise. Nhưng offset là một hằng số, nó chỉ dịch cả đường đặc tuyến chứ không méo, nên đo một lần rồi trừ đi (auto-zero / calib) là xong. Sau calib, đóng góp của nó vào ENOB gần như bằng 0.

Settling. Mục 2 đã thấy: DAC settle trong 19 ns trên ngân sách 70 ns, dư 3.7 lần, sai số dưới 0.5 LSB. Ở 1 MHz nó không ăn bit.

Nên hai thứ này ra khỏi cuộc chơi: một cái calib được, một cái thừa margin. Cái quyết định ENOB nằm ở noise và distortion của mục 3–4.


6. ENOB waterfall: ai ăn mất bit thứ 10

Giờ ghép cả bốn khối lại. ENOB quy thẳng từ SNDR (ENOB=(SNDR1.76)/6.02\text{ENOB} = (\text{SNDR} - 1.76)/6.02), nên cứ bắt đầu từ 10.0 bit lý tưởng rồi trừ dần đóng góp của từng nguồn:

ENOB waterfall: 10 bit lý tưởng trừ dần từng nguồn còn 9.93
BướcENOBΔ
Ideal 10-bit (chỉ quantization)10.00
− buffer op-amp (140 µV)9.95−0.053
− distortion CDAC INL (73 µV)9.93−0.014
− kT/C (28.8 µV)9.93−0.002
− settling (dư 3.7×)9.93−0.001
ENOB thật9.93

Đáng nói rõ trước khi đọc tiếp: bảng trên là budget tính tay ở corner nominal/typical, không phải Monte Carlo qua PVT hay số đo trên silicon thật. Nó cũng chưa gồm vài nguồn noise thực tế — noise nội tại của comparator (khác kickback, vốn chỉ là charge injection), noise/settling của buffer VrefV_{ref}, cap voltage coefficient của CDAC, và clock jitter. Cộng thêm các nguồn này rồi chạy qua 3σ corner, ENOB đo thật trên chip nhiều khả năng thấp hơn 9.93 — con số ở đây nên đọc là trần lý thuyết của một thiết kế được margin tốt, chứ không phải số đã đo trên tape-out.

Đây là chỗ đáng dừng lại. Con ADC được thiết kế cẩn thận ở từng khối — matching đặt DNL đúng ngưỡng 0.5 LSB, settling để dư 3.7 lần, kickback dưới 0.34 LSB, offset calib sạch. Mỗi khối đạt giới hạn riêng của nó với margin.

Vậy mà cái ăn mất bit thứ 10 lại là buffer op-amp — một mình nó gây ra 0.053-0.053 trong tổng 0.07-0.07 bit, gấp mấy lần mọi thứ khác cộng lại. Và trong con buffer đó, như bài kT/C đã tách, flicker (113 µV) còn lớn hơn thermal (82 µV). Nói cách khác: cái giới hạn ENOB của cả con ADC là flicker noise của một con op-amp — thứ không nằm trong “spec” của bất kỳ khối chuyển đổi nào, chỉ hiện ra khi bạn cộng cả hệ lại.

Nói cho công bằng: 9.93 ở nominal gần như là 10-bit trọn vẹn, con ADC không hề “hỏng” — nhiều thiết kế thực tế còn thấp hơn thế. Điểm của cái waterfall không phải “mất một bit”, mà là chỉ đúng chỗ mà bit tiếp theo sẽ mất đi: cái 0.07 bit thiếu kia gần như toàn bộ là buffer flicker, nên đó là bức tường bạn đụng đầu tiên khi muốn siết corner cho chắc 10-bit, hay đẩy lên 11-bit — và mục sau nói vặn núm nào.

Muốn tự chỉnh budget cho con ADC của bạn — đổi NN, VFSV_{FS}, noise buffer, matching — dùng ENOB Budget Calculator: nhập nguồn sai số, ra SNR / SNDR / ENOB và waterfall.


7. Muốn nhiều hơn thì sửa ở đâu

Cái waterfall trả lời luôn câu “làm sao khá hơn”, và câu trả lời thường ngược trực giác:

Muốn ENOB tiến về 10.0? Cắt flicker của op-amp, không phải đụng vào CsC_s hay CDAC. Tăng W1L1W_1L_1 của input pair để hạ flicker (bài op-amp mục 10) là đòn bẩy trực tiếp nhất — rẻ, chỉ tốn diện tích. Vặn CsC_s để giảm kT/C thì vô ích, vì kT/C chỉ đóng 0.002 bit.

Muốn fsf_s cao hơn? Lúc đó settling và kickback mới vào cuộc: CsC_s lớn cứu kickback nhưng giết settling của DAC — xung đột mà bài kickback đã mổ, và nó chuyển con ADC từ noise-limited sang timing-limited.

Muốn NN cao hơn (12, 14-bit)? Bài toán đổi hẳn: kT/C và matching mới là thứ chặn. Bài kT/C mục 5 cho thấy từ khoảng 13–14 bit, matching CDAC và kT/C đòi CsC_s pico, và đó là lý do ADC độ phân giải cao ăn công suất khủng khiếp.

Mỗi hướng đẩy bị chặn bởi một khối khác nhau — đúng như bốn bài feeder đã dựng. Con ADC 10-bit / 1 MHz này chỉ là một điểm trên mặt phẳng resolution × speed × power, và ở điểm đó, thủ phạm là buffer flicker.


8. Bài học

Sai số hệ thống không “thuộc về” khối nào. Bạn thiết kế op-amp đạt GBW, CDAC đạt matching, comparator đạt kickback — mỗi khối pass spec riêng. Nhưng ENOB là tổng, và cái chặn nó (buffer flicker) không phải spec của khối chuyển đổi nào. Chỉ budget cả hệ mới lộ ra.

Con số to nhất chưa chắc là ràng buộc. Offset 4.3 mV to nhất bảng nhưng calib được nên gần như 0 bit; quantization 507 µV là sàn không bỏ được; buffer 140 µV nhỏ hơn nhiều nhưng lại là thứ thật sự ăn bit vì không calib và không có sàn nào che.

Tối ưu đúng đòn bẩy. Ở con ADC này, ba tuần vặn CsC_s cho kT/C sẽ đổi được 0.002 bit; vài trăm nano kéo dài LL input pair cắt flicker đổi được gấp hai chục lần thế. Nên hãy budget cả hệ trước để biết đòn bẩy nào đáng vặn, rồi mới tối ưu.


Tổng kết

  • Con SAR ADC 10-bit / 1.8 V / 1 MHz đạt ENOB ≈ 9.93 (SNDR 61.5 dB) — mất 0.07 bit so với lý tưởng.
  • Buffer op-amp (140 µV) ăn hầu hết: 0.053-0.053 bit, gấp mấy lần distortion (−0.014), kT/C (−0.002) và settling (−0.001) cộng lại. Trong buffer, flicker lớn hơn thermal.
  • Offset (calib được) và settling (dư 3.7×) gần như không ăn bit; distortion nhỏ nhờ matching + common-centroid.
  • Muốn 10.0 ENOB thì sửa op-amp flicker, không phải CsC_s. Muốn fsf_s cao thì settling/kickback; muốn NN cao thì kT/C/matching. Mỗi hướng một thủ phạm.

Tham khảo

  • Bài two-stage Miller op-amp — con buffer S/H: acquisition 300 ns, buffer noise 140 µV (thermal 82, flicker 113), 1/f corner 1.8 MHz.

  • Bài kickback — comparator + timing bit-trial: DAC settle 7.6τ7.6\tau, ngưỡng CsC_s, xung đột high-speed.

  • Bài kT/C noise — budget noise sampling, vì sao buffer áp đảo kT/C, và kT/C thành ràng buộc từ 13–14 bit.

  • Bài Vth mismatch & offset — offset calib được, matching CDAC σ(Cu)/Cu<0.52%\sigma(C_u)/C_u < 0.52\% → DNL/INL, common-centroid.

  • Razavi, B., Principles of Data Conversion System Design, Ch. 3, 6 — quan hệ SNR/SNDR/ENOB, budget của ADC, dẫn xuất 6.02N+1.766.02N + 1.76.

  • Baker, R. J., CMOS Circuit Design, Layout, and Simulation, 4th ed. — charge-redistribution SAR, DNL/INL từ mismatch tụ. Website: cmosedu.com.