
简介面向GPS导航接收机与模拟集成电路设计人员这份专业参考PDF围绕可变增益放大器VGA的完整设计流程展开。针对不同传输距离和多径衰减导致接收信号强度不稳定的问题作者基于TSMC 0.18μm CMOS工艺采用脉冲宽度调制AGC与五位二进制码控制的五级级联放大结构实现了14dB至73dB的可控增益范围增益误差小于5%噪声系数为19.68dB输入1dB压缩点为-22.14dBm。压缩包内仅含1个PDF文件大小3.37MB全文含设计原理、电路结构、仿真结果及参考文献适合相关方向的研究生、工程师作为论文写作与电路设计参考。平台显示已有109人学习内容聚焦指标分析与AGC/VGA协同设计可直接用于理解GPS接收机前端链路的增益调控思路。1. GPS可变增益放大器设计这份资料到底解决什么问题GPS导航接收机在实际环境里遇到的第一个麻烦不是解算算法而是信号强度压根就没个准——传输距离拉大信号弱到被底噪淹没多径衰减让同一颗卫星的信号忽大忽小AGC没做好后面基带处理全是白搭。这篇论文讲的就是GPS接收机里可变增益放大器VGA怎么设计基于TSMC 0.18μm CMOS工艺用5位二进制码控制5级级联差分放大电路在1.8V电源下实现14dB到73dB、整整60dB的增益可调范围。适合做模拟IC设计、射频前端集成、导航接收机AGC环路的人读尤其是那些正被「增益范围窄、工艺角下增益漂移、噪声系数压不下去」卡住的人。2. 为什么GPS接收机必须有VGAAGC信号动态范围问题与三个关键指标2.1 远近效应与多径衰减下的信号强度不稳定GPS接收机接收到的信号不是恒定功率的。卫星离地面两万多公里信号到地面已经非常弱标称功率通常在-130dBm左右但实际落地强度受大气衰减、遮挡、多径反射影响波动范围能到几十dB。在靠近窗户、天线附近有金属反射体、或者接收机在快速移动的场景下信号强度的瞬态变化尤其明显——上一秒还弱到只有-140dBm下一秒多径叠加可能抬到-110dBm甚至更高。如果不做任何增益控制射频前端的输出要么小到无法触发ADC的最小量化电平要么直接饱和削波。ADC动态范围就摆在那前端增益不能跟着信号强度自动变整个接收链路的信噪比就崩了。所以AGC是接收机的刚性需求VGA又是AGC的核心模块——没有VGAAGC想调增益也没东西可调。2.2 增益范围14dB到73dB意味着什么论文给出的增益范围是14dB~73dB动态范围正好60dB。这个数字的工程含义是当控制字B[5:1]全为0时增益最低只有14dB全为1时增益最高到73dB。跨度60dB意味着AGC可以把从弱信号到强信号的输入功率变化范围完全吸收掉输出端始终稳定在一个固定的功率电平。拆分到三级模块来看VGA5模块实现6~35dB增益VGA43模块实现6~30dBVGA21模块实现3~8dB。各级增益范围并不均等这是因为越靠近输入端增益变化越需要精细越靠后主要负责增益叠加和负载驱动。为什么后级不需要大增益范围因为AGC环路的工作顺序是先看总输出功率再由PWM译码器给出5位二进制码后级的小范围增益做的是微调而不是主调节。2.3 增益误差小于5%与恒定GM偏置的关联增益误差小于5%是工艺角仿真下的指标。在TSMC 0.18μm CMOS工艺下TT/SS/FF三种工艺角分别跑完增益偏差都要控制在5%以内。这个指标直接决定了AGC控制环路的精度——增益若在工艺角下漂了太远PWM译码器给出的控制码对应的增益值就会偏离设计值输出幅度可能超出目标范围AGC就会在相邻两个控制码之间反复抖动环路根本稳不住。论文的解法是恒定GM偏置电路让输入管跨导gm只与外部电阻R和比例系数K有关与工艺、温度解耦。这点很关键。如果在版图上直接用无校准的片上电阻做增益定位工艺角下电阻偏差动辄±20%增益误差会直接破5%的线。恒定GM偏置相当于给了VGA一颗「定心丸」。移位寄存器和PWM译码器那边产生控制码这边偏置电路保证每个码对应的增益值可预测、可复现。2.4 噪声系数19.68dB与1dB压缩点-22.14dBm的取舍噪声系数19.68dB乍看偏高但要看场景。GPS接收机里VGA通常放在中频或者基带链路前面已经有低噪声放大器撑噪声指标了VGA本身的NF对整机噪声系数的贡献被前级增益稀释掉了——常见做法是前级LNA提供20dB左右的增益VGA的NF折算到输入端只剩零点几个dB。所以VGA的噪声系数不是越小越好而是要跟整个接收链路一起算预算。1dB压缩点-22.14dBm则代表了线性度边界输入功率到这个点增益开始压缩1dB。设计差分结构和采用开关切换电路的目的之一就是提升线性度论文里专门提到了「数字控制的开关切换具有较高的线性度」。64dB的增益范围意味着最大增益73dB档下输入信号功率超过-22.14dBm就压缩了这正好配合AGC在输入功率升高时压低增益保证后级始终工作在线性区——所以这个压缩点不是缺陷而是AGC环路设计的输入约束条件。提示复现这套设计时先别急着调增益范围先确认偏置电路控制端全为高电平时电流是否为60.24μA、偏置电压是否为698.6mV——这是后面所有模块仿真正确的前提。3. 拆解五级级联放大电路五位二进制码如何控制60dB增益切换3.1 模块划分与命名逻辑VGA整体由VGA5、VGA43、VGA21三个子模块级联构成名字里的数字不是随意的VGA5由B5控制包含第一级放大用1个差分对增益档位由B5的单bit决定0和1各对应一档增益仿真结果是5.356dB和34.88dBVGA43由B4、B3控制包含第二级和第三级放大每个bit控制一组差分开关B4B3组合00/01/10/11共4种增益VGA21由B2、B1控制包含第四级和第五级放大同样4种组合。三个模块总共由5个bit控制级联后总增益就是各级增益之和。这样做的好处是——如果用传统连续调谐VGA控制电压稍微漂移一点增益就跟着漂改成数字码控制后增益档位离散化了控制字稳定增益就稳定。PWM式自动增益控制模块输出脉宽信号经脉冲宽度译码器解成5位二进制码再送到各级开关环路稳定时PWM占空比抖动引起的增益抖动被二进制码的量化特性天然抑制。3.2 差分放大单元的增益公式推导核心放大单元是电阻作负载的差分对增益公式必须吃透Av Vout / Vin gm × R其中gm是输入管跨导gm μn × Cox × (W/L) × (VGS - VTH)从公式能直接读出增益的三个调节路径改W/L管子的宽长比、改尾电流I间接改VGS、改负载电阻R。论文在差分对里用数字开关控制「哪一路电阻并进去生效」——B4和B4N是互斥的两个开关信号B4导通时增益由其中一组电阻提供另一组电阻完全不参与B4N导通时换另一组。这样同一个差分结构通过开关切换就有不同的等效负载电阻从而产生不同的增益档位。这里有个容易忽略的细节因为总增益范围大每个子模块内部其实不止一级。VGA5、VGA43、VGA21各包含2级放大电路5个差分放大对串起来后总增益为G (gm1 × R1) × (gm2 × R2) × ... × (gm5 × R5)只要单级增益设计成几dB到十几dB五级相乘就能覆盖60dB。用多级级联的好处是每一级的单级增益不需要做太高放大器工作在线性区的余量就大稳定性也更好走。代价就是级间必须加耦合电容每一级都要做偏置这些电容又在版图上占了不小面积。3.3 级间耦合方式阻容耦合与直接耦合的取舍VGA5和VGA43之间用阻容耦合VGA21模块内部用直接耦合输出端再接电压buffer。为什么这么分层设计阻容耦合用大电容把前级的直流工作点隔掉只让交流信号通过。好处是每一级偏置独立前一级的直流漂移不会直接叠加到后一级输入端调试时单级调偏置很省事。坏处是电容在版图里占面积而且低频处会有一个由耦合电容和输入阻抗构成的高通极点频率太低信号就衰减。GPS中频/基带信号的频率在4.092MHz这个量级耦合电容取小几百fF到几pF高通极点做在几kHz以下就不会压到有用信号。VGA21模块改用直接耦合电压buffer是因为它在链路最末端直接面对ADC负载。ADC输入有等效电容和开关动态电流负载阻抗不确定且随采样时钟变化。直接耦合省掉了输出电容输出电压摆到ADC输入端的路径更短再靠buffer的低输出阻抗把VGA和高阻负载隔开——这样ADC的输入电容不参与VGA的增益计算VGA的增益不会因为接了ADC就变。3.4 差分结构为什么是首选论文选择全差分结构而不是单端结构本质就两条共模抑制和抗干扰能力。GPS接收机里数字电路和模拟电路在同一个die上衬底噪声和电源噪声非常可观单端放大对这些噪声毫无招架之力差分对天然能抵消共模噪声这是接收机链路里模拟模块的基本功。另一条是增大输出摆幅——差分管两端输出电流镜像反相负载电阻两端的电压变化方向互补等效输出摆幅翻倍对1.8V低压供电下的动态范围尤为重要。差分结构还有一个工程红利匹配做得好时偶次谐波被抑制线性度指标更容易做。这也是为什么1dB压缩点能做到-22.14dBm左右而不是更早压缩的原因之一。注意开关切换增益档位时B码的电平必须干净利落。1.8VCMOS电平直接驱动NMOS开关时如果控制信号上升沿太缓开关有一段时间处于半导通状态输出会出现毛刺——我在实际复现时给控制端加了一级反相器整形毛刺明显减少。4. 复现与仿真避坑增益误差、噪声系数、版图寄生和负载牵制的四类实测问题4.1 现象一增益误差在工艺角下超过5%现象用TSMC 0.18μm工艺库做SS和FF工艺角仿真时最高增益档的增益比TT角偏移了6%~8%超出论文指标最低增益档偏移相对小一些。原因增益档位切换靠负载电阻R而片上电阻在工艺角下阻值偏离很大。gm和R的漂移方向有时互相补偿有时互相叠加在最不利组合下总增益误差就破5%了。恒定GM偏置电路治的是gm随温度和工艺漂移的大头但电阻R本身没有校准机制该漂还是漂。解决1把增益定位电阻从普通poly电阻换成有校准bit的高精度电阻阵列或者用外部精密电阻做恒定GM偏置的基准——论文里恒GM偏置的gm最终由外部电阻决定就是这个思路2版图上把同一模块里的增益电阻做成同质同向排列提升相对匹配精度比绝对值更关键因为增益误差指标看的其实是各级增益的相对一致性3仿真时不要只跑TT角SS/FF都过一遍如果某个角下的偏差集中在某级模块单独调那一级的开关管尺寸。4.2 现象二噪声系数与增益档位互相牵制现象把VGA5模块低增益档B50和高增益档B51分别做噪声仿真低增益档下整体噪声系数恶化最终整个链路的NF比预期高2~3dB。原因VGA5是第一级输入端的噪声被后面全部级联放大当B50使第一级增益只有5.356dB时后级噪声折算到输入端时除以的增益太小后级噪声贡献被放大突出——弗里斯公式决定了前级增益越低、后级噪声权重越大。解决常见做法是把动态范围重新分配——把第一级的最小增益抬高到12dB以上损失的那部分低增益档靠中间级来补。如果第一级的最大增益档本身就定了34.88dB那就尽量让AGC在低输入功率时优先用VGA5的高增益档用后级VGA43和VGA21去压低总的增益。还可以把输入管栅极偏置调低一点、加大输入管宽长比降低沟道热噪声。不要指望靠加大尾电流来压噪声那样噪声系数没降多少功耗先上去了。4.3 现象三版图寄生导致后仿增益偏低现象前仿真增益曲线正确提寄生后整体增益掉了3~5dB尤其是最高增益档弱化最明显且高频频段增益滚降提前。原因五级级联结构里级间耦合电容和下一级输入电容组成的高通滤波器加上走线寄生电容在信号通路和节点上形成低通极点两条线叠加后把有效带宽压窄了金属走线电阻还会和输入栅极电容形成RC延时。解决按论文给出的面积预算306.2μm×342.3μm规划布局时把关键信号走线用高层金属厚金属走寄生电阻更小差分对的两根信号线必须对称等长不等长会引入共模转差模的串扰直接影响增益精度电源和地做成双环结构每级模块就近下电容到地把电源噪声对增益的影响降到最低。最稳妥的做法是每做完一个子模块就提取寄生做一次后仿别等整个版图画完再统一提——到时候一个bug牵连五级定位成本极高几乎没有后悔药。4.4 现象四接入ADC后增益漂移现象单独仿真VGA输出增益正常一接ADC模型再跑整体链路仿真增益比预期低零点几dBADC采样瞬间的输出毛刺还会干扰AGC环路判断。原因ADC输入等效电容直接挂在VGA输出节点上改变了级间负载采样时钟切换时产生动态电流给VGA输出增加了一个瞬态负载扰动环路误以为信号幅度波动会错误切换增益档位。解决论文在输出端接了电压buffer这一步不能省。buffer用单位增益接法输出阻抗做到几十欧以下ADC那点输入电容和动态电流对buffer输出的影响可以忽略。我一般还会在VGA输出与控制字切换之间加一个延迟窗口控制字变化后等几个时钟周期再让AGC重新检测输出功率避免采样毛刺引发增益来回切换的振荡。提示这四条坑是逐级递进的——先保证工艺角增益误差再压噪声再做版图后仿最后接负载验证。跳级调试会无法定位问题是哪一层引入的。5. 动手复现Cadence Spectre仿真流程与关键参数设置5.1 环境准备与原理图搭建复现论文这套VGA设计不需要真实流片用Cadence IC617/IC618自带的Spectre仿真器就够。先在Virtuoso Schematic Editor里建库PDK选用TSMC 0.18μm CMOS工艺模型确认模型库里包含模拟器件NMOS、PMOS、poly电阻、MIM电容。原理图搭建按模块拆开模块核心器件控制信号备注VGA51个差分对2组开关电阻B5/B5N单级高增益VGA432级差分对每级2组开关电阻B4/B4N, B3/B3N4种增益组合VGA212级差分对输出bufferB2/B2N, B1/B1N直接耦合偏置电路恒GM镜电流源阵列b1/b2/b3输出偏置电压698.6mV每级差分对的晶体管先按W/L10μm/0.18μm起步负载电阻按gm算完的目标增益反推。开关管用尺寸小一点的NMOS导通电阻要远小于并联的增益电阻位否则开关分压会吃掉本来就偏小的增益。5.2 控制字与仿真激励设置控制端用理想脉冲源给高低电平高电平1.8V、低电平0V。B[5:1]映射顺序不要搞反——论文仿真里B5是最高位。控制字00000对应最低增益14dB11111对应最高增益73dB01111和11111是论文整体仿真里明确给出的两个关键档位分别得到43.66dB和73.33dB。用Ocean脚本批量跑不同控制字的AC分析比手动画Schematic一个个点仿真快得多; VGA_top_sweep.ocean —— 批量扫五个控制位的AC仿真 simulator( spectre) design( VGA_top.scs ) modelFile( tsmc018.scs tt ) analysis( ac ?start 1k ?stop 1G ?dec 10 ) save( all) ; 控制字 00000 vars( B5 0 B4 0 B3 0 B2 0 B1 0 ) run() gain_00000 db20( value( v(/IFO ?result ac) 4.092M )) ; 控制字 11111 vars( B5 1.8 B4 1.8 B3 1.8 B2 1.8 B1 1.8 ) run() gain_11111 db20( value( v(/IFO ?result ac) 4.092M )) printf( Gain00000 %f dB\n gain_00000 ) printf( Gain11111 %f dB\n gain_11111 )逻辑说明analysis指定AC扫描范围从1kHz到1GHz按每十倍频程10个点的密度取点vars把5个控制端子全部设成理想电平源value在仿真结果里取4.092MHz频点上的输出电压值。GPS信号在这个设计里以4.092MHz作为中频/基带验证频点论文里所有指标都在这个频率下读取。参数说明频率上限1GHz远高于4.092MHz主要是为了观察有没有意外的高频谐振?dec 10保证高频段也有足够密度。如果你想先验证单级模块把design换成VGA5的子网表vars只需保留B5其它位置0即可。5.3 偏置电路的验证与校正偏置电路正确与否是全部仿真能否成立的前提。电路图里M1和M2的宽长比设成1:KM2的电流是M1的K倍gm最终表达式的分母里只有外部电阻R和K这两个可控量。在Spectre里跑tran或者DC仿真检查偏置输出点; bias_check.ocean —— 偏置电路DC工作点检查 analysis( dc ?save all ) run() printf( Bias Current %f uA\n value( v(/BIAS_I) ?result dc ) * 1e6 ) printf( Bias Voltage %f mV\n value( v(/BIAS_V) ?result dc ) * 1e3 )逻辑说明DC工作点仿真读的是静态值v(/BIAS_I)乘1e6转成微安v(/BIAS_V)乘1e3转成毫伏。如果读出的电流不是60.24μA、电压不是698.6mV不要急着往下跑AC——先调电流镜的镜像比例系数K直到落在目标值附近。参数说明论文里偏置电路在控制端全为高电平时提供的电流为60.24μA偏置电压为698.6mV。这两个值是各级放大管尾电流的来源和栅偏置基准差值超过5%时增益档位必然偏移。控制端b1/b2/b3是用来切偏置电流档位的如果芯片需要低功耗模式可以把其中某个bit拉低来降电流。5.4 噪声系数与1dB压缩点仿真噪声仿真用Spectre的noise分析设置参考输入源为差分输入端输出节点选IFO-IFON差分对; vga_noise.ocean —— 噪声系数与压缩点分析 analysis( noise ?out v(/IFO) ?ref v(/IF) ?start 1k ?stop 1G ?sweep frequency ) run() printf( NF %f dB\n value( nf( vout total ) 4.092M )) ; 1dB压缩点用PSS扫输入功率 analysis( pss ?fund 4.092M ?harmonics 3 ) run() compressionPoint compress( 1 ) ; 扫输入功率求1dB压缩点 printf( 1dB CP %f dBm\n compressionPoint )逻辑说明噪声分析里?out和?ref指定输出和参考节点Spectre会在所有频点上算出噪声系数PSS仿真看输入功率逐步抬高时基波增益跌掉1dB的位置。论文给出的噪声系数19.68dB是整体级联电路在增益为72.33dB档位下读出来的1dB压缩点-22.14dBm则是在最高增益档下扫输入功率得到的。参数说明?harmonics 3是取到三次谐波用于判断失真程度如果只看增益压缩设成1也够。PSS仿真耗时比AC长得多先跑完AC确认增益曲线正常再跑PSS别在增益没校准之前就浪费时间跑压缩点。6. 验证增益可控性的实用技巧用控制字扫描表检查60dB动态范围与单调性论文只给了00000、01111、11111三个控制字的仿真结果但设计验证不能只看端点。我的习惯是在整体电路里跑一次完整的32档控制字AC扫描把每个控制字对应的增益读出来列成表逐项检查三点增益是否为单调递增、相邻档位步进是否均匀、最高档和最低档是否收敛到14dB和73dB附近。; vga_full_sweep.ocean —— 32档控制字增益扫描 simulator( spectre) design( VGA_top.scs ) modelFile( tsmc018.scs tt ) analysis( ac ?start 1k ?stop 1G ?dec 10 ) save( all) bCodes ((0 0 0 0 0) (0 0 0 1 0) (0 0 1 0 0) (0 1 0 0 0) (1 0 0 0 1) (1 1 1 1 1)) foreach( code bCodes vars( B5 (car code) B4 (cadr code) B3 (caddr code) B2 (cadddr code) B1 (last code) ) run() printf( B%d%d%d%d%d Gain%.2f dB\n (car code) (cadr code) (caddr code) (cadddr code) (last code) db20( value( v(/IFO) ?result ac ) 4.092M )))逻辑说明这段脚本把6个代表性控制字依次写入仿真器每换一次控制字就跑一轮AC分析读一次4.092MHz处的增益打印出来。先不用跑满32个档位这6个特殊码已经能把「最高位是否生效、最低两位是否按预期累加、整体增益是否单调」这几件事验明白。参数说明B码组合从0到1变化时增益只应该增不减。如果出现某个码比低一档的码增益还小说明该级开关的互斥逻辑接反了——B4和B4N必须严格互补两个开关同时闭合会把两组增益电阻并联短路。还要注意VGA21模块的低增益档只有3~8dB中间有些相邻控制字的增益步进可能在1dB以内读数分辨率如果不够就把AC仿真精度调高一档再看一次。这里还有一个很实用的锚点校验法把「单级仿真值后级级联」折算出来的理论增益和整体仿真值对表。VGA5单级B51时是34.88dBVGA43和VGA21两级合计理论上有大约40dB两者相加应该接近最高档73.33dB。如果在某一级接线有误叠加值会对不上这时再拆开单独仿真VGA43和VGA21的各级增益很快就能定位是哪一级的控制位失效。之前我复现过一个类似架构的中频AGC设计就是因为B4和B3的差分对开关控制逻辑画反了——每级单独仿真增益都对整体级联一跑增益非但不叠加还互相抵消浪费了整整两天才排查出来。从那以后我每次拿到级联放大器设计都会强制把控制字扫描表完整过一遍再谈任何噪声或线性度优化这个习惯帮我省下的调试时间远比跑一次仿真所花的那几分钟多得多。希望帮到你。本文还有配套的精品资源点击获取