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'.
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 , 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
- SAR ADC làm gì — bản tóm tắt một phút
- Một lần chuyển đổi tốn bao lâu
- Ghép budget noise
- Distortion từ matching CDAC
- Offset và settling — hai thứ gần như miễn phí
- ENOB waterfall: ai ăn mất bit thứ 10
- Muốn nhiều hơn thì sửa ở đâu
- 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.
Đ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:
- — đ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 hoặc GND; cắm lên sẽ bơm một bước điện tích tỉ lệ trọng số nhị phân của tụ đó (, …, ). Nó định luôn full-scale () và 1 LSB . Vì mọi ripple/sụt áp của 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.
- — 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 /GND, và comparator chỉ hỏi “top-plate đang cao hay thấp hơn ?” — câu trả lời chính là bit. không định dải đo (đó là việc của ); 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.
Điện áp DAC nhảy nửa khoảng mỗi lần, kẹp dần lấy vào giữa. Sau 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 MHz, mỗi lần chuyển đổi có đúng 1 µs. Ngân sách thời gian đó chia làm hai:
Pha sample lấy 300 ns — chính là con số bài op-amp đã dẫn ( ns, gồm slew rồi settle của buffer để nạp ). 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à , 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:
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 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ồn | rms (input-referred) | Theo LSB |
|---|---|---|
| Quantization | 507 µV | 0.29 LSB |
| Buffer op-amp | 140 µV | 0.080 LSB |
| kT/C @ 5 pF | 28.8 µV | 0.016 LSB |
| Tổng | 527 µV | 0.30 LSB |
Đổi ra SNR, lấy tín hiệu full-scale sine mV:
So với SNR lý tưởng của 10-bit ( 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: để DNL ở dưới 0.5 LSB. INL là tổng dồn của DNL, độ lệch chuẩn cực đại của nó:
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 ở 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:
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 (), 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:
| Bước | ENOB | Δ |
|---|---|---|
| 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ật | 9.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 , 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 trong tổng 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 , , 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 hay CDAC. Tăng 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 để giảm kT/C thì vô ích, vì kT/C chỉ đóng 0.002 bit.
Muốn cao hơn? Lúc đó settling và kickback mới vào cuộc: 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 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 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 cho kT/C sẽ đổi được 0.002 bit; vài trăm nano kéo dài 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: 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 . Muốn cao thì settling/kickback; muốn 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 , ngưỡng , 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 → 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 .
-
Baker, R. J., CMOS Circuit Design, Layout, and Simulation, 4th ed. — charge-redistribution SAR, DNL/INL từ mismatch tụ. Website: cmosedu.com.