周末,我高中的弟弟问我这样一个问题:“为什么电脑都是从 C 盘开始?A 盘、B 盘哪去了?”

平时他总是问我一些奇怪的问题,其实这是个暴露年龄的问题,作为零五后,他不知道,我不怪他。我想他每天玩 iPad 不知道这些也没啥奇怪的。

于是,我拿出了我的耐心,准备给他讲讲 C 盘的故事。

话说,20 世纪五六十年代,工程师创造了个人电脑。为了方便使用,工程师就将系统安装在磁盘上,使用者通过磁盘驱动器读取。IBM 曾推出了一款在当时看起来更加方便的存储磁盘——软盘。

最早的软盘是8英寸的

其实 8 英寸这么大,还是有点不方便的。随后就出现了 5.25 英寸软盘和 3.5 英寸软盘,来取代 8 英寸软盘。

A 盘的盘符就是为 3.5 英寸软盘驱动器准备的,B 盘的盘符则是为 5.25 英寸的软盘驱动器准备的。因为当时的计算机还没有现在很常见的硬盘,所以 A 和 B 两个盘符就这样献给了软盘。

三种不同尺寸的软盘

中间的5.25寸软盘大概相当一张光盘的大小

之后便是硬盘的时代,将系统安装在硬盘并固定在机箱内,再也不用插入软盘,下次直接按下开机键就可以用了。

但这时候软驱还存于新兴时代,既有软盘,又有硬盘,于是硬盘便被命名为 C 盘。

随着 Windows 操作系统的诞生,TA 需要运行在硬盘上,所以 Windows 系统的默认软件安装路径是 C 盘,之后按照兼容的考虑不断升级 Windows,直到现在,硬盘的第一个盘还是 C 盘,默认安装路径也是 C 盘。

如今很少有人使用软盘了,它也仍然没有走远。比如“保存”和“另存为”功能的图标其实就是一个软盘。软盘的精神被尘封在了电脑里,寓意着人们对数据存储的渴望。

我问弟弟:“懂了吗?” 他点点头,又摇摇头!他说没见过软盘的样子,准备买一个回来感受下。接着他又给我抛出三个问题。那......

1. CPU 是什么的缩写?

2. Hz 又表示什么的单位呢?

3. Z80 CPU 是多少比特的 CPU?

这......我竟然有点发懵。不!这不应该,被他这么一问,我发现有一些问题还真无法简单地解释清楚呢!

其实,工作之后,以前这些有关硬件的底层知识,差不多都还给老师了。这次要不是弟弟问我,我都不知道自己竟然差不多忘得一干二净了。是时候重新补补这些硬件相关的知识了。

听说本周三,有这样一节有关硬件的直播课,不仅可以帮我补补课,而且还可以带着弟弟一起学习。这些电子时代成长起来的娃们,虽说摆弄电子产品很 6,但对于产品本身可谓是一无所知。

我一直想教他学 Python 的,如果先了解下计算机的构造,估计学起来也会容易点。如果你跟我有一样的烦恼,那么周三一起来听这场直播吧!

(扫码预约直播☝)

做一台计算机,可以说我们每个人上学时都有过这样的想法。后来因为这样那样的原因放弃了。那么,做一台计算机究竟需要哪些步骤?上班多年后,我开始考虑这个问题。以下节选自《计算机是怎样跑起来的》,通过做一台计算机,让我们实现年少时的愿望吧!(万字长文,干货满满,建议收藏起来慢慢读)

1.1 制作计算机所需元件:

首先我们要一起来收集元件吧。制作微型计算机所需的基础元件只有 3 个,CPU、内存和 I/O,每种元件都是作为一块独立的 IC 在市场上出售的。

CPU 是计算机的大脑,负责解释、执行程序。内存负责存储程序和数据。I/O 是 Input/Output(输入/输出)的缩写,负责将计算机和外部设备(周边设备)连接在一起。

这里我们使用 Z80 CPU 作为微型计算机的 CPU、TC5517 作为内存、Z80 PIO 作为 I/O。

Z80 CPU 是一款古老的 CPU,在 NEC 的 PC-8801、SHARP 的 MZ-80 等 8 比特计算机广泛应用的时代,曾以爆炸般的速度普及过。

TC5517 是可以存储 2K 的 8 比特数据的内存。在计算机的世界里,K 表示210 = 1024。TC5517 的容量是 8 比特 ×2×1024 = 16384 比特,即 2K 字节。虽然这点容量与诸位所使用的个人计算机比起来相差悬殊,但是对于用于学习的微型计算机来说是绰绰有余了。

Z80 PIO 作为 I/O,经常与 Z80 CPU 一起使用。正如其名,PIO(Parallel I/O,并行输入/输出)可以在微型计算机和外部设备之间并行地(一排一排地)输入输出 8 比特的数据。

在计算机爱好者们沉浸在制作微型计算机的那个年代,这些元件都是常见的 IC。不过我要先说一下,今天我们制作的微型计算机终归只是用于学习的模型,并没有什么实用的价值。

图1.1 Z80 微型计算机的电路图

为了制作微型计算机,除了 CPU、内存和 I/O,还需要若干辅助元件。

为了驱动 CPU 运转,称为“时钟信号”的电信号必不可少。这种电信号就好像带有一个时钟,滴答滴答地每隔一定时间就变换一次电压的高低(如图 1.2 所示)。输出时钟信号的元件叫作“时钟发生器”。时钟发生器中带有晶振,根据其自身的频率(振动的次数)产生时钟信号。时钟信号的频率可以衡量 CPU 的运转速度。这里使用的是 2.5MHz(兆赫兹)的时钟发生器。

图1.2 时钟信号的波形图

用于输入程序的装置也是必不可少的。在这里我们通过拨动指拨开关来输入程序,指拨开关是一种由 8 个开关并排连在一起构成的元件(如照片 1.1(a) 所示)。输出程序执行结果的装置是 8 个 LED(发光二极管)。到此为止,主要的元件就都备齐了。

剩下的就都是些细碎的元件了。表 1.1 是所需元件的一览表,里面也包含了之前介绍过的元件。请诸位粗略地浏览一遍。所需元件表中的 74367 和 7404 也是 IC,用于提高连接外部设备时的稳定性。

表 1.1 本次用到的制作微型计算机的元件:

电阻是用于阻碍电流流动、降低电压值的元件。为了省去布线的麻烦,这里也会使用将 8 个电阻集成到 1 个元件中的集成电阻(如照片 1.1(b) 所示)。电阻的单位是 Ω(欧姆)。

电容是存储电荷的元件,衡量存储电荷能力的单位是 F(法拉)。要让微型计算机运转起来,5V(伏特)的直流电源是必不可少的。于是还需要使用一个叫作“开关式稳压电源”的装置,将 220V 的交流电变成 5V 的直流电。

照片1.1 指拨开关和集成电阻

1.2 电路图的读法

在开始布线之前,先来介绍一下电路图的读法。在电路图中,用连接着各种元件符号的直线表示如何布线。电路中有些地方有交叉,但若只是交叉在一起的话,并不表示电路在交叉处构成通路。只有在交叉处再画上一个小黑点才表示构成通路。

图 1.3 判断电路交叉时是否构成通路

图 1.4 电源的表示方法

本次制作的微型计算机工作在 +5V 的直流电下。虽然在实际的电路中要把 +5V 和 0V 连接到各个元件的各个引脚上,但是如果在电路图中也把这些地方都一一标示出来的话,就会因为到处都是 +5V 和 0V 的布线而显得混乱不堪了。所以要使用如图 1.4 所示的两种电路图符号来分别表示电路连接到 +5V 和连接到 0V 的情况。

IC 的引脚(所谓引脚就是 IC 边缘露出的像蜈蚣腿一样的部分)按照逆时针方向依次带有一个从 1 开始递增的序号。数引脚序号时,要先把表示正方向的标志,比如半圆形的缺口,朝向左侧。举例来说,带有 14 个引脚的 7404,其引脚序号就如图 1.5 所示。

图 1.5 如何数 IC 的引脚序号

如果按照引脚序号的排列顺序来画 IC 的电路图符号,那么标示如何布线时就会很不方便。所以通常所绘制的电路图都不受引脚实际排布的限制1。画图时,在引脚的旁边写上引脚的序号,在表示 IC 的矩形符号中写上表明该引脚作用的代号。代号就是像 RD(Read)表示执行读取操作,WR(Write)表示执行写入操作这样的代表了某种操作的符号。各个代号的含义等到为引脚布线时再一一说明。

1.3 连接电源、数据和地址总线

下面就开始布线吧。请假想自己正在制作微型计算机,并按照如下的说明用红铅笔在电路图中描画相应的电路。

首先连接电源。IC 与普通的电器一样,只有接通了电源才能工作。Z80 CPU、TC5517 和 Z80 PIO 上都分别带有 Vcc 引脚和 GND 引脚。Vcc 和 GND 这一对儿引脚用于为 IC 供电。下面请先将 +5V 电源连接到各个 IC 的 Vcc 引脚上,然后将 0V 电源连接到各个 IC 的 GND 引脚上。接下来还需要将 +5V 和 0V 连接到时钟发生器上。接通电源后这些 IC 和时钟发生器就可以工作了。

微型计算机所使用的 IC 属于数字 IC。在数字 IC 中,每个引脚上的电压要么是 0V、要么是 +5V,通过这两个电压与其他的 IC 进行电信号的收发。用于给 IC 供电的 Vcc 引脚和 GND 引脚上的电压是恒定不变的 +5V 和 0V,但是其他引脚上的电压,会随着计算机的操作在 +5V 和 0V 之间不断地变化。

稍微说一点题外话,只要想成 0V 表示数字 0、+5V 表示数字 1,那么数字 IC 就是在用二进制数的形式收发信息。也正因为如此,二进制数在计算机当中才如此重要。

有关二进制的内容,请先记住以下知识点:通常将 1 个二进制数(也就是数字 IC 上 1 个引脚所能表示的 0 或者 1)所表示的信息称作“1 比特”,将 8 个二进制数(也就是 8 比特)称作“1 字节”。比特是信息的最小单位,字节是信息的基本单位。这里制作的微型计算机是一台 8 比特微型计算机,因此是以 8 比特为一个单位收发信息的。

下面回到正题。计算机以 CPU 为中心运转。CPU 可以与内存或 I/O 进行数据的输入输出。为了指定输入输出数据时的源头或目的地,CPU 上备有“地址总线引脚”。Z80 CPU 的地址总线引脚共有 16 个,用代号 A0~A15 表示,其中的 A 表示 Address(地址)。后面的数字 0~15 表示一个 16 位的二进制数中各个数字的位置,0 对应最后一位、15 对应第一位。16 个地址总线引脚所能指定的地址共有 65536 个,用二进制数表示的话就是 0000000000000000~1111111111111111。因此 Z80 CPU 可以指定 65536 个数据存取单元(内存存储单元或 I/O 地址),进行信息的输入输出。

一旦指定了存取数据的地址,就可以使用数据总线引脚进行数据的输入输出了。Z80 CPU 的数据总线引脚共有 8 个,用代号 D0~D7 表示。其中的 D 表示 Data(数据),后面的数字 0~7 与地址总线引脚代号的规则相同,也表示二进制数中各个数字的位置。Z80 CPU 可以一次性地输入输出 8 比特的数据,这就意味着如果想要输入输出位数(比特数)大于 8 比特的数据,就要以 8 比特为单位切分这个数据。

作为内存的 TC5517 上也有地址总线引脚(A0~A10)和数据总线引脚(D0~D7)。这些引脚需要同 Z80 CPU 上带有相同代号的引脚相连。一块 TC5517 上可以存储 2048 个 8 比特的数据(如图 1.6 所示)。可是由于用于输入程序的指拨开关是以 8 比特为一个单位指定内存地址的,所以我们只使用 TC5517 上的 A0~A7 这 8 个引脚,并把剩余的 A8~A10 引脚连接到 0V 上(这些引脚上的值永远是 0)。虽然总共有 2048 个存储单元,最终却只能使用其中的 256 个,稍微有些浪费。下面就请诸位用红铅笔把 Z80 CPU 和 TC5517 的 D0~D7 以 及 A0~A7 引脚分别连接起来。

图 1.6 TC5517 的内部构造

1.4 连接 I/O 

下面开始连接 I/O。只有了解了作为 I/O 的 Z80 PIO 的结构,才能理解为什么要这样布线。诸位都知道“寄存器”这个词吗?寄存器是位于 CPU 和 I/O 中的数据存储器。Z80 PIO 上共有 4 个寄存器。2 个用于设定 PIO 本身的功能,2 个用于存储与外部设备进行输入输出的数据。

这 4 个寄存器分别叫作端口 A 控制、端口 A 数据、端口 B 控制和端口 B 数据。所谓端口就是 I/O 与外部设备之间输入输出数据的场所,可以把端口(Port)想象成是轮船装卸货物的港口。Z80 PIO 有 2 个端口,端口 A 和端口 B,最多可以连接 2 个用于输入输出 8 比特数据的外部设备(如图 1.7 所示)。

图 1.7 Z80 PIO 的内部构造

既然已经大体上了解了 Z80 PIO 的结构,下面就开始布线吧。因为 Z80 PIO 上也有 D0~D7 的数据总线引脚,所以先把它们和 Z80 CPU 中带有同样代号的引脚连接起来。这样 CPU 和 PIO 就能使用这 8 个引脚交换数据了。

接下来要把 Z80 PIO 的  和  引脚分别连接到 Z80 CPU 的地址总线引脚 A0 和 A1 上。若表示 IC 引脚作用的代号上划有横线,则表示通过赋予该引脚 0(0V)可使之有效,反之若没有横线,则表示通过赋予该引脚 1(+5V)可使之有效。因此若赋予  引脚 1 则表示选中 B,反之赋予 0 则表示选中 A。同样地,若赋予  引脚 1 则表示选中的是 C(C 即 Control,表示控制模式);反之赋予 0 则表示选中的是 D(D 即 Data,表示数据模式)。

通过 Z80 CPU 的 A0~A7(00000000~11111111 共 256 个地址)地址总线引脚可以选择内存(TC5517)中的存储单元。同样地,使用 Z80 CPU 的 A0~A1(00~11 共 4 个地址)地址总线引脚也可以选择 I/O(Z80 PIO)中的寄存器。

Z80 CPU 的 A8~A15 地址总线引脚尚未使用,所以什么都不连接。在电路图中可以用代号 NC(No Connection,未连接)表示引脚什么都不连接。IC 上的引脚有些只用于输出,有些只用于输入,还有些是输入输出两用的。对于只用于输出的引脚,不需要使用时的处理方法是这个引脚什么都不连接;而对于只用于输入或输入输出两用的引脚,不需要使用时的处理方法则是把这个引脚上的电压固定成是 +5V 或 0V。

1.5 连接时钟信号

正如前文所述,Z80 CPU 和 Z80 PIO 的运转离不开时钟信号。为了传输时钟信号,就需要把时钟发生器的 8 号引脚和 Z80 CPU 的 CLK(CLK 即 Clock,时钟)引脚、Z80 PIO 的 CLK 引脚分别连接起来。时钟发生器的 8 号引脚与 +5V 之间的电阻用于清理时钟信号。

再插入一段题外话。诸位可以把 Z80 CPU 和 Z80 PIO 在时钟信号下运转的情景,想象成是它们在跟随着滴答滴答响的时钟同步做动作。据说 19 世纪英国的查尔斯·巴贝奇(Charles Babbage)曾向制造计算机的原型——分析机发起过挑战。分析机由齿轮组成,因当时科技水平的限制并未制造完成。可是如果把分析机改用电子元件制造出来的话,就是今天的计算机。

1.6 连接用于区分读写对象是内存还是 I/O 的引脚

至此,我们已经先后把 Z80 CPU 连接到了 TC5517 和 Z80 PIO 上,这两次连接都使用了地址总线引脚 A0 和 A1。如果仅仅这样连接,就会导致一个问题,当地址的最后两位是 00、01、10 和 11 时,CPU 就无法区分访问的是 TC5517 中的存储单元,还是 Z80 PIO 中的寄存器了。

Z80 CPU 上的 (即 Memory Request,内存请求)引脚和 (即 I/O Request,I/O 请求)引脚解决了这个问题。当 Z80 CPU 和内存之间有数据输入输出时,  引脚上的值是 0,反之则是 1。当 Z80 CPU 和 I/O 之间有数据输入输出时,  引脚上的值是 0,反之则是 1。

若把 TC5517 的 (即 Chip Enable,选通芯片)引脚设成 0,则 TC5517 在电路中被激活,若设成 1 则从电路中隔离,因为此时 TC5517 进入了高阻抗状态,所以即便它上面的引脚已经接入了电路也不会接收任何电信号。在 Z80 PIO 中,则是通过将  引脚和  引脚同时设为 0 或 1,来达到与 TC5517 的  引脚相同的效果。若同时设为 0,则 Z80 PIO 在电路中被激活,若同时设为 1 则从电路中隔离(之所以使用两个引脚是因为这样更适合使用了多个 I/O 的情况)。

按照上面的讲解,下面需要把 Z80 CPU 的  引脚连接到 TC5517 的  引脚上。然后把 Z80 CPU 的   引脚连接到 Z80 PIO 的  引脚和  引脚上。请诸位先用红铅笔把这些引脚分别连接起来吧。

对内存和 I/O 而言,还必须要分清 CPU 是要输入数据还是输出数据。为此就要用到 Z80 CPU 的  引脚(即 Read,表示输入,为 0 时执行输入操作)和  引脚(即 Write,表示输出,为 0 时执行输出操作)了。请把 Z80 CPU 的  引脚和 TC 5517 的  引脚,Z80 CPU 的  引脚和 TC 5517 的  引脚分别连接起来。Z80 PIO 虽然只有  引脚,但由于数字 IC 引脚上的值要么是 0 要么是 1,所以只用 1 个引脚也能区分是输入还是输出,0 的话是输入,1 的话就是输出(如表 1.2 所示)。

表 1.2 与读写内存、I/O 相关的引脚上的值

1.7 连接剩余的控制引脚

CPU、内存、I/O 中不但有地址总线引脚、数据总线引脚,还有其他引脚,通常把这些引脚统称为“控制引脚”。之所以这样命名是因为这些引脚上输入输出的电信号具有控制 IC 的功能。现在 Z80 CPU 上只剩下 9 个控制引脚没有连接了,那么就再加把劲,继续用红铅笔把它们也连接到电路中吧。

首先把 Z80 CPU 的  引脚(即 Machine Cycle 1,机器周期 1)和  引脚(即 Interrupt,中断)与 Z80 PIO 上标有相同代号的引脚连接起来。 是用于同步的引脚,  引脚是用于从 Z80 PIO 向 Z80 CPU 发出中断请求的引脚。所谓中断就是让 CPU 根据外部输入的数据执行特定的程序。有关中断的详细内容将在后边介绍,这里只需要先记住 I/O 可以中断 CPU 正在执行的程序的处理流程就可以了。

一旦把 Z80 CPU 的  引脚(即 Reset,重置)上的值先设成 0 再还原成 1,CPU 就会被重置,重新从内存 0 号地址上的指令开始顺序往下执行。重置 CPU 可以通过按键开关完成。按键开关需要经过电阻接在 +5V 和 0V 之间。请仔细地观察这一部分的电路图,可以看出  引脚上平时是 +5V(即 1)。当按下按键开关时, 引脚就变成了 0V(即 0),而放开按键开关后又会回到 +5V(即 1)。电阻是为了防止短路而加入的,否则一旦按下了按键开关,+5V 和 0V 就会直接接到一起发生短路。像这样通过加入电阻把 +5V 和 0V 连接起来的方法在电路图中随处可见(如图 1.8 所示)。

图 1.8 如何用开关输入 0 或 1

连接在  引脚上的电容,用于在电路接通电源时自动重置 CPU。电容就好像一个充电电池,具有储存电荷的功能。在通电后的一刹那,由于电容正在充电,所以  引脚上的电压并不会立刻上升到 +5V。而完成充电后,引脚的电压会变为 +5V,这样就相当于  引脚上的值从 0 变成了 1,重置了一次 CPU。

总线是连接到 CPU 中数据引脚、地址引脚、控制引脚上的电路的统称。使用快动开关可以使 Z80 CPU 的  引脚(即 Bus Request,总线请求)上的值在 0 和 1 之间切换。若将  引脚的值设为 0,则 Z80 CPU 从电路中隔离。当处于这种隔离状态时,就可以不通过 CPU,手动地向内存写入程序了。像这样不经过 CPU 而直接从外部设备读写内存的行为叫作 DMA(Direct Memory Access,直接存储器访问)。在诸位所使用的个人计算机里,硬盘等设备要读写内存时使用的就是 DMA。

当 Z80 CPU 从电路中隔离后, 引脚(即 Bus Acknowledge,响应总线请求)上的值就会变成 0。也就是说,把  引脚上的值设成 0 以后,还要确认  引脚上的值已经变成了 0,然后才能进行 DMA。请把  引脚分别连接到 4 个 74367 的  引脚上。有关 74367 的作用将在后面说明。

Z80 CPU 的其他控制引脚并未使用。所以要把  引脚和  引脚上的值设为 1,即连接到 +5V 上。之所以在连接时加入电阻,是为了便于今后加入开关等元件。请诸位先记住一个词——上拉(Pull-up),指的就是像这样通过加入电阻把元件的引脚和 +5V 连接起来。剩下的  引脚和  引脚什么都不连接。

Z80 PIO 的 PA0~PA7(PA 表示 Port A)以及 PB0~PB7(PB 表示 Port B)用于与外部设备进行输入输出,所以稍后要把它们分别连接到指拨开关和 LED 上。对于剩下的几个引脚可以这样处理:将 IEI 引脚上拉,IEO 引脚、引脚、ARDY 引脚、 引脚和 BRDY 引脚则什么都不连接。

到此为止,Z80 CPU、TC5517、Z80 PIO 以及时钟发生器上要用到的引脚就都接入电路了。这意味着计算机主机系统的功能完成了。作为总结,表 2.3 汇总了这几块 IC 上引脚的作用以及电信号的输入输出方向(从各个 IC 的角度看)。

表 1.3 Z80 CPU、TC5517、Z80 PIO 的引脚作用以及输入输出方向

用红铅笔尝试布线的诸位觉得怎么样呢?虽然需要连接的电路有点多,但也并不是太复杂吧?其实计算机的工作原理非常简单。CPU 在时钟信号的控制下解释、执行内存中存储的程序,按照程序中的指令从内存或 I/O 中把数据输入到 CPU 中,在 CPU 内部进行运算,再把运算结果输出到内存或 I/O 中。无论是小型的微型计算机,还是高性能的个人计算机,其工作原理都是相同的。

1.8 连接外部设备,通过 DMA 输入程序

下面我们继续布线,这次将计算机主机系统和外部设备连接起来。我们要使用 2 个指拨开关和 1 个按键开关,向地址总线引脚和数据总线引脚发送电信号,然后通过 DMA 将数据总线上的数据存储到内存。下面我们就先将这些元件连接到电路中。

首先将图 2.1 中右侧最上方的一个指拨开关连接到作为内存的 TC5517 的数据总线引脚 D0~D7 上。再将它下面紧挨着它的指拨开关连接到 TC5517 的地址总线引脚 A0~A7 上。接下来将用于控制内存写入的按键开关连接到 TC5517 的 引脚上。为了写入数据,还要将 TC5517 的 引脚上拉起来,连接到 +5V 上,然后把 引脚连接到 0V 上。把这些元件都连接起来以后,就可以拨动指拨开关,用二进制数设定地址总线引脚和数据总线引脚上的数据了。设定完后按下按键开关,数据就会被写入 TC5517 中。在 2 个指拨开关下方还有一个指拨开关,它通过电阻接到 +5V 上,这样拨动这个指拨开关就可以输入 +5V 或 0V 的信号了。

但是如果这些开关直接连接到了 TC5517 的各个引脚上,在程序执行时,开关的状态就会对电路产生影响。因此要使用 74367,在程序执行时把开关从电路中隔离出来。74367 是一种叫作“三态总线缓冲器”的 IC。在这个 IC 的电路图符号中,有用三角形标志代表的缓冲器,表示使电信号从右向左直接通过。但是,只有在 74367 的  引脚和  引脚同时为 0 的时候,电信号才能通过。而当  引脚和  引脚同时 为 1 时,74367 就会与电路隔离。

一旦打开了 Z80 CPU 的  引脚连接着的开关,就可以通过  引脚输出 0 得知 CPU 进入了 DMA 状态。 因此只要把 > 引脚连接到 4 个 74367 的   引脚和  引脚上,就可以实现通过 DMA 向内存写入数据了。

1.9 连接用于输入输出的外部设备

布线终于快结束了。下面该轮到把最下方用于输入数据的指拨开关和 LED 连接到 Z80 PIO 上了。当微型计算机运行起来后,指拨开关可用于从外部输入数据,LED 可用于向外部输出数据。用于输入数据的指拨开关,要连接到 Z80 PIO 的 PA0~PA7 引脚上。连接时没有使用 74367 是为了在程序运行中可以通过 Z80 PIO 从指拨开关获得输入的数据。表示输出数据的 LED 要通过电阻连接到 +5V 上。这里的布线方法依据惯例,输入 0V 点亮 LED(如图 1.9 所示)。LED 要通过 7404 这样的 IC 连接到 Z80 PIO 的 PB0~PB7 引脚上。

在 7404 的电路图符号中,末端带有一个小圆圈的三角形符号表示反相器,作用是将左侧输入的电信号反转后(即 0 变 1、1 变 0)输出到右侧。通过这样的设计,当 Z80 PIO 的 PB0~PB7 引脚上的值为 0 时 LED 就会熄灭,为 1 时 LED 就会点亮。

图 1.9 点亮 LED 的方法

是不是觉得忘记了什么呢?没错!74367 和 7404 上也都有 Vcc 引脚和 GND 引脚。请将它们分别连接到 +5V 和 0V 上。对于 74367 和 7404 中未使用的引脚(标有 NC 的引脚),或者什么都不连接,或者将它们连接到 GND 上。

1.10 输入测试程序并进行调试

微型计算机终于顺利地制作出来了,诸位辛苦了!微型计算机接上电源就能用了吗?其实还不能,因为尽管硬件组装好了,但若没有输入软件,计算机还是不能工作的。所以即使为微型计算机接通了电源,它也什么都执行不了。下面就编写一段测试程序吧。编写时可以使用哪种编程语言呢?是 BASIC、C 语言,还是 Java 呢?

其实这些语言都无法使用,因为作为计算机大脑的 CPU 只能解释执行一种编程语言,那就是靠罗列二进制数构成的机器语言(原生代码)。代码清单 1.1 展示了一段用机器语言编写的测试程序。程序是指令和数据的集合,表示指令或数据的数值是以 8 比特为一个单位存储到内存中的。这段程序只实现了一个简单的功能,那就是通过拨动连接到 Z80 PIO 上的指拨开关控制 LED 的亮或灭。

代码清单 1.1 用机器语言编写的测试程序

接通了微型计算机的电源后,请按下 Z80 CPU 上的 DMA 请求开关。在这个状态下,拨动用于输入内存程序和指定内存输入地址的两个指拨开关,把代码清单 1.1 所示的程序一行接一行地输入内存。

先来输入第一行代码,拨动用于指定地址的指拨开关,设定出第一行代码所在的内存地址 00000000,然后拨动用于输入程序的指拨开关,设定出程序代码 00111110。再然后按下用于向内存写入程序的按键开关。

接下来输入第二行代码,设定出内存地址 00000001,设定出程序代码 11001111,再次按下按键开关。反复进行这三步操作,直至输入完程序代码的最后一行。所有的指令都输入完成后,按下用于重置 CPU 的按键开关,控制 DMA 请求的快动开关就会还原成关闭状态,与此同时程序也就运行起来了。“太棒了,终于成功了!”这真是令人激动的一瞬间啊(如照片 1.2 所示)。

照片 1.2 运行中的微型计算机

程序一旦运行起来,就可以用用于输入数据的指拨开关控制 LED 的亮与灭。只要拨动指拨开关,LED 的亮灭就会随之改变。LED 并不会只亮一下,而是一直亮着,时刻保持着指拨开关上的状态。

如今活跃在计算机行业第一线的工程师们,他们多数都在年轻的时候玩过微型计算机。诸位可以把这本书拿给他们看,他们也许会这样说:现在还有人玩这个?不过不管怎么说,对计算机理解程度的深浅还是和有没有制作过微型计算机有很大关系的。

作者真的按照图 1.1 所示的电路图制作过微型计算机,收集零件就费了不少劲。而在单片机广泛应用的今天,CPU、I/O、内存都被集成到了一块 IC 上。可话又说回来,即便只是在纸上体验制作微型计算机的过程,也还是非常有益的。诸位在本章制作了微型计算机,想必这一体验定会加深诸位对计算机的理解,使诸位越来越喜欢计算机。

文末畅聊

来说说,你曾经鼓捣过的那些硬件吧!哪些给你留下了深刻印象?精选留言选出 3 位获得《计算机是怎样跑起来的》赠书一本。快来畅所欲言吧!留言截至2020.6.4。

推荐阅读:

霸榜18年,作者连续20年获得微软MVP,这本SQL书凭什么成为畅销经典

作为谷歌开发者布道师,我为什么要写这本通俗的《数据压缩入门》(一)

CSS Tricks网站创始人作序推荐,这本书助你成为Web开发高手

☟☟ 一键预约直播

如何制造一台计算机,编程多年后我开始思考这个问题相关推荐

  1. 制作一台计算机需要多少知识,如何制造一台计算机,编程多年后我开始思考这个问题...

    周末,我高中的弟弟问我这样一个问题:"为什么电脑都是从 C 盘开始?A 盘.B 盘哪去了?" 平时他总是问我一些奇怪的问题,其实这是个暴露年龄的问题,作为零五后,他不知道,我不怪他 ...

  2. 自制了一台计算机,可编程哦

    接触计算机多年,经常会有一种云里雾里的感觉.今天,一起动手来自制一台计算机,加深体会和理解. 必须说明的是,计算机有复杂的,也有简单的,但结构和原理基本相通,本文制作的是最简单的计算机. 我也会对自制 ...

  3. 如何在我的世界里打造一台计算机,在《我的世界》里从零打造一台计算机有多难?...

    一块小小的 CPU 里有多少个晶体管?几十亿个. 单枪匹马造出一个 CPU 乃至完整的电脑需要多长时间?有位大牛在<我的世界>游戏里用实际行动回答了这个问题:可能要花费一年多. 这篇造计算 ...

  4. 我的世界科学计算机,在我的世界打造一台计算机有多难?复旦大神花了一年

    欢迎关注"创事记"微信订阅号:sinachuangshiji 文/栗子 晓查 来源:量子位(ID:QbitAI) 一块小小的CPU里有多少个晶体管?几十亿个. 单枪匹马造出一个CP ...

  5. mc通用计算机,《我的世界》里打造一台计算机有多难?复旦大神花一年终于实现!...

    原标题:<我的世界>里打造一台计算机有多难?复旦大神花一年终于实现! 一块小小的CPU里有多少个晶体管?几十亿个. 单枪匹马造出一个CPU乃至完整的电脑需要多长时间?有位大牛在<我的 ...

  6. 从零打造一台计算机有多难?复旦本科生大神花费了一年心血!

    微信改版,置顶本公众号避免遗漏最新文章! 栗子 晓查 发自 凹非寺  量子位 报道 | 公众号 QbitAI 一块小小的CPU里有多少个晶体管?几十亿个. 单枪匹马造出一个CPU乃至完整的电脑需要多长 ...

  7. 厉害 !在《我的世界》里从零打造一台计算机有多难?复旦本科大神花费一年终于实现!...

    一块小小的CPU里有多少个晶体管?几十亿个. 单枪匹马造出一个CPU乃至完整的电脑需要多长时间?有位大牛在<我的世界>游戏里用实际行动回答了这个问题:可能要花费一年多. 这篇造计算机的教程 ...

  8. 在《我的世界》里从零打造一台计算机有多难?复旦本科生大神花费了一年心血......

    点击蓝色"五分钟学算法"关注我哟 加个"星标",天天中午 12:15,一起学算法 栗子 晓查 发自 凹非寺 量子位 报道 | 公众号 QbitAI 一块小小的C ...

  9. 在《我的世界》里从零打造一台计算机有多难?复旦本科生大神花费了一年心血...

    朋友的公众号在送书,晚上八点开奖,她说参与的人有点少,那索性拿过来给我的粉丝白piao一下,哈哈哈哈...:送66本技术书籍 栗子 晓查 发自 凹非寺  量子位 报道 | 公众号 QbitAI 一块小 ...

最新文章

  1. Python3.6.4 安装
  2. 如何将比Long类型更大数值字符串转化为整数
  3. 结对开发4----最大子数组(大数溢出)
  4. SpringSecurity认证用户状态的判断
  5. 网站性能优化--CRP
  6. springboot springcloud区别_SpringCloud微服务全家桶-第一篇!为什么要用微服务
  7. 【渝粤教育】 国家开放大学2020年春季 1443卫生信息与文献检索 参考试题
  8. python xml etree word_使用python格式化插入的元素xml.etree模块,包括新行
  9. 淘宝/天猫api 收货地址列表 API接口
  10. Python实验室-实现阿拉伯数字的大小写转换-解法1
  11. 【基础】PNP三极管导通条件____很具代表性
  12. 卸载Docker CE
  13. 并发完全知识点目录--yzy
  14. 网页通过Flash播放视频
  15. 2022年我应该怎么学习SAP?上篇
  16. 免线圈高频无线充电IC无线供电芯片方案芯片XKT-511
  17. Python可视化案例:Mutual Funds和ETFs对比
  18. dhcp应该开启还是关闭(dhcp应该开启还是关闭)
  19. Python 生成双峰分布的概率密度函数并画图
  20. 黑苹果+win10双系统折腾笔记

热门文章

  1. linux message日志只有4k,命令长期运行 常用技巧 Linux 服务器 · 404k的前后端日志...
  2. c语言怎么倒计时,如何在c语言程序中插入一个倒计时命令?
  3. ubuntu vasp 安裝_VASP安装过程(64位)
  4. java取服务器时间的函数,非常有用的Java日期时间操作函数代码一览
  5. 扩展源_Ubuntu14版本下无法使用php7.2版本的bcmath扩展
  6. 事件计划自动关闭_首部L3级自动驾驶国际法规之ALKS功能解读
  7. 【c语言】蓝桥杯算法训练 sign函数
  8. linux+传输文件时卡住,linux - rsync 同步文件时卡住不动
  9. Tido 习题-二叉树-树状数组求逆序对
  10. 【剑指offer】整数中1出现的次数,C++实现