250MHz环形VCO电源抑制比仿真:PSS+PXF全流程
跑环形VCO的250MHz电源抑制比仿真是我这两年带项目时被问得最多的一件事。很多人一上来就在Cadence里把psspxf几个字母拼进去PSS跑大半个小时PXF扫完出一条乱糟糟的曲线然后对着曲线沉默——这数据到底能不能信电源抑制比算出来是正的还是负的才算好为什么别人的VCO PSR曲线是平的我的却是随频率乱跳的这篇文章的任务很具体用Cadence的PSSPXF仿真一个250MHz环形VCO的电源抑制比PSR流程从一开始就能快速复现。为了不让仿真时间变成劝退因素我用Verilog写了一个VCO行为模型先在数字仿真器里验证250MHz功能再把它等效成Verilog-A放进Spectre跑RF分析。整个过程覆盖原理、代码、参数设置、结果解读和排坑适合正在做PLL或时钟电路的同学参考。1. 环形VCO的电源抑制比PSSPXF到底在测什么1.1 环形VCO为什么对电源噪声这么敏感环形VCO的核心是延迟单元常见的是电流饥饿反相器或差分延迟单元。一个N级环形振荡器的振荡频率近似为f1/(2Ntd)td是单级延迟。延迟时间td大约等于负载电容上的充放电时间td≈C*ΔV/I。这里的I是延迟单元的尾电流或驱动电流ΔV是输出摆幅。问题就出在这里。电源电压直接决定了PMOS和NMOS的栅源电压、饱和电流也就直接决定了I和ΔV。电源上哪怕只有几毫伏的纹波都会变成延迟单元的充放电电流变化体现在延迟时间上最后变成振荡频率和相位的抖动。这就是环形VCO电源敏感度差的根本原因——它没有一个天然的机制去隔离电源噪声。LC-VCO反而好很多谐振腔的选频特性会对电源扰动做滤波而且尾电流源的共模抑制也能挡掉一部分电源噪声。环形VCO没有这个“保护罩”延迟时间就是被电源电压牵着走。所以做环形VCO评估电源抑制比是一件绕不开的事情。1.2 PSS和PXF的分工一个找周期解一个算时变频响VCO是一个非线性自治振荡器普通AC分析在这里完全失效。AC分析是在直流工作点上做线性化而VCO压根没有稳定的直流工作点——它一直在振荡。如果把AC激励加进去你得到的只是一个不存在的“直流平衡点附近”的响应结果自然没有物理意义。PSSPeriodic Steady-State解决的是“找周期解”的问题。它在时域里迭代直到电路波形在一个周期内的状态与上一周期一致从而得到周期为1/250MHz4ns的稳态波形。这个稳态解里包含了所有谐波分量比如500MHz、750MHz、1GHz等。PXFPeriodic Transfer Function解决的则是“在周期时变工作点上算小信号传递函数”的问题。它在PSS得到的时变工作点基础上做线性化把电路抽象成一个LPTV线性周期时变系统然后计算从输入端口到输出端口的频域传递函数。这里有一个关键概念PXF扫描的频率是基波附近的偏移频率。比如PSS的基波是250MHzPXF扫描1kHz到100MHz那么它实际算的是250MHz±1kHz、250MHz±100MHz这些边带位置上的传输特性。这正是电源噪声的AM/PM边带在VCO输出端被放大了多少。1.3 先搞清楚你测的是PSR还是PSRR不少人在这一步就栽了跟头。PSRR和PSR不是一回事。放大器的PSRR定义为信号通路增益除以电源通路增益单位是dB正数越大表示抑制能力越强。LDO、运放这些线性电路里的“Power Supply Rejection Ratio”就是这个意思。VCO的PSR一般定义为电源电压变化到输出频率或相位的灵敏度。它可以写成KPSRΔf/ΔVDD单位是Hz/V也可以用dB来表示相对抑制能力。更严格的做法是在相位域看电源扰动→频率变化→相位积分→相位噪声。这是VCO特有的积分特性。所以当你听到别人说“把VCO的PSR仿成-50dB”他说的多半是从电源节点到VCO输出节点或相位节点的电压增益。负值越大越好表示电源扰动经过VCO之后衰减得越厉害。这篇文章演示的就是这种电压域/相位域的频响测量但我会在结果解读部分特别说明相位域的结果才具有真正的设计指导意义单纯看输出幅度曲线容易被AM效应带偏。2. 用Verilog行为模型搭一个250MHz环形VCO2.1 为什么先用行为模型而不是直接上晶体管晶体管级环形VCO做PSS仿真不是不行而是很痛苦。即使只有3级反相器加上寄生电容后PSS要迭代收敛到一个高次谐波丰富的稳态解对仿真器的牛顿迭代收敛能力是很大的考验。如果VCO工作在有源区、亚阈值区的边界仿真时间会成倍增长。行为模型的好处是参数直观可控KPSR、KVCO都是显式写出来的参数想改成多少改多少仿真速度快PSS和PXF都是短平快可以分离效应比如把输出摆幅固定、只让频率随电源变化就能单独观察频率调制的影响。等你通过行为模型把整个仿真流程跑通了再换回晶体管电路验证真实PSR效率会高很多。2.2 相位累加型VCO模型Verilog/SV代码我用SystemVerilog写了一个差分输出的VCO行为模型核心思路是“相位累加器”。瞬时频率freq由中心频率、控制电压项和电源电压项共同决定然后每个固定时间步长对频率做一次积分累加出瞬时相位。相位超过2π就回卷同时根据相位所在半周期决定输出是高电平还是低电平。timescale 1ps/1fs module vco250m_diff #( parameter real F_CENTER 250.0e6, // 中心振荡频率 parameter real KVCO 1.0e9, // 压控增益 Hz/V parameter real V_CENTER 0.9, // 控制电压中心点 parameter real VDD_NOM 1.2, // 标称电源电压 parameter real KPSR 25.0e6 // 电源到频率的敏感系数 Hz/V )( input real vctrl, input real vdd, output real outp, output real outn ); real freq; real phase; const real TWO_PI 6.283185307179586; initial begin freq F_CENTER; phase 0.0; outp 0.0; outn 0.0; end always * begin freq F_CENTER KVCO * (vctrl - V_CENTER) KPSR * (vdd - VDD_NOM); if (freq 1.0e3) freq 1.0e3; end // 固定1ps步长的相位积分 always #1 begin phase phase TWO_PI * freq * 1.0e-12; if (phase TWO_PI) phase phase - TWO_PI; outp (phase 3.141592653589793) ? VDD_NOM : 0.0; outn (phase 3.141592653589793) ? 0.0 : VDD_NOM; end endmodule这段代码的核心是always #1块。每1ps更新一次相位250MHz下每周期是4000ps因此一个波形周期内会有4000个采样点波形精度足够PSS和PXF使用。参数化的意义在于你可以把KPSR设成0来模拟“理想电源绝缘的VCO”也可以设成不同数量级来观察PSR的变化趋势。我默认给25MHz/V意味着电源上1mV扰动会导致25kHz的频率偏移这是一个量级偏大但直观的参数。2.3 用testbench验证模型能否稳定振荡在250MHz行为模型写完必须先在纯数字或混合仿真环境里验证一遍确认它真的在250MHz振荡。timescale 1ns/1ps module tb_vco250m; real vctrl; real vdd; real outp; real outn; vco250m_diff u_vco ( .vctrl(vctrl), .vdd(vdd), .outp(outp), .outn(outn) ); initial begin vdd 0.0; vctrl 0.9; #20 vdd 1.2; end initial begin #20000 $finish; end endmodule在Xcelium或VCS里跑完这个testbench用波形窗口测量outp在1us附近的周期理想情况下周期应该是4ns对应250MHz。如果vctrl偏离0.9V周期会相应变短或变长说明KVCO链路生效如果vdd偏离1.2V周期同样会变说明KPSR链路生效。一个值得注意的点纯Verilog的real端口在Cadence AMS流程里是能用的但老版本的Virtuoso对real端口兼容性一般。如果遇到编译报错可以直接改成Verilog-AMS的方式或者用下一章里的Verilog-A模型作为spectre仿真入口。行为模型验证的目的只是让你确认参数和公式没有写错。3. 从Verilog模型到能跑PSSPXF的Spectre环境3.1 纯Verilog为什么跑不了Spectre的PSSPXF这是很多人在Cadence里卡住的第一道坎。Spectre的PSS和PXF分析是模拟/RF仿真器内部的分析算法它的求解对象是电路网表里的analog器件和Verilog-A行为模型。纯Verilog模块不是Spectre直接支持的语法你需要通过AMS Designer或者把Verilog转成Verilog-A才能在Spectre里跑RF分析。有些版本可以通过config里挂数字视图来混合仿真但PSSPXF在纯数字和模拟混合模式下支持有限版本不同行为差异很大。与其在AMS配置上耗时间不如直接把VCO行为模型改写成Verilog-A。Verilog-A是Spectre的“母语”PSS和PXF对它的支持是最完整的。3.2 Verilog-A等效模型的转换思路从Verilog到Verilog-A的转换有两个关键点一是把时钟步进的相位累加器改成idt积分器二是把逻辑电平的高低翻转改成模拟域的sin波形输出。我额外加了一个vph输出端口这个端口对外输出out_phase/(2*π)也就是以“圈数”为单位的累积相位。做PXF时可以直接以这个节点为输出看到的是“电源扰动→相位扰动”的传递函数这才是VCO真正的PSR表达。include constants.vams include disciplines.vams module vco250m_va(vctrl, vdd, outp, outn, vph); input vctrl, vdd; output outp, outn, vph; voltage vctrl, vdd, outp, outn, vph; parameter real F_CENTER 250.0e6; parameter real KVCO 1.0e9; parameter real V_CENTER 0.9; parameter real VDD_NOM 1.2; parameter real KPSR 25.0e6; real freq; real out_phase; analog begin freq F_CENTER KVCO * (V(vctrl) - V_CENTER) KPSR * (V(vdd) - VDD_NOM); if (freq 1.0e3) freq 1.0e3; out_phase 2.0 * M_PI * idt(freq, 0.0); // vph节点输出累积圈数 V(vph) out_phase / (2.0 * M_PI); // 固定输出摆幅只体现频率调制 V(outp) (VDD_NOM / 2.0) * (1.0 sin(out_phase)); V(outn) (VDD_NOM / 2.0) * (1.0 - sin(out_phase)); end endmodule在Cadence里用ahdl_include引入这个文件或者直接以Verilog-A view挂在schematic里的symbol上。3.3 测试平台搭建和激励设置在Virtuoso中新建一个schematic testbench层次如下vco250m_vaVerilog-A模型symbolvdc控制电压源VCTRL0.9Vvdc主电源VDD1.2Vvsin交流扰动源串联在VDD和实际供电节点之间。PSS时幅度为0PXF时由Spectre自动叠加小信号AC幅度设为1方便直接读出增益capVCO输出到地接100fF理想电容模拟后级负载gnd接地符号这种“在理想VSIN上做PXF输入”的手法比直接指定理想电压源作为输入要稳妥。理想电压源是强制节点在PXF里作为输入源时容易产生无物理意义的自激响应尤其是串联一个1V幅度的扰动源之后仿真器可以更干净地注入测试信号。4. PSSPXF仿真设置与PSR曲线解读4.1 PSS参数设置要点在ADE L或ADE XL里添加PSS分析参数按下面的表格设置。参数推荐值说明Beat Frequency250MHz必须尽可能接近实际振荡频率否则不收敛或结果失真Number of Harmonics15250MHz的15次谐波是3.75GHz对VCO足够Tstab5us让行为模型从初始状态稳定到周期解Errpresetmoderate收敛和速度的折中Maxstep100ps防止时间步长跨过输出翻转沿Oscillator不勾选模型已经起振若用真实电路建议用Oscillator模式PSS跑完后Spectre会在电路内部保存这个周期稳态解。PXF后续计算全部基于这个时变工作点展开所以PSS没跑对后面全白搭。4.2 PXF参数设置要点PXF分析需要与PSS关联在PSS分析后面添加PXFSweep TypeLogarithmicStart Frequency1kHzStop Frequency100MHzPoints per Decade20Input Source前面串联的vsin扰动源Output分别看两个输出outp电压域PSR包含所有调制效应vph相位域PSR只反映频率调制积分后的相位响应Relative Harmonic1关于Relative Harmonic这里我多说一句。它表示PXF扫描的频率偏移是相对于哪个谐波算的。对VCO来说我们关心的是基波250MHz附近的边带所以必须设成1。设成0就变成了相对于DC附近的传递函数对振荡器来说物理意义完全不对劲。4.3 从Direct Plot导出PSR曲线并按相位域解读PXF跑完后在ADE菜单里选择Direct Plot → PXF → Voltage Gain选中输出节点画图。你会看到两条曲线以outp为输出的电压增益曲线和以vph为输出的相位增益曲线。相位域曲线更能说明VCO的特性。因为VCO本质上是频率到相位的积分器低频电源扰动经过积分之后产生更大的相位偏移所以曲线呈现“低频高、高频低”的滚降形态。这是VCO的物理本征特性不代表设计差。真正有价值的是比较不同参数、不同延迟单元结构下曲线差异的大小。如果KPSR从25MHz/V降到2.5MHz/V相位域曲线会整体下移20dB这个下移量就是电源抑制设计的收益。电压域曲线则要注意AM效应。如果行为模型里输出摆幅是固定的那么outp节点的PXF结果其实主要来自相位信号经过sin函数映射后的边带不是真正的幅度调制。如果你在真实电路里把输出接buffer后测PSRbuffer的电源抑制特性也会混进去解读时要小心区分。5. 仿真中的坑与排查经验5.1 PSS不收敛的完整排查链路PSS不收敛是最常见的问题尤其是第一次跑VCO。我的排查顺序是先看瞬态波形。单独跑2us瞬态仿真实在确认outp真的是250MHz的稳定方波/正弦波。如果瞬态都不起振PSS必然失败。再检查PSS的Beat Frequency。环形VCO的行为模型受KPSR影响如果VDD设的不是标称1.2V实际振荡频率会偏移。你PSS设250MHz但电路实际振荡在252MHzPSS就会反复迭代试图拟合一个错误的周期耗时长且结果差。最后加大Tstab。行为模型初始相位为0需要几个微秒才能稳定到周期解Tstab太短会让PSS在非稳态状态下计算谐波直接导致PXF结果出现不存在的毛刺。实测中把Tstab从100ns加到5us很多“奇怪曲线”会消失。5.2 Relative Harmonic设错的特征和后果前面提到Relative Harmonic必须设为1但很多人会默认用0。设成0跑出来的曲线有个典型特征在低频段出现一个非常宽的“平台”高频段出现不规则的峰和陷波交替很像混叠噪声。原因是你把边带响应当成了基带响应而VCO的谐波分量在频谱上混到一起了。如果遇到这种曲线先别怀疑电路先回过头检查PXF的相对谐波设置。这也是我反复强调看结果前先确认仿真配置的原因——VCO的psspxf对配置参数极其敏感一个参数错整个曲线都在骗你。5.3 模型细节对PSR结果的影响输出摆幅不要随电源走最后一个坑来自行为模型本身的建模方式。有人喜欢把输出摆幅写成VDD_NOM (vdd - VDD_NOM)这样输出的幅度会跟着电源变化看起来更“真实”。但对PSR仿真来说这会引入一个严重的AM分量电源扰动直接出现在输出幅度上PXF测到的电压增益会被这个AM项主导结果比真实的频率调制PSR大很多掩盖了真正关心的相位效应。正确做法是先固定输出摆幅只让频率随电源变化把FM效应单独分离出来。等你对FM部分的PSR心里有数了再回头把AM效应加进去看整体影响。这样你才会知道一条PSR曲线里哪些来自频率调制哪些来自幅度调制对应到电路优化才是不同的发力方向。我从实践里的体会是psspxf本身不难难的是你对被测对象有没有清晰的认知。VCO不是运放它没有直流偏置点有的是一个周期稳态解和时变频响。想清楚这一点再回来设参数、读曲线很多困惑会迎刃而解。

相关新闻

AI Agent skills实战:从Genkit开发到GKE部署的工程化指南

AI Agent skills实战:从Genkit开发到GKE部署的工程化指南

1. 从"skills"这个词说起:为什么它突然成了AI Agent圈子的高频词如果你最近在关注AI Agent相关的技术动态,大概率会反复看到一个词——skills。它出现在Google Cloud的官方博客里,出现在Genkit的文档更新中,也出现在GKE…

2026/10/7 6:30:52 阅读更多 →
PCIe 6.0阻抗一致性:PAM4时代信号完整性的生死线

PCIe 6.0阻抗一致性:PAM4时代信号完整性的生死线

1. 为什么“阻抗一致性”是PCIe高速信号的生命线?——从3.0到6.0的实战视角你拆过一块PCIe 6.0显卡吗?或者调试过一块刚打回来的M.2 NVMe主板?如果信号完整性出问题,你大概率会看到:设备枚举失败、链路训练卡在L0s/L1状…

2026/10/7 6:30:51 阅读更多 →
Agent持久化运行环境实战:基于WeKnora与CubeSandbox的稳定架构

Agent持久化运行环境实战:基于WeKnora与CubeSandbox的稳定架构

做 Agent 开发这件事,最容易翻车的地方往往不是模型选型,也不是 Prompt 写不好,而是 Agent 跑起来之后怎么让它稳定地活下去。最近我基于 WeKnora 这个开源知识管理与 Agent 工作台项目,配合 CubeSandbox 沙箱运行时,搭…

2026/10/7 6:29:51 阅读更多 →

最新新闻

浅谈高可用负载均衡集群实现原理及 TaoToken 统一 API 通道接入实践

浅谈高可用负载均衡集群实现原理及 TaoToken 统一 API 通道接入实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 7:38:40 阅读更多 →
在Node.js中MongoDB查询分页的方法:用TaoToken统一Key跑通Mongoose分页链路

在Node.js中MongoDB查询分页的方法:用TaoToken统一Key跑通Mongoose分页链路

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 7:38:40 阅读更多 →
第八集补贴政策:立交热管融雪改造财政专项补贴申报

第八集补贴政策:立交热管融雪改造财政专项补贴申报

冰未至,路先暖 智能环路热管融雪化冰系统,为北方城市立交装上“主动防冰”的智慧大脑智慧城市 城市干道 城市立交 主动防冰 全域保通一场冻雨,能让城市立交的桥面在半小时内结满暗冰;一次寒潮,能让城市干道在早高峰…

2026/10/7 7:38:40 阅读更多 →
U-Boot移植实战:Kbuild构建系统原理与问题排查指南

U-Boot移植实战:Kbuild构建系统原理与问题排查指南

1. 从一份编译报错说起:为什么U-Boot移植绕不开Kbuild第一次给一块新板子做U-Boot移植的人,大概率会经历这样一个场景:源码拉下来,make xxx_defconfig跑得挺顺,结果一执行make,满屏的No rule to make targe…

2026/10/7 7:38:40 阅读更多 →
RISC-V裸机启动全流程:从复位向量到main函数

RISC-V裸机启动全流程:从复位向量到main函数

1. 从复位向量到main函数:RISC-V裸机启动到底经历了什么很多人第一次接触RISC-V裸机开发,脑子里冒出来的第一个问题就是:芯片一上电,第一条指令到底从哪儿取?我当初从ARM Cortex-M转过来的时候,也习惯性地去…

2026/10/7 7:38:40 阅读更多 →
大学生论文写作AI工具推荐:用TaoToken统一Key接入多款AI写作软件

大学生论文写作AI工具推荐:用TaoToken统一Key接入多款AI写作软件

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 7:37:39 阅读更多 →

日新闻

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:01:58 阅读更多 →
用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:02:00 阅读更多 →
芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:02:00 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 7:15:40 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 5:29:09 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 6:26:51 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 8:21:32 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 4:21:51 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 1:18:13 阅读更多 →