简介文华学院《计算机组成原理》课程设计文档面向计算机与软件工程专业学生对应“基于Proteus简单模型计算机设计与实现”考查题目可供课程复习、实验报告撰写与设计思路对照使用。内容围绕模型计算机逻辑电路设计与控制信号归纳、整机电路层次化设计展开涵盖运算器、寄存器组、指令计数器与存储器各单元的端口信号并用开关模拟控制信号调试二段汇编指令同时给出机器指令对应的微指令码点、脉冲与电平信号的区分及时序安排最后连接微程序控制器完成整机运行与指令系统验证。压缩包共1个doc文件约2.79MB目录含需求与总体设计、模型机逻辑图、软件设计、调试过程与结果、总结等章节并附参考教材信息。已有537人学习适合需要课程设计框架、微程序设计与调试排错参考的读者。1. 拨一排开关才能跑通一条指令这份 Proteus 模型计算机课设到底给了什么两片 74LS181、一片 6116、几片 74LS273、一条 8 位总线再加一排拨动开关和一个单步脉冲按钮——这就是一份「计算机组成原理课程设计」里能跑起来的最小 Proteus 模型计算机。它把整机拆成运算器、寄存器组、PC 计数器、存储器、控制器五个子电路用 26 位微指令驱动靠 T2/T4 两个节拍手工拨开关跑通 IN、ADD、OUT最后拿到 58H58HD0H。资源里逻辑图、控制信号表、微代码段、逐拍调试记录都有适合正在赶课设又不想从零猜连线的人对已经工作、想补一遍数字系统时序概念的工程师它也是一台能上手的最小样机。下面按信号、电路、微码、时序、排错的顺序拆。2. 控制信号先立住74LS181 与 6116 的 23 个字段、有效电平和脉冲/电平之分2.1 先出信号表再动笔画图Proteus 里画模型机最贵的不是画是改。一根线名字起错后面五张子图全要翻。所以第一步不是打开软件是拿张纸把信号列成表叫什么、干什么、高有效还是低有效、是脉冲还是电平、从哪个子电路出、到哪个子电路去。这张表定下来后面画图只是照着连线。课程设计里要求「归纳所有控制信号、区分脉冲信号和电平信号」这句话不是形式。脉冲信号指上升沿触发一次动作、平时无效的时钟类信号比如 D1CK、D2CK、RCK、PCK、WMCK电平信号指在一个节拍内保持有效、当组合逻辑使能用的信号比如 /EDR1、/ALU-O、/RM。两者的区别直接决定你调试时是先拨开关还是先按脉冲按钮混了就会遇到「开关全对但数据不进去」。下面这张表是我按资源里的端口整理的一份信号名统一用下划线前缀 N 表示低有效你在 Proteus 里可以照抄也可以换成斜杠但全图必须统一一种写法信号作用有效电平类型归属SW_BUS开关数据送上总线高电平主图EDR1选通 DR1 暂存器低电平运算器EDR2选通 DR2 暂存器低电平运算器D1CKDR1 打入上升沿脉冲运算器D2CKDR2 打入上升沿脉冲运算器M181 逻辑/算术选择高为逻辑电平运算器S3~S0181 功能选择高电平运算器CN181 进位输入低为有进位电平运算器ALU_OALU 结果上总线低电平运算器SA、SB寄存器组 A/B 口选择高电平寄存器组WR寄存器组写允许低电平寄存器组RCK寄存器组打入上升沿脉冲寄存器组RD寄存器组读允许低电平寄存器组PC_PLUS1PC 加一高电平PC 单元PCKPC 打入上升沿脉冲PC 单元PC_OPC 值上地址总线低电平PC 单元CLRPC 与微地址清零高电平主图RM存储器读低电平存储器WM存储器写低电平存储器WMCK存储器写入脉冲上升沿脉冲存储器CS6116 片选低电平存储器EIR1IR1 打入高电平控制器EIR2IR2 打入高电平控制器IR2_OIR2 内容上总线低电平控制器MCS微地址寄存器打入低电平控制器提示这张表一旦被微指令字段引用就不要随手改名。Proteus 的网络标号是纯文本匹配改一个字符不会报错只会静默不通。低有效信号多了以后容易看花眼我一般把低有效统一写成 N 开头N_EDR1、N_ALU_O比斜杠可靠因为部分版本的标号框对斜杠处理不一致。这一步做完你会得到 20 多个信号正好对上 26 位微指令的字段数多出来的几位留给 CLR、PCK 这类全局信号。2.2 运算器子电路两片 74LS181 的级联与功能码74LS181 是 4 位 ALUA0~A3、B0~B3 两组数据输入F0~F3 结果输出S3~S0 选功能M 选逻辑还是算术Cn 是进位输入Cn4 是进位输出G、P 是给快速进位链用的。8 位模型机就用两片级联低片管 D0~D3高片管 D4~D7两片的 S3~S0、M 并联由微码同时给低片的 Cn4 接高片的 Cn串行进位就够用课设里没有必要上 74LS182。两片 181 的 A 口接 DR1 的输出、B 口接 DR2 的输出DR1/DR2 由总线在 EDR1/EDR2 有效时用 D1CK、D2CK 打入。运算结果要挂回总线就必须过一级三态常见做法是接一片 74LS245方向固定 A→B使能端接 ALU_O。这里是第一个大坑74LS181 本身没有三态输出把 F0~F7 直接怼到总线上总线上永远有强驱动别的模块一说话就打架。资源里的 ALU_O 信号正是为这级缓冲准备的画图时别省。功能码取决于你要做什么运算常用几个如下M0 为算术M1 为逻辑运算MS3 S2 S1 S0CNAB01 0 0 11A−B00 1 1 00A·B11 0 1 1无关A∨B11 1 1 0无关A⊕B10 1 1 0无关取反 /A10 0 0 0无关直通 A11 1 1 1无关做加法时 CN 取「无进位」那一档做减法时 CN 取「有进位输入」那一档具体到你的 Proteus 器件模型H/L 的含义可能和手册标注相反。血泪经验是级联之前先拿一片 181 单独搭个测试电路A 口拨 5、B 口拨 3S1001、M0看 F 是不是 8确认了再往整机里放。这一步花十分钟能省掉后面两小时的怀疑人生。减法 A−B 在 181 上是靠「加补码」实现的S0110 配合进位输入就能出结果不需要你自己搭反相器。这也是模型机里 SUB、AND、OR、XOR、COM 五条指令能共用同一套 DR1/DR2 通路的原因——只是 S3~S0 和 M 不同数据通路完全不动。2.3 寄存器组、存储器与 PC三类端口的命名习惯寄存器组要放 R0~R3 四个 8 位寄存器常见做法是四片 74LS273每个 273 的 CP 接各自的 RCK 分支D 端并到总线Q 端再经 74LS244 三态挂回总线。SA、SB 两位负责选口SA 选送到 ALU A 口的那个寄存器SB 选 B 口。写的时候用 WR 选片、RCK 上升沿打入读的时候用 RD 使能 244。这里的关键是 SA/SB 是电平信号必须在脉冲到来之前就稳定否则打进去的是上一个寄存器的值。存储器用 61162K×8 的静态 RAM11 根地址线 A0~A10、8 根数据线、WE、OE、CS 三个控制端。资源里地址只接了 AB0~AB7也就是只用前 256 字节对课设这点程序和数据完全够但你要知道这是简化真要扩到 2K得把 PC 高位也接上去而 74LS193 只有 4 位8 位 PC 已经占了两片再扩就要加第三片。写存储器时 WM 和 WMCK 必须配合6116 是 WE 有效期间数据被写入WMCK 给一个上升沿更稳妥读的时候 RM 和 CS 同时有效数据才上总线。PC 单元用两片 74LS193 级联成 8 位CLR 清零PC_PLUS1 接计数使能PCK 接 CP输出经 74LS244 挂地址总线PC_O 使能。193 是双时钟器件加计数和减计数分开接线时别把 CP 和 CP 搞混否则会出现「PC 每拍减一」这种看着像玄学的问题。3. 层次化整机电路五个子电路的端口清单与主图总线接法3.1 切分原则主图只放总线、开关、灯和控制器层次化设计不是为了好看是为了改得动。主图上一旦铺开二十多片芯片改一根线要滚半天屏仿真速度也肉眼可见地掉。合理的切法是主图只保留 8 位数据总线、地址总线、开关输入、指示灯输出、时序发生器、微控制器以及五个子电路的方框符号运算器、寄存器组、PC、存储器各成一个子电路控制器也可以单独拆出去。子电路之间的连接全部通过网络标号完成不画长线。主图里每个方框的引脚用 INPUT/OUTPUT 终端标注名字与子电路内部完全一致Proteus 就按名字连。这样你在子电路里改内部结构只要端口名不变主图一个字都不用动。主图上还需要两个东西一个是单步脉冲源给 T2、T4 各一个按钮按一下出一个上升沿另一个是拨码开关组接 SW_BUS 缓冲后上总线用来模拟「输入数据」和「手工给电平」。资源里调试阶段就是靠这两样一个节拍一个节拍地拨。3.2 五个子电路的端口清单下面这份清单按资源里的端口整理画方框时照着填子电路输入端口输出端口运算器D0~D7、EDR1、EDR2、D1CK、D2CK、S3~S0、M、CNF0~F7、ALU_O寄存器组D0~D7、SA、SB、WR、RCK、RDD0~D7PC 单元CLR、PC_PLUS1、PCK、PC_OAB0~AB7存储器AB0~AB7、D0~D7、RM、WM、WMCK、CSD0~D7控制器CLR、T2、T4、MCS、IR1、IR2MD0~MD25、MB0~MB5、EIR1、EIR2、IR2_O有个细节容易被忽略运算器和寄存器组都是「既读总线又写总线」的模块端口表里 D0~D7 会同时出现在输入和输出两栏。Proteus 里对应做法是内部用双向总线终端或者干脆拆成 DIN 和 DOUT 两组标号在子电路内部用 245 隔开。我倾向后者因为调试时一眼能看出方向。存储器的数据线也要双向读的时候 6116 输出写的时候 6116 输入中间必须有三态缓冲不能直接并联。3.3 网络标号与端口一致性Proteus 里最容易翻车的一步画完五个子电路把它们拖进主图接下来全是标号活。Proteus 的规则很简单同名的 Default 终端互连总线用 BUS 线加D[0..7]标注每个引脚再单独标D0、D1。规则简单错起来也简单而且不报错。常见的三种错法一是大小写不一致N_RD和n_rd在 Proteus 里是两个网络肉眼看不出来二是总线入口没标号线画上去了但成员没进总线单根线是通的整体是断的三是子电路端口名和主图终端名差一个下划线比如IR2_O对IR2-O画面上完全一样逻辑上不通。我的做法是建一份命名表放在旁边画一个标一个画完用 Proteus 的 Design Explorer 或者直接 Search 功能逐个查引用数每个信号至少要出现两次一次源、一次目的出现一次的大概率是漏了。这个检查花五分钟比仿真跑不通再回头找强得多。注意子电路符号的引脚顺序和内部端口的对应关系在放置时确定后面改内部端口顺序不会同步到主图改完要重新放置符号。4. 从汇编到微代码两条程序的逐拍拆解与 26 位码点位4.1 先把两条汇编程序拆成数据流资源里给了两段程序第一段练输入输出和运算第二段多两条访存指令; 程序一 IN R0, #DATA1 IN R1, #DATA2 ADD R0, R1 OUT R0 ; 程序二 IN R0, #DATA1 STA (01H), R0 IN R0, #DATA2 MOV R1, (01H) ADD R0, R1 OUT R0拆微操作的方法是从寄存器出发反推数据从哪来、经过谁、最后落到哪。以IN R0,#DATA1为例路径是「开关 → 总线 → DR1 → ALU 直通 → 总线 → R0」对应三个动作SW_BUS 加 EDR1 把开关值送上总线并选通 DR1T2 打一个 D1CK 把值锁进 DR1然后 ALU 设成直通M1、S1111ALU_O 打开结果上总线同时寄存器组 SA 选 R0、WR 有效T2 给一个 RCK值就进了 R0。ADD R0,R1的路径是「R0 → DR1R1 → DR2181 相加结果回 R0」四拍选 R0 读、EDR1 有效、T2 打 D1CK选 R1 读、EDR2 有效、T2 打 D2CK设 S1001、M0、CN 取无进位、ALU_O 打开结果上总线寄存器组选 R0、WR 有效、T2 打 RCK。中间任何一拍顺序错了结果就不是和而是某个中间值。OUT R0最简单选 R0 读ALU 直通结果送到显示锁存器一片 273 带 LEDT2 打一下就行。程序二里的STA (01H),R0和MOV R1,(01H)多了一步地址来源地址 01H 从 IR2 的立即数字段经 IR2_O 送上地址总线数据走 RM、WM。把每条指令拆成这样的动作序列你就得到了微指令的骨架——一条微指令对应一个节拍节拍里哪些电平有效、哪个脉冲打一下写清楚就完事。4.2 T2/T4 两个节拍脉冲打数据电平选通路资源里的调试过程反复出现「给 T4 脉冲打开某功能给 T2 脉冲把数据打入」这个分工要理解透T4 负责切换通路T2 负责让数据落袋。一个节拍内先由 T4 把这一拍要用的电平信号全部建立选寄存器、开三态、设功能码稳定之后再给 T2 一个上升沿把总线上的值打进目标寄存器。这解释了为什么很多人的模型机「单步能走、连起来就乱」T2 和 T4 的先后关系反了。先给 T2 再给 T4打进寄存器的是上一拍残留的总线值看起来就像数据晚了一拍。节拍谁动作典型信号T4 上升沿微地址更新、电平信号切换MCS、S3~S0、SA、SB、RD、ALU_OT4 之后总线稳定数据在总线上保持T2 上升沿数据打入D1CK、D2CK、RCK、PCK、WMCK微地址的推进也挂在 T4 上每条微指令执行完T4 让 MB0~MB5 加一或者跳到下一条。资源里 MB 是 6 位最多 64 条微指令跑两段程序够用如果你要加指令先数一下还剩多少空位。4.3 26 位微指令的字段位序与互斥约束微指令是 26 位直接对应 26 个控制信号。位序怎么排没有标准答案但一旦定了就不能改因为微码 ROM 里的数据是按这个顺序烧的。我用的一套顺序如下你可以整体替换但要整表一起换位信号位信号MD0SW_BUSMD13RDMD1EDR1MD14PC_PLUS1MD2EDR2MD15PC_OMD3MMD16EIR2MD4S3MD17IR2_OMD5S2MD18RMMD6S1MD19WMMD7S0MD20CSMD8CNMD21EIR1MD9ALU_OMD22MCSMD10SAMD23CLRMD11SBMD24PCKMD12WRMD25WMCK字段之间有硬性互斥写微码时必须自己盯住同一拍只能有一个三态源上总线SW_BUS、ALU_O、PC_O、IR2_O、寄存器组的 RD 选通五选一RM 和 WM 不能同时有效EDR1 和 EDR2 不要同时开否则 DR1、DR2 会同时往总线上怼WR 和 RD 在寄存器组上同时有效时写入值等于读出值动作看起来「没生效」。这些约束靠人眼检查迟早出事尤其是微指令加到三四十条以后。稳妥的做法是写几行脚本打包的同时做检查第 4.4 节和第 6 章各给一段。4.4 用脚本把微指令表压成 6116 的 HEX 文件手工把 26 位二进制敲成十六进制敲错一位就要重来而且很难查。我一般写成「助记符集合 自动打包」改一条微指令只改集合里的名字。# microasm.py —— 26 位微指令打包输出 6116 可用的 hex FIELDS [ SW_BUS, EDR1, EDR2, M, S3, S2, S1, S0, CN, ALU_O, SA, SB, WR, RD, PC_PLUS1, PC_O, EIR2, IR2_O, RM, WM, CS, EIR1, MCS, CLR, PCK, WMCK, ] ACTIVE_LOW {EDR1, EDR2, ALU_O, PC_O, IR2_O, RM, WM, CS, MCS, RD, WR} def pack(sig): sig 是本拍有效的信号名集合低有效信号未出现时输出 1 v 0 for name in FIELDS: on name in sig if name in ACTIVE_LOW: # 低有效无效时该位为 1 on not on if on: v | 1 FIELDS.index(name) return v # 每条微指令微地址 本拍有效信号 备注 MICRO [ (0x00, {SW_BUS, EDR1}, IN R0: 开关值送上总线选通 DR1), (0x01, {EDR1, D1CK}, IN R0: T2 打入 DR1), (0x02, {M, S3, S2, S1, S0, ALU_O, SA, WR}, IN R0: ALU 直通选 R0 写), (0x03, {RCK}, IN R0: T2 打入 R0), (0x04, {RD, SA, EDR1}, ADD: 读 R0 到 DR1), (0x05, {D1CK}, ADD: T2 打入 DR1), (0x06, {RD, SB, EDR2}, ADD: 读 R1 到 DR2), (0x07, {D2CK}, ADD: T2 打入 DR2), (0x08, {S3, S0, ALU_O, SA, WR}, ADD: S1001, M0, AB), (0x09, {RCK}, ADD: T2 结果写回 R0), ] def emit(micro, pathmicro.hex): rows [] for addr, sig, note in micro: val pack(sig) # 26 位拆成 4 个字节 p a hrefhttps://download.csdn.net/download/killer655/86738737 stylecolor:#ec7500;font-size:14px; 本文还有配套的精品资源点击获取 /a img altmenu-r.4af5f7ec.gif srchttps://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif stylewidth:16px;margin-left:4px;vertical-align:text-bottom;cursor:text; /p
企业数字化 ERP 产品动态
相关推荐
log2工程避坑:浮点精度、整数位运算与分桶越界 上周某开发者把一段环形缓冲区的分桶代码发过来让我看:容量按 64 个桶均分,桶号用int(log2(n))算,本地调试一切正常,换到另一台机器上跑压力测试,第 64 个桶偶尔出现越界写。代码没改过一行,问题却凭空出现… · 2026/11/3 14:17:15
自然语言驱动AI生成ECharts可视化:亚运会数据图表Prompt实战 1. 先把“自然语言做可视化”这件事说清楚 你随便找个做数据可视化的人问一句:接到一个“把亚运会奖牌数据做成图表”的需求,第一反应是什么?十有八九是打开编辑器、翻ECharts文档、开始写option配置。写配置本身不难,难的是你脑子… · 2026/11/3 14:16:09
AI原生应用中的模型部署优化与实践 1. AI原生应用行为分析的模型部署挑战 上周在部署一个用户行为分析模型时,我遇到了典型的"模型漂移"问题——测试时准确率98%的模型,上线后效果直接腰斩。这促使我系统梳理了AI原生应用场景下的模型部署方法论。不同于传统机器学习,… · 2026/11/3 14:16:09
宏智树AI如何革新学术研究流程 1. 项目概述:重新定义AI辅助学术研究的边界 去年帮导师带本科生论文时,发现一个有趣现象:学生们使用AI工具时普遍存在两极分化——要么完全依赖生成内容导致学术事故,要么因担心抄袭彻底拒绝技术辅助。这促使我系统测试了市面上12… · 2026/11/3 15:56:52
OIF-CEI-05.2电气契约解析:高速SerDes互操作的物理层底线 简介:本资源为光学互联论坛(OIF)于2024年1月正式发布的最新版CEI高速电气接口标准——OIF-CEI-05.2实施协议官方PDF文档,面向芯片设计、高速互连系统开发、数据中心架构及光模块研发等领域的工程师与标准研究者。该标准统一规范了… · 2026/11/3 15:56:52
AI学术研究助手:从文献检索到论文写作的全流程解决方案 1. 项目概述:重新定义AI在学术研究中的角色"数字科研伙伴"这个概念正在颠覆传统认知中AI辅助写作的工具属性。作为一名在学术写作和AI交叉领域深耕多年的研究者,我见证了从早期简单的语法检查工具到如今具备全流程研究辅助能力的智能系统演进过… · 2026/11/3 15:56:52
nerf-slam复现编译排错:依赖、CMake与CUDA/torch 简介:面向希望从零复现 NeRF-SLAM 的研究者与三维重建方向的学习者,这份 docx 文档以实操记录加原理解读的方式,梳理了神经辐射场与 SLAM 结合的完整链路。包内共 1 个 docx 文件,约 11.01MB,内容兼顾公式推导与工程细… · 2026/11/3 15:56:52
CSP-J/S第一轮分数线深度解析:省际差异、划线逻辑与预估方法 每年到了第一轮成绩公布那几天,后台总会被同一类问题刷屏:某个省今年大概多少分能进第二轮、为什么隔壁省分数差那么多、孩子考了多少分到底稳不稳。这类问题看着简单,真要回答清楚,得把分数线背后的东西掰开揉碎讲。2019年那一届… · 2026/11/3 15:56:52
链表操作精要:快慢指针与回文判断实战 1. 链表基础与问题概述 链表作为一种基础数据结构,在实际编程和算法面试中出现频率极高。今天我想和大家分享两个经典的链表问题:寻找链表的中间节点(876题)和判断链表是否为回文(234题)。这两个问题看似简… · 2026/11/3 15:55:51
双极步进电机控制实战: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