噪声整形SAR ADC设计入门:从原理到实践
1. 从一个“听不清”的烦恼说起为什么需要噪声整形SAR ADC如果你曾经在嘈杂的餐厅里试图听清对面朋友说话你大概能体会到一个核心矛盾想听清对方的声音但环境噪声太大。你的大脑会自动做一件事——把注意力集中在对方说话的频段上同时抑制其他频段的噪声。这个“选择性放大有用信号、压制无用噪声”的过程本质上就是一种“整形”。在芯片设计领域尤其是模拟-to-数字转换器ADC的设计中工程师们面临着一模一样的困境。SAR ADC逐次逼近型寄存器模数转换器以低功耗、结构简洁著称广泛用于传感器接口、便携设备、工业控制等场景。但它有一个天生的短板比较器噪声和采样噪声会直接限制有效位数ENOB。你想让它做到12位、14位甚至更高精度噪声就成了绕不过去的坎。那怎么办传统思路是加大采样电容、提高比较器增益、增加功耗。但这条路在先进工艺节点下越来越难走——电容匹配变差、电源电压降低、功耗预算收紧。于是一种更聪明的做法被引入噪声整形Noise Shaping。它的核心思想不是“消灭噪声”而是“把噪声搬到不碍事的地方去”。就像你在餐厅里把噪声“推”到高频段而把对话声留在低频段后续再用一个低通滤波器把高频噪声滤掉最终带内的信噪比就上去了。这个项目标题里提到的“Opus 5.5巨献”我理解为一个系列技术分享的代号重点在于“初中水平也能看懂”这个定位。这意味着我们要把噪声整形SAR ADC的原理拆解到最底层用生活化的类比、直观的波形图思路和可复现的推导让没有微电子背景的人也能理解它到底在干什么、为什么这么干、以及怎么干才靠谱。这篇文章就是围绕这个目标展开的完整拆解适合芯片设计初学者、模拟电路爱好者、以及想了解混合信号设计思路的工程师参考。2. 核心原理拆解SAR ADC的“笨”与“巧”2.1 SAR ADC到底在做什么一个“猜数字”的游戏要理解噪声整形先得把SAR ADC本身吃透。你可以把SAR ADC想象成一个玩“猜数字”游戏的人。假设有一个未知电压Vin范围是0到Vref。SAR ADC的工作流程是这样的先猜Vin是不是大于Vref/2。如果是最高位MSB记1否则记0。根据上一步的结果调整猜测范围。如果MSB是1下一步猜Vin是否大于3Vref/4如果是0猜Vin是否大于Vref/4。重复这个过程直到所有位都确定。这个过程的核心器件是比较器和DAC数模转换器。比较器负责判断“大了还是小了”DAC负责根据当前猜测结果生成对应的模拟电压反馈回去。SAR逻辑则像一位裁判逐位记录比较结果最终输出数字码。这个结构的好处是不需要高增益放大器功耗低面积小而且随着工艺进步数字逻辑部分可以快速缩放。但问题也很明显比较器的噪声、DAC的建立误差、采样开关的电荷注入都会直接叠加在输入信号上导致输出码字出现随机抖动。对于高精度应用这个抖动就是致命伤。2.2 噪声整形的核心思想把噪声“赶”到高频去噪声整形的基本框架来自Delta-Sigma调制器。它的核心是一个反馈环路包含一个积分器或滤波器和一个量化器。量化器产生的量化噪声经过环路滤波器后会被“整形”——在低频段被抑制在高频段被放大。用数学语言描述假设量化噪声为Q(s)环路滤波器为H(s)那么输出Y(s) X(s) Q(s)/(1H(s))。当H(s)在低频段增益很大时Q(s)/(1H(s))在低频段就很小噪声被抑制而在高频段H(s)增益下降噪声被放大。最终带内噪声被大幅降低带外噪声可以通过后续数字滤波器滤除。那SAR ADC怎么和噪声整形结合关键在于SAR ADC本身可以看作一个量化器而它的比较器噪声和DAC噪声可以等效为量化噪声的一部分。如果在SAR ADC前面加一个环路滤波器把它的量化噪声“推”到高频同时用过采样OSR把带内噪声进一步压低就能用较低精度的SAR核心实现较高的有效位数。2.3 为什么是“噪声整形SAR”而不是“Delta-Sigma ADC”你可能会问既然Delta-Sigma已经能做高精度为什么还要搞噪声整形SAR答案在于速度和功耗的平衡。传统Delta-Sigma ADC依赖高增益运算放大器功耗大而且环路稳定性设计复杂。在先进工艺下低电源电压让高增益运放的设计变得极其困难。而SAR ADC天生适合低功耗、中高速度的场景。把噪声整形技术嫁接到SAR上相当于用“数字辅助少量模拟环路”的方式在保持SAR低功耗优势的同时提升精度。具体来说噪声整形SAR通常采用两级或三级结构第一级是一个粗SAR完成大部分位的转换第二级是一个细SAR或动态放大器处理残差。级间通过电容或电荷再分配实现残差传递。环路滤波器可以用无源电容网络实现避免使用高功耗运放。这样整体功耗远低于同等精度的Delta-Sigma ADC而速度又能做到几MS/s到几十MS/s。3. 关键模块与实操要点从理论到晶体管级3.1 环路滤波器的实现无源还是的有源环路滤波器是噪声整形的灵魂。在SAR ADC中常见的实现方式有两种无源滤波用电容和开关构成电荷再分配网络。优点是功耗极低噪声小适合低功耗场景。缺点是增益有限整形效果受限于电容比值精度。有源滤波用运放或动态放大器构成积分器。优点是增益高整形效果好。缺点是功耗大设计复杂且运放噪声会引入新的问题。对于“初中水平也能看懂”的定位我建议先从无源滤波入手理解。你可以把它想象成一个“电荷搬运工”在第一级SAR转换完成后残差电荷被存储在电容上然后通过开关控制把一部分电荷转移到积分电容上。下一次转换时这个积分电容上的电压会与输入信号叠加形成反馈。这个过程反复进行低频噪声就被“搬”到了高频。实操中无源滤波的电容比值需要仔细设计。假设环路滤波器传递函数为H(z) α/(1 - z^-1)其中α由电容比值决定。α越大低频增益越高整形效果越好但稳定性风险也越大。通常α取0.3到0.7之间需要根据仿真结果调整。3.2 比较器噪声与动态失调校准SAR ADC的比较器噪声是限制精度的关键因素。在噪声整形架构中比较器噪声同样会被环路整形但前提是环路增益足够高。如果比较器噪声太大即使整形后带内噪声仍然可能超标。降低比较器噪声的常用方法有增大输入对管的尺寸降低热噪声但会增加寄生电容影响速度。增加预放大器增益提高比较器灵敏度但功耗和面积增加。采用动态失调校准在每次转换前用校准电容存储失调电压并在比较时抵消。我实测下来对于12位以上的噪声整形SAR比较器输入等效噪声需要控制在几十微伏以内。如果工艺节点是28nm或更先进电源电压只有0.9V左右比较器设计难度会显著增加。这时候动态失调校准几乎是必选项。3.3 时序设计与时钟抖动噪声整形SAR的时序比普通SAR复杂得多。一个典型的转换周期包括采样阶段输入信号被采样到电容阵列上。粗转换阶段SAR逻辑完成高N位的转换。残差传递阶段将残差电荷转移到积分电容。细转换阶段完成低M位的转换。反馈阶段将积分电容上的电压反馈到输入端。每个阶段都需要精确的时钟控制。时钟抖动会直接调制采样时刻引入额外的噪声。对于过采样率OSR8、信号带宽1MHz的场景时钟抖动需要控制在几十皮秒以内。如果时钟抖动是100ps引入的噪声可能就会吃掉1到2个有效位。实操中我建议用多相时钟发生器从主时钟分频得到各相时钟。主时钟的抖动要尽可能低可以用LC振荡器或低抖动PLL。另外关键路径上的时钟树要平衡避免偏斜导致时序错误。4. 完整设计流程从行为级仿真到版图验证4.1 行为级建模用Python快速验证架构在动手画晶体管之前先用行为级模型验证架构可行性。我习惯用Python写一个简单的噪声整形SAR模型包括输入信号正弦波频率fin。采样理想采样加入时钟抖动。量化器SAR逻辑加入比较器噪声。环路滤波器一阶或二阶无源滤波。数字滤波器CIC或FIR用于滤除带外噪声。代码示例如下import numpy as np import matplotlib.pyplot as plt # 参数设置 fs 10e6 # 采样率 fin 100e3 # 输入信号频率 OSR 8 # 过采样率 N 4096 # 采样点数 Vref 1.0 # 参考电压 bits 8 # SAR核心位数 noise_rms 100e-6 # 比较器噪声RMS # 生成输入信号 t np.arange(N) / fs vin 0.5 * Vref * np.sin(2 * np.pi * fin * t) # 量化器模型 def sar_quantize(vin, bits, Vref, noise_rms): lsb Vref / (2**bits) noise np.random.randn(len(vin)) * noise_rms vout np.round((vin noise) / lsb) * lsb return vout # 一阶噪声整形环路 def noise_shaping_loop(vin, bits, Vref, noise_rms, alpha0.5): vout np.zeros_like(vin) integrator 0.0 for i in range(len(vin)): # 反馈 v_fb vin[i] - integrator # 量化 v_q sar_quantize(np.array([v_fb]), bits, Vref, noise_rms)[0] # 积分器更新 integrator integrator alpha * (v_q - v_fb) vout[i] v_q return vout # 运行仿真 vout noise_shaping_loop(vin, bits, Vref, noise_rms) # 计算频谱 fft_out np.fft.fft(vout) fft_in np.fft.fft(vin) freq np.fft.fftfreq(N, 1/fs) # 计算SNR signal_power np.sum(np.abs(fft_in[:N//2])**2) noise_power np.sum(np.abs(fft_out[:N//2] - fft_in[:N//2])**2) snr 10 * np.log10(signal_power / noise_power) print(fSNR {snr:.2f} dB)这个模型跑下来你可以快速看到不同alpha值、不同OSR对SNR的影响。我试过alpha0.5、OSR8时8位SAR核心可以做到约12位有效位数。如果alpha提高到0.7SNR还能再提升3到4dB但稳定性需要仔细检查。4.2 晶体管级设计从理想元件到真实器件行为级验证通过后进入晶体管级设计。这一步的核心是用真实器件替换理想模型并验证性能是否达标。关键模块包括采样开关用自举开关bootstrap switch降低导通电阻和失真。注意自举电容的耐压和时钟馈通。电容阵列用单位电容并联构成注意匹配和寄生。通常采用共中心布局加dummy电容。比较器用预放大器锁存器结构。预放大器增益要足够高锁存器要快速再生。SAR逻辑用动态逻辑实现降低功耗。注意时序余量。环路滤波器用无源电容和开关实现。注意电荷注入和时钟馈通。我踩过的一个坑是电容阵列的寄生电容会严重影响残差传递精度。在版图中电容阵列的连线寄生可能达到单位电容的5%到10%。如果不加补偿整形效果会大打折扣。解决办法是在关键节点加屏蔽层或者用差分结构抵消共模寄生。4.3 版图与后仿真细节决定成败版图阶段是噪声整形SAR设计的“最后一公里”。以下是我总结的几个关键点对称性差分信号路径必须严格对称包括电容阵列、开关、比较器输入对。不对称会引入偶次谐波失真。接地与电源模拟地和数字地要分开用星型连接。电源去耦电容要靠近模块。时钟走线时钟线要短、粗、屏蔽避免与其他信号线平行走线。寄生提取后仿真必须提取寄生电容和电阻尤其是电容阵列和比较器输入节点。后仿真中我通常会对比前仿真和后仿真的SNR、ENOB、SFDR等指标。如果后仿真SNR下降超过2dB就需要检查版图寄生是否过大或者时序是否因为寄生而偏移。5. 常见问题与排查技巧实录5.1 输出频谱出现杂散怎么办杂散是噪声整形SAR最常见的异常。典型表现是在输出频谱中除了输入信号和噪声整形后的高频噪声还出现了一些离散的尖峰。这些尖峰可能来自时钟馈通采样开关的时钟信号通过寄生电容耦合到信号路径。电荷注入开关关断时沟道电荷注入到采样电容。DAC失配电容阵列的失配导致非线性。比较器失调比较器的固定失调导致输出码字偏移。排查思路先看杂散频率与时钟频率的关系。如果杂散在fs/2附近很可能是时钟馈通。如果杂散在fin的谐波位置很可能是非线性。我通常会用频谱扫描的方法改变输入频率观察杂散是否跟随。如果杂散跟随输入频率就是非线性如果固定不变就是时钟相关。5.2 有效位数不达标怎么调ENOB不达标是另一个高频问题。可能原因和对应措施如下表问题现象可能原因排查方法解决措施ENOB低于预期比较器噪声过大仿真比较器输入等效噪声增大输入对管增加预放大器增益ENOB随输入频率下降采样开关带宽不足检查开关导通电阻和采样电容用自举开关减小采样电容ENOB随温度变化偏置电流温漂检查偏置电路温度系数用温度补偿偏置ENOB在特定码字下降DAC失配检查电容阵列匹配加大单位电容优化布局ENOB随电源电压下降电源抑制比不足检查电源噪声耦合路径增加去耦电容用LDO供电我实测下来比较器噪声和采样开关失真是两个最主要的限制因素。如果这两个都优化到位ENOB通常能接近理论值。5.3 环路稳定性怎么保证噪声整形SAR的环路稳定性比普通SAR更敏感。如果环路增益太高或者相位裕度不足输出会出现振荡或极限环。排查方法开环仿真断开环路注入小信号看增益和相位曲线。瞬态仿真观察输出是否收敛是否有周期性振荡。蒙特卡洛仿真检查工艺角变化对稳定性的影响。我通常会把环路增益控制在40dB到60dB之间相位裕度大于60度。如果稳定性不够可以降低alpha值或者增加补偿电容。6. 经验总结与进阶方向6.1 我踩过的三个坑第一个坑是忽视时钟抖动。早期设计时我以为行为级仿真过了就万事大吉结果流片回来发现ENOB比仿真低了3位。后来排查发现是时钟发生器抖动太大导致采样时刻随机偏移。换了低抖动PLL后ENOB恢复了2位。第二个坑是电容阵列寄生。版图完成后后仿真发现残差传递误差比前仿真大了5倍。原因是电容阵列的连线寄生在关键节点上形成了分压。后来重新布局加宽关键连线问题解决。第三个坑是比较器动态失调校准时序。校准阶段和转换阶段的时钟重叠导致校准电容上的电荷没有完全建立。调整时序后失调从5mV降到0.5mV。6.2 进阶方向二阶噪声整形与MASH结构一阶噪声整形SAR的整形效果有限通常只能提升2到3位有效位数。如果想进一步提升可以考虑二阶噪声整形在环路中增加一个积分器整形斜率从20dB/dec提升到40dB/dec。代价是稳定性设计更复杂功耗增加。MASH结构用多个低阶噪声整形SAR级联通过数字消除逻辑合并输出。优点是稳定性好缺点是数字逻辑复杂对匹配要求高。对于初学者我建议先从一阶结构入手把基本环路跑通再逐步尝试二阶或MASH。毕竟能把一阶做到12位有效位数已经能覆盖很多传感器和音频应用了。6.3 一个实用小技巧用FFT快速定位问题每次仿真完我都会先做FFT看频谱。如果频谱干净只有输入信号和整形后的高频噪声说明架构没问题。如果出现杂散就根据杂散频率反推原因。这个方法帮我省了很多调试时间。具体操作在输出码字上加窗函数比如Hanning窗做N点FFT然后看前N/2个点的幅度。如果某个频点幅度异常高就重点排查对应的模块。这个内容后续还可以这样扩展把噪声整形SAR和传统Delta-Sigma ADC做对比分析在不同工艺节点下的功耗和面积差异或者讨论如何用数字校准进一步提升精度。但那是另一个话题了先把基础打牢比什么都重要。

相关新闻

Python工业级数据流水线:清洗→建模→可视化一键交付

Python工业级数据流水线:清洗→建模→可视化一键交付

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

2026/10/11 3:32:41 阅读更多 →
晶圆代工三国杀:台积电、三星、中芯国际,2025年谁在领跑?(附最新营收数据)

晶圆代工三国杀:台积电、三星、中芯国际,2025年谁在领跑?(附最新营收数据)

目录晶圆代工三国杀:台积电、三星、中芯国际,2025年谁在领跑?(附最新营收数据)一、先搞懂:为什么芯片公司不自己造芯片?二、2025年全球格局:AI把整个行业推上历史新高三、台积电&…

2026/10/11 3:32:41 阅读更多 →
PJ85718DM与STM32F215ZG工业温控硬件协同设计

PJ85718DM与STM32F215ZG工业温控硬件协同设计

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

2026/10/11 3:32:41 阅读更多 →

最新新闻

服务器初始化步骤简述

服务器初始化步骤简述

服务器初始化完成硬件上电,通过控制台/IPMI登录操作系统,获取服务器操作终端。配置网络配置网卡IP、网关、DNS,测试内网、外网连通。为yum下载、时间同步等后续操作提供网络基础。配置Yum源替换为国内镜像源,清理并生成yum缓存&am…

2026/10/11 4:25:11 阅读更多 →
DESIGN.md 完整指南:一份 Markdown 设计系统文件,让 AI 生成视觉一致的 UI

DESIGN.md 完整指南:一份 Markdown 设计系统文件,让 AI 生成视觉一致的 UI

DESIGN.md 完整指南:一份 Markdown 设计系统文件,让 AI 生成视觉一致的 UI 【免费下载链接】awesome-design-md A collection of DESIGN.md files analysis by popular brand design systems. Drop one into your project and let coding agents generat…

2026/10/11 4:25:11 阅读更多 →
Open Generative AI 快速上手:420+ 模型的免费 AI 图像与视频生成工作室,无订阅费

Open Generative AI 快速上手:420+ 模型的免费 AI 图像与视频生成工作室,无订阅费

Open Generative AI 快速上手:420 模型的免费 AI 图像与视频生成工作室,无订阅费 【免费下载链接】Open-Generative-AI Unrestricted Open-source alternative to AI video platforms — Free AI image & video generation studio with 600 models (…

2026/10/11 4:25:11 阅读更多 →
Gradle报错No tests found排查指南:原因与解决方案

Gradle报错No tests found排查指南:原因与解决方案

直接说结论:Execution failed for task :xxxx-api:test. > No tests found for given includes:这行报错,八成不是你的测试代码写挂了,而是 Gradle 在 test 任务阶段压根没发现任何它认为需要测试的类。这个报错在 Java/Kotlin 多模块项目…

2026/10/11 4:25:11 阅读更多 →
PS5通用优化指南:容量、散热、存档与远程游玩全攻略

PS5通用优化指南:容量、散热、存档与远程游玩全攻略

最近帮身边好几个人折腾了PS5,发现一个挺有意思的现象:不管是首发入的首批机器,还是后来买的改款,甚至是收来的二手,大家遇到的问题几乎一模一样——硬盘不够用、系统选项看不懂、主机烫得能煎鸡蛋,还有存档…

2026/10/11 4:25:11 阅读更多 →
nodejs 获取客服端ip,以及获取ip一直都是127.0.0.1的问题

nodejs 获取客服端ip,以及获取ip一直都是127.0.0.1的问题

个人博客(vue3 nodejs mysql )http://36.151.145.67:30000/ 一、问题描述 在做登录日志的时候想要获取客户端的ip, 网上查了一下 通过 req.headers[x-forwarded-for] || req.connection.remoteAddress; 获取, 结果获取了之后不管是开发环境&#xf…

2026/10/11 4:24:11 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 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/10 5:23:50 阅读更多 →
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/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练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/10 10:38:42 阅读更多 →