
用DC仿真去观察施密特触发器最有价值的不是那条普通的传输特性曲线而是用Hysteresis Sweep技术画出来的迟滞曲线。很多工程师对施密特触发器的理解停留在“能整形、能抗噪”的层面真让他把正负阈值报出来或者解释为什么仿真曲线会呈现一个回环就开始含糊了。这篇文章就把这条链路完全讲透迟滞是怎么产生的、Hysteresis Sweep为什么能把完整的迟滞环“逼”出来、以及如何从曲线里读出VH、VL-和噪声容限。内容主要针对数字接口电路设计、IO设计、信号调理方向的工程师也适合正在学习CMOS电路、想把仿真原理和工具操作对上的研究生。1. 施密特触发器到底在解决什么问题从阈值“抖动”到迟滞锁定1.1 普通反相器在噪声面前有多脆弱先看一个很常见的场景。一个编码器输出、机械开关触点或者传感器模拟信号经过长走线送到MCU的GPIO信号边缘不是理想方波而是在阈值附近慢慢爬上面还叠着几片噪声。普通CMOS反相器的输入阈值是一个点比如VDD3.3V时阈值大约1.65V。输入信号一旦跨过这个点输出就翻转。问题就出在“一个点”上。如果输入信号恰好在阈值附近来回抖比如1.5V到1.8V之间反复跨越反相器输出就会跟着来回翻转。对于后级数字逻辑来说这等于在时钟沿附近看到了多个毛刺状态机可能采错计数器可能多计寄存器可能写入垃圾数据。更隐蔽的问题是动态功耗输出每翻转一次后级栅极充放电一次频率一高功耗就上去了EMI噪声也会变大。我遇到过最典型的案例是一个按键检测电路。按键按下时RC充放电波形很缓结果在阈值附近弹跳了十几次软件里加了消抖延时都不够后来直接换施密特触发器缓冲器一次反弹都没有。所以这个电路的价值不是理论上的而是实实在在地解决“阈值单点导致的误翻转”问题。1.2 迟滞的本质阈值有了“方向记忆”施密特触发器的设计思路简单说就是把“一个阈值点”变成“两个阈值点”并且让这两个阈值的选择取决于输入的变化方向。具体行为是这样的输入从低往高走时输出翻转发生在较高的正向阈值VH输入从高往低走时输出翻转发生在较低的负向阈值VL-。在VH和VL-之间的区间内输出保持原有状态不变像是“记住”了之前的状态。这个区间就是迟滞窗口也叫死区。打个比方普通反相器像一格一格的开关阈值为1.65V你在阈值附近拨动它就来回跳施密特触发器像空调的温控器设定制冷26℃实际压缩机在27℃启动、25℃停止中间这2℃就是迟滞防止压缩机频繁启停。施密特触发器就是用这个“中间缓冲区”换来了抗噪声能力。从负反馈和正反馈的角度看普通反相器在翻转时处于开环高增益状态没有反馈施密特触发器内部引入了正反馈正反馈的存在让翻转过程变得更陡峭、更果断——一旦输出开始翻转反馈会加速翻转直到输出彻底切换。而且这个反馈还带着一个“记忆”输出状态不同反馈对输入节点的影响就不同阈值自然跟着变。1.3 两级反相器加电阻的典型电路与阈值公式用标准单元库里的两个反相器和两个电阻就能搭出一个清晰直观的施密特触发器非常适合做Hysteresis Sweep的演示和分析对象。电路结构是这样的输入vin通过电阻R1接到节点A节点A接第一级反相器INV1的输入INV1的输出mid接第二级反相器INV2的输入INV2的输出out就是整形后的输出反馈电阻R2连接在节点A和输出out之间。这个结构的关键在于R2。输出out为高电平时它会通过R2把节点A往上拉输出为低电平时它会把节点A往下拉。结果是输入从低往高走时因为输出低电平拉着节点A你需要把输入抬得更高才能让节点A电压达到INV1的翻转阈值Vinv——这就是VH偏高的原因。反过来输入从高往低走时输出高电平帮节点A维持高电平你需要把输入压得更低才能让节点A跌破Vinv——这就是VL-偏低的原因。推导一下阈值公式。设Vinv为INV1的开关阈值。当输出为低约0V时节点A电压是vin在R1和R2上的分压VA vin × R2 / (R1 R2)翻转条件VA Vinv所以VH Vinv × (1 R1/R2)当输出为高约VDD时节点A电压是vin和VDD通过R1、R2的叠加VA (vin × R2 VDD × R1) / (R1 R2)翻转条件VA Vinv所以VL- Vinv × (1 R1/R2) - VDD × R1/R2如果Vinv约等于VDD/2那就得到一个很好用的近似VH ≈ VDD/2 × (1 R1/R2)VL- ≈ VDD/2 × (1 - R1/R2)迟滞宽度 ΔV VH - VL- ≈ VDD × R1/R2这个公式非常实用。比如VDD3.3VR120kΩR280kΩR1/R20.25那么理论上VH约2.06VVL-约1.24V迟滞宽度约0.83V。设计时想调宽迟滞就加大R1对R2的比值想调窄就减小这个比值。需要特别强调的是R2不能太小否则反馈太强输入驱动要消耗很大的电流才能翻转R2也不能太大否则节点A的寄生电容和输入偏置会让翻转变得迟钝。工程上R1在10k到100k量级、R2比R1大2到10倍是比较稳妥的选择。2. 为什么普通DC扫描会失效Hysteresis Sweep的双向扫描原理2.1 普通DC扫描的“单向思维”陷阱拿到一个施密特触发器电路很多人第一反应是跑一个DC扫描输入电压从0V扫到3.3V观察输出电压变化期待看到一条带有迟滞的传输曲线。但实际操作后会发现这条曲线往往让所有人大失所望——要么只看到一次翻转要么翻转点不对要么上扫下扫根本没有分开。原因在于普通DC扫描的逻辑。传统的DC analysis在每一个输入电压点都把电路当作一个独立的静态问题来求解。求解器从某个初始猜测出发用牛顿迭代找稳态解。对于普通反相器每个输入电压下只有一个解所以不管从哪个猜测出发结果都一样。但对于施密特触发器这样的迟滞系统在VH和VL-之间的区间内输出其实存在两个可能的稳定解输出高或输出低。普通DC扫描的求解器按顺序从前一个点继续迭代最终停在哪一支完全取决于起点状态和算法路径。换句话说普通DC扫描只给了你“一条腿”的曲线。它缺乏一种机制去强制系统分别从两个方向完整走一遍。这就像用一台只能从左往右读数的仪表去测量一个带记忆的元件你得到的只是某一种历史路径下的结果而不是完整的迟滞环。2.2 Hysteresis Sweep的核心状态连续与上/下双扫描Hysteresis Sweep解决的就是这个“记忆路径”问题。在Cadence Spectre里它本质上是一种连续追踪法continuation method在DC仿真中的工程实现。原理说起来并不复杂先把输入电压从起点按照设定方向逐步增加上扫到达终点后再反向逐步减小下扫而且每个扫描点都以它前一个扫描点的解作为初值开始迭代。这一步“以前一点解作为初值”非常关键。它保证了整个扫描过程是沿着电路真实的静止解轨迹在走而不是在每个点从零开始猜。当输入电压扫到翻转点附近时正反馈让现有解分支变得不稳定继续往后走不下去了求解器就会自动跳到另一条稳定的解分支上。这个跳变在VTC曲线上表现为一条几乎垂直的边缘就是输出电平的突变。上扫记录的是输出从低到高翻转的那条轨迹翻转点对应VH下扫记录的是输出从高到低翻转的那条轨迹翻转点对应VL-。两条轨迹围起来的区域就是完整的迟滞环。从波形上看它像一个“眼睛”——左侧几乎是垂直的上升边右侧几乎是垂直的下降边上下两横分别是高低电平。有人可能会问能不能用瞬态仿真加一个缓慢三角波来替代可以但瞬态结果会受到RC延迟、寄生电容充电时间的影响。只要斜坡速度不够“无限慢”翻转点就会产生动态偏移读出来的阈值并不纯粹。DC Hysteresis Sweep不考虑时间因素直接解静态平衡得到的是纯静态迟滞特性更适合用来做阈值设计验证。瞬态慢斜坡则更适合在已经确定静态参数之后验证真实负载下的翻转行为。2.3 快照点Snapshot与跳变捕捉机制Spectre的Hysteresis Sweep设置里有一个容易被忽略的选项快照点数量Snapshot Count。它的作用是在扫描到指定的输入电压时把电路内部各节点的电压、各器件的直流工作点完整保存下来供仿真后查看。快照点在调试跳变过程时特别有用。我之前调试过一个施密特触发器翻转时刻总比理论值晚了几十毫伏怎么看都找不到原因。后来设置了4个快照点分别在跳变前、跳变后各取两个点打开快照检查INV1输入节点A的电压才发现节点A上有一个来自输入源的额外分压导致实际到达INV1输入端的电压和理论VA不一致。没有快照这种问题是很难定位的。快照数量设多少合适我的经验是4个就够用覆盖跳变前一个点、跳变点附近精确点、跳变后一个点。设太多会增加仿真文件体积和仿真时间设太少则无法还原跳变前后内部状态。如果只是想得到VH和VL-两个值快照不设也完全没问题。3. 在Cadence Virtuoso里跑通Hysteresis Sweep完整实操步骤3.1 测试平台搭建与器件选型先搭测试平台。为了方便说明我用前面那个两级反相器加电阻的结构参数取VDD3.3VR120kΩR280kΩ输出带100fF负载电容。反相器用0.18μm工艺的标准数字单元库INV1和INV2直接用库里的单元即可不需要手画晶体管。在Virtuoso Schematic Editor里连线关系如下vin接vdc源的正端vdc源的直流值随便先填0后面作为扫描变量输入vin通过R1接到节点A节点A接反相器INV1的输入a引脚同时接R2的一端INV1输出y接到节点midmid接反相器INV2的输入a引脚INV2输出y接到节点out即整体输出R2另一端接out两个反相器的电源接VDD地接0out节点接一个100fF电容到地模拟后级栅极负载。下面是一份可直接参考的Spectre网表清单方便不熟悉图形界面的人对照// Schmitt trigger hysteresis sweep testbench simulator langspectre VDD (vdd 0) vsource typedc dc3.3 Vin (in 0) vsource typedc dc0 R1 (in a) resistor r20k R2 (a out) resistor r80k XINV1 (a mid vdd 0) inv XINV2 (mid out vdd 0) inv CL (out 0) capacitor c100f simulatorOptions options reltol1e-4 dcSweep dc devVin paramdc start0 stop3.3 linstep0.005 hysteresisupdown snapshots4 maxiters1000需要注意不同的工艺库inv单元的端口顺序不完全一样有的库是(Y A VDD GND)有的是(A Y VDD GND)使用前先确认一下单元的symbol和CDF定义避免连线时端口接反。这个细节不复杂但很影响结果我在带新人时至少有一半人的仿真异常是端口顺序错了。3.2 DC仿真Hysteresis选项的逐项配置在ADE L或ADE Explorer里进入Analyses - dc具体配置如下Sweep Variable选择Vin的dc值也就是网表中的devVin paramdc。这一点很关键如果选错了源比如选成电源VDD那扫出来的就是电源变化对输出的影响跟迟滞曲线完全没关系。Sweep Range设为0到3.3单位V。勾选Sweep Type里的Hysteresis选项模式选择Bidirectional即双向扫描。双向扫描的含义是先上扫再下扫上扫从0到3.3下扫从3.3回到0。有的版本里还能选择Up-Down或Down-Up两种顺序通常选Up-Down即可。步长设置上我一般先用5mV粗扫一遍确定翻转点的位置然后在翻转点附近缩小到1mV做一次精细扫描。Spectre的Hysteresis Sweep允许直接指定linstep比如0.005表示5mV步长。更小步长的好处是翻转点定位更精确代价是仿真时间明显增加。对分析迟滞曲线来说5mV已经足够定位VH和VL-到毫伏量级。快照数Snapshot Count设为4。最大迭代次数maxiters设为1000这个参数主要影响扫描点不收敛时的容忍度一般默认值不够时才需要改。如果想提高精度可以把相对迭代容差reltol从默认的1e-3收紧到1e-4对跳变点附近的分支切换有可见的帮助。配置完成后运行仿真。如果一切顺利波形窗口里会同时出现两条轨迹一条是上扫路径一条是下扫路径二者围成一个迟滞环。3.3 从波形窗口准确定位翻转点的技巧仿真跑完之后直接把输出节点out的电压对输入电压vin作图。横轴是vin从0到3.3V纵轴是V(out)你会看到经典的“眼睛”形曲线。精准读数的做法不要用肉眼去估而是用Cadence Calculator里的cross函数。这个函数可以找到输出波形穿越某个电平的时刻或坐标。具体来说输出从高往低翻转的那个点对应的输入电压就是VH输出从低往高翻转的那个点对应的输入电压就是VL-。在Calculator里可以这样写不同版本语法略有差异基本原理是一样的VHplus cross(VT(/out) 1.65 1 falling nil nil ?xName vin) VLminus cross(VT(/out) 1.65 1 rising nil nil ?xName vin)这里的1.65是输出电平的判据线取VDD一半左右即可falling和rising分别指定下降沿和上升沿。用这种方式读出来的VH和VL-误差最多一两个步长比鼠标取点稳定得多。如果波形窗口里两条轨迹分不开可以在查看器里分别选中上扫和下扫trace用颜色区分或者直接在Calculator里分别提取两条曲线的数据来做后处理。4. 从迟滞曲线上读出关键参数VH、VL-、迟滞宽度与设计余量4.1 实测数据与理论计算对照按照前面VDD3.3V、R120kΩ、R280kΩ的参数跑完仿真得到的典型结果大致如下表参数理论估算值仿真实测值偏差Vinv单独反相器1.65V1.62V-0.03VVH2.06V2.05V-0.01VVL-1.24V1.20V-0.04V迟滞宽度 ΔV0.83V0.85V0.02VVH、VL-与理论值存在少量偏差是正常的。主要原因是实际反相器的开关阈值Vinv不是精确的VDD/2而是取决于PMOS和NMOS的强度比同时CMOS输出的高电平VOH也不是精确等于VDD存在几毫伏到几十毫伏的压降。但整体趋势和量级完全对得上说明这个公式用于工程估算没有问题。读出来的VH和VL-是设计施密特触发器的核心依据。比如你要做一个5V容忍的输入缓冲器要求上升沿在3.3V左右触发、下降沿在1.5V左右释放那就可以反推R1/R2。注意公式里的R1/R2决定的是迟滞宽度Vinv决定的是迟滞窗口的中心位置两者独立调整设计自由度其实很高。4.2 迟滞宽度与噪声容限之间的权衡迟滞宽度最直接的作用是决定系统能容忍多大的输入噪声。道理很简单只要叠加在输入信号上的噪声峰值不超过迟滞窗口的一半信号在上升过程中就不会因为噪声抖动而回落到VL-以下输出就不会误翻转。以本次仿真的0.85V迟滞宽度为例理论上可以容忍约425mV的噪声。但我个人的工程习惯是只信一半按200mV左右做设计。原因有三个第一噪声往往不是单峰而是连续几个周期叠加第二电源电压和温度变化会让整个迟滞窗口平移窗口实际边缘可能会靠近工作点第三PCB上走线串扰带来的高频噪声还会通过容性耦合直接影响内部节点而不是完全被输入阈值挡住。迟滞宽度也不是越大越好。太宽会带来两个问题一是要求输入信号的摆幅足够大必须同时覆盖VH和VL-否则根本触发不了翻转二是施密特触发器本身的传播延迟会增加因为输入必须在更强的过驱状态下才能翻转。对于3.3V系统我一般把迟滞宽度控制在0.3V到1V之间具体取值取决于输入噪声幅度和信号摆幅。如果输入摆幅只有1.8V迟滞0.8V就很危险因为信号可能刚到VH就回不去了。4.3 电源电压、温度与工艺角对迟滞窗口的影响从公式ΔV≈VDD×R1/R2可以看出迟滞宽度跟电源电压近似成正比。低压应用里这算是一个隐患VDD从3.3V降到1.8V时同样的R1/R2设计迟滞绝对宽度从0.83V降到0.45V抗噪能力跟着缩水。所以在低压系统里如果噪声环境没有改善可能需要增大R1/R2来补偿。温度影响主要体现在Vinv的漂移上。MOS管的阈值电压Vth随温度升高会下降大约-1到-2mV/℃导致Vinv随温度整体下移VH和VL-也跟着平移。好消息是只要两个电阻用的是同一种类型比如都是多晶硅电阻R1/R2的比值随温度变化很小迟滞宽度基本稳定。所以温度变化更多是让迟滞窗口整体移动而不是变宽变窄。工艺角的影响则要大得多。SS角和FF角下Vinv的偏移可能达到±100mV以上这会让VH和VL-同时偏离设计值。我的习惯是在设计阶段就跑TT、SS、FF三个corner的Hysteresis Sweep每次读取VH和VL-画成一张变化范围表确认所有corner下的阈值都落在系统允许的输入电平规格内。如果某个corner下VH高于规格要求的上限后级可能来不及触发就必须调电路。这个步骤在流片前非常值得做一次corner扫描的成本远低于芯片回来后发现IO阈值不达标的代价。5. 实测中的三个高频坑收敛失败、曲线重合与阈值偏移5.1 跳变点附近不收敛一份收敛性调试笔记Hysteresis Sweep最常见的报错就是跳变点附近的直流不收敛。现象是仿真停在某个电压点打出一串Newton iterations fail或dc convergence not reached后面的点全部中断。原因不复杂翻转瞬间正反馈环路的环路增益接近无穷大系统雅可比矩阵奇异普通牛顿迭代在两个状态之间来回振荡怎么都落不到一个稳定解上。这属于仿真数值问题不是电路本身坏了。我的处理顺序是这样的先把扫描步长从5mV改到1mV很多时候跳变点附近的分支切换需要更细的步长才能找到跨越点再把maxiters从默认值提升到2000给求解器更多迭代次数如果还不行就打开Spectre DC收敛辅助选项比如source stepping或者homotopy让求解器在电压源上先加一个辅助序列从易解的状态逐步过渡到目标状态最后还是不收敛的话先跑一个瞬态慢斜坡确认电路整体行为正常然后利用瞬态中翻转点附近的工作点作为DC仿真的初始条件。这里分享一个经验多数情况下收敛失败不是设置问题而是测试平台本身有冲突。比如输入端同时接了多个直流源或者某个节点的浮空引脚没有正确连接。先把电路跑一个简单的DC工作点仿真确认所有节点都能正常算出电压再跑Hysteresis Sweep能省掉一大半排查时间。5.2 上扫和下扫曲线完全重合排查清单与方向另一个高频问题明明开了Hysteresis跑出来的上扫和下扫曲线却完全重合看不到一点迟滞环。遇到这个现象按下面这个清单逐项排查先确认你看到的是不是两条曲线真的重合。有时候波形窗口里两条trace叠在一起看起来重合实际上相差只有几十微伏。把纵轴分辨率放大或者在Calculator里分别提取两条曲线的数据做差值就一目了然了。确认netlist里确实带上了hysteresis关键字。图形界面勾选之后netlist里应该能看到类似hysteresisupdown的语句。有些版本的ADE界面里Hysteresis选项藏在二级菜单里稍不注意就没勾上。确认扫描方向是一正一反。如果设置成了上扫从0到3.3、下扫还是从0到3.3那两次扫描方向相同结果自然完全一样。检查扫描的目标是不是输入直流源。如果错误地扫描了电源VDD或者某个无关偏置结果当然看不出输入传输特性。最后检查电路本身是否真的存在正反馈。比如R2误接到电源或地、反馈路径上有断线或者悬空节点迟滞就消失了。这个不常见但一旦发生很难一眼看出我用快照检查节点A电压时才确认过。我遇到过最离谱的一次是原理图里R2被画到了INV2的输入和输出之间而INV2本身就是普通反相器这样形成的只是两个反相器的串联没有任何正反馈迟滞环自然出不来。后来我把R2改接到整体输出out和节点A之间一切才恢复正常。所以画原理图时一定要盯住反馈的取样点是“整体输出”而不是“中间节点输出”。5.3 阈值偏移如何从仿真结果反推设计问题如果VH和VL-跟理论计算差得比较多先别急着调电阻按下面的顺序定位问题。第一步单独仿真反相器INV1的开关阈值Vinv。拆掉反馈网络给INV1输入端加DC扫描找出输出翻转时对应的输入电压。这个值是不是接近VDD/2如果VDD3.3V时Vinv实测1.8V说明PMOS比NMOS强整个施密特触发器的触发点都会偏高。解决办法是调整反相器内部PMOS和NMOS的宽长比让翻转阈值回到VDD/2附近。第二步确认输出高电平VOH和低电平VOL是否接近电源轨。施密特触发器的阈值公式默认输出是满摆幅的如果输出负载太重或者反相器驱动能力不足输出高电平被拉到3.2V甚至更低低电平也有残留两档阈值都会跟着偏移。第三步如果Vinv正常、输出电平正常但迟滞宽度和理论值还是不一致那就是R1/R2电阻的工艺偏差问题。多晶硅电阻的绝对阻值偏差可能达到±20%但两个同类型电阻的比值偏差小很多。此时直接用测试结构量一下实际阻值按实测值重新算理论阈值通常就能对上了。最后分享一个我的工作习惯每次跑完Hysteresis Sweep我都会把VH、VL-、迟滞宽度三个值连同当时的温度、工艺角、VDD一起记到一张表格里。这样积累几组数据以后电路的阈值漂移规律就清清楚楚了后续调参根本不需要重新猜。为了省事我还会把仿真输出的CSV数据丢到脚本里做后处理自动提取翻转点并生成报告。这个流程一旦跑通后续做IO库的输入缓冲器设计就变得非常高效。