Alt-F4 #24 - 创造记忆  2021-02-19

作者 pocarski, 编辑 stringweasel, Nanogamer7, Conor_, Therenas, Firerazer,
翻译 Ph.X

目录

本周,我们会跟进 pocarski 上周的文章,内容是关于如何在异星工厂内只用传送带来搭建一台电脑。这一次,我们要教它如何记住东西。让我们看看效果如何。

纯传送带计算,第二部分:永不忘记 pocarski

本周,我将继续延续我的关于纯传送带计算的文章。我强烈建议大家回到上期去复习一下。

在开始之前,先做一个简短的说明:在本周的 DiscordBlueCheetah#7844 对我的加法器回路进行了重大的布局改进,现在它略微长了一些,但仅有四格宽。以下是改进后的图片,做着与上周一样的计算。

更好的加法器

看完了这个,我们就开始讲正事吧。上一次,我们探讨了只用传送带和分流器进行数字加法,本周我们将探讨在计算方面同样重要的东西:内存。能够给数字做加法的能力是很棒的,但如果没有办法存储指令或结果,一切都是徒劳。在 CPU 内部,加法的结果会被记住,然后经过一些操作,反馈回刚才做计算的加法器。这样一来,就可以实现几乎所有能够想象到的数学运算。

和上周一样,欢迎大家下载本文中的所有电路的蓝图簿来亲身体验一下。

数据选择器

首先介绍一个新的电路:数据选择器。数据选择器有两个数据输入 AB,一个指针输入 P,一个输出 O。下面是这个多路复用器的真值表(“-”表示输入不影响输出):

A B P O
0 - 0 0
1 - 0 1
- 0 1 0
- 1 1 1

输入 P 功能是选择了哪个数据输入应该被传递给输出。如果 P0,我们的输出将等于 A 的值,而如果是 1,我们的输出将是 B 的值。现在,为了实际构建这个电路,我们可以利用 AND 门。它们允许我们选择性地忽略一个输入。我们可以通过简单地启用或禁用门的另一个输入来选择是否要通过一个输入。考虑到这一点,我们可以将数据选择器重新想象为 (A AND NOT P) OR (B AND P)。这些都是我们已经熟悉的元素,意味着一个数据选择器可以这样构建:

这只是一个 复制器-NOT 电路和两个 AND 门。我们还需要一些物品交换器,以匹配所有输入和输出物品类型。

基本存储单元

存储单元乍听起来非常复杂。一个能够 记忆 输入的电路?当然,这需要某种储藏方式,但要如何让它保持输出而不会耗尽呢?这就是我们的新朋友数据选择器大展身手的地方。如果我们将输出循环回来,将其送入自己的 输入 A,会发生什么?答案是:魔法!

正如你所见,通过这一个变化,我们把数据选择器变成了一个非常基本的存储单元。过去称为 输入 B 的输入端现在是存储单元的唯一数据输入,过去称为 输入 P 输入端现在是“写”输入。这个电路自从我们循环之后就没有输出了,所以我们通过增加一个复制器来解决这个问题(就像上次一样包含一个物品交换器和一个 AND 门)。

我们刚才做的这个电路叫 门控 D 锁存器。它有两个输入。D 代表“数据”,E 代表“使能”。与电子计算机中不同的是,我们必须让 E 在相当长的时间内处于开启状态,因为物品需要回到起点,输出才会变得稳定。但是,D 锁存器有一个相当大的问题,那就是在 输入 E 开启的时候,输出完全复制 输入 D,实际上是把整个东西变成了一根花哨的线。我们需要保证输出的稳定性,为此,我们需要的不仅仅是一个简单的 D 锁存器。

主从存储单元

很多问题可以靠再建一个副本来解决,D 锁存器的问题也不例外。我们将 输入 E 复制并反转,将其反转后送入另一个 D 锁存器的使能端。然后,我们使第一个锁存器的输出进入第二个锁存器的数据输入。这里的反转是通过引入第三个物品类型来完成的,让它被使能输入覆盖。就像上周一样,传送带的两边来救场了,我们其实不需要再建一个完整的副本,而是做一些巧妙的循环:

这个双锁存系统为我们的数据值建立了一种阶梯,当 输入 E 开启时,它被允许进入第一阶梯,但只有在它关闭后才能继续前进。这就在我们完成一个周期前保护了输出不被变。现在我们可以重新排列一切,做出一个紧凑的模块:

有趣的是,它的尺寸和上周的加法器模块一模一样(至少在 BlueCheetah 出现之前是一样的)。令人满意的巧合!

最后说明

现在我们有了加法器和内存,我们就可以建造一个 CPU 了。当然,我们需要一个时钟来运行所有的东西,但这是个简单的半满传送带复制器循环。算术逻辑单元(ALU)只是一堆加法器通过寄存器循环回自己,而寄存器本身只是一堆内存单元。我的计算机科学知识还不够丰富,无法完全解释一切,不妨看看 YouTube上 的 letao12,正是他的系列视频启发了我,让我尝试这种基于传送带的逻辑。

征稿

一如既往的,我们正在召集任何想要为 Alt-F4 做出贡献的人,无论是提交文章还是帮助翻译都可以。如果您有些有趣的想法,并乐于与社区分享,这里就是一个好地方。如果您没有太大把握,我们会很乐意帮助您讨论内容创意和结构问题。如果您有意参与,从加入 Discord 开始吧!