首页/新闻资讯/正文详情

计算机组成原理课程设计实战:从MIPS子集到单周期CPU完整实现

发布时间:2026/9/25 6:30:48 来源:云帆数科 栏目:资讯中心
计算机组成原理课程设计实战:从MIPS子集到单周期CPU完整实现
简介北航计算机学院计算机组成原理课程设计完整资料包涵盖P0至P8各阶段项目要求覆盖Logisim部件与状态机、Verilog HDL实现、汇编语言、单周期CPU与流水线CPU设计等核心内容适合计算机专业本科生、课程学习者及准备相关实验的考生对照练习。包内1541个文件以733个v源码文件为核心辅以sdb电路文件、asm汇编代码、didat仿真数据、c与obj编译结果等可完整还原从电路搭建到CPU实现的各环节另有docx/pdf说明文档与工程配置文件便于查阅和复现。资源包33.25MB目录按P0-P8分模块组织浏览学习人数已达287人。针对课下测试与课上测试两道场景资料梳理了CRC校验电路、ALU、矩阵乘法、排序、回文判断、指令扩展与流水线工程化等关键任务可作为赛题方案、设计思路和调试参考。1. 计算机组成原理课程设计北航这门课到底在逼你做什么第一次打开北航计算机学院的计算机组成原理课程设计文档时我以为只是把前几周实验的运算器、存储器拼一拼结果发现期末要交的是一颗能从外部取指令、译码、执行、访存、写回的最小处理器。这门课设计不是考背诵它要求你设计一个支持指定指令集的 CPU 模型通常至少涵盖算术运算、逻辑运算、取数存数和转移控制四类指令设计环境有的班允许 Logisim有的班直接上 Verilog验收方式从仿真波形到板级下载都有。它最大的价值是把计算机组成原理这门课里背过的真值表、数据通路图变成一张你能对着它讲清楚每个信号为什么这么连的电路。适合的人是正在赶课设的本科生以及想借此搞明白处理器为什么能跑起来的入门者。2. 课设前的架构决策指令集选型和数据通路风格直接决定你的工作量2.1 指令集选型MIPS 子集和 RISC-V 怎么选课程设计最忌讳把题干要求的指令先放着上来就画电路。你先得把“支持哪些指令”落在纸面上才能反推出哪些引脚、哪些控制信号是必须的。以北航课设最常见的参考来看指令风格偏向 MIPS因为它的编码格式和教材章节的对应关系最顺算术指令对应运算器访存指令对应存储器分支指令对应 PC 更新和比较逻辑。唐朔飞教材里的数据通路几乎就是照着 MIPS 单周期处理器画的所以选 MIPS 子集能少走很多弯路。RISC-V 近年热度很高理论上也更现代但课程设计的坑在于参考资料散、指令编码格式和教材对不上。除非指导老师明确允许并展开讲 RISC-V否则我不建议在课设里用 RISC-V 从头造轮子。一个够用的 MIPS 子集我一般保留下面这 8 条指令add、sub、or 三条 R 型算术逻辑指令ori 一条带立即数逻辑指令用来初始化寄存器lw 和 sw 两条访存指令beq 和 j 两条转移指令这 8 条能组合出算术运算、数组遍历、循环和函数调用场景覆盖课设验收绰绰有余。指令再多比如加上 mult、divALU 和控制逻辑的复杂度翻倍但得分不会翻倍。指令编码最好用脚本生成纯手算二进制很容易把 rs、rt、rd 字段写串。下面这段 Python 把 R 型和 I 型的字段拼成 32 位整数打印成固定宽度十六进制生成的机器码可以直接喂给仿真器和 .mem 文件def encode_r(rs, rt, rd, func, shamt0): # R 型字段: op(6) rs(5) rt(5) rd(5) shamt(5) func(6) return ((0 0x3F) 26) | ((rs 0x1F) 21) | ((rt 0x1F) 16) \ | ((rd 0x1F) 11) | ((shamt 0x1F) 6) | (func 0x3F) def encode_i(op, rs, rt, imm16): # I 型字段: op(6) rs(5) rt(5) imm16(16) return ((op 0x3F) 26) | ((rs 0x1F) 21) | ((rt 0x1F) 16) \ | (imm16 0xFFFF) # add $8, $9, $10 : func 字段为 0x20 print(0x%08X % encode_r(9, 10, 8, 0x20)) # ori $8, $9, 0xFF : op 字段为 0x0D print(0x%08X % encode_i(0x0D, 9, 8, 0x00FF))逻辑说明encode_r 里 op 固定为 0这是 MIPS 约定 R 型指令的高 6 位全零。rs、rt、rd 分别对应两个源操作数和写回目标寄存器调换位置整条指令的语义就变了。encode_i 里 imm16 直接截断到 16 位符号扩展要在 CPU 内部完成而不是在编码器里做否则 beq 的偏移量会算错。func 字段是重点add 是 0x20、sub 是 0x22、or 是 0x25写错一位ALU 就会执行完全不同的操作。2.2 单周期还是流水线按验收标准反推数据通路结构北航课设的常见验收标准是“指令功能全部正确能跑通给定程序”而不是“时钟频率尽量高”。据此单周期是最稳的选择一条指令一拍完成控制信号全靠译码器组合输出不需要考虑数据冒险和转发你甚至不需要单独的 Forwarding 逻辑调试成本低一个量级。缺点是用最长路径决定整个时钟周期CPI 不好看但对课程设计这是优点因为你有大量时间花在功能验证上而不是频率优化上。流水线作为加分项可以后置。我见过不少同学一开始就想做五级流水结果在数据冒险上耗掉两周最后只能减配交付。更合适的路径是先做出完全正确的单周期 CPU再插入流水段寄存器把流水线作为第二阶段的进阶目标。如果你在复习考研这条单周期数据通路和备考时刷王道计算机组成原理掌握的知识点是一致的两者可以并行理解。结构单条指令周期主要难度调试点推荐场景单周期固定一个时钟周期较低单拍波形默认选择多周期依指令而定控制状态机状态跳转想练有限状态机五级流水理想 1 CPI冒险与旁路时序深度加分项后期做2.3 工具链选型Logisim 和 Verilog 各自适合哪类人Logisim 的最大优点是可以直接上手做实验连线即所得仿真时能看到每一位信号在电路里的走向当堂验收时逻辑非常直观适合画数字电路熟练的同学。它的缺点是总线一多就乱寄存器堆和存储器用图形方式连接时要格外小心改一处控制逻辑往往要拖一大片线。Verilog 的优点是可综合、方便做自动化回归并且后续上板路线顺适合在头歌这类实验平台上已经写过 Verilog 代码的同学。缺点是抽象度高信号之间靠命名关联你容易写出生理上能通过语法检查但时序上完全不合理的代码。我的选择建议是如果只在仿真环境验收、画图能力强选 Logisim如果还想把作品留在简历上或者有上板机会就选 Verilog。工具选择不影响架构但会决定你调试信号的粒度。Logisim 适合单步走Verilog 适合同时打印几十个信号的波形。后续章节的代码以 Verilog 为主但每一模块在 Logisim 里的对应位置我都会说明。3. 把 CPU 拆成可测试单元ALU、寄存器组与译码逻辑的手写实现刚开始做课程设计时最容易犯的错误是把整个 CPU 画成一张超级大图然后对着图发愁。正确做法是把处理器拆成 ALU、寄存器组、指令存储器、数据存储器、控制器五个单元每个单元单独验证最后再对接。这样出问题时你能定位到具体模块而不是在一整片电路里盲目试错。3.1 ALU算术逻辑单元的最小可测实现ALU 是第一个要实现的模块。北航实验课第一周就是运算器课程设计里的 ALU 只是把它扩成 32 位。常见设计需要支持加、减、与、或、异或至少这五个。控制信号 ctrl 一般给 4 位留出两位扩展位给后续逻辑。重点不是真值表背得多熟而是确认两个操作数来自寄存器组还是立即数扩展这一步由数据通路层的 ALUSrc 信号决定不归 ALU 自身管理。下面是最小 Verilog 实现带 default 分支避免综合时生成 latchmodule alu_32 ( input [31:0] a, b, input [3:0] ctrl, output reg [31:0] result, output zero ); parameter ADD 4b0010, SUB 4b0110; parameter AND 4b0000, OR 4b0001, XOR 4b0011; always (*) begin case (ctrl) ADD: result a b; SUB: result a - b; AND: result a b; OR: result a | b; XOR: result a ^ b; default: result 32b0; endcase end assign zero (result 32b0); endmodule逻辑说明这是一个纯组合逻辑模块always (*)表示输出只随输入变化不依赖时钟沿。zero信号专门给 beq 用控制器后续看到 zero 为 1 就拉起 Branch 信号。参数值 ADD、SUB 不要随意改建议和数据通路里其他模块共用一份宏定义否则后期管理很容易出现功能和位宽对不上的情况。3.2 寄存器组与指令译码从机器码到控制信号寄存器组是 CPU 里状态量最多的模块32 个 32 位寄存器两个读口和一个写口。读口是异步的只要给出地址就输出写口是同步的只在时钟上升沿并且 RegWrite 使能时写入。寄存器$0必须硬连线为 0这是 RISC 指令集的基本约定如果忽略它某条算术指令的结果会莫名多出初始值。指令译码是连接指令位域和控制信号的桥梁。以 lw、sw、beq 三条 I 型指令为例控制逻辑至少需要产出五个信号RegDst、ALUSrc、MemtoReg、RegWrite、MemWrite。用 Verilog 写控制真值表时我习惯把每条指令显式列全而不是用一个大判断式隐式表达否则漏一条指令很难查module controller ( input [5:0] op, // 指令高 6 位 op 字段 output reg reg_write, mem_write, branch, jump, output reg alu_src, mem_to_reg, reg_dst ); parameter LW 6b100011; parameter SW 6b101011; parameter BEQ 6b000100; parameter J 6b000010; always (*) begin // 位序: {reg_write, mem_write, branch, jump, alu_src, mem_to_reg, reg_dst} {reg_write, mem_write, branch, jump, alu_src, mem_to_reg, reg_dst} 7b0000000; case (op) LW: {reg_write, mem_write, branch, jump, alu_src, mem_to_reg, reg_dst} 7b1000111; SW: {reg_write, mem_write, branch, jump, alu_src, mem_to_reg, reg_dst} 7b0100100; BEQ: {reg_write, mem_write, branch, jump, alu_src, mem_to_reg, reg_dst} 7b0010000; J: {reg_write, mem_write, branch, jump, alu_src, mem_to_reg, reg_dst} 7b0001000; endcase end endmodule这段代码里最需要注意位序集合赋值按声明顺序从高到低排列。比如 lw 要写回寄存器、需要把访存数据送到寄存器组输入端所以 reg_write1、mem_to_reg1、reg_dst1同时访存地址来自寄存器加上立即数因此 alu_src1。beq 不需要写回任何目标寄存器所以 reg_write、mem_to_reg、reg_dst 全是 0只有 branch 和 alu_src 保持指定值。3.3 模块测试别等数据通路搭完才验证单独对 ALU 做模块测试是课设里最划算的几分钟。Verilog 下用 testbenchLogisim 下用探针加常量输入方法一致每组输入配一个期望输出。前几周在头歌这类平台上做计算机组成原理实验时也是同一套流程拆一个模块验证一个模块。这是最简 ALU testbench输出用$display打印便于和手算结果对账reg [31:0] a, b; reg [3:0] f; wire [31:0] y; alu_32 uut (.a(a), .b(b), .ctrl(f), .result(y), .zero(q)); initial begin a 32d15; b 32d7; f 4b0010; #10; $display(add: %0d, y); f 4b0110; #10; $display(sub: %0d, y); f 4b0001; #10; $display(or : %0d, y); $finish; end这里的#10只是仿真延时不是时序设计里的周期约束但记得给足否则显示的是同一仿真时间片下的旧值。测试寄存器组时更要注意写口的结果只在时钟上升沿后可见如果只在 initial 里连续赋值看到的是组合逻辑输出而不是寄存器真实状态所以测试寄存器组要用 repeat 循环打时钟。提示模块测试请保留成文件不要跑完就删。答辩时被问到“你怎么验证 ALU 正确”时把 testbench 调出来展示比口头解释有说服力得多。4. 数据通路搭接与联调从单条指令跑到完整测试程序4.1 数据通路总图与多路开关信号对齐把 ALU、寄存器组、两块存储器和控制器对接起来之前先画一张数据通路总图。图上要有 PC、指令存储器、寄存器组、ALU、数据存储器、控制器的位置并标出每个多路器的选择信号名。北航课设的评审往往要看报告缺这张图会很吃亏更重要的是画图的过程能逼你把每根连线都想清楚。连接顺序我按教材习惯取指 → 译码 → 执行 → 访存 → 写回。最容易乱的是三个 MUXRegDst选择把 rt 还是 rd 写入寄存器组R 型指令必须选 rd。ALUSrc选择寄存器值还是立即数扩展值送入 ALU 的 B 端。MemtoReg选择访存读出数据还是 ALU 计算结果写回寄存器组。Verilog 里可以用条件运算符实现这三个 MUX但要注意它们不是同一层级的信号。RegDst 由指令 op 字段决定ALUSrc 由指令类型决定MemtoReg 只有 lw 需要置 1。三个信号如果共用一套判断逻辑后续扩展指令时会互相污染。4.2 时钟、复位和写使能三条最容易出错的信号线第一次跑波形时你会看到两个奇怪现象寄存器安安静静吞掉了本该写入的数据或者数据在半路上消失。这些问题通常不是逻辑错误而是信号采样时机不对。第一寄存器组的写操作必须发生在时钟上升沿并且要有 RegWrite 门控。有些仿真器默认数据变化就写入RegWrite 没拉高也把数据灌进了寄存器这是仿真器行为与真实硬件不一致的典型陷阱等你上板时发现寄存器值总是不对再回头查这个问题会非常痛苦。第二复位信号最好用同步复位。也就是说 rst 为高时在下一个时钟上升沿把 PC 清零、寄存器组恢复初值。异步复位在仿真里常表现正常但板级会有毛刺下载后开机状态不可控。第三PC 更新逻辑不要用组合逻辑自增。应该把 PC 声明为reg [31:0]在 always 块里同步更新pc pc 4或pc jump_target。组合自增会让当前指令执行和下一周期取指并行变化单周期还好一旦转向流水线整条逻辑就废了。4.3 跑一个能证明全指令集的测试程序当数据通路所有 MUX 对齐后用一段完整程序做回归验证。我推荐“从数据存储器中找最大值”这个小程序它同时覆盖 R 型指令、ori 立即数初始化、lw 访存、sw 写回、beq 分支和 j 无条件跳转比单独跑单条指令可靠得多。Verilog 仿真时先用脚本生成 .mem 文件在 testbench 里用$readmemh加载进指令存储器和数据存储器然后复位跑若干周期打印关键寄存器和 PC// tb_top.v 最小验证段 cpu_top cpu ( .clk(clk), .rst(rst), .pc(pc_wire), .inst(inst_wire), .r8(reg8_wire) // 把寄存器组 8 号寄存器引到顶层方便观察 ); initial begin $readmemh(prog.mem, cpu.imem.mem); // 加载指令 $readmemh(data.mem, cpu.dmem.mem); // 加载数据 clk 0; rst 1; #10 rst 0; repeat (200) begin #5 clk 1; #5 clk 0; end $display(R8 %0d, PC %0d, reg8_wire, pc_wire); if (reg8_wire 32d42) $display(TEST PASS); else $display(TEST FAIL); $finish; end逻辑说明prog.mem 每行一个 32 位十六进制机器码起始地址从 0 开始cpu.imem.mem 和 cpu.dmem.mem 是具体例化名换成自己工程的层次路径即可。repeat(200) 是防死循环保险如果程序有 bug 导致 PC 卡住200 个周期后也会自动停止并打印错误寄存器值。测试程序不要只覆盖三条指令至少要保证每条指令都执行一次并且出现“访存后立即使用该数据”的相关场景。5. 课设避坑记录北航 CPU 设计最常见的五个翻车点过了设计和实现阶段接下来就是没人能逃过的查错阶段。下面五条是我在带课设和答辩时反复见到的翻车点按照“现象、原因、解决”整理属于血泪经验。5.1 现象模块测试全通过整机跑必现错误这是最打击人的情况ALU、寄存器组、数据存储器单测都对一接成整机就从第三条指令开始错。原因通常不在模块本身而在多路器的选择信号没有按指令类型切换。比如 lw 指令要求写回访存数据如果 MemtoReg 在控制真值表里恒为默认值写回的就会是 ALU 计算结果差之毫厘。如果你是软件方向来补课很容易下意识默认“寄存器里存的数就是原来那个数”绕开了写回路径这个黑匣子自然找不到错。解决先用单步时钟把出错指令的所有控制信号打印出来和 3.2 节的真值表逐位对比不要上来就怀疑 ALU。5.2 现象要写入的数据总是晚一个周期才落进寄存器这个现象几乎每个做课设的人都会遇到一次。表现是你期望第 5 个时钟周期末寄存器组里出现新值结果第 6 个周期初才看到。原因多半是 RegWrite 的使能时间没对准或者 testbench 里对写口的激励写在了时钟下降沿而寄存器组只在上升沿采样数据等于白送一个周期。解决调整时钟边沿与写使能做正交保证“指令在第 i 拍执行完结果在第 i 拍上升沿写入在第 i1 拍可以被读到”。观察波形时重点看写使能信号相对于时钟边沿建立得够不够早不要只看结果最终是否出现。5.3 现象仿真波形正常下载到板子后直接哑火仿真通过代表逻辑正确不代表板级时序正确。最常见的诱因是时钟过快。开发板默认晶振常在 50 MHz 到 100 MHz 量级而课程设计里的 CPU 没有做静态时序收敛存储器 IP 和引脚走线跟不上。解决把时钟分频到 1 MHz 到 10 MHz 量级再用同步复位把 PC 和关键状态清零。分频常用的做法是在顶层模块写一个计数器对板载时钟按数万分频后输出到 CPU 的 clk 端口。不要追求运行频率课设评审不会因为你跑 100 MHz 加分只会因为你跑不起来扣分。5.4 现象某条指令执行时整条总线数据变成 XX 在 Verilog 里表示未驱动或发生冲突。你会在波形里看到数据总线上出现了几个未知位而且每次仿真出现的位置还一样。原因基本逃不出两处一是控制器里 case 没有 default非法控制组合输出高阻态二是 MUX 的条件判断没写完整两个分支同时向同一根线赋值。解决给控制器的 case 补 default 分支让所有信号在非法 op 下归零给每一个多路器补 else 分支。这个行为能让仿真波形干净更是可综合代码的基本要求。总线上出现 X 时顺着波形往上找哪一级输出在高阻通常就是问题模块。5.5 现象分支跳转总是跑到错误地址beq 指令的跳转目标计算有两个边界立即数是否做了符号扩展以及目标地址到底是PC4sign_ext(imm)*4还是PCsign_ext(imm)*4。MIPS 约定分支基于 PC4如果你的 ALU 在计算跳转地址时拿错了基址表现就是每条分支固定偏移错一段距离而且条件成立和不成立的路径偏差还不一样。解决单独构造两条 beq 测试一条条件成立、一条条件不成立分别打印跳转前后的 PC。差多少、差在正负方向都能告诉你是不是符号扩展写成了无符号扩展。我遇到过一位师弟在这个地方卡了一整天最后发现是编码器里把负数 immed 按无符号截断汇编层就得改。6. 验收前别急着交用一套测试向量证明你的 CPU 是对的靠代码里的$display打印一个寄存器值就算通过这是最危险的验收方式。更稳的流程是把测试向量组织成一张表每个用例对应一组指令、一个期望结果跑完之后程序自动比对。用例覆盖点检查内容单条 R 型指令add、sub、or目标寄存器结果ori 立即数初始化符号扩展与位宽初始值正确连续 lw、sw访存读写内存值与寄存器一致beq 成立与不成立PC 跳转两个方向目标地址或顺序地址j 跳转绝对地址跳转PC 落到目标数组最大值程序全部指令组合结果寄存器符合预期这套表不需要额外工具把 5 个用例写成一个 testbench 驱动每个用例跑固定周期数并打印结果就行。我自己的习惯是在写代码之前先手算出每个用例的期望值放进测试脚本里仿真跑出不一致就停下来改而不是在波形窗口里靠肉眼找问题。这里有一条真实教训有一版 CPU 所有测试都通过我提交前临时加了一条加载立即数指令结果得意到忘了重新回归前面的用例。答辩时讲师随手给了个负数偏移的 beq直接暴露了符号扩展的 backlog。后来我把所有用例做成了可重复执行的回归脚本每次改完立刻跑一遍再也没在验收时翻车。希望这个方向能帮你少走几步弯路。本文还有配套的精品资源点击获取

相关推荐

BMI088+TLS205B0EJ+ESP32+NSI8221C工业级姿态感知硬件链路设计
BMI088+TLS205B0EJ+ESP32+NSI8221C工业级姿态感知硬件链路设计

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

SMIC 180nm工艺下二阶带隙基准源设计实战指南
SMIC 180nm工艺下二阶带隙基准源设计实战指南

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

LVGL中文字体显示实战:从底层原理到生成优化全攻略
LVGL中文字体显示实战:从底层原理到生成优化全攻略

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

GEF 逆向实战:用 pattern 命令基于 De Bruijn 序列定位溢出偏移量
GEF 逆向实战:用 pattern 命令基于 De Bruijn 序列定位溢出偏移量

网络安全开发工具 【免费下载链接】gef GEF (GDB Enhanced Features) - a modern experience for GDB with advanced debugging capabilities for exploit devs & reverse engineers on Linux 项目地址: https://gitcode.com/gh_mirrors/gef/gef 点击查看 免费下… · 2026/9/25 7:32:55

【windows】安装抓包工具Burp Suite 2024_10激活汉化
【windows】安装抓包工具Burp Suite 2024_10激活汉化

【windows】安装抓包工具Burp Suite 2024&激活&汉化 前言 在项目即将上线阶段,迈入生产环境之际,确保其安全性成为我们不可忽视的首要任务。为筑起一道坚不可摧的安全防线,我们借助业界公认的网络安全利器——Burp Suite,… · 2026/9/25 7:32:55

AI Agent工具链实战:CLI、MCP与OpenRouter集成指南
AI Agent工具链实战:CLI、MCP与OpenRouter集成指南

1. 从"treg"这个模糊词说起:它到底指什么第一次看到"treg"这个词,很多人会一头雾水。它不像"codex cli"或者"openrouter"那样有明确的指向,更像是一个被截断的缩写或者内部代号。结合热搜词里高频出… · 2026/9/25 7:32:49

Windows内核非分页池泄漏诊断:PoolMon与RAMMap实战指南
Windows内核非分页池泄漏诊断:PoolMon与RAMMap实战指南

1. 这不是“内存不足”,是内核在悄悄吃掉你的RAM 你有没有遇到过这种情况:刚重启的 Windows 11,任务管理器显示“已使用内存”只有 3GB,但系统却卡得像在用软盘加载高清视频?打开 Chrome 多几个标签页,内存… · 2026/9/25 7:32:49

Fast-LIO2在ROS2上的部署实践与避坑手册
Fast-LIO2在ROS2上的部署实践与避坑手册

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

华为EC6108V9I刷机实战:RK3228通刷包与隐藏技能
华为EC6108V9I刷机实战:RK3228通刷包与隐藏技能

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

数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)
数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)

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

创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战

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

MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX

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

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码