第 2 章 试着制造一台计算机吧

第 2 章 试着制造一台计算机吧

热身问答

在阅读本章内容前,让我们先回答下面的几个问题来热热身吧。

问题

初级问题

CPU 是什么的缩写?

中级问题

Hz 是表示什么的单位?

高级问题

Z80 CPU 是多少比特的 CPU ?

怎么样?被这么一问,是不是发现有一些问题无法简单地解释清楚呢?下面,笔者就公布答案并解释。

答案

初级问题:CPU 是 Central Processing Unit(中央处理器)的缩写。

中级问题:Hz(赫兹)是频率的单位。

高级问题:Z80 CPU 是 8 比特的 CPU。

解释

初级问题:CPU 是计算机的大脑,负责解释、执行程序的内容。有时也将 CPU 称作“处理器”。

中级问题:通常用 Hz 来表示驱动 CPU 运转的时钟信号的频率。1 秒发出 1 次时钟信号就是 1Hz,所以 100MHz(兆赫兹)的话就是 100×100 万 = 1 亿次/秒。M(兆)代表 100 万。

高级问题:CPU 上数据总线的条数,或者 CPU 内部参与运算的寄存器的容量,都可以作为衡量 CPU 性能的比特数。在 Z80 CPU 中,无论是数据总线的条数还是寄存器的容量都是 8 比特,所以 Z80 CPU 是一款 8 比特的 CPU。而在 Windows 个人计算机中广泛使用的 Pentium(奔腾)CPU 则是 32 比特的 CPU。

本章重点

要想彻底掌握计算机的工作原理,最好的方法就是自己搜集零件,试着组装一台微型计算机。微型计算机(MicroCom)是 Micro Computer 的缩写,字面含义是微小的计算机,但一般也可用于指代 IC 元件外露的、用于控制的计算机。因为要制作一台真正的微型计算机既花时间又花金钱,所以本章就在纸上体验一下微型计算机的制作过程吧。需要让诸位准备的只有如图 2.1 所示的电路图和一根红铅笔。将电路图复印下来后,请诸位一边想象着元件之间传输的信号的作用,一边用红铅笔描画出笔者所介绍的电路,以此来代替实际的布线环节。当所有的电路都描红了,微型计算机也就完成了。

别看只是描了描线,却一样能学到很多知识,甚至可以说不费吹灰之力就能了解计算机的工作原理。从此之后不但消除了对硬件的恐惧感,而且还会感到和计算机更加亲近了。请诸位一定要借此机会体验微型计算机的制作过程。

2.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。这里要先跟诸位打声招呼,这里制作的微型计算机终归只是用于学习的模型,并没有什么实用的价值。

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

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

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

图 2.2 时钟信号的波形图

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

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

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

电阻是用于阻碍电流流动、降低电压值的元件。为了省去布线的麻烦,这里也会使用将 8 个电阻集成到 1 个元件中的集成电阻(如照片 2.1(b) 所示)。电阻的单位是 Ω(欧姆)。电容是存储电荷的元件,衡量存储电荷能力的单位是 F(法拉)。要让微型计算机运转起来,5V(伏特)的直流电源是必不可少的。于是还需要使用一个叫作“开关式稳压电源”的装置,将 220V 的交流电变成 5V 的直流电。

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

2.2 电路图的读法

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

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

图 2.4 电源的表示方法

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

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

图 2.5 如何数 IC 的引脚序号

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

1有时也会遵循引脚序号的顺序绘制电路图,这样的电路图叫作实物布线图。

2写在引脚旁边的代号,其含义会写在 IC 生产厂商发布的资料中,但在这里为了保持文章的通俗易懂,改变了一部分代号的写法,这一点还望诸位谅解。例如,在厂商的资料中 TC5517 的第 20 个引脚的代号是 OE(Output Enable,输出使能),在这里则改为了含义相同的 RD(Read,读取)。

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

图 2.6 TC5517 的内部构造

2.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 比特数据的外部设备(如图 2.7 所示)。

图 2.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。

2.5 连接时钟信号

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

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

2.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 的话就是输出(如表 2.2 所示)。

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

Z80 CPU的操作

引脚

引脚

引脚

引脚

从内存输入

0

1

0

1

向内存输出

0

1

1

0

从I/O输入

1

0

0

1

向I/O输出

1

0

1

0

2.7 连接剩余的控制引脚

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

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

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

图 2.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 的角度看)。

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

Z80 CPU
引脚的代号方向作用
A0~A15输出指定地址
D0~D7输入输出输入输出数据
输出把输入输出对象设定为内存
输出把输入输出对象设定为I/O
输出读取数据
输出写入数据
输入接收DMA请求
输出响应DMA请求
输出用于同步
输入接收中断请求
CLK输入接收时钟信号
输入重置
输入(这里未使用)
输入(这里未使用)
输出(这里未使用)
输出(这里未使用)
A0~A10输入指定地址
D0~D7输入输出输入输出数据
输入在电路中激活IC
输入读取数据
输入写入数据

 

Z80 PIO
引脚的代号方向作用
输入选择端口B或端口A
输入选择控制模式或数据模式
D0~D7输入输出从CPU读取数据或向CPU写入数据
输入在电路中激活IC
输入在电路中激活IC
输入用于同步
输出发出中断请求
输入选择是读取数据还是写入数据
CLK输入接收时钟信号
PA0~PA7输入输出从外部设备读取数据或向外部设备写入数据
PB0~PB7输入输出从外部设备读取数据或向外部设备写入数据
输入(这里未使用)
ARDY输出(这里未使用)
输入(这里未使用)
BRDY输出(这里未使用)
IEI输入(这里未使用)
IEO输出(这里未使用)

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

2.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 向内存写入数据了。

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

布线终于快结束了。下面该轮到把最下方用于输入数据的指拨开关和 LED 连接到 Z80 PIO 上了。当微型计算机运行起来后,指拨开关可用于从外部输入数据,LED 可用于向外部输出数据。

用于输入数据的指拨开关,要连接到 Z80 PIO 的 PA0~PA7 引脚上。连接时没有使用 74367 是为了在程序运行中可以通过 Z80 PIO 从指拨开关获得输入的数据。

表示输出数据的 LED 要通过电阻连接到 +5V 上。这里的布线方法依据惯例,输入 0V 点亮 LED(如图 2.9 所示)。LED 要通过 7404 这样的 IC 连接到 Z80 PIO 的 PB0~PB7 引脚上。在 7404 的电路图符号中,末端带有一个小圆圈的三角形符号表示反相器,作用是将左侧输入的电信号反转后(即 0 变 1、1 变 0)输出到右侧。通过这样的设计,当 Z80 PIO 的 PB0~PB7 引脚上的值为 0 时 LED 就会熄灭,为 1 时 LED 就会点亮。

图 2.9 点亮 LED 的方法

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

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

微型计算机终于顺利地制作出来了,诸位辛苦了!微型计算机接上电源就能用了吗?其实还不能,因为尽管硬件组装好了,但若没有输入软件,计算机还是不能工作的。所以即使为微型计算机接通了电源,它也什么都执行不了。

下面就编写一段测试程序吧。编写时可以使用哪种编程语言呢?是 BASIC、C 语言,还是 Java 呢?其实这些语言都无法使用,因为作为计算机大脑的 CPU 只能解释执行一种编程语言,那就是靠罗列二进制数构成的机器语言(原生代码)。代码清单 2.1 展示了一段用机器语言编写的测试程序。程序是指令和数据的集合,表示指令或数据的数值是以 8 比特为一个单位存储到内存中的。这段程序只实现了一个简单的功能,那就是通过拨动连接到 Z80 PIO 上的指拨开关控制 LED 的亮或灭。有关机器语言的细节将在接下来的第 3 章中介绍。

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

地址           程序
00000000       00111110
00000001       11001111
00000010       11010011
00000011       00000010
00000100       00111110
00000101       11111111
00000110       11010011
00000111       00000010
00001000       00111110
00001001       11001111
00001010       11010011
00001011       00000011
00001100       00111110
00001101       00000000
00001110       11010011
00001111       00000011
00010000       11011011
00010001       00000000
00010010       11010011
00010011       00000001
00010100       11000011
00010101       00010000
00010110       00000000

接通了微型计算机的电源后,请按下 Z80 CPU 上的 DMA 请求开关。在这个状态下,拨动用于输入内存程序和指定内存输入地址的两个指拨开关,把代码清单 2.1 所示的程序一行接一行地输入内存。先来输入第一行代码,拨动用于指定地址的指拨开关,设定出第一行代码所在的内存地址 00000000,然后拨动用于输入程序的指拨开关,设定出程序代码 00111110。再然后按下用于向内存写入程序的按键开关。接下来输入第二行代码,设定出内存地址 00000001,设定出程序代码 11001111,再次按下按键开关。反复进行这三步操作,直至输入完程序代码的最后一行。所有的指令都输入完成后,按下用于重置 CPU 的按键开关,控制 DMA 请求的快动开关就会还原成关闭状态,与此同时程序也就运行起来了。“太棒了,终于成功了!”这真是令人激动的一瞬间 啊(如照片 2.2 所示)。

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

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

☆   ☆   ☆

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

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

在接下来的第 3 章中,笔者会先用汇编语言为微型计算机编写程序,然后尝试“手工汇编”,即以手工作业的方式将这段程序转换成机器语言(原生代码)。敬请期待!

目录

  • 版权声明
  • 前言
  • 关键词
  • 本书结构
  • 第 1 章 计算机的三大原则
  • 第 2 章 试着制造一台计算机吧
  • 第 3 章 体验一次手工汇编
  • 第 4 章 程序像河水一样流动着
  • 第 5 章 与算法成为好朋友的七个要点
  • 第 6 章 与数据结构成为好朋友的七个要点
  • 第 7 章 成为会使用面向对象编程的程序员吧
  • 第 8 章 一用就会的数据库
  • 第 9 章 通过七个简单的实验理解 TCP/IP 网络
  • 第 10 章 试着加密数据吧
  • 第 11 章 XML 究竟是什么
  • 第 12 章 SE 负责监管计算机系统的构建
  • 结束语
  • 谢辞