一个“小白”的PLL学习实录--锁相环从入门到进阶到“放弃”(更新版)
本文整理自 作者:胭脂扣(EETOP username)发在EETOP的论坛连载。去年EETOP微信推送过。之后论坛里又有了相应的更新,现在重新整理更新给大家。
帖子地址: http://bbs.eetop.cn/thread-606264-1-1.html
以下是整理之后的正文(为了便于阅读,不同时段的更新用分割线做了分割)
其实这个题目只是一个幌子
(现在还没到进阶这一步,怎么能放弃),作为一个小白(小编注:标题里小白加了引号,现在的作者应该早已不是小白了),从这学期开学和导师说了,毕设的方向是PLL,之所以比通常研二上学期才定毕设方向要早半学期,是因为老师和我都知道对于现在自身的基础以及这边实验室能提供的条件都有限,所以希望我自己早点选定方向,早点开始。 对于选择方向,是在去年年底就开始考虑了,权衡了自己导师的生物医学芯片的难度和自己的兴趣,最后还是决定选自己感兴趣的射频方向,以及综合了自己之前稍微有点数字电路的基础,所以选择数模混合的射频方向,从而在今年开学初和导师定了做pll。
既然选定了做pll,就开始要进一步来确定是做哪方面应用的pll。首先,在通信领域的pll非常广,但是绝大部分还是集中在1-5G这个比较常用的波段。因为本科的毕设和导航系统相关,所以贼心不死,毅然决然就要选做导航的射频前端的本振信号。哈哈!!!好任性。。。。
好啦!!!好啦!!!不扯那些没用的了,说一下开这个贴的初衷呗,主要希望把接下来对于pll学习知识以及动手建模,电路仿真,最好还有电路测试,这个成长周期做一个记录,更重要的是希望在这里能得到前辈的指点,还有同样和我一样开始学习pll新人能互相讨论,共同进步。
XOR FPD:
1、在相位误差特性上具有高线性度。
2、完全避免了死区问题
3、更高的PFD噪声和参考杂散
Tristate PFD:
1、UP和DOWN的失配降低了线性度
2、在reset路径增加延迟单元来避免死区问题
在Σ△ Fractional-N FS中,选择XOR FPD,由于它的高线性度避免折叠Σ△量化噪声,通过提高参考频率,电荷泵噪声和参考杂散馈通的影响会降低。
分解为两个设计阶段:
一. 设计G(f)来实现需要的闭环特性
二. 设计A(f)来实现需要的G(f)
第一阶段 设计G(f)来实现需要的闭环特性
A 带宽、阶数、形状
fo为闭环带宽,fz为开环零点,3dB带宽为2πfp,阶数为滚降特性n
形状取决于滤波器种类(巴特沃斯、贝塞尔、切比雪夫)
对形状的影响最大的因素是主极点
B 类型
定义:开环传递函数的滤波器个数,一般为1型或2型,type 1 具有更快的稳定时间Type2 允许滤波器的输出实现任意直流值,同时强迫相位误差达到0稳定值。积分器可以实现任意值的直流电平转换
更低的pll带宽可以降低噪声
更高的vco增益可以提高频带调谐宽度
更低的环路滤波器增益可以降低pll带宽
更低的环路滤波器增益可以提高vco增益
Type1 pll没有足够的环路滤波器增益,导致环路滤波器输出 有限,也就是vco的输入范围有限
Type1 pll需要DA来进行控制电压的粗调,环路滤波器进行细调
Type2 pll具有积分器的环路滤波器可以任意设定直流输出,从而自动调谐整个频率范围
Type2 pll会产生尖峰(peaking)在闭环时,并且增加稳定时间。原因在于peaking 值和稳定时间与开环零点和闭环带宽的比值有关(fz/f0比值提高将增加peakiing 幅度和超调量,在阶跃响应中),一般是1/10-1/6
环路滤波器设计
分为三个步骤
A、选择传输函数
B、选择拓扑结构
C、选择传输函数的值
A、选择传输函数
电荷泵电流设定比较自由,它影响环路滤波器的增益。对pll噪声性能的要求也将影响电荷泵电流大小,更大的电流将产生更低的鉴相器噪声。环路滤波器的值或者功耗约束了电荷泵最大电流
B、选择拓扑结构
无源结构:噪声小、功耗低
有源结构:电荷泵不需要宽电压范围、三阶pll不需要电感
In general, there are two design rules that should be followed when using an active loop filter implementation. First, the output of the charge pump should always feed directly into a high-Q capacitor (i.e. a capacitor with minimal series resistance) in order to attenuate its high frequency content before it feeds into the loop filter opamp. The reason for doing so is that the opamp has limited bandwidth and can exhibit nonlinear behavior if it is directly driven with the high frequencies that are present in the charge pump output. The second rule is that the feedback of the opamp should be configured to achieve unity gain from the opamp terminals to its output. By doing so, the input referred noise of the opamp is not amplified in its influence on the loop filter output. The active topologies shown in Figure 11 achieve both of these desired characteristics.
C、参数估计
噪声性能
主要来源:鉴相器噪声和vco噪声
鉴相器噪声:自身白噪声和杂散,参考频率和分频器的抖动,电荷泵噪声,和参考频率杂散(可忽略)
vco噪声:本身结构的热噪声 在低频时,由闪烁噪声影响,滚降高于-20dB每十倍频,但由于pll动态特性的高通特性,基本滤除了闪烁噪声。
前段时间根据别人论文的Verilog—A建模的pll代码,我在AMS里仿真了,但是觉得有些抽象。所以参考了论坛的一些前辈的建议,选择先使用cppsim工具进行建模,可能这样对环路函数更有直观的感受,当然有些大神建议MATLAB甚至手算,我抱着好用的态度还是先试试cppsim吧。
这周先通过《cppsim_vppsim_primer5》文档大体了解cppsim这一套软件其次阅读《PLL Design Using the PLL Design Assistant Program》,介绍了用该软件来设计pll的流程,摘录了笔记发在了前面。
了解了设计流程后,通过《Fractional-N Frequency Synthesizer Design》
学了cppsim的基本操作以及在cppsim上设计和仿真小数分频频率综合器的流程之后,开始学《CppSim/VppSim Primer for Cadence》教程,但是在调用cppsim时,出错:未定义功能-runcppsim,也就是说,应该是我在配置cppsim时,有路径或者什么其他问题
上图是教程中的,但是我在操作中,没有出现第二张图 ,而是报错undefined function - runcppsimForm
这个问题好纠结啊,弄了好久还没弄好,求路过大神指点指点
在昨天仿真锁相环时出现了一个奇葩问题。定义电荷泵的输出电流为100uA,而后面滤波器的电压却是在下降。
也就是说电荷泵这个模块是在抽取电流,而不是输出电流。这个非常的奇葩,我在仿真的时候探测电荷泵输出电流端口的电流大小,显示的是100uA。于是我另外搭建一个测试电路,用这个电荷泵的输出端加电阻负载(电阻另一端接地),最后发现电阻对地的电压是负的。而测试电荷泵输出端口的电流还是显示100uA,也就证明了,这里端口电流大小如果为正,那么代表的是外部输入电荷泵的电流(注意,电流方向是外部向模块内部),尽管在模块内部定义这个端口为输出端口。但事实上,电流的方向不是你定义为输出就是对外部输出的方向,而是相反的。
“奇葩思维”的原因是,我们使用Verilog-A描述语言,是描述电路,系统也是将它理解为一个电路模块,而真正的电路模块的端口是一个导线,导线是没有方向的。因此我们默认对一个电路的端口灌入电流的方向为正。
对理想模型进行瞬态仿真,得到环路稳定的时间是25+微秒,对于理想模型来说,这个时间是不是太长了?而且环路稳定前的振荡间隔太长,是不是因为我把环路带宽调的太小了(选了100K)。还有,对于理想模型我还可以仿真其他什么参数呢?
25M参考频率,输出3G的瞬态仿真
在pll的Verilog-A建模后,在仿真时,环路滤波器的电压(vco控制电压)的过冲非常明显,应该怎么调整。
说是不知不觉一个月就过去了,可是在黑板上写了倒计时,开始写的40天(回家倒计时)到今天还有11天,每天把数字擦去写上,还是能感觉到时间过得好快。而与时间并不对等的就是我的成果。差不多一个月吧,也该总结一下了。
大概花了一周多时间在cppsim上,然并软!最后还是选择Verilog-a建模,大概花了一周时间算了环路参数以及仿真出环路结果。
后面大概又花了一周做非理想建模,也就是考虑相位噪声,抖动,以及电流失配。但是没有实现相位噪声建模。
后面大概又花了一周做△Σ调制器,包括理论学习和建模,清楚的记得数模混合仿真的方法整整搞了两天,最后发现不是混仿的方法不对,而是数字模块写的不对,这是因为没提前在modelsim中仿真数字模块导致的,原本太自信数字模块的代码了。心塞的是,目前这个模块还没写出可靠的代码。决定暂时搁置。
接下来开始vco的学习与设计,而vco这一块将是接下来的大任务。
细想一下,前面除了走了一些弯路之外,有一个问题是做东西的效率并不高。需要调整,但是又无从调整,心塞!!!
有时候会总在一个问题上抠,最后发现问题不在那里!!!所以多试试其他方法,多找找其他问题很重要!!!!!
经过这一段时间的pll学习与设计,喔!仅仅是建模。现在积累了一些问题有待解决
1、在ken kundert的《Predicting the Phase Noise and Jitter of PLL-Based Frequency Synthesizers》还是不能正确地定义phase类型的端口,以及用white_noise和flicker_noise函数来模拟白噪声和闪烁噪声。
2、在整数分频时,环路虽然稳定了,但是稳定前的过冲电压非常大,高到2.5v,而我电路准备用smic .18的库,所以电路级的控制电压只可能到1.8v(甚至由于考虑电荷泵等,实际控制电压到1.4v),不知道会不会到电路级这个模型就崩了?
3、在设计小数分频的△Σ调制器模块中还是有问题,别人的代码不能直接用,修改后,减少量化位数,环路有稳定的迹象,但是控制电压波动太大。自己根据池保勇的论文中的结构写的代码就完全不能出结果。
4、以上的问题准备暂时不花大量时间来做,先把vco的学习与设计提上日程,这关系到下半年的流片时间。
网友 bbbenjamin 提问:
LZ你好,我做了一阵子PLL,一些建议:
1. Cadence自带的ahdl库中有PLL各模块的时域模型,可以参考。噪声函数可参见verilog-A的ref,有较详细的说明。
2. 整数环的带宽过小会有较大过冲,可以先用稍大带宽,待锁定检测OK或者等一段时间之后,环路稳定,再切回窄带宽。实际CPPLL中过冲大,则CP会进入非线性区,输出电流变小。
3. Sigma-delta代码参考《Integrated Circuit Design for High-Speed Frequency Synthesis》第四章和第九章。
链接:http://bbs.eetop.cn/thread-119868-1-1.html
4. 你在后续学习电路过程中遇到的大部分问题,应该可以在Razavi的射频微电子第二版中找到办法。当然,还有其他的,如果你有些时间,不妨一读:
Design Methodology for RF CMOS Phase Locked Loops
Phaselock Techniques 3rd
Phase-Locked Loops
esign,simulation and applications
Jitter, Noise, and Signal Integrity at High-Speed...
PLL Performance, simulation and design
CMOS PLLs and VCOs for 4G Wireless 等等等等
作者回复:
谢谢指点!其中第一个问题用Verilog-A定义phase端口依旧无法定义!可能是本身软件的问题!其中第二个问题用vco控制电压有过冲的问题,我在把vco换成电路级,就没有过冲了!(不过我不太懂明白为啥)!
其中第三个问题暂时没有做!
最近在做多频带VCO时,发现在设计电容阵列时,出现一个问题。因为我希望频带间隔一致。而f=1/2PI(LC)^(1/2),如果要保证频率是线性的,那么电容阵列变化是非线性的,是一条理想的曲线。
但是电容阵列值应该是符合这个公式。Ctune=K0*C0+K1*C1+K2*C2+K3*C3+K3*C3+K4*C4+Cbias,想问用什么样的办法求出各个电容组,而且实际阵列值与理想曲线拟合度更高!
上图是根据f与c的关系得到的理想曲线(纵坐标是C,横坐标是控制位)
网友 hughhuang 提问:
我觉得你试图通过让电容非线性变化来保证KV的线性变化是不可取的,因为随着工艺尺寸的减小,很难保证电容器件制作出来的具体数值,尤其是版图不能保证很好地一致性的时候,但相对比例可以很好地保证(参考电流镜),所以通常做法是采用不同增益的电容阵列,比如CT、FT,甚至有人采用比FT更小KV的电容阵列,用大的电容阵列保证range,用小的电容阵列保证KV线性度(正常的KV曲线只要取的间距足够小,那么可以近似认为是线性的)。我的建议仅供参考,希望多多讨论共同提高。
作者回复:
我的意思是,通常我们把电容阵列做成按比例增长的,如果电容是按比例增加(也就是线性的),那么出来的频率带的间隔就不是一致的(前提是我们希望每条频带的增益基本不变),比方说第一条频带与第二条频带之间相差80M,而第十五条与十六条的频带之间就相差40M。也就是频率越高,频带越密集,频率越低,频带越稀疏!也就是你说的用大的电容阵列来保证频率范围一致性。
如果大电容阵列来保证频率范围一致性,那么电容阵列就应该是非线性的。你的意思是否是,再增加一组小电容阵列来配合大电容阵列,使得最后总的电容值变化是非线性?
采用非线性电容阵列后得到较为理想的电容阵列值(弯曲的),并且通过与电感构成LC振荡电路,进行s参数扫描得到与理想的频率范围接近的直线。
现在想问一下,如果采用非线性的电容阵列有什么弊端?或者二进制权重电容阵列为什么是比较好的选择?
前面两张图都是通过S参数扫描得到的电容值和谐振频率。但是将设计好的LC Tank并入交叉耦合MOS对中之后,进行PSS仿真,得到的谐振频率大大缩水,应该是什么原因呢?(还是我的设计方法本来就错了?)
上图中,灰色的是pss仿真得到的谐振频率,而橙色是LC Tank的s参数扫描的谐振频率(也就是Y11的虚部为零)
版主 JoyShockley 回复:
有论文就是用的非线性的电容阵列;以使得频率线性。
但为了简便,和layout 方便,采用二进制电容阵列。
DCO 中,有Coarse bank (二进制) 和Fine Bank (温度计码);
当PLL开始控制Fine bank 的时候,频率变化范围不大,近似线性。
在DCO 中,因为这样做太麻烦,电容设计自由度有限,难道几十bit 一个一个去调吗? 电容mismatch,会使得想的和得到的不一致。
我看到如果要符合理想的非线性,最好是使用温度计编码(粗调也用它),但是温度计编码的位数等于控制线的个数(32条控制线就要32个开关,而二进制只需要5个开关),这样代价有点高,我的做法是在二进制的基础上,再增加三位开关电容,也就是将理想的非线性曲线分割成两端去逼近的!在后半段,将增加的三位开关电容闭合,从而形成新的一组二进制电容阵列。
上一篇出现了频率缩水的问题,主要是因为对管的寄生电容的影响,因此重新设计电容阵列,方法1:原来的电容阵列是以600M的调频范围去设计的,最后仿真得到的调频范围只有360M,因此增大设计冗余度,以1G的调频范围来计算出新的电容阵列值,最后仿真得到的调频范围为480M。依旧不满足600M的要求;
方法2:仍然按照600M的调频范围来计算电容阵列值,在实际电路中采用两倍的电容计算值,得到的频率范围有600M;
设计了采用二进制权重法的电容阵列来对比线性度和相噪,可以看出线性度得到较好的提高,但是相噪却差了1dB左右;
分析原因:应该是线性化需要6组电容开关,并且为了节省面积,使用与或逻辑重复利用了一些电容阵列,因此相对二进制权重法阵列的4组开关,多出了很多有源器件。相噪因此降低!
后来想了想,把基础知识的学习笔记挪到我的个人eetop上的博客去了,这篇帖子主要用来设计讨论,post一些设计中的问题以及解决方法!
eetop上个人博客地址---打铁匠---http://www.eetop.cn/blog/1264080
在博客上会记录每次看书看论文的学习笔记,欢迎大家指正!
自从2016.06.26在eetop上发了《锁相环从入门到进阶到放弃》的帖子至此已经约好长时间了,也就是从那个时刻开始着手进入锁相环的学习环节。当然在这五个半月中间,除去暑假回家和出差等等花去一个半月,总共在这个项目中投入了4个月,完成了第一阶段--建模,第二 阶段--电路设计,到目前为止,PFD、CP、Divider、VCO整数分频锁相环的所有基本模块的基本电路敲定,环路锁定。
下面进入第三阶段--电路性能优化,虽然基本电路出来了,能够锁定,但是预估性能还是距离目标差很远的。所以整个第三阶段尤为重要,如果说第二阶段的电路设计更多的是学习基本知识,而第三阶段更多是注重思考,很多细节问题将暴露出来。应该说,这一阶段的任务会更加艰巨的。
第三阶段--电路性能优化细分任务:
1、根据目前电路的噪声做整个pll的相位噪声拟合
2、寻找突破口,也就是找到需要优化的模块
3、前仿tt工艺角性能达标后,进行其他工艺角仿真
4、前仿所有工艺角达标后,进行版图设计
5、根据后仿结果,优化电路以及版图
与第三阶段还有一些并行任务
1、整理设计的宽带vco的内容,完成专利申请
2、整理之前的频率合成器VerilogA建模的内容,完成一篇水文。
前一阶段暴露的问题
1、本身电路中,能用到模电的知识并不是很多,其中PFD和分频器基本全是触发器,以及用数字方法设计的电路。电荷泵用了最简单的电流镜,vco最基本的交叉耦合。期间没有涉及到一个放大器的设计,所以在接下来的设计中,要刻意引用更多模拟模块,以便对模拟电路更深更全的学习。
2、对于基础知识的学习过程中,需要更多的回归书本,而不是去找一大堆论文,以后要提醒自己寻找更合适的资料。
3、在帖子中,曾许诺要一周一次分享与讨论学习过程中的问题,然而之后并没有做好这一点,以后要更多的整理记录学习的内容,及时在eetop上分享与讨论。
前天把Divider的电路设计完,替代了原本VerilogA模块,跑了一下环路,结果很意外,直接就锁定了。之后改变分频比,出现了不能锁定的现象,马上根据问题解决了多模分频器的一个bug。比预想的情况还是好很多,原本以为替换完电路之后,要花个好几天来调试电路才能锁定。没想到不需要怎么调试电路。这说明了建模真的很重要啊!!!
好久没来更新了,前段时间一直做AFC,陷进去好久,特别是这样数模混合的仿真开始学还是挺麻烦的。因为我的AFC有一部分是Verilog来写的,在混仿的时候还是建议大家采用AMS吧,虽然开始学的时候比spectreVerilog要复杂一点,但是学会之后,功能要强大许多,特别是debug模式来查看数字模块的内部信号。
好不容易熬到第二阶段了,因为要单独流片VCO,对于单独流片VCO的话,它的辅助电路以及版图布局优化我还是没有经验,希望大神们指点一下。