简介:面向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接收机必须有VGA+AGC:信号动态范围问题与三个关键指标
2.1 远近效应与多径衰减下的信号强度不稳定
GPS接收机接收到的信号不是恒定功率的。卫星离地面两万多公里,信号到地面已经非常弱,标称功率通常在-130dBm左右,但实际落地强度受大气衰减、遮挡、多径反射影响,波动范围能到几十dB。在靠近窗户、天线附近有金属反射体、或者接收机在快速移动的场景下,信号强度的瞬态变化尤其明显——上一秒还弱到只有-140dBm,下一秒多径叠加可能抬到-110dBm甚至更高。
如果不做任何增益控制,射频前端的输出要么小到无法触发ADC的最小量化电平,要么直接饱和削波。ADC动态范围就摆在那,前端增益不能跟着信号强度自动变,整个接收链路的信噪比就崩了。所以AGC是接收机的刚性需求,VGA又是AGC的核心模块——没有VGA,AGC想调增益也没东西可调。
2.2 增益范围14dB到73dB意味着什么
论文给出的增益范围是14dB~73dB,动态范围正好60dB。这个数字的工程含义是:当控制字B[5:1]全为0时,增益最低只有14dB;全为1时,增益最高到73dB。跨度60dB意味着AGC可以把从弱信号到强信号的输入功率变化范围完全吸收掉,输出端始终稳定在一个固定的功率电平。
拆分到三级模块来看,VGA5模块实现6~35dB增益,VGA43模块实现6~30dB,VGA21模块实现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.88dB;
- VGA43:由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模块低增益档(B5=0)和高增益档(B5=1)分别做噪声仿真,低增益档下整体噪声系数恶化,最终整个链路的NF比预期高2~3dB。
原因:VGA5是第一级,输入端的噪声被后面全部级联放大;当B5=0使第一级增益只有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模型再跑整体链路仿真,增益比预期低零点几dB,ADC采样瞬间的输出毛刺还会干扰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电容)。
原理图搭建按模块拆开:
| 模块 | 核心器件 | 控制信号 | 备注 |
|---|---|---|---|
| VGA5 | 1个差分对+2组开关电阻 | B5/B5N | 单级高增益 |
| VGA43 | 2级差分对,每级2组开关电阻 | B4/B4N, B3/B3N | 4种增益组合 |
| VGA21 | 2级差分对+输出buffer | B2/B2N, B1/B1N | 直接耦合 |
| 偏置电路 | 恒GM镜+电流源阵列 | b1/b2/b3 | 输出偏置电压698.6mV |
每级差分对的晶体管先按W/L=10μm/0.18μm起步,负载电阻按gm算完的目标增益反推。开关管用尺寸小一点的NMOS,导通电阻要远小于并联的增益电阻位,否则开关分压会吃掉本来就偏小的增益。
5.2 控制字与仿真激励设置
控制端用理想脉冲源给高低电平:高电平1.8V、低电平0V。B[5:1]映射顺序不要搞反——论文仿真里B5是最高位。控制字00000对应最低增益14dB,11111对应最高增益73dB,01111和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( "Gain@00000 = %f dB\n" gain_00000 ) printf( "Gain@11111 = %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:K,M2的电流是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单级B5=1时是34.88dB,VGA43和VGA21两级合计理论上有大约40dB,两者相加应该接近最高档73.33dB。如果在某一级接线有误,叠加值会对不上,这时再拆开单独仿真VGA43和VGA21的各级增益,很快就能定位是哪一级的控制位失效。
之前我复现过一个类似架构的中频AGC设计,就是因为B4和B3的差分对开关控制逻辑画反了——每级单独仿真增益都对,整体级联一跑增益非但不叠加还互相抵消,浪费了整整两天才排查出来。从那以后,我每次拿到级联放大器设计都会强制把控制字扫描表完整过一遍,再谈任何噪声或线性度优化,这个习惯帮我省下的调试时间,远比跑一次仿真所花的那几分钟多得多。希望帮到你。
本文还有配套的精品资源,点击获取