建模實(shí)戰(zhàn):SAR ADC設(shè)計(jì)的關(guān)鍵技術(shù)解析)
簡(jiǎn)介本資源是一套面向電子工程與集成電路設(shè)計(jì)初學(xué)者的SAR ADC建模實(shí)踐材料聚焦MATLAB環(huán)境下的逐次逼近型模數(shù)轉(zhuǎn)換器原理仿真與性能分析解決理論理解抽象、硬件實(shí)驗(yàn)條件受限等學(xué)習(xí)痛點(diǎn)適用于課程設(shè)計(jì)、畢業(yè)設(shè)計(jì)及數(shù)字系統(tǒng)建模入門。壓縮包共2個(gè)文件1.98MB含核心MATLAB腳本SAR_ADC.m——實(shí)現(xiàn)SAR邏輯控制、DAC反饋比較、二進(jìn)制逼近全過(guò)程仿真并支持分辨率、采樣率、量化誤差等關(guān)鍵參數(shù)配置另附MIT出品的SAR ADC-MIT.pdf技術(shù)文檔系統(tǒng)講解工作原理、時(shí)序流程、非理想因素如比較器失調(diào)、電容失配建模方法及SNR/ENOB計(jì)算示例。目前已有2863人學(xué)習(xí)下載材料結(jié)構(gòu)緊湊、代碼可讀性強(qiáng)、理論與實(shí)現(xiàn)緊密結(jié)合讀者可直接運(yùn)行仿真觀察逐位判決過(guò)程對(duì)比理想與非理想輸出快速掌握SAR ADC系統(tǒng)級(jí)建模核心技能。 做混合信號(hào)電路的朋友應(yīng)該都有體會(huì)SAR ADC這顆“老將”在物聯(lián)網(wǎng)、工業(yè)采集、醫(yī)療電子甚至汽車電子里出鏡率相當(dāng)高。我之前在做一款16位、1MSPS的逐次逼近型ADC時(shí)最頭疼的不是電路圖本身而是架構(gòu)選型和參數(shù)權(quán)衡。流片一次成本太高光是電容陣列失配、比較器失調(diào)、時(shí)鐘抖動(dòng)這幾個(gè)非理想因素就足以讓方案改到懷疑人生。那段時(shí)間我?guī)缀跆焯炫菰贛ATLAB里把整個(gè)SAR ADC的行為級(jí)模型搭起來(lái)用仿真結(jié)果反向指導(dǎo)電路設(shè)計(jì)。今天這篇文章就從“用MATLAB對(duì)SAR ADC建?!边@個(gè)項(xiàng)目出發(fā)把我踩過(guò)的坑、驗(yàn)證過(guò)的流程、以及可以直接“抄作業(yè)”的建模細(xì)節(jié)完整梳理一遍給正在做ADC預(yù)研或準(zhǔn)備做系統(tǒng)級(jí)仿真的朋友一個(gè)參考。1. 項(xiàng)目概述與建模動(dòng)機(jī)1.1 為什么選SAR ADC而不是其他架構(gòu)ADC的架構(gòu)選擇本質(zhì)上是速度、精度、功耗和面積四個(gè)維度的權(quán)衡。SAR ADC的定位很有意思它不像Flash ADC那樣靠堆比較器數(shù)量換速度也不像流水線ADC那樣需要用運(yùn)放做級(jí)間增益更不像Delta-Sigma那樣依賴過(guò)采樣和噪聲整形。SAR的核心思路是“二分查找”通過(guò)一個(gè)比較器、一個(gè)DAC和一個(gè)逐次逼近寄存器在N個(gè)時(shí)鐘周期內(nèi)把模擬輸入量逐位逼近成數(shù)字碼。我個(gè)人的體會(huì)是SAR ADC最近幾年能持續(xù)熱下去主要沾了先進(jìn)工藝的光。在CMOS工藝特征尺寸不斷縮小的背景下SAR只需要一個(gè)高增益運(yùn)放有時(shí)甚至不需要器件本身的開關(guān)速度和匹配特性卻越來(lái)越好所以中精度10~16位、中速度幾kSPS到幾十MSPS這塊市場(chǎng)基本上被SAR拿下了。比如電池管理系統(tǒng)里的電壓采樣、超聲探頭的模擬前端、以及各類工業(yè)傳感器信號(hào)鏈SAR ADC的出場(chǎng)率都非常高。但SAR ADC的電路實(shí)現(xiàn)遠(yuǎn)沒(méi)有原理框圖那么輕描淡寫。電容DAC的失配會(huì)直接變成INL/DNL比較器的失調(diào)和噪聲會(huì)決定整個(gè)ADC的底噪SAR邏輯的時(shí)序余量不夠會(huì)導(dǎo)致高位判決錯(cuò)誤。這些問(wèn)題如果直接上晶體管級(jí)仿真跑一次1MSPS、16位的全精度仿真幾天時(shí)間都未必能出結(jié)果。這時(shí)候行為級(jí)建模的價(jià)值就體現(xiàn)出來(lái)了。1.2 行為級(jí)建模到底解決什么問(wèn)題建模不是“模擬個(gè)理想ADC”那么簡(jiǎn)單而是要建立一個(gè)與真實(shí)晶體管電路行為足夠貼近的可執(zhí)行模型。這個(gè)模型要能快速跑出各種非理想因素對(duì)整體性能的影響幫我們確定每個(gè)模塊的具體指標(biāo)要求。具體來(lái)說(shuō)我在項(xiàng)目里用MATLAB建模主要做了幾件事架構(gòu)預(yù)研時(shí)快速比較不同位寬、不同采樣率下限定的SNR/SFDR/ENOB可行性把電容失配、比較器噪聲、時(shí)鐘抖動(dòng)等非理想因素逐一注入模型觀察哪些因素先成為瓶頸協(xié)助電路設(shè)計(jì)人員確定DAC電容陣列的單位電容大小、比較器的輸入?yún)⒖荚肼暽舷?、采樣開關(guān)的導(dǎo)通電阻要求等在芯片回來(lái)后用MATLAB模型對(duì)實(shí)測(cè)數(shù)據(jù)進(jìn)行交叉驗(yàn)證判斷問(wèn)題出在哪個(gè)模塊。這套流程走完之后再去Cadence里搭晶體管級(jí)電路心里基本有底了。實(shí)際上我后面做很多項(xiàng)目都會(huì)先搭一個(gè)MATLAB行為模型把指標(biāo)分解清楚再動(dòng)電路這已經(jīng)成了我的標(biāo)準(zhǔn)動(dòng)作。2. 建模方案與總體架構(gòu)2.1 行為級(jí)建模與晶體管級(jí)仿真的取舍很多初學(xué)者會(huì)糾結(jié)一個(gè)問(wèn)題建模能不能直接反映電路特性這里就得明確“行為級(jí)模型”和“電路仿真”的邊界。晶體管級(jí)仿真比如Spectre、HSPICE是把每個(gè)器件的物理方程都解一遍精度最高但速度極慢。行為級(jí)建模則是把模塊當(dāng)成一個(gè)“有輸入輸出關(guān)系的黑盒”用數(shù)學(xué)表達(dá)式描述它的行為特征。比如比較器我們不關(guān)心它內(nèi)部是幾級(jí)預(yù)放大、幾級(jí)鎖存而是關(guān)心它的輸入失調(diào)電壓、輸入?yún)⒖荚肼?、回踢噪聲和判決時(shí)間這些參數(shù)直接從行為層面注入模型。MATLAB建模的優(yōu)勢(shì)在于速度。跑一組16位、1MSPS的完整轉(zhuǎn)換序列用Simulink的離散事件模型在我個(gè)人使用的普通工作站上只需要幾百秒換作晶體管級(jí)仿真可能跑幾萬(wàn)個(gè)采樣點(diǎn)就得等上幾天。所以行為級(jí)模型的價(jià)值不是替代電路仿真而是把設(shè)計(jì)空間快速縮小讓電路仿真集中精力驗(yàn)證最關(guān)鍵的“邊緣情況”。這是整個(gè)建模方案選型時(shí)最核心的考量。需要注意一點(diǎn)行為級(jí)模型也不是越復(fù)雜越好。模型參數(shù)過(guò)多擬合起來(lái)困難跑起來(lái)也慢反而失去“快速迭代”的優(yōu)勢(shì)。我一般把模型分成兩個(gè)版本理想模型用來(lái)驗(yàn)證算法和時(shí)序邏輯非理想模型用來(lái)評(píng)估性能邊界。兩個(gè)版本共用同一套頂層代碼只是通過(guò)開關(guān)控制是否注入非理想因素。2.2 頂層模型結(jié)構(gòu)與數(shù)據(jù)流設(shè)計(jì)我采用的頂層模型結(jié)構(gòu)嚴(yán)格對(duì)應(yīng)SAR ADC的信號(hào)鏈路模擬輸入經(jīng)過(guò)采樣保持開關(guān)進(jìn)入比較器一端DAC輸出進(jìn)入比較器另一端SAR邏輯根據(jù)比較器結(jié)果逐位設(shè)置DAC的電容開關(guān)。整個(gè)系統(tǒng)是一個(gè)混合信號(hào)環(huán)路所以建模時(shí)既要處理連續(xù)時(shí)間信號(hào)也要處理離散時(shí)鐘事件。在MATLAB里我用的是腳本與Simulink混合的方式。底層算法邏輯如SAR搜索算法、校準(zhǔn)算法用MATLAB Function塊寫入方便調(diào)試采樣保持、比較器、DAC這些偏模擬性質(zhì)的模塊用Simulink基礎(chǔ)庫(kù)里的數(shù)學(xué)運(yùn)算模塊搭建便于注入噪聲和失配。數(shù)據(jù)流的時(shí)序關(guān)系是建模成功與否的關(guān)鍵。SAR ADC的每個(gè)轉(zhuǎn)換周期分成采樣階段和轉(zhuǎn)換階段采樣階段輸入信號(hào)被采樣到電容陣列上轉(zhuǎn)換階段SAR邏輯從MSB開始逐位比較每一位判決占用一個(gè)時(shí)鐘周期。所以頂層模型里必須有一個(gè)嚴(yán)格的時(shí)鐘計(jì)數(shù)器確保采樣、比較、DAC建立、數(shù)字輸出在正確的時(shí)間節(jié)點(diǎn)發(fā)生。我在實(shí)際代碼中維護(hù)了一個(gè)clk_cnt變量每個(gè)時(shí)鐘上升沿加1在1到N2的范圍內(nèi)循環(huán)。第0個(gè)時(shí)鐘沿是采樣沿第1個(gè)時(shí)鐘沿后開始逐次逼近這樣整個(gè)時(shí)序一目了然也方便后續(xù)在Simulink里做波形觀測(cè)。function digital_out sar_adc_behavioral(signal_in, params) % 頂層行為級(jí)模型函數(shù) % signal_in歸一化后的模擬輸入范圍 [-1, 1] % params結(jié)構(gòu)體包含位寬、電容失配標(biāo)準(zhǔn)差、比較器噪聲等參數(shù) N params.Nbits; % 位數(shù) Vref params.Vref; % 參考電壓 Vdac 0; % DAC初始輸出 clk_cnt 0; % 時(shí)鐘計(jì)數(shù)器 digital_bits zeros(1, N); % 數(shù)字碼寄存器 for clk 1:(N2) if clk 1 % 采樣階段 Vdac signal_in; else % 轉(zhuǎn)換階段從MSB開始 bit_index clk - 1; if bit_index N % 嘗試把當(dāng)前位置1 Vdac_test update_dac(digital_bits, bit_index, 1, params); % 比較器判決 if signal_in Vdac_test digital_bits(bit_index) 1; else digital_bits(bit_index) 0; end Vdac update_dac(digital_bits, bit_index, digital_bits(bit_index), params); end end end digital_out bi2de(digital_bits, left-msb); % 轉(zhuǎn)成十進(jìn)制數(shù) end這段代碼是骨架中的骨架實(shí)際項(xiàng)目里我會(huì)在update_dac函數(shù)里加入電容失配矩陣在比較器判決處注入噪聲在采樣處疊加抖動(dòng)和帶寬限制。但核心的分時(shí)邏輯就是上面這個(gè)“采樣→逐位逼近→輸出”的三段式結(jié)構(gòu)。3. 核心模塊建模與參數(shù)設(shè)計(jì)3.1 采樣保持與時(shí)鐘抖動(dòng)建模采樣保持電路的行為模型重點(diǎn)在三個(gè)非理想因素導(dǎo)通電阻帶來(lái)的帶寬限制、電荷注入導(dǎo)致的采樣誤差、以及時(shí)鐘抖動(dòng)引起的孔徑不確定度。對(duì)于帶寬限制我在模型里用一階低通濾波來(lái)近似。采樣開關(guān)的導(dǎo)通電阻Ron和采樣電容Cs構(gòu)成一個(gè)RC低通其3dB帶寬大概是1/(2*pi*Ron*Cs)。要讓16位精度不受帶寬影響這個(gè)RC時(shí)間常數(shù)必須遠(yuǎn)小于采樣窗口的時(shí)間。工程上有個(gè)經(jīng)驗(yàn)法則采樣時(shí)間內(nèi)RC時(shí)間常數(shù)至少是采樣窗口的十倍以上否則高頻信號(hào)的幅度衰減和相位延遲就會(huì)明顯劣化SFDR。時(shí)鐘抖動(dòng)就更微妙了。抖動(dòng)引起的采樣電壓誤差與輸入信號(hào)的壓擺率直接相關(guān)誤差電壓約等于dv/dt * t_jitter。在MATLAB模型里我為每個(gè)采樣點(diǎn)生成一個(gè)高斯分布的時(shí)鐘偏差再乘以當(dāng)前時(shí)刻信號(hào)的斜率把這個(gè)誤差疊加到采樣值上。我一般用下面這段代碼來(lái)生成采樣值里面同時(shí)考慮了RC帶寬和時(shí)鐘抖動(dòng)% 采樣階段建模 function vsample sample_hold(t, x, Ron, Cs, tj) tau Ron * Cs; % RC時(shí)間常數(shù) % 理想采樣值 v_ideal x(t); % 時(shí)鐘抖動(dòng)導(dǎo)致的采樣時(shí)刻偏差 t_actual t tj * randn(); v_jittered x(t_actual); % 一階RC建立誤差假設(shè)采樣窗口為Ts_hold Ts 1e-6; % 采樣周期示例 Ts_hold Ts/2; % 采樣窗口半個(gè)周期 settle_error (v_ideal - v_jittered) * exp(-Ts_hold/tau); vsample v_jittered settle_error; end實(shí)際項(xiàng)目中我習(xí)慣把時(shí)鐘抖動(dòng)和RC帶寬分別做成兩個(gè)獨(dú)立參數(shù)便于觀察各自對(duì)SNR的影響。單獨(dú)跑抖動(dòng)參數(shù)掃描時(shí)結(jié)果會(huì)和理論曲線吻合得很好這也驗(yàn)證了模型本身沒(méi)寫錯(cuò)。3.2 比較器噪聲與失調(diào)注入方法比較器是整個(gè)SAR ADC里最“致命”的模塊之一。它的失調(diào)電壓會(huì)直接變成ADC的輸出失調(diào)誤差而它的輸入?yún)⒖荚肼晻?huì)疊加在信號(hào)上影響SNR。在行為級(jí)模型里我把比較器建模成一個(gè)帶有遲滯的理想判決器再加上失調(diào)和噪聲兩個(gè)偏置量。在MATLAB里實(shí)現(xiàn)很簡(jiǎn)單每次比較時(shí)在判斷條件上加上一個(gè)隨機(jī)量% 比較器判決含失調(diào)和噪聲 function cmp_out comparator(vp, vn, vos, vn_rms) if vp vos vn_rms * randn() vn cmp_out 1; else cmp_out 0; end end這里的vos是失調(diào)電壓vn_rms是等效輸入噪聲的有效值。有一點(diǎn)需要注意SAR ADC的噪聲來(lái)源不只有比較器采樣電容上的KT/C熱噪聲也占了很大比重。在建模時(shí)我會(huì)把KT/C噪聲折算成等效輸入噪聲與比較器噪聲一起疊加這樣才能反映真實(shí)的信噪比上限。KT/C的計(jì)算公式是sqrt(k*T/C)比如室溫下1pF電容產(chǎn)生的噪聲有效值約為64uV。如果目標(biāo)SNR是90dB滿量程2V那么總積分噪聲要小于約31.6uV。這樣的話1pF的單端采樣電容已經(jīng)不夠了需要增大電容或采用相關(guān)雙采樣等降噪技術(shù)。在模型里注入這個(gè)噪聲后設(shè)計(jì)指標(biāo)一下子就能對(duì)齊。3.3 電容陣列DAC與失配建模SAR ADC里最常見的DAC結(jié)構(gòu)是二進(jìn)制權(quán)重電容陣列。每個(gè)電容的權(quán)重由單位電容的數(shù)量決定理想情況下最高位電容是2^(N-1)*Cu最低位電容是Cu。但實(shí)際工藝?yán)飭挝浑娙荽嬖陔S機(jī)失配這個(gè)失配會(huì)導(dǎo)致DAC的輸出電壓偏離理想值進(jìn)而變成ADC的DNL和INL。在MATLAB模型里我用一個(gè)數(shù)組來(lái)表示每個(gè)電容的實(shí)際值數(shù)組元素是Cu * (1 delta_i)其中delta_i服從均值為0、方差由失配參數(shù)決定的高斯分布。電容失配的標(biāo)準(zhǔn)差與面積的關(guān)系工藝模型里通常會(huì)給出sigma A / sqrt(W*L)或更精確的Pelgrom模型公式。我建模時(shí)生成的電容失配矩陣關(guān)鍵代碼大概是這樣的% 生成電容失配矩陣 function cap_array gen_cap_array(N, Cu, sigma_mismatch) cap_array zeros(1, N); for i 1:N % 二進(jìn)制權(quán)重第i位的電容是2^(i-1)個(gè)單位電容 weight 2^(i-1); mismatch sigma_mismatch * randn() / sqrt(weight); % 失配與sqrt(面積)成反比 cap_array(i) weight * Cu * (1 mismatch); end end這里有一個(gè)工程技巧最高位的電容面積最大其相對(duì)失配最小最低位電容面積最小失配最大。所以建模時(shí)不能簡(jiǎn)單給所有電容一個(gè)相同的相對(duì)失配而應(yīng)該根據(jù)面積大小調(diào)整其失配標(biāo)準(zhǔn)差。這也是為什么我的代碼里用了sqrt(weight)來(lái)縮放失配——失配與面積平方根成反比是工藝層面的基本規(guī)律。DAC輸出電壓的計(jì)算邏輯是把所有接參考電壓的電容電荷加起來(lái)除以總電容再乘以Vref。如果所有電容都接Vref輸出就是Vref如果全都接地輸出就是0。實(shí)際的轉(zhuǎn)換過(guò)程中SAR邏輯從MSB往下依次控制電容的接法最終使DAC輸出電壓逼近輸入電壓。3.4 SAR邏輯與時(shí)序設(shè)計(jì)SAR邏輯在行為級(jí)模型里看似簡(jiǎn)單但它是整個(gè)模型的“神經(jīng)系統(tǒng)”。它的工作方式是從最高位開始先假設(shè)當(dāng)前位為1把DAC輸出與采樣輸入比較如果輸入大于DAC輸出則保留1否則置0。然后處理下一位直到最低位判決完成。這個(gè)逐位逼近的過(guò)程本質(zhì)上是二分查找。16位的SAR ADC需要16個(gè)時(shí)鐘周期完成轉(zhuǎn)換加上采樣周期一個(gè)完整轉(zhuǎn)換周期是17個(gè)時(shí)鐘周期。在實(shí)際邏輯設(shè)計(jì)里還要考慮DAC建立時(shí)間、比較器判決時(shí)間以及數(shù)字邏輯的傳播延遲所以最小可行時(shí)鐘周期會(huì)被這些時(shí)間參數(shù)限制。在MATLAB行為級(jí)模型里我給每個(gè)時(shí)鐘周期設(shè)置了“比較器判決時(shí)間”和“DAC建立時(shí)間”兩個(gè)內(nèi)部延遲參數(shù)。如果比較器判決時(shí)間過(guò)長(zhǎng)模型會(huì)提示“時(shí)序不收斂”如果DAC建立時(shí)間不足則模型中DAC的輸出只建立到一定的穩(wěn)定精度這個(gè)誤差會(huì)被帶進(jìn)下一次比較。這個(gè)設(shè)計(jì)和真實(shí)電路里的時(shí)序約束幾乎一一對(duì)應(yīng)。尤其在16位精度下DAC必須在一位判決的時(shí)間內(nèi)建立到0.5LSB以下。16位LSB對(duì)應(yīng)滿量程的約1/65536也就是約15ppm。如果假設(shè)建立誤差按指數(shù)衰減那么需要約11個(gè)時(shí)間常數(shù)才能達(dá)到這個(gè)精度。這就意味著R*C乘積必須遠(yuǎn)小于一個(gè)時(shí)鐘周期。模型里把這些關(guān)系顯式寫出來(lái)后驗(yàn)證后續(xù)電路側(cè)的開關(guān)尺寸和DAC建立時(shí)間就方便多了。4. 性能評(píng)估與指標(biāo)計(jì)算4.1 用FFT算SNR、SINAD、ENOB和SFDR模型搭建完成后最大的問(wèn)題是如何從仿真數(shù)據(jù)里提取性能指標(biāo)。ADC的動(dòng)態(tài)性能測(cè)試標(biāo)準(zhǔn)做法是相干采樣后做FFT。所謂相干采樣就是保證采樣點(diǎn)數(shù)M和信號(hào)周期數(shù)J互質(zhì)并且Fin/Fs J/M。這樣做FFT時(shí)能量能集中在單一頻率bin上不會(huì)被頻譜泄漏污染。在MATLAB里我會(huì)用一個(gè)腳本自動(dòng)完成這個(gè)過(guò)程生成一個(gè)滿量程正弦波輸入跑完整個(gè)SAR ADC模型得到一串?dāng)?shù)字碼再對(duì)數(shù)字碼做加窗FFT計(jì)算信號(hào)功率、噪聲功率和諧波功率。核心代碼如下% 動(dòng)態(tài)性能計(jì)算 function metrics adc_fft_analysis(codes, Fs, Fin, M) % codesADC輸出數(shù)字碼長(zhǎng)度M % Fs采樣率Fin信號(hào)頻率M采樣點(diǎn)數(shù) % 去除直流和線性斜率避免窗口泄漏 codes codes(:); Nfft M; % 加漢寧窗或使用相干采樣時(shí)不加窗 window hanning(Nfft, periodic); data codes .* window; spectrum fft(data, Nfft); P abs(spectrum).^2 / (Nfft^2 / 4); % 找信號(hào)bin bin_signal round(Fin / Fs * Nfft) 1; Psig sum(P(max(1,bin_signal-2):min(Nfft,bin_signal2))); % 信號(hào)功率 % 諧波位置2nd, 3rd... harmon_pow 0; for k 2:8 bin_h round(k * Fin / Fs * Nfft) 1; if bin_h 1 bin_h Nfft harmon_pow harmon_pow sum(P(max(1,bin_h-1):min(Nfft,bin_h1))); end end Pnoise sum(P) - Psig - harmon_pow; SINAD 10*log10(Psig / (Pnoise harmon_pow)); SNR 10*log10(Psig / Pnoise); SFDR 10*log10(Psig / harmon_pow); ENOB (SINAD - 1.76) / 6.02; metrics.SINAD SINAD; metrics.SNR SNR; metrics.SFDR SFDR; metrics.ENOB ENOB; end這里有個(gè)經(jīng)驗(yàn)點(diǎn)如果仿真數(shù)據(jù)量不夠大加窗會(huì)影響諧波泄漏的估算。我一般建議至少采集2^124096個(gè)點(diǎn)才能把底噪壓到足夠低否則ENOB算出來(lái)會(huì)偏小。用這個(gè)腳本跑完理想模型ENOB應(yīng)該接近N0.5左右因?yàn)閷?shí)際有效位會(huì)受量化噪聲影響理想16位ADC的SNR理論值是98.08dBENOB約16.0。如果連理想模型都跑不到這個(gè)水平那一定是模型或腳本里有bug這時(shí)候不要急著往下加非理想因素先排查基本問(wèn)題。4.2 靜態(tài)指標(biāo)INL/DNL的仿真方法動(dòng)態(tài)指標(biāo)之外INL和DNL是衡量ADC線性度的另一組關(guān)鍵指標(biāo)。DNL反映的是相鄰數(shù)字碼對(duì)應(yīng)的“代碼寬度”偏離理想值多少而INL則是把DNL累積起來(lái)反映整體轉(zhuǎn)移曲線對(duì)理想直線的偏差。在行為級(jí)模型里我通常用兩種方法測(cè)INL/DNL斜坡法和正弦直方圖法。斜坡法簡(jiǎn)單直觀給ADC灌一個(gè)緩慢上升的斜坡信號(hào)記錄每個(gè)數(shù)字碼出現(xiàn)的次數(shù)代碼寬度就是出現(xiàn)點(diǎn)數(shù)除以采樣率。如果某個(gè)碼出現(xiàn)的點(diǎn)數(shù)明顯多于或少于平均值就說(shuō)明這一級(jí)的臺(tái)階寬度偏大或偏小。正弦直方圖法更適合實(shí)測(cè)數(shù)據(jù)因?yàn)楫a(chǎn)生高精度斜坡信號(hào)并不容易。做法是輸入一個(gè)幅度略超滿量程的正弦波統(tǒng)計(jì)每個(gè)數(shù)字碼出現(xiàn)的概率再和理想正弦分布對(duì)比。因?yàn)檎也ǖ母怕拭芏仍诜逯蹈浇摺⑦^(guò)零附近低所以只要知道輸入幅度和位數(shù)就可以反推出每個(gè)碼對(duì)應(yīng)的實(shí)際電壓閾值從而計(jì)算DNL和INL。我在建模時(shí)用斜坡法來(lái)驗(yàn)證DAC失配模型因?yàn)镸ATLAB生成的數(shù)字斜坡可以做到絕對(duì)理想DAC失配對(duì)INL造成的S形曲線一目了然。得到INL曲線后我經(jīng)常做一個(gè)判斷如果INL呈現(xiàn)出明顯的二次或高次形狀通常說(shuō)明電容失配中存在著系統(tǒng)性的梯度效應(yīng)這時(shí)需要調(diào)整單位電容的布局方案而不是單純追求更大的電容面積。4.3 蒙特卡洛分析確定工藝魯棒性單個(gè)失配樣本只能告訴我們這個(gè)特定芯片的性能而實(shí)際量產(chǎn)中每顆芯片的電容失配都不同。要評(píng)估設(shè)計(jì)在工藝波動(dòng)下的表現(xiàn)蒙特卡洛仿真是標(biāo)準(zhǔn)做法。在MATLAB里做蒙特卡洛分析非常方便在for循環(huán)里每次生成一個(gè)隨機(jī)的電容失配矩陣跑一次完整ADC轉(zhuǎn)換和性能計(jì)算把所有結(jié)果存起來(lái)。跑上幾百次后統(tǒng)計(jì)ENOB/SFDR的均值、標(biāo)準(zhǔn)差和最差情況就能判斷設(shè)計(jì)是否滿足量產(chǎn)要求。我在一個(gè)16位SAR項(xiàng)目里跑過(guò)300次蒙特卡洛每次采樣4096點(diǎn)。結(jié)果發(fā)現(xiàn)SFDR主要受電容失配限制而SNR主要受比較器噪聲和KT/C噪聲限制。根據(jù)這個(gè)結(jié)果我把優(yōu)化重心放在提高電容匹配精度上比如單位電容取大、加dummy電容而不是一味降低比較器噪聲。如果沒(méi)有蒙特卡洛分析這個(gè)方向判斷很可能做反白花幾周優(yōu)化時(shí)間。5. 常見問(wèn)題與排查技巧實(shí)錄5.1 模型跑出來(lái)的ENOB總比理論值低1~2位這是新手最容易碰到的問(wèn)題。我排查這種問(wèn)題時(shí)會(huì)按“信號(hào)鏈順序”逐步檢查先看采樣環(huán)節(jié)有沒(méi)有引入過(guò)大噪聲再看比較器判決是不是被噪聲或失調(diào)干擾最后看DAC建立是否足量。最容易被忽略的是“基準(zhǔn)源噪聲”。很多模型里把Vref當(dāng)成理想恒定值實(shí)際上芯片內(nèi)部基準(zhǔn)源是帶噪聲和帶內(nèi)阻的。如果基準(zhǔn)源噪聲沒(méi)有建模模型性能會(huì)顯得比實(shí)際好這是個(gè)“樂(lè)觀偏差”反過(guò)來(lái)如果采樣時(shí)鐘抖動(dòng)參數(shù)給得太大性能又會(huì)偏悲觀。我習(xí)慣在模型里把參考電壓也加一個(gè)可調(diào)節(jié)的噪聲項(xiàng)這樣調(diào)參時(shí)能直觀看到“基準(zhǔn)源噪聲每降低10uVSNR提升約0.5dB”這類規(guī)律。另一個(gè)細(xì)節(jié)FFT分析時(shí)如果沒(méi)有做相干采樣或者采樣點(diǎn)數(shù)太少頻譜泄漏會(huì)嚴(yán)重抬高噪底ENOB被壓低。這種情況不代表ADC模型本身差而是測(cè)量方法的問(wèn)題。建議先用理想模型配合標(biāo)準(zhǔn)相干采樣腳本自檢確認(rèn)測(cè)量鏈路無(wú)誤后再評(píng)估非理想模型。5.2 電容失配注入過(guò)大導(dǎo)致高位碼丟失電容失配的方差設(shè)置不當(dāng)最典型的癥狀是“某些數(shù)字碼從結(jié)果中消失”。比如16位ADC跑完4096個(gè)點(diǎn)后FFT頻響看起來(lái)沒(méi)什么大問(wèn)題但只要統(tǒng)計(jì)輸出碼值的分布就會(huì)發(fā)現(xiàn)一些碼值從來(lái)沒(méi)出現(xiàn)過(guò)轉(zhuǎn)移曲線呈現(xiàn)局部缺失。這背后的原理是當(dāng)某位電容的實(shí)際權(quán)重偏離理想值過(guò)多時(shí)相鄰兩個(gè)DAC輸出電壓之間會(huì)出現(xiàn)“跳碼”導(dǎo)致某些數(shù)字碼對(duì)應(yīng)的模擬區(qū)間寬度為負(fù)。實(shí)際芯片里這叫非單調(diào)性嚴(yán)重時(shí)比較器可能停機(jī)ADC完全無(wú)法工作。我排查時(shí)第一件事是把DAC的實(shí)際權(quán)重打印出來(lái)對(duì)比理想權(quán)重看偏差是否在3*sigma以內(nèi)。如果失配參數(shù)給的過(guò)大就先把sigma調(diào)回工藝給出的合理范圍。有些朋友喜歡“為了測(cè)試魯棒性”故意用很大的失配這本身沒(méi)問(wèn)題但需要有明確的應(yīng)用場(chǎng)景否則就是給自己制造麻煩。5.3 仿真速度慢參數(shù)掃描效率低行為級(jí)模型雖然比晶體管仿真快但如果跑蒙特卡洛和參數(shù)掃描累積下來(lái)的時(shí)間一樣可觀。我在做參數(shù)掃描時(shí)最喜歡用的是MATLAB的parfor并行循環(huán)直接把一臺(tái)多核電腦的CPU用滿。另外在掃描參數(shù)范圍內(nèi)使用linspace生成一組參數(shù)每組的蒙特卡洛次數(shù)可以根據(jù)靈敏度自適應(yīng)調(diào)整——不敏感的參數(shù)少跑幾次敏感的參數(shù)多跑幾次可以節(jié)約一半以上的總仿真時(shí)間。還有一個(gè)容易踩的坑每跑一次蒙特卡洛都重新生成電容失配矩陣。這當(dāng)然沒(méi)問(wèn)題但如果你想對(duì)比“同一個(gè)失配樣本在不同比較器噪聲水平下的表現(xiàn)”必須把失配樣本固定住否則兩組結(jié)果的差異會(huì)同時(shí)受到失配和噪聲兩個(gè)隨機(jī)變量的影響沒(méi)法準(zhǔn)確歸因。我會(huì)在模型里加入外部種子值控制的隨機(jī)數(shù)生成器確保實(shí)驗(yàn)的可復(fù)現(xiàn)性。6. 擴(kuò)展方向與個(gè)人心得6.1 從MATLAB模型到Cadence真實(shí)驗(yàn)證流程MATLAB行為模型跑完并不代表項(xiàng)目就結(jié)束了。我建議的完整流程是先在MATLAB里把架構(gòu)方案和模塊指標(biāo)確定再進(jìn)Cadence做晶體管級(jí)驗(yàn)證。如果電路仿真結(jié)果和MATLAB模型預(yù)測(cè)偏差過(guò)大通常說(shuō)明某個(gè)模塊的行為模型參數(shù)設(shè)置不合理要回頭修正模型而不是硬調(diào)電路。實(shí)際操作中很多團(tuán)隊(duì)還會(huì)用MATLAB生成電路的激勵(lì)文件和期望輸出然后在Cadence的testbench里比對(duì)。這樣可以省去寫大量Verilog testbench的時(shí)間。特別是仿真數(shù)據(jù)量大的時(shí)候用MATLAB做后處理分析比Cadence自帶的波形計(jì)算器方便太多。我甚至?xí)袴FT分析腳本直接封裝成函數(shù)Simulink輸出數(shù)據(jù)后一鍵出結(jié)果。6.2 建模過(guò)程中的一些心得體會(huì)前面寫了很多技術(shù)細(xì)節(jié)最后聊幾句自己的實(shí)操感受。我在這個(gè)SAR ADC建模項(xiàng)目里最深的體會(huì)是行為級(jí)模型的價(jià)值不僅在于“算出一個(gè)好看的數(shù)字”更在于它逼著你把信號(hào)鏈的每個(gè)環(huán)節(jié)都想清楚。以前看論文覺(jué)得SAR ADC原理很簡(jiǎn)單直到自己建模時(shí)才發(fā)現(xiàn)比較器的噪聲帶寬怎么算、DAC的建立時(shí)間怎么留余量、采樣開關(guān)的時(shí)鐘饋通怎么補(bǔ)償每個(gè)細(xì)節(jié)都是一個(gè)坑。另一點(diǎn)是參數(shù)化設(shè)計(jì)的重要性。模型里所有可調(diào)參數(shù)我都會(huì)用結(jié)構(gòu)體統(tǒng)一管理而不是散落在各個(gè)腳本里。這樣做的好處是跑參數(shù)掃描時(shí)可以一次性生成組合出問(wèn)題時(shí)也能快速定位是哪一組參數(shù)導(dǎo)致的異常。我見過(guò)不少同事的模型里參數(shù)寫著寫著就寫死了回過(guò)頭來(lái)想復(fù)現(xiàn)某次實(shí)驗(yàn)結(jié)果還得翻代碼歷史記錄效率非常低。還有一點(diǎn)小建議模型注釋要寫得足夠詳細(xì)。這個(gè)項(xiàng)目隔了幾個(gè)月再回頭看如果沒(méi)有注釋我可能都記不清當(dāng)初設(shè)置某個(gè)參數(shù)時(shí)的物理含義。我的習(xí)慣是每個(gè)參數(shù)都注明“典型值、范圍、對(duì)應(yīng)電路模塊”這樣模型本身也是一份可交付的設(shè)計(jì)文檔。后續(xù)擴(kuò)展SAR ADC的校準(zhǔn)算法比如前臺(tái)校準(zhǔn)、后臺(tái)校準(zhǔn)、注入抖動(dòng)校準(zhǔn)直接用這個(gè)模型作為環(huán)境去測(cè)試這會(huì)幫你省掉非常多事。本文還有配套的精品資源點(diǎn)擊獲取