简介这份实验报告面向计算机组成原理课程的学习者与实验备考学生聚焦运算器硬件实现这一核心难点帮助读者理清从串行加减到先行进位加法的设计脉络。内容围绕8位可控加减法器、4位快速加法器与16位快速加法器三个实验展开涵盖设计要求、方案设计、实验步骤、故障调试与测试分析等完整环节并给出全加器串联、CLA74182先行进位、组内与组间进位扩展等关键电路思路及具体测试用例。资源包共1个docx文件约1.26MB为可直接参考的完整实验报告文档便于对照撰写报告或复现电路。目前已有2565人学习适合需要掌握二进制运算、进位机制与电路调试方法的学生参考借鉴。1. 运算器实验为什么 8 位加法器能跑16 位却容易翻车很多人第一次在电路仿真里搭出 8 位串行加法器时会觉得运算器不过如此——把全加器一级一级串起来进位像多米诺骨牌一样往后传结果对了就收工。可一旦把位宽拉到 16 位、甚至只是把 4 位加法器级联起来结果就开始出现玄学错误低位明明算对了高位却莫名其妙差 1。问题不在你的连线而在进位链的延迟结构。运算器实验真正要搞懂的不是“加法器怎么接”而是“进位到底以什么代价传播”。8 位可控加减法器用串行进位把代价摊在时间上4 位快速加法器用先行进位把代价摊在电路面积上16 位快速加法器则要在两者之间做一次分层取舍。这份实验报告把三级设计串成一条线恰好是理解计算机算术运算底层机制最干净的样本。搞懂这条线你再看任何 ALU 的进位逻辑都不会觉得是黑匣子。2. 8 位可控加减法器补码减法为什么能复用加法电路2.1 串行进位的本质是把时间换面积8 位可控加减法器的核心结构是 8 个一位全加器首尾相连低位的进位输出直接接到高位的进位输入。每一位全加器完成的是三个一位二进制数的相加两个操作数位 Xi、Yi加上来自低位的进位 Ci-1输出和 Si 与向高位的进位 Ci。串行结构下第 7 位的进位必须等第 6 位的进位算完才能稳定第 6 位又要等第 5 位整条进位链的延迟随位宽线性增长。这就是为什么 8 位还能接受、16 位就开始吃力的根本原因——不是逻辑错了是进位信号到达最高位的时间太晚在真实时钟约束下会直接导致建立时间违例。从设计动机看串行加法器的价值在于结构极简、门数极少。每一位只需要一个全加器全加器本身也不过是若干与门、或门、异或门的组合。对于教学实验和低功耗场景这种“用时间换面积”的取舍完全合理。常见的实现思路是先把一位全加器的真值表固化成一个封装好的子电路再在顶层重复例化 8 次用隧道标签把进位逐级连起来。隧道标签在这里的作用相当于命名连线避免长距离走线把电路图搅成一团。2.2 Sub 信号如何把减法变成加法减法复用加法电路靠的是补码恒等式X - Y X (~Y) 1。电路上只需要一个控制信号 Sub 同时驱动两件事——对 Y 的每一位做异或以及给最低位全加器的进位输入置 1。当 Sub0 时Y 原样进入全加器最低位进位为 0执行 XY当 Sub1 时Y 的每一位被取反最低位进位为 1等价于加上 Y 的补码执行 X-Y。这个设计的精妙之处在于没有引入任何额外的减法器控制信号只改变了数据通路上的两个点就把整个 8 位加法阵列切换成了减法模式。// 8 位可控加减法器核心逻辑行为级描述对应实验中的电路结构 module add_sub8( input [7:0] X, // 被加数/被减数 input [7:0] Y, // 加数/减数 input Sub, // 0: 加法 1: 减法 output [7:0] S, // 运算结果 output Cout, // 最高位进位 output OF // 有符号溢出标志 ); wire [7:0] Y_eff; // 经 Sub 处理后的实际加数 wire [8:0] carry; // 9 位进位链carry[0] 是最低位进位输入 assign Y_eff Y ^ {8{Sub}}; // Sub1 时按位取反 assign carry[0] Sub; // Sub1 时最低位加 1构成补码 // 8 个全加器串行连接carry[i] 是第 i 位的进位输入 assign {carry[8], S} X Y_eff carry[0]; assign Cout carry[8]; // 溢出最高数据位进位与符号位进位不一致 assign OF carry[8] ^ carry[7]; endmodule这段代码里最值得盯住的是OF的生成方式。有符号溢出的判定条件不是“结果超出 8 位”而是“进入符号位的进位和从符号位出去的进位不一致”。carry[7] 是第 6 位向第 7 位符号位的进位carry[8] 是符号位向外的进位两者异或为 1 就说明符号位被进位冲错了方向。这个判据在串行和先行进位结构里都成立是补码运算的通用性质不是某种电路的巧合。2.3 故障与调试进位链断在哪里实验报告里提到“经检验该电路图能正常运行”但真实搭建时最常见的翻车点恰恰在进位链。现象是低位结果正确、高位结果随机原因通常是某一位全加器的进位输入没有接到前一位的进位输出或者隧道标签重名导致进位信号被短路。排查方法是逐位注入固定输入比如让 X00000001、Y00000000、Sub0观察进位是否逐级传递如果第 3 位之后结果就错了问题一定出在第 2 位到第 3 位之间的进位连线上。另一个隐蔽的坑是 Sub 信号只接到了异或门、忘了接最低位进位导致减法结果永远差 1这种错误在加法测试里完全看不出来必须用 XY 的减法用例才能暴露。3. 4 位快速加法器先行进位到底“先行”在哪3.1 从串行进位到生成/传递函数串行加法器的延迟根源是进位必须逐位计算而每一位的进位又依赖前一位的进位。先行进位的思路是把进位表达式展开让高位进位不再等待低位进位稳定而是直接从操作数和最低位进位输入算出来。关键是把每一位的进位行为拆成两个函数生成函数 Gi Xi·Yi表示这一位自身就会产生进位与低位无关传递函数 Pi Xi⊕Yi表示这一位会把低位来的进位原样传出去。于是进位可以写成 Ci Gi Pi·Ci-1递归展开后C1 到 C4 都能表示成 G、P 和 C0 的组合不再有逐级依赖。这个变换的代价是门电路数量增加。展开后的进位表达式里高位的项会包含多个 G 和 P 的乘积需要多输入与门、或门来实现。4 位先行进位电路 CLA74182 就是把这组展开式固化下来的专用芯片它接收 4 组 G、P 和进位输入 C0并行输出 C1、C2、C3、C4同时给出成组进位生成函数 G* 和成组进位传递函数 P*。G* 表示这 4 位整体会不会产生进位P* 表示这 4 位整体会不会传递进位这两个信号是后续扩展到 16 位的关键接口。3.2 CLA74182 的接口语义与 C0 依赖实验报告里有一句血泪经验式的提醒“74182 是 C0 的函数一定要连上 C0。”这句话的分量在于先行进位电路的输出 C1 到 C4 全部是 C0 的函数如果 C0 悬空或接错所有进位都会错而且错误模式看起来像是“高位随机”。C0 不是可有可无的默认值它是整个进位展开式的自变量。常见的实现思路是把 C0 接到最低位进位输入同时确保 CLA74182 的 G、P 输入来自 4 个全加器对应的 Xi、Yi 组合而不是来自上一级的结果。// 4 位快速加法器CLA 负责并行进位FA 只负责求和 module add4_fast( input [3:0] X, Y, input Cin, output [3:0] S, output Cout, output G_star, P_star // 成组生成/传递函数供 16 位扩展使用 ); wire [3:0] G, P; // 每一位的生成、传递函数 wire [3:0] C; // CLA 并行产生的进位 C1..C4 assign G X Y; // Gi Xi·Yi assign P X ^ Y; // Pi Xi⊕Yi // CLA74182 行为模型C1..C4 并行计算全部依赖 Cin assign C[0] G[0] | (P[0] Cin); assign C[1] G[1] | (P[1] G[0]) | (P[1] P[0] Cin); assign C[2] G[2] | (P[2] G[1]) | (P[2] P[1] G[0]) | (P[2] P[1] P[0] Cin); assign C[3] G[3] | (P[3] G[2]) | (P[3] P[2] G[1]) | (P[3] P[2] P[1] G[0]) | (P[3] P[2] P[1] P[0] Cin); assign S P ^ {C[2:0], Cin}; // Si Pi ⊕ Ci-1 assign Cout C[3]; assign G_star G[3] | (P[3] G[2]) | (P[3] P[2] G[1]) | (P[3] P[2] P[1] G[0]); assign P_star P[3] P[2] P[1] P[0]; endmodule代码里S P ^ {C[2:0], Cin}这一行对应的是 Si Pi⊕Ci-1注意进位下标错开一位第 0 位的进位输入是 Cin第 1 位是 C1依此类推。G_star 和 P_star 的表达式是 4 位整体的进位生成与传递它们不依赖 Cin只依赖 X、Y这正是 16 位扩展时组间先行进位的输入。如果这里把 G_star 写成依赖 Cin 的形式16 位级联时就会引入额外的串行延迟快速加法器的意义就丢了一半。3.3 测试用例背后的进位路径验证报告里给出的测试是 X1000、Y0100、Cin0输出 S1100、Cout0、P*0、G*0。这个用例看似简单但它验证的是“无进位产生、无进位传递”的路径X 和 Y 没有同一位同时为 1所以 G 全 0X 和 Y 也没有哪一位是 1 和 0 并存导致 P 为 1 后继续传递所以 P* 为 0。真正能压出问题的用例是让低位产生进位并向上传递比如 X1111、Y0001此时 G00、P01进位会一路穿过 4 位C4 应该为 1P* 应该为 1。只测“干净”的用例等于没测先行进位的关键路径。4. 16 位快速加法器组间先行进位如何避免二次串行4.1 两级先行进位的分层结构16 位快速加法器不是把 16 个全加器直接接一个更大的 CLA而是把 16 位切成 4 个 4 位组每组内部用 4 位快速加法器完成组内先行进位组间再用一个 CLA74182 根据各组输出的 G*、P* 计算组间进位。这样进位延迟从 16 级串行降到“组内先行 组间先行”两级延迟量级从 O(n) 降到 O(log n) 的分层结构。每 4 位的进位 C1 到 C4 由上层 CLA 的输出接到对应 4 位加法器的进位输入端形成“组内并行、组间也并行”的格局。这个设计的取舍很清晰面积换速度。4 个 4 位加法器加一个组间 CLA比单个 16 位串行加法器多用了不少门电路但换来了进位路径的显著缩短。常见的实现思路是把 4 位快速加法器封装成带 G*、P* 输出的子电路顶层只负责把 4 组的 G*、P* 送进 CLA74182再把 CLA 输出的组间进位分发回各组的 Cin。隧道标签在这里承担的是“跨层级信号分发”的角色命名必须严格区分组内进位和组间进位否则很容易把 C4 和 C8 接混。4.2 组间进位与组内进位的接口对齐16 位结构里最容易出错的地方是进位下标的对齐。第 0 组位 0 到 3的进位输入是全局 C0第 1 组位 4 到 7的进位输入应该是组间 CLA 产生的 C4第 2 组是 C8第 3 组是 C12。如果误把每组的 Cin 都接成 C0组间进位就完全失效结果会在跨 4 位边界时出错。报告里的测试输入 X0000 1100 0000 1100、Y1000 0100 1000 0100结果 S1001 0000 1001 0000这个用例恰好跨越了组边界能验证组间进位是否被正确注入。分析时应该逐组核对低 4 位的结果是否影响了高 4 位的进位输入而不是只看最终和对不对。// 16 位快速加法器4 个 4 位组 组间 CLA module add16_fast( input [15:0] X, Y, input Cin, output [15:0] S, output Cout, output G_star, P_star ); wire [3:0] G_grp, P_grp; // 各组输出的成组生成/传递函数 wire [3:0] C_grp; // 组间进位C4, C8, C12, C16 // 组间 CLA根据各组 G*、P* 和全局 Cin 并行算出组间进位 assign C_grp[0] G_grp[0] | (P_grp[0] Cin); assign C_grp[1] G_grp[1] | (P_grp[1] G_grp[0]) | (P_grp[1] P_grp[0] Cin); assign C_grp[2] G_grp[2] | (P_grp[2] G_grp[1]) | (P_grp[2] P_grp[1] G_grp[0]) | (P_grp[2] P_grp[1] P_grp[0] Cin); assign C_grp[3] G_grp[3] | (P_grp[3] G_grp[2]) | (P_grp[3] P_grp[2] G_grp[1]) | (P_grp[3] P_grp[2] P_grp[1] G_grp[0]) | (P_grp[3] P_grp[2] P_grp[1] P_grp[0] Cin); // 4 个 4 位组每组 Cin 来自组间进位第 0 组用全局 Cin add4_fast u0(.X(X[3:0]), .Y(Y[3:0]), .Cin(Cin), .S(S[3:0]), .G_star(G_grp[0]), .P_star(P_grp[0])); add4_fast u1(.X(X[7:4]), .Y(Y[7:4]), .Cin(C_grp[0]), .S(S[7:4]), .G_star(G_grp[1]), .P_star(P_grp[1])); add4_fast u2(.X(X[11:8]), .Y(Y[11:8]), .Cin(C_grp[1]), .S(S[11:8]), .G_star(G_grp[2]), .P_star(P_grp[2])); add4_fast u3(.X(X[15:12]), .Y(Y[15:12]), .Cin(C_grp[2]), .S(S[15:12]), .G_star(G_grp[3]), .P_star(P_grp[3])); assign Cout C_grp[3]; assign G_star G_grp[3] | (P_grp[3] G_grp[2]) | (P_grp[3] P_grp[2] G_grp[1]) | (P_grp[3] P_grp[2] P_grp[1] G_grp[0]); assign P_star P_grp; endmodule这段代码里C_grp的下标语义必须和组编号严格对应C_grp[0] 是第 0 组向第 1 组的进位也就是全局的 C4C_grp[3] 是最高组的进位输出也就是 Cout。如果例化时把 u1 的 Cin 接成 C_grp[1]整个 16 位结果会在第 8 位附近开始错而且错误会随输入变化极难靠肉眼定位。参数说明上G_grp 和 P_grp 是各组 4 位整体的生成/传递函数它们不依赖组内进位只依赖该组的 X、Y这是组间并行计算的前提。4.3 溢出与进位的区分16 位加法器同样需要区分无符号进位 Cout 和有符号溢出 OF。Cout 是最高位向外的进位OF 是最高数据位进位与符号位进位的异或。在两级先行进位结构里符号位是第 15 位它的进位输入是 C_grp[2]即 C12它的进位输出是 C_grp[3]即 C16。所以 OF C_grp[3] ^ C_grp[2]而不是 Cout 与某个内部信号的异或。这个细节在实验报告里没有展开但它是把 8 位加减法器的溢出逻辑迁移到 16 位时必须重新对齐的地方接错的话有符号运算会在边界值上给出错误标志。5. 避坑与排查运算器实验里最容易翻车的五件事5.1 现象低位对、高位错结果随输入跳变原因通常是进位链某一段断开或接错尤其是 16 位结构里组间进位没有正确注入到各组的 Cin。解决方法是逐组隔离测试先只给第 0 组输入并观察 C4再给第 1 组输入并观察 C8确认每一级的进位输入来源正确。不要一上来就跑 16 位全量用例错误会被高位掩盖。5.2 现象减法结果永远差 1原因是 Sub 信号只驱动了 Y 的按位取反没有接到最低位的进位输入。补码减法是“取反加一”少加那个 1 就等价于算 X (~Y)结果比正确值小 1。排查时用 XY 的减法用例正确结果应该是全 0 且 Cout1如果得到全 1基本可以锁定这个坑。5.3 现象CLA74182 输出全错且与输入无明显规律原因是 C0 悬空或接错。先行进位电路的所有输出都是 C0 的函数C0 不确定时 C1 到 C4 全部失效。解决方法是先把 C0 固定为 0 跑加法用例确认 G、P 通路正常再接入真实进位输入。这个坑在实验报告里被专门点名说明踩的人不少。5.4 现象16 位结果在 4 位边界处周期性出错原因是组间进位和组内进位的下标错位比如把第 1 组的 Cin 接成了 C0 而不是 C4。表现是每跨 4 位就出现一次偏差且偏差方向一致。排查方法是构造只有一组产生进位的输入观察进位是否被正确传到下一组而不是只看最终和。5.5 现象无符号结果正确有符号溢出标志乱跳原因是 OF 的判据用错了位。8 位结构里 OF carry[8] ^ carry[7]16 位结构里应该是 C16 ^ C12如果误用 Cout 与组内某个进位异或标志就会在正常运算时误报。解决方法是对照补码溢出的定义确认参与异或的两个进位分别是“进入符号位的进位”和“离开符号位的进位”。6. 设计取舍为什么真实 ALU 不只用一种加法器把三级实验放在一起看会发现它们不是三个孤立练习而是一条完整的取舍光谱。8 位串行加法器面积最小、延迟最大适合位宽低、对速度不敏感的场景4 位先行进位加法器用更多门电路换来了进位延迟的对数级下降16 位两级先行进位则在组内和组间各做一次并行把延迟控制在两级 CLA 的量级。真实处理器里的 ALU 往往不会只用其中一种而是根据数据通路的关键路径选择混合结构——低位宽用串行省面积高位宽用先行进位保时序甚至在更宽的位宽上继续分层做成多级 CLA 树。我一般会这么理解这组实验的价值它逼你在电路图上亲眼看到“进位”这个抽象概念如何变成一条有延迟的物理路径。串行结构里你能数出进位经过了多少个门先行进位结构里你能看到 G、P 如何把这条路径压平16 位结构里你能体会分层如何避免“展开式爆炸”。这些直觉在写 RTL 时同样成立——综合工具报出的关键路径十有八九就落在进位链上。验证一个加法器设计是否真的“快速”不能只看功能用例对不对要看最坏进位路径。一个可操作的验证方法是构造让进位从最低位一路传到最高位的输入比如 X 全 1、Y 最低位为 1、其余为 0观察 Cout 的稳定时间再构造让进位在组间连续传递的输入观察组间 CLA 的输出是否比组内结果晚一个层级。功能正确只是及格线延迟结构才是这类实验真正想让你看见的东西。从那以后我每次搭多位运算电路都会先把进位链单独拎出来画一遍确认每一级的进位来源和去向再谈功能和测试。希望帮到你。本文还有配套的精品资源点击获取
企业数字化 ERP 产品动态
相关推荐
分布式系统唯一ID生成方案对比与实践指南 1. 项目概述:唯一标识号的意义与应用场景在软件开发和系统设计中,唯一标识号(Unique Identifier)就像每个人的身份证号码,是区分和识别数据实体的核心机制。我处理过的分布式系统中,标识冲突导致的脏数据问… · 2026/11/3 21:47:50
什么是Buzz?从技术杂音到传播热词的跨领域解析 我无法基于当前输入生成符合要求的博文。原因在于:您提供的输入内容中,项目标题仅为“buzz”,且后续未提供任何有效信息——没有项目正文(原始描述)没有关键词列表(当前显示为空)没有摘要描述&a… · 2026/11/3 21:47:50
SSD1322驱动开发实战:从GDDRAM寻址到电源时序的避坑指南 简介:SSD1322数据手册面向OLED/PLED显示驱动开发工程师、嵌入式硬件设计者及电子类学生,提供Solomon Systech公司480128点阵高功率段/公共驱动器控制器的完整技术资料,可解决芯片选型、寄存器配置与硬件调试中缺乏权威依据的问题。资源包共1个… · 2026/11/3 21:47:50
Selenium自动化测试:电子忏悔室与赎罪券生成实践 1. 项目背景与核心思路 这个看似荒诞的项目标题"用Selenium操控教堂:电子忏悔室自动生成赎罪券"实际上是一个极具创意的技术实验。它巧妙地将自动化测试工具Selenium的应用场景扩展到了宗教领域,构建了一个能够模拟人类操作、自动完成电子忏悔… · 2026/11/3 22:42:25
多人同时编辑Excel:共享地址、权限与协作规范实战 1. 多人同时编辑Excel,真正的拦路虎不在软件功能每到季度末、项目节点、盘点周期,办公室里最容易出现的一幕就是:五个人分头填同一张表,收上来五个附件,文件名依次是"汇总表.xlsx""汇总表-修改.xlsx&qu… · 2026/11/3 22:42:25
88E1512千兆以太网PHY调试:RGMII/SGMII、EEE与VCT排查 简介:Marvell 88E1512 芯片数据手册,面向以太网PHY选型、硬件原理图设计及嵌入式网络调试人员,用于快速掌握这款集成10/100/1000 Mbps节能以太网收发器的功能定位、性能边界与设计约束。压缩包仅含1个PDF文件,大小约1.05MB&#x… · 2026/11/3 22:42:25
一人公司运营实战:政策、成本与效率优化 1. 一人公司的政策背景与市场环境2023年新修订的《公司法》正式实施后,一人有限责任公司(自然人独资)的注册门槛显著降低。最明显的变化是取消了注册资本实缴要求,改为完全的认缴制。这意味着创业者可以用1元注册资本成立公司&… · 2026/11/3 22:42:25
EDID 128字节字段解析与HDMI扩展块生成校验 简介:本资源是一份面向显示驱动开发、硬件调试与显示器固件工程师的EDID编程规范文档,聚焦扩展显示识别数据(EDID)这一显示终端与信号源之间的信息交换结构。内容从数据结构层面拆解128字节基本块(可扩展至256字节&… · 2026/11/3 22:42:24
条码标签打印软件流水号跳号设置与漏号排查指南 条码标签打印软件里最容易被做成“事故”的一个功能,就是流水号。我这些年帮不少仓库、产线、门店处理过标签打号的问题,其中问得最集中的一类就是——为什么我的流水号打出来是跳号的。有意思的是,“跳号”这个词在条码标签打印软件里其实是… · 2026/11/3 22:41:24
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46
STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46