1 位继电器存储器:存储系统的基本构件与系列终章
搭建电平敏感的 1 位继电器存储单元,区分这一教学模型与 SRAM、DRAM,并考察 Z3、Harvard Mark I 及 Mark II 飞蛾日志。
上一篇文章构建了 D 锁存器:这是一种带 Data 输入和 Write 使能线的电平敏感电路。Write 有效时,锁存器处于透明状态,Q 会在模型规定的延迟后跟随 Data;Write 无效后,反馈维持最后的数值。该行为提供了一种实用的 1 位存储抽象,但要作为可复用模块,还需完成接口封装。
本文是用继电器搭建计算机系列的第 18 篇,也是本系列的最后一篇。下文将完成存储单元的接口封装,并系统回顾此前十七篇文章建立的逻辑层次:从单个电控开关开始,经过逻辑门、加法器、反馈与时钟,最终形成可保存一个比特的基本存储单元。
这一结果并不是各种 RAM 所使用的实际物理单元,而是用于讲解大型存储器所需状态、写控制与读出行为的教学模型。
封装 1 位存储单元
D 锁存器已经具备状态保持功能。它具有一条 Write 使能线(常称 EN 或 WE)和一条 Data 线(D),能够保留 Write 为高电平期间最后呈现的数值。但未经封装的原始电路会暴露继电器反馈与内部节点;将其封装为小型接口后,外围设计便可依赖规定行为,而不必依赖内部拓扑。
1 位存储单元就是为 D 锁存器套上一份清晰的接口约定:
- Write——一条控制线。置为高电平(1)时写入;保持低电平(0)时读取或仅保持状态。
- Data——待存储的位值:0 或 1。
- Q——已存储的输出。Write 为 1 时跟随 Data;Write 回到 0 后保持最后一个数值。
反馈以及用于产生有效内部驱动条件的门控均封装在内部,外部电路只需遵守 Write、Data 和 Q 的接口约定。该电平敏感单元的状态表如下:
| Write | Data | Q(下一状态) |
|---|---|---|
| 0 | — | Q(保持) |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
Write 为 0 时,Data 栏中的破折号表示该输入为无关项:Data 的变化不会影响已存状态。只要电源持续供应,存储单元便保持此前写入的值。
还应注意,若没有初始条件或先前写入值,仅凭当前输入无法从状态表确定 Q。存储器具有状态;它不是当前输入的纯函数,而依赖输入历史。这是组合逻辑与时序存储之间的本质区别。实际实现还必须规定上电、复位、时序、负载和无效条件,而上述三列表格并未涵盖这些行为。
这里的 Write 是电平敏感使能,而非边沿触发信号。Write 为高时,锁存器处于透明状态,Data 的有效变化会传播到 Q;Write 变为低电平后,反馈通路维持最后写入的状态。因此,上层电路必须保证 Data 在写入窗口内满足相应的稳定时间要求,也不能把这一教学模型视为具有独立读端口、地址译码或断电保持能力的完整 RAM 宏单元。
扩展规模:从一个比特到一台计算机
接口抽象使相同单元可以按位并行扩展。
八个独立存储的比特构成一个字节,可表示 0 至 255 的无符号数。要把存储单元组织成可寻址存储器,还需要字线、位线、地址译码、读写电路、灵敏放大与时序电路,通常还包括刷新或纠错逻辑。十进制前缀规定 1 kB = 1,000 字节,二进制前缀则规定 1 KiB = 1,024 字节;在 MB/MiB 和 GB/GiB 数量级上,两者差异会进一步扩大。
不同技术面对的抽象问题相同——保存什么数值、在什么条件下允许改变——但物理存储单元并不是按比例缩小的 D 锁存器。静态随机存取存储器(SRAM)通常采用带访问器件的交叉耦合晶体管单元;动态随机存取存储器(DRAM)以电荷存储信息,需要读出和刷新;非易失性存储器则采用其他机制。它们的接口可以呈现相近的逻辑行为,但器件物理、密度、时序、耐久性和断电行为存在显著差异。
操作验证
下面的 memory-bit 单元将 D 锁存器封装为浏览器端 Relay Lab 中的 1 位模块。它是一项交互式仿真,并非物理硬件:模型按照仿真器规则更新继电器、触点和电路状态,Q 所保持的也是模拟状态。
可依次完成以下操作:
-
存入 1。 设置 Data = 1,再置位 Write = 1,Q 随即变为 1。随后将 Write 释放为 0;此时 Data 不再影响 Q,即使将 Data 改为 0,Q 仍保持为 1。
-
用 0 覆盖。 设置 Data = 0,再短暂地向 Write 施加高脉冲,Q 降为 0。释放 Write 后,Q 继续保持为 0。
-
确认保持状态。 将 Write 与 Data 均保持为 0,Q 仍为 0。此时存储单元不响应 Data,而是保持最后写入的值。
上述操作验证了一个比特的模拟状态。由此类抽象组成的阵列,再配合选择与读写电路,可以作为随机存取存储器的初步模型;不能从这一继电器实现推断商用 RAM 的物理单元拓扑。
从逻辑门到存储器的构建路径
在进一步讨论继电器计算机之前,下面回顾本系列从开关到存储单元的构建层次。 第 1 篇——继电器本身。 继电器是一种电控开关:线圈产生磁力并驱动衔铁移动触点,使控制电路能够改变另一个电路的导通状态。使用常开触点可实现同相缓冲行为,使用常闭触点可实现反相行为。该器件由此提供了从物理开关状态到逻辑 0/1 抽象的基础映射,也说明控制信号与受控通路可以保持电气隔离。
第 2–3 篇——串联与并联。 两个开关串联,只有两者都闭合时电流才能通过:这就是 AND。两个开关并联,任意一个闭合就有电流通过:这就是 OR。此时还没有逻辑门符号,只有导线与可以观察的电流行为。逻辑已经存在,只是写在铜线之中。
第 4–7 篇——被命名的逻辑门。 乔治·布尔的代数与克劳德·香农 1937 年关于继电器网络和布尔代数等价性的工作,为 AND、OR 和 NOT 建立了统一的名称与符号。本系列据此从第一性原理实现缓冲器、反相器和三种基本逻辑门。
第 8–9 篇——函数完备逻辑门。 NAND 与 NOR 均可独立实现任意布尔函数,只需一种门并采用不同连接方式即可构造其他逻辑门。随后介绍阿波罗制导计算机对 NOR 门的应用,并给出相应继电器实现。
第 10–11 篇——XOR 与 XNOR。 XOR 在两个输入不同时输出 1,这一差异检测功能是错误检测、密码学和算术电路的重要基础。
第 12–13 篇——加法器。 XOR 产生半加器的和位,AND 产生进位;加入进位输入即可构成全加器,多个全加器串联后得到行波进位加法器。行波进位仍适用于教学和部分实现点,而高性能算术电路还可能采用超前进位、前缀、进位选择、FPGA 专用进位链或混合结构。George Stibitz 在 1937 年开展的继电器实验,是利用机电开关实现二进制算术的重要早期实例。
第 14–16 篇——反馈与时钟。 反馈可以产生振荡,经过专门设计的振荡器能够提供周期性时钟。在同步教学计算机中,时钟边沿用于协调状态更新。时钟并非唯一的时序组织方式——异步电路可使用握手和局部时序——但它便于在本系列中组织和观察状态变化。
第 17 篇——D 锁存器。 反馈转而发挥建设性作用:交叉耦合的继电器会保持一种状态,直到收到改变指令。Write 使能线可以避免出现两个继电器同时导通的禁用状态。继电器电路中由此出现了可控存储。
第 18 篇——1 位存储单元。 把 D 锁存器封装在清晰的接口之后。Write 为高时存储,为低时保持。八个叠在一起得到一个字节,数百万个叠在一起得到一兆字节。
由此可归纳出计算机的基本组成。
从最底层看,一台计算机由四类东西组成:
- 时钟——有规律的振荡器,用节拍告诉其他所有电路何时动作。
- ALU——算术逻辑单元,包括加法器、比较器和布尔运算。
- 存储器——在操作之间保持状态;易失性存储器通常会在断电后丢失该状态。
- 控制与选择——多路复用器、译码器与指令逻辑,在正确时刻把正确数据路由到正确位置。
本系列已经用简化的继电器实例介绍了这些功能。一台完整计算机还需要明确的指令集与数据通路、时序控制、寻址、输入/输出、初始化、故障行为和系统性验证。因此,规模化与组织本身就是设计问题,而不只是增加更多导线。
有文献依据的继电器计算机里程碑
20 世纪 40 年代的继电器与机电计算机采用了相关的开关和状态思想,但它们在十进制或二进制表示、存储机制、时序组织及算术体系结构上更加多样,不能等同于本文的教学存储单元。
Konrad Zuse 的 Z3 于 1941 年完成。计算机历史博物馆的时间线将其描述为一台早期二进制计算机:采用约 2,300 只继电器、22 位浮点字长,并从穿孔胶片读取程序;机器于 1943 年的一次空袭中被毁。该馆另称其为首台程序控制的机电数字计算机。此类“首台”称谓必须明确判定标准:Z3 从外部胶片读取固定指令序列,并不具备现代存储程序体系结构。
在美国,Howard Aiken 与 IBM 共同开发了 Harvard Mark I,正式名称为 IBM 自动顺序控制计算器,1944 年投入哈佛大学使用。IEEE 里程碑资料记载,这台长 51 英尺的机电设备采用十进制计数器、开关、控制电路和约 3,500 只多极继电器。指令由穿孔带输入,乘法运算耗时以秒计,而非微秒。它并不是本文二进制 D 锁存器阵列的房间级放大版本。
Mark I 之后,哈佛大学于 1947 年启用了同属机电计算机的 Mark II。计算史上广为流传的飞蛾事件发生在这台机器上。
1947 年 9 月,Mark II 操作人员在机器中发现一只飞蛾,并将其粘入日志,旁注 “First actual case of bug being found.” Grace Hopper 当时是 Mark II 团队成员,但现存记录不足以把发现行为归于她个人。史密森尼学会的藏品记录还指出,用“bug”指称技术故障的用法早于这一事件。
该日志页和飞蛾现藏于史密森尼学会美国国家历史博物馆;藏品目录目前标注其未公开展出。
这起事件把既有工程术语变成了字面事实,因而令人印象深刻。更审慎的历史表述是:它促进了“bug”和“debug”的传播,而不是创造了其中任何一个词。
技术谱系:继电器 → 真空管 → 晶体管 → 芯片
继电器计算机曾与速度更高的真空管电子计算机并存,随后逐渐被后者取代。真空管可以通过控制栅极影响电子流,无需机械衔铁;但从继电器转向真空管绝非简单替换器件,电压电平、放大能力、扇出、功耗、散热、可靠性、时序和电路拓扑均会改变。相同的布尔函数需要采用不同的物理设计实现。
随后,晶体管成为主流开关器件。双极型晶体管(BJT)具有基极、集电极和发射极;现代数字 CMOS 普遍采用的 MOSFET 则具有栅极、源极、漏极和体端。晶体管不再依赖机械触点和加热灯丝,但也需要新的逻辑系列、制造方法、信号裕量与体系结构。
20 世纪50年代末以后,集成电路技术开始在同一衬底上集成多个电子元件;后续工艺与设计进步,最终使包含数十亿只晶体管的系统成为现实。布尔代数仍可描述预期的二值逻辑,而器件物理、互连、存储层次、并行结构与微体系结构则决定现代芯片如何实现这些行为。
第 1 篇中的继电器和 CMOS 晶体管都可以参与受控开关网络。这种功能类比很有价值,但不意味着两者具有相同的开关行为、电路拓扑、时钟频率或计算机体系结构。Shannon 的开关代数成果说明继电器触点网络可以用布尔代数分析;同一代数也能在更高抽象层描述数字 CMOS 设计。
因此,继电器是理解数字逻辑历史的一条重要路径,但不是所有计算技术的完整单一谱系。
后续学习建议
完成本系列后,可从以下三个方向继续学习。
第一:搭建更大的系统。 可以把多个加法器级联,再加入寄存器与时钟,并验证得到的状态序列。DigiSim Relay Lab 提供加法机、计数器、触发器和分频器等更大型教学电路。页面显示的触点动作声和电气行为都是仿真模型输出,还应将该模型与物理器件数据手册中的时序和触点特性进行比较。
第二:阅读 Charles Petzold 的 CODE。 本系列的构建思路受到该书启发。Petzold 从摩尔斯电码和手电筒出发,逐步构造可工作的 CPU,并进一步介绍机器语言、汇编语言与操作系统,可作为本系列的系统性延伸阅读。
第三:开展独立设计。 可在 DigiSim 画布中放置继电器,将阅读过程中形成的设计设想转化为实际电路,从复现实例逐步过渡到自主设计。
本系列从电控开关出发,最终把继电器反馈封装为可复用的存储抽象,并同时说明了将这种抽象迁移到后续技术时的价值与边界。
可在 DigiSim Relay Lab 中观察继电器计算机的实际运行过程。



