首页/文章/ 详情

第 3 篇 · 鉴相器 PFD:三态输出、死区与复位延迟

48分钟前浏览0
上一篇把五大模块的「责任表」立了起来,PFD 排第一个。这一篇单独拆 PFD——因为它是最容易被低估、却直接决定 PLL 能不能锁、锁得干不干净的第一个环节。你调环路时遇到的"近载波相噪鼓包""锁定后毛刺多",根子常常就在这个不起眼的鉴相器里。

一、PFD 凭什么取代普通鉴相器

先分清两个能力:鉴相(phase detect)和鉴频(frequency detect)。

普通鉴相器(XOR 门、模拟乘法器、混频器)只输出一个与"相位差"相关的量,对频率差不敏感。这意味着什么?如果参考时钟和反馈时钟一开始频率差得很大,普通鉴相器给出的平均误差可能很小甚至为零,环路"看不见"该往哪个方向拉,自然无法保证锁定——这就是捕获范围窄的根源。

PFD 的核心价值:它同时对相位差和频率差敏感。当两个信号频率不相等时,PFD 输出的 UP/DN 脉冲宽度差会持续偏向某一侧,等效给出一个"方向正确、大小足够"的频率牵引信号;当频率拉近、只剩相位差时,它又退化成线性鉴相器。这种"先鉴频、后鉴相"的能力,保证了 PLL 从任意初始状态都能可靠锁定。

顺带一提,XOR 鉴相器的线性鉴相范围只有 ±π/2,而三态 PFD 的线性范围可达 ±2π,这也是 CP-PLL 相比传统乘法器 PLL 的一大优势。

二、经典实现:两个 D 触发器 + 一个与门

三态 PFD 的标准实现极简,但每个细节都有讲究:

  • 两个 D 触发器的 D 端都固定接逻辑「1」。
  • 参考时钟 fref 接第一个触发器的时钟端,反馈时钟 fdiv 接第二个。
  • 两个输出 Q 分别作为 UP 和 DN。
  • UP 和 DN 经一个与门反馈到两个触发器的异步复位端。

时序逻辑:fref 上升沿先到,第一个触发器置 1,UP=1;随后 fdiv 上升沿到来,第二个触发器也置 1,DN=1,与门输出高电平,把两个触发器同时复位,UP=DN=0。于是 UP 保持高电平的时间长度,正好等于 ref 领先 div 的时间差。

输出是三态信号,对应电荷泵的三种动作:

  1.    UP=1、DN=0:ref 超前,电荷泵充电,抬高 Vctrl;
  2.    UP=0、DN=1:div 超前,电荷泵放电,拉低 Vctrl;
  3.    UP=0、DN=0:两者对齐,电荷泵不动作(锁定态或高阻态)。

























// 三态鉴相器 PFD 行为模型(Verilog-A)     // tdel 是复位路径延迟——它不只是”延时”,而是消除死区的关键(见第四节)     `include ”constants.vams”    `include ”disciplines.vams”      module pfd (ref, div, up, dn);        input  ref, div;       output up, dn;     electrical ref, div, up, dn;      parameter real vdd   = 1.0;      parameter real tdel  = 200.0e-12;  // 复位延迟:填死区       integer up_q, dn_q;       an alog begin        @(initial_step) begin            up_q = 0; dn_q = 0;        end        @(cross(V(ref) - vdd/2, +1)) up_q = 1;   // ref 上升沿:UP 置 1        @(cross(V(div) - vdd/2, +1)) dn_q = 1;   // div 上升沿:DN 置 1        if (up_q && dn_q) begin                  // 两者都高:复位            up_q = 0; dn_q = 0;        end        // transition 让 UP/DN 经 tdel 延迟才到达输出,等效复位路径延迟        V(up) <+ transition(up_q * vdd, tdel, tdel);        V(dn) <+ transition(dn_q * vdd, tdel, tdel);    endendmodule 

三、鉴相特性曲线

把 UP 的平均电压减去 DN 的平均电压,就得到随相位差变化的鉴相特性。理想三态 PFD 在 ±2π 范围内是线性的,这条曲线的斜率就是鉴相增益 Kpd(单位 V/rad)。

但真实世界里,这条曲线在零点附近不是理想直线——这就是死区。

四、死区(Dead Zone):PFD 最要命的坑

死区的物理来源:当相位差趋近零时,UP 和 DN 的脉冲宽度都极窄。如果窄到电荷泵开关来不及充分打开/关闭(充放电电流还没建立起来,脉冲就结束了),那么零相位附近环路增益会塌陷——相位差很小的时候,环路反而"看不见"误差。

我用 MATLAB 实测跑了一个死区模型,参数是:电荷泵电流 250 µA、参考频率 25 MHz、死区宽度 200 ps。结论:死区对应的相位差约 ±1.80°,占参考周期的 0.5%。

死区的后果是灾难性的:环路在锁定点附近增益丢失,输出相位在一个小窗口内随机游走,表现为近载波相噪鼓包和杂散——这正是很多 PLL"锁定了但相噪曲线近载波处鼓起来"的原因。

怎么治?在复位路径上串一个复位延迟(几百 ps),故意让 UP 和 DN 在相位差为零时也有一个最小脉冲宽度,保证电荷泵每个周期都被充分打开一次,把死区"填平"。代价是:这个最小脉冲宽度本身会贡献一点参考杂散,所以延迟值要折中。

这里有个面试常问的点:复位延迟为什么不能太长?因为复位延迟撑出的"最小脉冲"在锁定后依然存在,它等效于一个固定的相位误差注入,直接变成参考杂散。所以死区消除和杂散抑制是一对矛盾,延迟值要在两者之间取平衡。

五、关键指标

  • 线性鉴相范围:三态 PFD 理论 ±2π,实际受复位延迟和触发器速度压缩。
  • 最大工作频率:由「触发器建立时间 + 复位路径延迟 + 与门延迟」决定,高频设计里这是硬约束。
  • 毛刺与失配:UP/DN 路径器件不对称,复位瞬间产生毛刺,反映到电荷泵就是瞬态电流失配,最终变成参考杂散。

小结

PFD 是 PLL 的"裁判":把 ref 与 div 的时间差翻译成 UP/DN 两个数字信号,交给电荷泵转成电流,推动环路锁定。理解它的鉴频鉴相双重能力、三态输出、以及死区的物理来源和复位延迟的折中,是理解整个 CP-PLL 动态行为的第一步。

下一篇顺着信号流讲电荷泵 CP——裁判举了手,执行者怎么发力,以及它的电流失配为什么直接变成杂散。

参考

  1.    Behzad Razavi, RF Microelectronics, 2nd ed., 第 9 章(PFD/CP 与频率合成器)。
  2.    Floyd M. Gardner, Phaselock Techniques, 3rd ed., 第 5 章(鉴相器)。
  3.    Roland E. Best, Phase-Locked Loops, 第 2 章(PFD 结构)。
  4.    死区与复位延迟分析:Razavi 第 9 章;杂散见 Gardner 第 6 章。
  5.    Verilog-A 语法参考:Cadence Verilog-A Language Reference。

来源:集成电路小刚
MATLAB理论ElectricCadence
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2026-09-30
最近编辑:48分钟前
集成电路小刚
硕士 立志成为集成电路领域专家
获赞 4粉丝 65文章 72课程 0
点赞
收藏
作者推荐

干货:手把手教你用Cadence软件设计一个标准的CMOS反相器

Cadence可以实现电路图输入(Schematic Input)、电路仿真(Analog Simulation)、版图设计(Layout Design)、版图验证(Layout Verification)、寄生参数提取(Layout Parasitic Extraction)以及后仿真(Post Simulation)。(图源:西安交通大学国家IC人才培养基地培养资料)现在,开始用Cadence画一个标准的CMOS反相器。一个反相器包括PMOS,NMOS,VDD,GND。01软件常用操作及命令1)Cadence/virtuoso软件常用操作1.启动软件:virtuoso或者virtuoso&amp;:&amp;表示后台运行(shell自带语法)2.常用快捷键:i:添加器件或者电路的symbole:进入symbol的下一层ctrl+e:和e相反q:打开属性编辑窗口F3:打开命令菜单,一般和命令配合使用,相当于对命令的操作进行设置w:连线p:端口引脚u:撤销X:检查和保存l:电路节点命名作为初学者,在设计电路过程中应该要仔细阅读提示区中的信息。注意:①Composer中的多数命令会一直保持,直到你调用其它命令替代它或者按Esc取消,尤其是在执行delete命令时,忽视这一点很可能会误删除,一定要多加小心!Composer的Undo操作默认只能进行一次(可以在CIW窗口的Option-&gt;User Preferences中修改,最多可以是10)。所以每完成一个命令,记着按ESC取消当前命令。②点击工具栏的zoomin和zoomout按钮可以放大缩小电路图。键入快捷键f可以使电路图自动缩放到合适大小。③编辑电路图过程中注意要及时保存,保存方法是菜单栏-&gt;Design-&gt;Save,也可以键入快捷键大写的S(Shift+s)来保存。2)shell常用命令Cadence开发了自己的编程语言skill以及相应的编译器,整个Cadence可以理解为一个搭建在skill语言平台上的可执行文件集。初学者对此可以不用理会,当用户深入后,可以用skill语言对Cadence进行扩展。pwd :显示当前目录cd:改变当前工作目录mkdir:建立目录mkdir/path/to/dir_name:特定路径下的目录,必须保证path/to/已经存在ls:文件显示whoami:查看用户自己当前使用的账号名who:查看当前有哪些用户登录到系统中w:查看哪些用户登录在线,同时显示用户当前的工作clear:清屏命令touch file_name:修改file_name文件时间戳;如果文件不存在生成空文件cat file_name:将文件file_name显示到屏幕上cat file_name1file_name2:显示两个文件cat file_name1file_name2&gt;file_name3:将前两个文件依次组合,并添加到file_name3的末尾(图源:E课网培训视频截图)02创建CMOS反相器原理图步骤1)键入快捷键i点击Browse,弹出库浏览器。选中Show Categories可以分类显示器件,方便我们快速找到所要的器件。依次点击analogLib-&gt;Actives-&gt;pmos4-&gt;symbol,再单击close。刚才的添加器件窗口发生变化。点击Hide隐藏当前窗口,此时鼠标对应有一个PMOS的symbol,此时按r键,可以旋转PMOS。移动PMOS到合适的位置点击鼠标左键将其放下。如果要放置更多的PMOS,继续点击鼠标左键,否则按ESC取消当前的放置器件命令。继续放置NMOS晶体管、电源与地。对应的器件名称为nmos4,vdd,gnd。注意:vdd与gnd仅仅是全局电源与地标识,并不是独立电源器件,vdd并不能提供电源。仿真时必须有gnd,否则仿真不收敛。2)键入快捷键w连线注意区别wire(narrow)与wire(wide),wire(narrow)表示普通连接导线,而wire(wide)表示总线连接。总线连接的快捷键是大写的W。还可以对画好的线进行命名,键入快捷键l,在弹出的对话框中输入线名,比如a,点击Hide,然后将字母a移动到要命名的线附近点击左键放下,如果名字离线较远,则要求再单击所要命名的线。3)设置元件参数先选中器件,再键入快捷键q参数可以是以下三种形式的各种数学组合表达式,①变量,②常量,③skill语言函数。变量作参数会在仿真时用到。单击PMOS选中它,这样PMOS会被一个白色方框包围。然后键入快捷键q,会弹出属性编辑对话框。这里我们需要填上model name,以及PMOS的栅长和栅宽。栅长我们设为常量0.18u(注意u是小写!),而栅宽我们设为函数pPar(“wp”),注意大小写不能错。当然也可以设一个固定的尺寸,但这样就不能利用参数修改晶体管的栅宽了。pPar函数就是把wp作为传递参数,在其它电路图中调用这个电路时对wp赋值,就相当于给这个PMOS的栅宽赋值,这样做的目的是为了方便层次化设计。在后面仿真时大家会更加明白这一点。Composer会根据数值大小自动变换单位。模型名我们填p18,这是因为我们这里采用的Spice模型是由SMIC提供的,对应PMOS的模型有p18和p33两种,18代表电源电压为1.8V。在后边仿真的时候我们还要再设SpiceModel文件的具体路径。同样的方法继续设置NMOS参数,只是模型名为n18,栅长为固定值0.18u,栅宽设为pPar(“wn”)。注意:①设置参数时不要自己输入单位,系统会自动加上。比如0.18uM是错误的写法。如果非要自己写单位,也要和数值之间留一个空格,否则系统会把M识别为变量。②器件的参数也可以在放置时就设置好。4)键入快捷键p放置端口单击菜单栏-&gt;Check and Save或者键入快捷键大写的X,可以对电路进行检查并存储。03创建SymbolComposer窗口菜栏-&gt;Create-&gt;Create CellView-&gt;From Cellview,弹出Cellview from Cellview窗口默认的Symbol是一个比较大的矩形。对于反相器,我们习惯用一个三角形再加小圆圈来表示。选中绿色矩形框,delete之,然后Add-&gt;-Shape&gt;Polygon,在刚才矩形框的位置画一个三角形。鼠标在三个端点点3次即可。注意在三角形右边留出画圆圈的位置。再Add-&gt;Shape-&gt;Circle,先于圆心位置单击左键,再移动鼠标,得到合适的圆的半径后左键确认。再把图中的输入输出端口以及partname和instanceName移动到合适位置。其中,@instance Name代表以后调用此反相器时的编号,@partName代表对应的schematic的名字,一般不用改。最后再把红色框大小修改合适(框住三角形和端口)。画好的Symbol需要检查保存。Design-&gt;check and save,检查结果显示在CIW窗口中。04仿真现在我们用画好的反相器的symbol组成一个缓冲器(buffer)进行仿真,通过对buffer做瞬态分析、DC分析、AC分析,分别得到该buffer的延迟时间、输入输出特性以及小信号频率响应。对电路进行仿真需要加激励信号,而加激励信号有两种方法,一种是在原理图中直接加入信号源元件,另一种是在仿真环境窗口(ADE)中对输入端口加激励。缓冲器是由两个反相器组成,利用前边的方法,新建一个cellview,画出缓冲器原理图。其中反相器我们直接调用了画好的Symbol(注意是在自己的库中)。选中inverter,键入e,再点OK,可以显示和Symbol对应具体的schematic,但是这时只能看,而不能修改。Crtl+e退出该Symbol。设置inverter参数。选中inverter,键入q,就会弹出反相器的属性。这里我们需要分别设wn和wp的值。①独立电源vdc也是在analoglib库中,将其属性中的DC voltage设为1.8。②另一个激励信号是方波源,对应器件名称为vpulse,也位于analoglib库中。方波上升下降时间为0.1n,周期为10n,脉冲宽度为4.9n,voltage1设为0,voltage2设为1.8。因为我们还要做AC分析,交流电压幅值为1(这样测得的输出直接就是小信号增益)。为了得到inverter的输入输出特性,我们把直流电压设为变量vin。这里设置的方波电压、直流电压、交流电压是相互独立的,分别用于瞬态分析、dc分析、ac分析Composer菜单栏-&gt;Tools-&gt;Analog Environment,打开仿真窗口(简称为ADE窗口)。于ADE窗口,Setup-&gt;Model Libraries,打开Model库设置窗口,后再于Model库设置窗口的Section栏填写工艺角,这里我们填tt(即NMOS和PMOS速度均为典型值),然后再点Add按钮,将当前的仿真库文件添加进列表,点击OK退出。仿真环境菜单栏-&gt;Variables-&gt;Edit,或者直接点击右侧的工具栏中的Edit Variables按钮,弹出如图5.10所示窗口。击点按钮“Copy From”,就会列出我们前面在测试电路中添加的变量vin。选中该变量,我们设置一个初始值0.9。之所以是0.9,是因为当反相器的输入为0.9时两个MOS管都会导通,此时反相器实际起的是放大器的作用,而我们做AC分析就是要得到MOS管处于饱和区时它的频率响应。需要强调的是,AC分析是建立在一定的工作点上的,而电路的工作点正是由电路图中所设置的电源DC值以及这里的变量初始值决定的。由于我们要做瞬态分析,dc分析,ac分析,所以我们一次弄好所有设置。①Analyses-&gt;choose,或者点击右侧工具栏的choose analyses按钮。于Analysis栏选择不同的仿真。对于瞬态分析,我们选tran,然后于stop time栏输入仿真时间10n。②再于该窗口中选取dc,窗口会有相应变化。于sweep variable栏选择Design Variable,然后输入变量名vin,并输入变量的扫描范围,从0到1.8。并选择扫描类型为线性,扫描为0.001。这样仿真时就会对vin从0到1.8V以0.001为间隔进行扫描,从而得到输入输出特性。注意选中DC Analysis复选框,这样就可以将AC分析时所采用的的直流工作点保存下来,以便我们后面查看电路的直流工作点。③再于该窗口中选取ac,窗口会有相应变化。默认是频率扫描。我们只需要输入频率扫描范围。这里输入10到1000M(注意是大写)。其它均为默认值。接下来要选择我们需要观察的对象,即我们要看哪个节点的电压,或者要看哪一条支路的电流。于ADE窗口,Output-&gt;To Be Plotted-&gt;Select On Schematic,这样会弹出我们画的电路图。然后分别单击输入和输出两条线IN和OUT,以及第一级反相器的输出v1。注意选择v1时要先选中反相器,再按e进入下一层子电路。并注意一定要单击导线,而不是元件的Pin角。保存当前的仿真设置。Session-&gt;Save State,弹出保存对话框,填好名称,点击OK确定。这样下次再仿真时,可以直接调用该仿真设置,而不用每次都进行同样的设置。我之后修改了器件为tsmc工艺库后的仿真结果05版图设计现在开始根据我们前边的设计尺寸,来画缓冲器的版图。为了显示层次化设计,我们先分别画出两个不同尺寸的反相器版图,再将两个反相器组成缓冲器的版图。通常的版图设计步骤大概如下:①NMOS:画出N有源区-&gt;栅-&gt;做接触孔-&gt;覆盖金属-&gt;N注入区;②PMOS:画出P有源区-&gt;栅-&gt;做接触孔-&gt;覆盖金属-&gt; N注入区;③连接晶体管:放置PMOS和NMOS-&gt;连接输出-&gt;连接输入-&gt;金属连接-&gt;电源线;④PAD。类似新建原理图,CIW窗口菜单栏-&gt;File-&gt;New-&gt;CellView,选择自己的库,然后输入版图名字inverter,注意于tool栏选择Virtuoso,ViewName栏会自动变为layout。点击OK后,会弹出Virtuso主界面,以及LSW窗口。注意:①类似Composer,Virtuso中的多数命令会一直保持,直到你调用其它命令替代它或者按Esc取消,尤其是在执行delete命令时,忽视这一点很可能会误删除!②点击工具栏的zoomin和zoomout按钮可以放大缩小版图。键入快捷键f可以使版图自动缩放到合适大小。③编辑版图过程中注意要及时保存,保存方法是菜单栏-&gt;Design-&gt;Save,也可以键入快捷键S(大写)来保存。版图有非常多的物理规则约束,这是由Foundry的工艺决定的。在后面做设计规则验证(DRC)遇到错误时还要不断地回来查阅该设计手册。06关键掩模层序号层名字含义含义本实验所需要的1AAActive Area有源区√2ARReverse Active Area无源区3KVAlignment mark clear-out对准标记4NWN-WellN阱√5PWP-WellP阱6DGDual Gate(thick oxide)双栅(厚氧)7GTPoly gate多晶硅√8PLHPMOS LDD implant for 3.3V3.3V下PMOS轻掺杂注入9NLHNMOS LDD implant for 3.3V3.3V下NMOS轻掺杂注入10PLLPMOS LDD implant for 1.8V1.8V下PMOS轻掺杂注入11NLLNMOS LDD implant for 1.8V1.8V下NMOS轻掺杂注入12SPP+implantP注入√13SNN+ implantN注入√14ESD1ESD implant for Boron(B)静电放电注入15SABSalicide block area硅化物阻挡区16CTContact有效接触孔√17M1Metal-1第一层金属√18V1VIA-1通孔1√19M2Metal-2第二层金属√20V2VIA-2通孔221M3Metal-3第三层金属22V3VIA-3通孔323M4Metal-4第四层金属24V4VIA-4通孔425M5Metal-5第五层金属26V5VIA-5通孔527M6Metal-6第六层金属28PAPassivation/Pad焊盘29PIPolyimide END作者 | 小刚排版 | 黑小姐 图片 | 网络参考资料 | 西安交通大学国家IC人才培养基地培养资料、E课网视频教程 *著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。来源:集成电路小刚

未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习计划 福利任务
下载APP
联系我们
帮助与反馈