news 2026/10/7 1:20:26

SRAM存储器实验深度解析:从芯片原理到故障排查实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SRAM存储器实验深度解析:从芯片原理到故障排查实战

在实验室带计算机组成原理实验这些年,我见过太多学生在“存储器实验”这一步翻车:插线半小时,拨码五分钟,读回来全是 FF,然后开始怀疑芯片、怀疑实验箱、怀疑人生。这个实验看起来只是“往芯片里写数据再读出来”,但它其实是整门课里承上启下的关键节点——弄懂了它,后面 CPU 模型机、中断、DMA 都会顺不少;弄不懂,实验报告抄完也就过去了,脑子里什么都没留下。

这篇内容不止讲“怎么把实验做完”,更多是把我自己踩过的坑、学生反复问的问题、以及实验背后真正要考核的原理一次性讲透。内容以常见的 TDN-CM++ 这类教学实验箱为例(原理对所有 SRAM 实验平台通用),从芯片引脚、地址译码讲到故障排查,适合正在上计算机组成原理课、准备考研复试,或者想补一补存储器基础的人。

1. 实验整体认识:先把“存储器”三个字落到实处

这个实验的全称是“存储器实验”,任务核心一句话:通过实验箱上的开关、按键或模型 CPU,对一片静态随机存储器(SRAM)进行读写操作,验证其工作原理。听起来简单,但实际涉及的知识点覆盖了地址总线、数据总线、控制总线、三态门、时序配合,几乎是后面所有实验的地基。

1.1 这个实验到底在做什么

做实验前,很多同学有一个误区:以为存储器实验是“把程序烧进去”的实验。不是。这个实验面对的是一个裸的、没有任何软件管理的 SRAM 芯片,比如常用的 6116(2K×8 位)或 6264(8K×8 位)。你要做的是:像硬件工程师一样,手动把地址信号、数据信号、读写控制信号按照芯片手册的要求送到芯片引脚上,让它完成“写入”和“读出”两个操作。

实验一般分两个层次:

  • 手动模式:实验箱上的拨码开关模拟地址总线和数据总线,按键模拟读写控制信号,一位一位拨进数据,再读回来看是否一致。
  • 自动/模型机模式:把 SRAM 挂到实验箱自带的模型 CPU 总线上,通过执行几条访存指令(比如“把某个地址的数据取到寄存器”“把寄存器数据存到某个地址”),观察 CPU 和存储器之间怎么配合工作。

第二个层次实际上就是在回答那个经典问题——“CPU 和内存到底是怎么通过总线交换数据的”。这个等会儿专门展开讲。

1.2 先建立一张全景图,再动手

很多学生做实验之所以乱,是因为脑子里没有一张“数据流程全景图”。我建议你做实验前先画一张这样的图:

CPU / 开关组 --地址--> 地址译码器 --> SRAM 片选/列选 数据 --> SRAM 数据线(双向) 控制 --> SRAM 的 WE/OE

存储器芯片本身没有“智能”,它不知道数据该放哪个位置。它只认得:

  • 地址线给高还是低;
  • 数据线给高还是低;
  • WE(写使能)、OE(读使能)、CE(片选)这几个控制脚是什么电平。

所以,实验的全部要点就是把这四类信号正确、稳定地送到芯片上。先建立这个认知,后面每一步操作你都会知道自己在拨什么、为什么这么拨。

2. 核心原理补课:搞懂这三件事,后面全通

我始终认为,一个实验如果只做不想,那和搬砖没区别。存储器实验里最值得搞清楚的原理有三块:芯片引脚怎么工作、地址译码怎么分地址、总线连接为什么需要三态门。这三块全通了,实验就是走过场。

2.1 SRAM 芯片到底长什么样:以 6116 为例

教学实验中见得最多的是 6116,2K×8 位静态 RAM。所谓“2K×8”,意思是它有 2048 个存储单元,每个单元可以存 8 位(1 字节)。要访问 2048 个单元,需要多少根地址线?2 倍的 10 次方是 1024,2 倍的 11 次方是 2048,所以需要 11 根地址线(A0~A10)。

6116 的引脚功能大致如下:

引脚作用说明
A0~A10地址输入决定访问 2048 个单元中的哪一个
D0~D7数据输入/输出8 位数据总线,双向
CE片选低电平有效,选中芯片
WE写使能低电平有效,允许写入
OE读使能低电平有效,允许读出
VCC / GND电源/地一般 5V

6116 的操作真值表是这个实验的核心,建议背下来:

CEWEOE操作数据线状态
HXX未选中高阻
LLX写入高阻(输入)
LHL读出输出数据
LHH输出禁止高阻

注意一个细节:数据线是双向口。写入时数据从外部进芯片,读出时数据从芯片出到总线,未选中或禁止输出时则呈高阻态(既不是高电平也不是低电平,相当于断开)。正是因为有三态输出能力,存储器芯片才能直接“挂”在总线上,而不干扰其他设备。

2.2 地址译码:怎么从一大片地址里找到你要的那一个

单片 6116 只有 2K 容量,但实验箱的地址总线往往有 16 根(A0~A15),对应 64KB 地址空间。如果直接把 A0~A10 接到芯片上,那剩下来的 A11~A15 怎么办?它们决定了这片存储器的“基地址”——也就是它在整个 64KB 空间里占据哪一段。这个工作由地址译码器完成,实验箱里一般用 74LS138 三八译码器。

举个例子。假设实验箱把 6116 的 A0~A10 直接接系统地址总线低 11 位,然后用 74LS138 对高 5 位进行译码:

译码器输入连接信号
CA15
BA14
AA13
G1A12
G2AA11(低有效)
G2B接地

这种情况下,当 A15A14A13 = 001 且 A12 = 1、A11 = 0 时,地址高 5 位就是 00101,对应的地址范围是多少?

高 5 位二进制 00101 = 十进制 5,左移 11 位(乘以 2K):5 × 0x800 = 0x2800,所以这片 SRAM 的地址范围是0x2800 ~ 0x2FFF。

如果你写程序或拨开关访问的地址不在这个范围,芯片根本不会被选中,数据总线永远是高阻态,读回来自然全是乱码或 FF。很多“写不进去”的问题,根源不在芯片,而在译码逻辑。

2.3 存储器与 CPU 连接:为什么不能只靠一根线

先把那个高频问题说清楚:以存储器为中心的双总线结构里,**CPU 能不能通过系统总线直接和内存交换数据?答案是:能,而且正常情况下 CPU 访问内存就是通过系统总线进行的。**地址总线负责给出要访问的地址,数据总线负责双向传数据,控制总线负责宣布“这一拍是读还是写”。总线控制权和时序协调由 CPU 内部的总线控制器负责。

那“直接交换”为什么还需要控制总线?因为总线上不止 CPU 和内存,还有外设接口、中断控制器等。如果所有设备同时往数据总线上推信号,就会发生总线冲突,轻则数据错乱,重则烧毁芯片。所以存储器芯片的数据线都是三态结构,只有 CE、OE、WE 满足条件时才输出数据;CPU 也要在地址稳定之后再发读信号,等数据线上电平稳定后再采样。

在实验箱上,这个过程会被放得很慢、很直观:CPU 先把地址放到总线,然后拉低读信号,存储器把数据放到数据总线,CPU 再把数据取走。你用示波器看总线上这几个信号的先后顺序,会发现就是一条“数据流流水线”。这个实验的价值,就在于此。

3. 实验必备:电路接线与初始化检查

这部分是实操的起点。接线是整个实验里最无聊、也最容易出错的一步。我的建议是:先别急着插线,把实验箱说明书翻出来,对着芯片插座和信号排针一个个确认,再动手。

3.1 接线前必须搞清楚的信号清单

以常见实验箱为例,你需要接的信号分四组:

信号类型实验箱对应排针说明
地址总线A0~A10接 6116 的 A0~A10
数据总线D0~D7接 6116 的 D0~D7
控制信号WE、OE、CE接实验箱的手动按键或模型机控制输出
电源VCC、GND5V 电源,注意极性

有几个接线策略上的经验:

  • 先接电源和地,再接地址、数据,最后接控制线。控制线是“总开关”,接错了最容易被忽略。
  • 地址线和数据线不要扎在一起走。虽然实验箱排针距离很近,但区分开便于排查。
  • 一定要记住哪个颜色线代表哪一组信号。我见过太多学生用同一颜色线接完全部信号,出问题时无从下手。

实验箱上的芯片插座一般把 6116 的引脚丝印标得很清楚,但如果你用的平台是面包板或 FPGA 核心板,引脚映射以你所用的芯片手册为准。

3.2 上电前的五步自检

别急着上电,先花两分钟做完这五步,能省掉后面半小时排障:

  1. 核对芯片方向:6116 这类 DIP 芯片的缺口朝上/朝插座缺口一致,插反了上电就可能烧芯片。我曾经见过学生把芯片插反后依然能读出一堆随机数,然后反复怀疑接线。
  2. 用万用表测电源对地电阻:正常应在几十欧以上,如果接近 0,先查电源短路再上电。
  3. 检查 CE/OE/WE 的初始电平:上电前建议把手动控制开关设置成 CE=1(未选中)、WE=1、OE=1,避免一上电芯片就往总线上输出数据或意外改写。
  4. 确认地址开关全部初始为 0,数据开关全部初始为 0。这样即使控制线误接,最坏情况也是往 0 号单元写 0,影响可控。
  5. 打开电源后,用万用表量芯片 VCC 和 GND 之间电压,确认是 5V 左右再继续。

这五步每步都不复杂,但实验课上最常见的“上电就异常”基本都是这几个环节出问题。

4. 完整实操:从手动读写到接入 CPU

这一步是实验报告里最核心的内容,我把过程分成四个阶段讲:手动写入、读回验证、全片测试、接入模型机运行。每个阶段都有明确的判断标准,能做到哪一步、看到什么现象、现象说明什么,都对得上。

4.1 第一步:手动模式下写入一个单元

以 6116 芯片、地址范围 0x2800~0x2FFF 的接线为例,目标是往 0x2800 单元写入数据 0x5A。

操作顺序很讲究,原则是:先稳定地址和数据,再给写脉冲。

  1. 把地址开关拨成 0x2800 对应的二进制。0x2800 = 0010 1000 0000 0000,低 11 位 A10~A0 = 000 0000 0000(即全 0)。这一步是在告诉芯片:我要访问从译码器选中的那片区域里的 0 号单元。
  2. 把数据开关拨成 0x5A,也就是 0101 1010。数据线上已经准备好要写进去的内容。
  3. 确认 CE 已经为低、OE 为高;然后给 WE 一个低脉冲:先拉低,等一小段时间,再拉高。

为什么 WE 要“先拉低再拉高”而不是一直低着?因为 SRAM 的写入是边沿/电平结合触发的:WE 低电平期间,数据线上的数据被锁存进存储单元;WE 恢复高电平后,存储单元内部保持住这个数据。如果 WE 一直低着,芯片一直处于“写使能”状态,外部数据一变它也变,不能稳定保存。

实验箱上一般有专门的手动按键或拨动开关来实现 WE 脉冲,直接快速“下降-上升”即可。

4.2 第二步:读回验证与全片测试

写入完成后,不改变地址开关,把 WE 拨回高电平,OE 拨到低电平。此时芯片中 0x2800 单元的数据应该出现在数据总线上,实验箱的 LED 灯会显示 0x5A(二进制 0101 1010)。如果读回的数据和写入一致,说明这一轮的地址、数据、控制时序都正确。

但只测一个单元不够。教材实验报告一般要求做“全片测试”,也就是把 2K 个单元全部写一遍、读一遍。常见做法是:

  • 先全部写 00,再全部读 00;
  • 再全部写 FF,再全部读 FF;
  • 也可以交替写入 55 和 AA,因为 55=01010101、AA=10101010,能暴露数据线中某一位固定为高或固定为低的故障。

这个过程手动拨 2K 次显然不现实,实验箱通常支持“地址自动加一”模式,或者你直接写一个循环用模型机连续写。用 C 语言在 PC 端通过串口控制实验箱的话,也可以写一段简单的测试脚本,逻辑无非是:

for (addr = 0; addr < 2048; addr++) { write_sram(0x2800 + addr, 0x55); if (read_sram(0x2800 + addr) != 0x55) printf("fail at %04X\n", 0x2800 + addr); }

4.3 第三步:接入模型机运行一段访存指令

手动读写验证通过后,接下来把 SRAM 的数据线、地址线、控制线切换到模型 CPU 的对应总线接口。实验箱上一般有跳线或拨码开关,把“手动/自动”模式切换过去。

这一阶段的任务是写一小段机器指令(由实验箱的微程序控制器或指令执行器运行),例如:

  • MOV A, [0x2800]:把 0x2800 单元内容读入 A 寄存器;
  • MOV [0x2801], A:把 A 寄存器内容写到 0x2801 单元。

你可以在实验箱上看到:CPU 先输出地址 0x2800,然后数据总线上出现该单元数据,A 寄存器 LED 变亮。这其实就是“CPU 通过系统总线访问内存”的直观演示。

如果运行结果不对,问题大概率在总线切换不干净或控制信号冲突。最典型的是“手动模式下正常的单元,自动模式下读回来的数据每隔几次就错一次”,这就引出了下面要讲的时序问题。

4.4 用示波器看时序,眼见为实

如果你手里有示波器或逻辑分析仪,这是全实验最震撼的环节。把探头分别接在 WE、OE、地址线任一引脚上,触发条件设为 WE 下降沿,你会看到:

  • 地址线先变化并稳定一段时间;
  • 接下来 WE 拉低;
  • WE 拉高后一段时间,数据线上出现有效数据;
  • 如果是读周期,可以看到 OE 拉低后,数据线从高阻变成有效电平。

对照芯片手册上的时序图,你会发现自己手动拨“快一点”“慢一点”时,波形形状几乎一样,只是时间尺度变了。这也是为什么 SRAM 实验简单——它不涉及刷新、不涉及页行激活,地址给到、控制倍给到,数据就到了。

5. 经典问题与排障实录

我在实验课上记录过大量学生出过的故障,总结下来主要就三类:读回全 FF、部分地址能用、运行不稳定。下面每一条都是真实案例。

5.1 现象:写进去读出来全是 FF 或者 00

这个现象可以说是存储器实验的“头号杀手”。原因排查按以下顺序来:

排查点怎么查常见原因
片选 CE用万用表量 CE 引脚电平,手动模式下应能拉低译码器接线错、CE 没接对
读写控制 WE/OE拨动按键看引脚电平是否正确变化控制信号接反,WE/OE 互换
芯片是否选中看译码器输出 Y 端是否为低高位地址线没接或接错
芯片本身损坏换一片同型号芯片测试插反/静电损坏

从统计上讲,读回全 FF,八成是 CE 没生效,芯片根本没被选中;数据线高阻状态下,上位机读到的就是全 1。读回全 00 则可能是数据线卡在低电平,或者芯片供电有问题。

5.2 现象:只有部分地址能用

如果你发现 0x2800 好用,0x2A00 一写就错,多半是高位地址线的译码逻辑有局部错误。最好把地址范围按二进制展开,画出哪几位发生了变化。比如 0x2800 到 0x2FFF,A10~A0 全都能变,说明低 11 位没问题;如果 A10 这位的区间总是失败,就要检查 A10 这根地址线是虚接、排针氧化还是芯片引脚损坏。

另一个隐蔽原因是实验箱上有些地址线默认接了别的模块,比如拨码开关没有完全断开。这种就属于“接触类”问题,最好的办法是拿万用表从地址源端到芯片引脚端量通断,一段一段量,别凭感觉换线。

5.3 现象:单步读正常,连续运行就乱

这个现象通常是时序裕量不足造成的,也是最有“含金量”的故障。手动模式下每一步都间隔几秒,芯片有充分时间稳定;模型机连续运行后,读写操作在微秒甚至纳秒级别完成,如果 SRAM 的地址建立时间、WE 低电平时间不满足手册要求,就可能出现“上次地址的数据还在总线上,下一次操作已经开始”的情况。

排查思路:

  • 用示波器观察 WE/OE 的脉冲宽度,对照 6116 手册要求(一般 WE 低电平时间需要大于 70ns 左右)。实验箱模型机时钟不快,通常能满足,但如果模型机经过分频后频率异常,就会出现这个问题。
  • 检查数据总线是否存在竞争。如果 OE 还没有完全释放(变为高阻),CPU 已经开始输出下一条数据,总线上两个信号打架,就会出现时好时坏。

这种不稳定故障不要一开始就怀疑芯片,先把时序抓出来看。你一旦习惯用示波器看总线,很多“玄学”问题都会变成“时序不够”的常规问题。

5.4 延伸:上位机软件报“存储器空间不足”怎么处理

有读者在留言里问过:自己用 GX Works2 这类工业软件调试时,偶尔会遇到“存储器空间不足”或者“桌面堆栈不足”的提示,这是不是和实验箱有关?

老实说,这不是实验箱硬件的问题,而是 PC 端软件资源管理的问题。GX Works2 这类软件在打开大型工程、频繁编译或多次打开关闭窗口后,Windows GDI 资源和栈空间可能被耗尽,于是报“堆栈不足”。处理办法有这几个:

  • 关闭无关软件,尤其是浏览器多标签页,释放系统 GDI 资源;
  • 清一下系统临时目录,删掉软件的临时编译文件;
  • 把软件工程从机械硬盘挪到本地固态盘,减少文件读写压力;
  • 如果频繁出现,检查 Windows 虚拟内存设置,把“自动管理所有驱动器分页文件大小”打开;
  • 实在不行,卸载重装软件,装最新补丁版。

这个算题外话,但既然实验课上很多同学一边连实验箱一边开着编程软件,碰到这个提示会误以为是实验平台坏了,所以一并说清楚。

6. 实验之外:从存储器实验延伸出去

做完实验、拍完波形、写完报告,如果到此为止那就太可惜了。这个实验的底层逻辑可以延展到很多后面更“高级”的话题,这里挑三个最常见的方向聊一聊。

6.1 SRAM、DRAM、EEPROM 到底差在哪

实验箱上用的是 SRAM(静态随机存储器),它的存储原理是锁存器——每个位是一个双稳态电路,只要不掉电,数据就不会丢。优点是速度快、时序简单,适合做教学实验;缺点是集成度低、成本高,做不了大容量内存条。

而我们电脑里的内存条用的是 DRAM(动态随机存储器),存储原理是电容存储电荷。电容会漏电,所以需要每隔几毫秒刷新一次,这也是 DRAM 控制器的核心工作。DRAM 牺牲了刷新逻辑,换来了极高的集成度。

还有一些实验箱会加入 EEPROM 芯片(如 AT28C16),它的存储原理是靠浮栅晶体管“困住”电荷:写入时在控制栅和漏极之间加高压,让电子穿过绝缘层进入浮栅;擦除时加反向电压把电子拉出来。浮栅里的电荷可以保持十年以上,断电不丢。EEPROM 的好处是按字节擦写,缺点是擦写速度慢、寿命有限(常见 100 万次左右),所以它适合存配置参数,不适合当内存用。

一句话总结:SRAM 快但贵,DRAM 大但需要刷新,EEPROM 断电不丢但慢。理解了这三者的取舍,你也就理解了计算机里为什么会有“寄存器—高速缓存—主存—磁盘”这么一长串存储层次。

6.2 “直接内存交换”与 DMA:CPU 的让位

前面提到 CPU 可以通过系统总线直接访问内存。但在实际计算机里,如果硬盘、网卡每次交换数据都要 CPU 来搬运,CPU 会被大量中断和处理工作占用,系统性能会大幅下降。所以出现了 DMA(直接存储器访问)技术:DMA 控制器在总线上“代替” CPU,直接控制地址总线和读写信号,让外设和内存之间直接交换数据。

回到“以存储器为中心的双总线结构”问题上来——在这种结构里,CPU 和 DMA 设备共享系统总线。CPU 访问内存是“正常访问”,DMA 访问内存是“接管总线后访问”。教学实验里如果条件和时间允许,可以做一下 DMA 实验的时序演示,你会发现 DMA 的几个关键信号(总线请求、总线允许)本质上是“总线使用权”的交接仪式。这对理解多设备共享总线非常有帮助。

6.3 虚拟存储器:实验里地址和程序地址不是一回事

在实验箱里,你拨到地址总线上的 0x2800,CPU 或译码器看到的也是 0x2800,寻址物理位置是确定的。但在现代操作系统里,C 语言指针保存的地址是虚拟地址,它要经过 CPU 内部 MMU(内存管理单元)的页表翻译,才能映射到物理内存地址。

int a = 42; int *p = &a; printf("virtual address: %p\n", p); // 你看到的是虚拟地址

这个打印出来的地址,并不是内存条上的物理位置。进程 A 和进程 B 可以拥有同一个虚拟地址,但它们对应的物理页完全不同,靠页表隔离。这就是为什么每个进程都觉得自己独占了几 GB 内存——实际上物理内存只有几 GB,操作系统靠换页和缺页中断把暂时用不到的数据挪到磁盘上。

从这个角度看,你在实验箱上亲手对着物理地址写数据,反而成了一次难得的“物理地址直通体验”。等你学到操作系统虚拟内存管理时再回头看这个实验,会特别有感:原来物理地址是这么一回事。

7. 个人实操心得与最后提醒

最后讲几个我自己的习惯,可能对你们做实验、写报告有帮助。

我从第一次带实验开始就要求学生“先查真值表,再动线”。很多人觉得麻烦,总觉得芯片手册是业余才看的。但实际上,真值表就是存储器的“行为准则”——CE、WE、OE 任意组合对应什么操作,看清楚这些,很多问题根本不用猜。你甚至可以把真值表手抄在实验报告扉页,排障时一目了然。

接线这块,我自己的习惯是每种信号用固定颜色:红色电源、黑色地、白色地址、黄色数据、绿色控制。颜色自定,关键是整套实验中保持一致。这样只要看到一根绿线,就知道它是控制线,排查起来脑子不用转。

还有一个容易被忽视的细节:实验结束关电源后再拔线。SRAM 虽然不像某些器件那样对带电插拔极其敏感,但数据线在带电瞬间可能因为接触抖动产生虚假写脉冲,把里面数据改得乱七八糟。下次实验一上电,看到的数据不是上上次的,第一个念头就是怀疑芯片坏了,其实只是数据被“意外改写”了。类似这种细枝末节,往往就是真实工程里最难查的 bug。

另外提一句,如果你在实验箱上用的是 FPGA 或 CPLD 平台,存储器逻辑是写进 Verilog 代码里的,这时候建议额外做一件事:把芯片手册里的读写时序翻译成自己的状态机,比如写周期至少拆成“地址建立、WE 拉低、保持、WE 拉高”四个状态。别小看这个练习,它能把抽象的时序图变成你能控制的硬件行为,对后面做复杂总线设计帮助极大。

这个实验做到位了,你对“CPU 怎么从内存里拿数据”的理解会从“课本上的图”变成“亲手拨出来的现象”,这种把知识变成体感的过程,是实验课最有价值的地方。如果你做的时候遇到其他奇怪现象,也别慌,先把每根信号的电平量一遍,八成能找到问题。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/7 1:20:20

agent-skills实战:用skills CLI和Claude Code实现TDD编码智能体

1. 从"agent-skills"这个标题能读出什么第一次看到agent-skills这个仓库名&#xff0c;我的直觉是&#xff1a;这不是又一个"提示词大全"&#xff0c;而是一套把 AI coding agent 当"新员工"来培养的技能体系。关键词里同时出现了skills CLI、Cl…

作者头像 李华
网站建设 2026/10/7 1:18:46

Altium Designer画简单PCB:从原理图、封装到Gerber交付

/* 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:18:27

工业相机选型、打光与调试:从像素精度到丢帧排查指南

/* 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:18:05

01背包求具体方案与方案数:动态规划回溯与计数全解析

/* 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:17:47

DAG上的动态规划:城市交通路网题的建模本质

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

作者头像 李华