2.1 制作微型计算机所需的元件
制作微型计算机所需的基础元件只有 3 个:
CPU, 负责解释、执行程序,这里使用 Z80 CPU
内存, 负责存储程序和数据, TC5517
I/O, 负责将计算机和外部设备(周边设备)连接在一起, Z80 PIO
Z80 是一款古老的CPU, TC5517 是可以存储 2K 的 8比特数据的内存。 PIO ( Parallel I/O) 可以在微型计算机和外部设备之间并行地(一排一排地)输入输入8 比特的数据。
辅助元件:
时钟发生器: 为了驱动 CPU运转, 称为 “ 时钟信号” 的电信号必不可少, 这种电信号就好像自身带有一个时钟, 每隔一定时间就变换一次电压的高低, 输出时钟信号的元件叫做 “时钟发生器” 。 时钟发生器中带有晶振, 根据其自身的频率(振动的次数) 产生时钟信号, 时钟信号的频率可以衡量 CPU的运转速度, 这里使用的是 2.5MHZ 的时钟发生器
(每隔 1 s 发出 1 次时钟信号就是 1 Hz)
指拨开关: 用于输入程序 的装置也是必不可少的, 在这里我们通过拨动指拨开关来输入程序, 指拨开关是由 8 个 开关并排连在一起构成的元件,
输出程序 执行结果的装置是 8 个 LED(发光二极管)。
剩下一些细碎的元件, 电阻是用于阻碍电流流动、降低电压值的元件。 为了省去布线的麻烦, 这里会使用将 8 个电阻集成到 1 个元件中的集成电阻。
要让微型计算机运转起来, 5 V的直流电源是必不可少的, 于是还需要使用一个叫作 “ 开关式稳压电源” 的装置, 将220 V 的交流电变成 5 V的直流电。
用到的元件列表
2.2 电路图的读法
电路中有些地方有交叉,但若只是交叉在一起的话, 并不表示电路在交叉处构成通路。只有在交叉处再画上一个小黑点才表示构成通路。
使用如图所示的两种电路图符号来分别表示电路连接到 + 5V 和连接到 0V 的情况。
IC的引脚(所谓引脚就是 IC 边缘露出的像蜈蚣腿一样的部分) 按照逆时针方向依次带有一个从 1 开始递增的序号。
数引脚序号时, 要先表示正方向的标志, 比如 半圆形的缺口, 朝向左侧。举例说明:
如果按照引脚的排列顺序来画 IC 电路图符号, 那么标示如何布线就会很不方便。 所以通常所绘制的电路图都不受引脚实际排布的限制。
画图时,在引脚的旁边写上引脚的序号,在表示 IC 的矩形符号中写上表明该引脚作用的代号。 代号就是像 RD(Read) 表示执行读取操作, WR(Write)表示执行写入操作这样的代表了某种操作的符号。
2.3 连接电源、数据和地址总线
下面开始布线:
首先连接电源。
IC与普通的电气一样, 只有接通了电源才能工作, Z80 CPU 、 TC5517 和 Z80 PIO 上都分别带有 Vcc 引脚 和 GND 引脚。 Vcc 和 GND 这一对儿引脚用于为 IC供电。
将+5V 电源连接到各个 IC 的Vcc 引脚上
将 0V 电源牛连接到各个 IC 的 GND 引脚上。
将 + 5V 和 0V 连接到时钟发生器上。
接通电源后这些 IC 和时钟发生器就可以工作了。
CPU 的 Vcc 、 GND 引脚
内存 的 Vcc 、 GND 引脚
时钟发生器的 Vcc 、 GND 引脚
I/O 的 Vcc 、 GND 引脚 微型计算机所使用的 IC 属于数字 IC。 在数字 IC 中,每个引脚上的电压要么是 0V、 要么是 +5V, 通过这两个电压与其他的IC 进行电信号的收发, 用于给 IC供电的 Vcc 引脚和 GND 引脚上的电压是恒定不变的 +5V 和 0V,但是其他引脚上的电压,会随着计算机的操作在 +5V 和 0V 之间不断地变化。
只要想成 0V 表示数字 0 , +5 V 表示数字 1, 那么数字 IC 就是在用二进制数的形式收发信息。1个二进制是 1 比特,比特是信息的基本单位, 字节是信息的基本单位, 这里制作的微型计算机是一台 8 比特微型计算机, 因此是以 8 比特为一个单位收发信息的。
数据的输入输出
计算机以 CPU 为中心运转, CPU可以与内存或 I/O 进行数据的输入输出,(即他们之间有连接),
地址总线引脚
为了指定输入输出数据时的源头或目的地, CPU上备有 “ 地址总线引脚”。
其中 A 表示 Address (地址) , 16 个地址总线引脚所能指定的地址共有 65536 个, 用二进制数表示的话就是 0000000000000000 ~ 1111111111111111. 因此 Z80 可以指定 65536 个数据存储单元(内存存储单元或 I/O 地址),进行信息的输入输出。
一旦指定了存取数据的地址, 就可以使用数据总线引脚进行数据的输入输出了。 Z80 CPU 的数据总线引脚共有 8 个, 用代号 D0 ~ D7表示, D 表示 Data ,后面的数字0 ~ 7表示二进制中各个数字的位置。 Z80 CPu 可以一次性地输入输出 8 比特的数据, 这意味着如果想要输入输出位数(比特数) 大于 8比特的数据,就要以 8 比特作为单位切分这个数据。
作为内存的 TC5517 也有地址总线引脚和数据总线引脚。 这些引脚需要同 Z80 CPU 上带有相同代号的引脚相连, 一块 TC5517 上可以存储 2048 个 8 比特的数据。如下所示:
可是由于用于输入程序的指拨开关是以 8 比特为一个单位指定内存地址的, 所以我们只使用 TC5517 上的 A0~ A7这 8个引脚, 并把剩余的 A8~ A10 引脚连接到 0V 上(这些引脚上的值永远是 0)
(指拨开关的位置) 虽然总共有 2048 个存储单元,最终却只能使用其中的 256 个,稍微有些浪费。
2.4 连接 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 所示)。
因为 Z80 PIO 上也有 D0~D7 的数据总线引脚,所以先把它们和 Z80CPU 中带有同样代号的引脚连接起来。这样 CPU 和 PIO 就能使用这 8个引脚交换数据了。
接下来要把 Z80 PIO 的 B/A 和 C/D 引脚分别连接到 Z80 CPU 的地址总线引脚 A0 和 A1 上。
若表示 IC 引脚作用的代号上划有横线,则表示通过赋予该引脚 0(0V)可使之有效。(通0V电源)
反之若没有横线,则表示通过赋予该引脚 1(+5V)可使之有效。(通 +5V 电源)
因此若赋予 B/A 引脚 1 则表示选中 B,反之赋予 0 则表示选中 A。同样地,若赋予 C/D 引脚 1 则表示选中的是 C(C 即 Control,表示控制模式);反之赋予 0 则表示选中的是 D(D 即 Data,表示数据模式)。
过 Z80 CPU 的 A0~A7(00000000~11111111 共 256 个地址)地址总线引脚可以选择内存(TC5517)中的存储单元。同样地,使用 Z80CPU 的 A0~A1(00~11 共 4 个地址)地址总线引脚也可以选择 I/O (Z80 PIO)中的寄存器。
Z80 CPU 的 A8~A15 地址总线引脚尚未使用,所以什么都不连接。在电路图中可以用代号 NC(NoConnection,未连接)表示引脚什么都不连接。IC 上的引脚有些只用于输出,有些只用于输入,还有些是输入输出两用的。
对于只用于输出的引脚,不需要使用时的处理方法是这个引脚什么都不连接。
而对于只用于输入或输入输出两用的引脚,不需要使用时的处理方法则是把这个引脚上的电压固定成是 +5V 或 0V。
2.5 连接时钟信号
正如前文所述, Z80 CPU 和 Z80 PIO 的运转离不开时钟信号。 为了传输时钟信号, 就需要把时钟发生器的 8 号引脚和 Z80 CPU 的 CLK(CLK 即 Clock,时钟)引脚、Z80 PIO 的 CLK 引脚分别连接起来**。时钟发生器的 8 号引脚与 +5V 之间的电阻用于清理时钟信号。**
我们可以把 Z80 CPU 和 Z80 PIO 在时钟信号下运转的情景, 想象成是它们在跟随着滴答滴答响的时钟同步做动作。
2.6 连接用于区分读写对象是内存还是 I/O 的引脚
至此,我们已经先后把 Z80 CPU 连接到了 TC5517 和 Z80 PIO 上,这两次连接都使用了地址总线引脚 A0 和 A1
如果仅仅这样连接, 当地址的最后两位是 00、01、10 和 11 时,CPU 就无法区分访问的是 TC5517 中的存储单元,还是 Z80 PIO 中的寄存器了。
解决问题的引脚 : MREQ(Memory Request,内存请求)引脚和 IORQ (I/O Request, I/O 请求)。
当 Z80 CPU 和内存之间有数据输入输出时,MREQ 引脚上的值是 0,反之则是 1。
当 Z80 CPU 和 I/O 之间有数据输入输出时,IORQ 引脚上的值是 0,反之则是 1。
CE 引脚:
内存: 若把 TC5517 的 CE(即 Chip Enable,选通芯片)引脚设成 0, 则 TC5517 在电路中被激活,若设成 1,则从电路中隔离。 因为此时TC5517 进入了高阻抗状态,所以即便它上面的引脚已经接入了电路也不会接收任何电信号。
I/O : 在 Z80 PIO 中,则是通过将 CE 引脚和 IORQ 引脚同时设为 0 或 1,来达到与 TC5517 的 CE 引脚相同的效果。若同时设为 0,则 Z80 PIO 在电路中被激活,若同时设为 1 则从电路中隔离(之所以使用两个引脚是因为这样更适合使用了多个 I/O 的情况)。== I/O 具有特殊性==
对内存和 I/O 而言, 还必须要分清 CPU 是要输入数据还是要输出数据。—— RD 引脚和 WR引脚。
Z80 CPU 的 RD 引脚(即 Read,表示输入,为 0 时执行输入操作)和 WR 引脚(即 Write,表示输出,为 0 时执行输出操作)了。
Z80 PIO虽然只有 RD 引脚,但由于数字 IC 引脚上的值要么是 0 要么是 1,所以只用 1 个 RD 引脚也能区分是输入还是输出,0 的话是输入,1 的话就是输出(如表 2.2 所示)。
2.7 连接剩余的控制引脚
CPU、内存、I/O 中不但有地址总线引脚、数据总线引脚,还有其他引脚,通常把这些引脚统称为“控制引脚”。之所以这样命名时因为这些引脚上输入输出的电信号具有控制 IC 的功能。
MI 引脚和 INT引脚: M1 是用于同步的引脚,INT 引脚是用于从 Z80 PIO 向 Z80 CPU发出中断请求的引脚。首先把 Z80 CPU 的 M1 引脚(即 Machine Cycle 1,机器周期 1)和 INT 引脚(即 Interrupt,中断)与 Z80 PIO 上标有相同代号的引脚连接起来。
所谓中断就是让 CPU 根据外部输入的数据执行特定的程序。![在这里插入图片描述](
?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0NTg3ODU1,size_16,color_FFFFFF,t_70)
中断对于计算机的运行来说很重要。
RESET 引脚(即 Reset,重置)。一旦把 Z80 CPU 的 RESET 引脚(即 Reset,重置)上的值先设成 0
再还原成 1,CPU 就会被重置,重新从内存 0 号地址上的指令开始顺序往下执行。
重置 CPU 可以通过按键开关完成。按键开关需要经过电阻接在 +5V 和 0V 之间。请仔细地观察这一部分的电路图,可以看出RESET 引脚上平时是 +5V(即 1)。当按下按键开关时,RESET 引脚就变成了 0V(即 0),而放开按键开关后又会回到 +5V(即 1)。电阻是为了防止短路而加入的,否则一旦按下了按键开关,+5V 和 0V 就会直接接到一起发生短路。像这样通过加入电阻把 +5V 和 0V 连接起来的方法在电路图中随处可见(如图 2.8 所示)。
电容的作用:
连接在 RESET 引脚上的电容,用于在电路接通电源时自动重置CPU。电容就好像一个充电电池,具有储存电荷的功能。在通电后的一刹那,由于电容正在充电,所以 RESET 引脚上的电压并不会立刻上升到 +5V。而完成充电后,RESET 引脚的电压会变为 +5V,这样就相当于 RESET 引脚上的值从 0 变成了 1,重置了一次 CPU。
总线:
总线是连接到 CPU 中数据引脚、地址引脚、控制引脚上的电路的统称。使用快动开关可以使 Z80 CPU 的 BUSRQ 引脚(即 Bus Request,总线请求)上的值在 0 和 1 之间切换。
若将 BUSRQ 引脚的值设为 0,则 Z80 CPU 从电路中隔离。当处于这种隔离状态时,就可以不通过CPU,手动地向内存写入程序了。
像这样不经过 CPU 而直接从外部设备读写内存的行为叫作 DMA(Direct Memory Access,直接存储器访问)。在诸位所使用的个人计算机里,硬盘等设备要读写内存时使用的就是 DMA。
DMA 与 CPU的合作任务
当 Z80 CPU 从电路中隔离后,BUSAK 引脚(即 Bus Acknowledge,响应总线请求)上的值就会变成 0。也就是说,把 BUSRQ 引脚上的值设成 0 以后,还要确认 BUSAK 引脚上的值已经变成了 0,然后才能进行 DMA。
Z80 CPU 的其他控制引脚并未使用。所以要把 WAIT 引脚和 NMI引脚上的值设为 1,即连接到 +5V 上。之所以在连接时加入电阻,是为了便于今后加入开关等元件。请诸位先记住一个词——上拉(Pull-up),指的就是像这样通过加入电阻把元件的引脚和 +5V 连接起来。剩下的 HALT 引脚和 ASTB 引脚什么都不连接。
Z80 PIO 的 PA0~PA7(PA 表示 Port A)以及 PB0~PB7(PB 表示Port B)用于与外部设备进行输入输出,所以稍后要把它们分别连接到指拨开关和 LED 上。对于剩下的几个引脚可以这样处理:将 IEI 引脚上拉,IEO 引脚、ASTB 引脚、ARDY 引脚、BSTB 引脚和 BRDY 引脚则什么都不连接。
其实计算机的工作原理非常简单。CPU在时钟信号的控制下解释、执行内存中存储的程序,按照程序中的指令从内存或 I/O 中把数据输入到 CPU 中,在 CPU 内部进行运算,再把运算结果输出到内存或 I/O 中。无论是小型的微型计算机,还是高性能的个人计算机,其工作原理都是相同的。
2.8 连接外部设备, 通过DMA输入程序
下面我们继续布线,这次将计算机主机系统和外部设备连接起来。我们要使用 2 个指拨开关和 1 个按键开关,向地址总线引脚和数据总线引脚发送电信号,然后通过 DMA 将数据总线上的数据存储到内存。下面我们就先将这些元件连接到电路中。
将右侧最上方的一个指拨开关连接到作为内存的TC5517 的数据总线引脚 D0~D7 上。
再将它下面紧挨着它的指拨开关连接到 TC5517 的地址总线引脚 A0~A7 上。
第 3 个指拨开关则通过电阻接到 +5V 上,这样拨动这个指拨开关就可以输入 +5V 或 0V 的信号了。
接下来将用于控制内存写入的按键开关连接到 TC5517 的 WE 引脚上。
为了写入数据,还要将 TC5517 的 RD 引脚上拉起来,连接到 +5V上,然后把 CE 引脚连接到 0V 上。
把这些元件都连接起来以后,就可以拨动指拨开关,用二进制数设定地址总线引脚和数据总线引脚上的数据了。设定完后按下按键开关,数据就会被写入 TC5517 中。
但是如果这些开关直接连接到了 TC5517 的各个引脚上,在程序执行时,开关的状态就会对电路产生影响。因此要使用 74367,在程序执行时把开关从电路中隔离出来。74367 是一种叫作“三态总线缓冲器”的 IC。在这个 IC 的电路图符号中,有用三角形标志代表的缓冲器,表示使电信号从右向左直接通过。但是,只有在 74367 的 G1 引脚和 G2引脚同时为 0 的时候,电信号才能通过。而当 G1 引脚和 G2 引脚同时为 1 时,74367 就会与电路隔离。
一旦打开了 Z80 CPU 的 BUSRQ 引脚连接着的开关,就可以通过 BUSAK 引脚输出 0 得知 CPU 进入了 DMA 状态。因此只要把 BUSAK引脚连接到 4 个 74367 的 G1 引脚和 G2 引脚上,就可以实现通过DMA 向内存写入数据了。
2.9 连接用于输入输出的外部设备
下面轮到把指拨开关和 LED 连接到 Z80 PIO 上了, 当微型计算机运行起来后, 指拨开关可用于从外部输入数据, LED 可用于向外部输出数据。
用于输入数据的指拨开关, 要连接到 Z80 PIO 的 PA0 ~ PA7 引脚上。 连接时没有使用 74367 是为了在程序运行中可以通过 Z80 PIO 从指拨开关获得输入的数据。
表示输出数据的 LED 要通过电阻连接到 +5V 上, 依据惯例, 输入 0V 点亮 LED , LED 要通过 7404 这样的 IC 连接到 Z80 PIO 的 PB0 ~ PB7 引脚上, 在 7404 的电路图符号上, 末端带有一个小圆圈的三角形符号表示反相器,作用是将左侧输入的电信号反转后(即 0 变 1、1 变 0)输出到右侧。通过这样的设计,当Z80 PIO 的 PB0~PB7 引脚上的值为 0 时 LED 就会熄灭,为 1 时 LED就会点亮。
74367 和 7404 上也都有 Vcc 引脚和 GND 引脚。请将它们分别连接到 +5V 和 0V 上。对于 74367 和7404 中未使用的引脚(标有 NC 的引脚),或者什么都不连接,或者将它们连接到 GND 上。
2.10 输入测试程序并进行调试
微型计算机尽管硬件组装好了, 但若没有输入软件, 计算机还是不能工作的, 所以即使为微星计算机接通了电源, 它也什么都执行不了。
下面编写一段测试程序。 编写时应该使用哪种编程语言呢? BASIC ? C 语言? Java? 其实这些语言都无法使用, 因为作为计算机大脑的 CPU 只能解释一种编程语言, 那就是靠罗列二进制数构成的机器语言(原生代码)。
如下展示了一段用机器语言编写的测试程序。 程序是指令和 数据的集合, 表示指令或数据的数值是以 8 比特为一个单位存储到内存中的, 这段程序只实现了一个简单的功能,那就是通过拨动连接到 Z80 PIO上的指拨开关控制LED的亮或灭。
接通了微型计算机的电源后,请按下 Z80 CPU 上的 DMA 请求开关。在这个状态下,拨动用于输入内存程序和指定内存输入地址的两个指拨开关,把代码清单 2.1 所示的程序一行接一行地输入内存。
先来输入第一行代码,拨动用于指定地址的指拨开关,设定出第一行代码所在的内存地址 00000000,然后拨动用于输入程序的指拨开关,设定出程序代码 00111110。再然后按下用于向内存写入程序的按键开关。
接下来输入第二行代码,设定出内存地址 00000001,设定出程序代码11001111,再次按下按键开关。反复进行这三步操作,直至输入完程序代码的最后一行。
所有的指令都输入完成后,按下用于重置 CPU 的按键开关,控制 DMA 请求的快动开关就会还原成关闭状态,与此同时程序也就运行起来了。(如照片 2.2 所示)。程序一旦运行起来,就可以用第 3个指拨开关控制 LED的亮与灭, 只要拨动指拨开关, LED的亮灭就会随之改变。 LED并不会只亮一下, 而是一直亮着, 时刻保持指拨开关上的状态。
在单片机广泛应用的今天,CPU、I/O、内存都被集成到了一块 IC 上。
2.1 制作微型计算机所需的元件
制作微型计算机所需的基础元件只有 3 个:
CPU, 负责解释、执行程序,这里使用 Z80 CPU
内存, 负责存储程序和数据, TC5517
I/O, 负责将计算机和外部设备(周边设备)连接在一起, Z80 PIO
Z80 是一款古老的CPU, TC5517 是可以存储 2K 的 8比特数据的内存。 PIO ( Parallel I/O) 可以在微型计算机和外部设备之间并行地(一排一排地)输入输入8 比特的数据。
辅助元件:
时钟发生器: 为了驱动 CPU运转, 称为 “ 时钟信号” 的电信号必不可少, 这种电信号就好像自身带有一个时钟, 每隔一定时间就变换一次电压的高低, 输出时钟信号的元件叫做 “时钟发生器” 。 时钟发生器中带有晶振, 根据其自身的频率(振动的次数) 产生时钟信号, 时钟信号的频率可以衡量 CPU的运转速度, 这里使用的是 2.5MHZ 的时钟发生器
(每隔 1 s 发出 1 次时钟信号就是 1 Hz)
指拨开关: 用于输入程序 的装置也是必不可少的, 在这里我们通过拨动指拨开关来输入程序, 指拨开关是由 8 个 开关并排连在一起构成的元件,
输出程序 执行结果的装置是 8 个 LED(发光二极管)。
剩下一些细碎的元件, 电阻是用于阻碍电流流动、降低电压值的元件。 为了省去布线的麻烦, 这里会使用将 8 个电阻集成到 1 个元件中的集成电阻。
要让微型计算机运转起来, 5 V的直流电源是必不可少的, 于是还需要使用一个叫作 “ 开关式稳压电源” 的装置, 将220 V 的交流电变成 5 V的直流电。
用到的元件列表
2.2 电路图的读法
电路中有些地方有交叉,但若只是交叉在一起的话, 并不表示电路在交叉处构成通路。只有在交叉处再画上一个小黑点才表示构成通路。
使用如图所示的两种电路图符号来分别表示电路连接到 + 5V 和连接到 0V 的情况。
IC的引脚(所谓引脚就是 IC 边缘露出的像蜈蚣腿一样的部分) 按照逆时针方向依次带有一个从 1 开始递增的序号。
数引脚序号时, 要先表示正方向的标志, 比如 半圆形的缺口, 朝向左侧。举例说明:
如果按照引脚的排列顺序来画 IC 电路图符号, 那么标示如何布线就会很不方便。 所以通常所绘制的电路图都不受引脚实际排布的限制。
画图时,在引脚的旁边写上引脚的序号,在表示 IC 的矩形符号中写上表明该引脚作用的代号。 代号就是像 RD(Read) 表示执行读取操作, WR(Write)表示执行写入操作这样的代表了某种操作的符号。
2.3 连接电源、数据和地址总线
下面开始布线:
首先连接电源。
IC与普通的电气一样, 只有接通了电源才能工作, Z80 CPU 、 TC5517 和 Z80 PIO 上都分别带有 Vcc 引脚 和 GND 引脚。 Vcc 和 GND 这一对儿引脚用于为 IC供电。
将+5V 电源连接到各个 IC 的Vcc 引脚上
将 0V 电源牛连接到各个 IC 的 GND 引脚上。
将 + 5V 和 0V 连接到时钟发生器上。
接通电源后这些 IC 和时钟发生器就可以工作了。
CPU 的 Vcc 、 GND 引脚
内存 的 Vcc 、 GND 引脚
时钟发生器的 Vcc 、 GND 引脚
I/O 的 Vcc 、 GND 引脚 微型计算机所使用的 IC 属于数字 IC。 在数字 IC 中,每个引脚上的电压要么是 0V、 要么是 +5V, 通过这两个电压与其他的IC 进行电信号的收发, 用于给 IC供电的 Vcc 引脚和 GND 引脚上的电压是恒定不变的 +5V 和 0V,但是其他引脚上的电压,会随着计算机的操作在 +5V 和 0V 之间不断地变化。
只要想成 0V 表示数字 0 , +5 V 表示数字 1, 那么数字 IC 就是在用二进制数的形式收发信息。1个二进制是 1 比特,比特是信息的基本单位, 字节是信息的基本单位, 这里制作的微型计算机是一台 8 比特微型计算机, 因此是以 8 比特为一个单位收发信息的。
数据的输入输出
计算机以 CPU 为中心运转, CPU可以与内存或 I/O 进行数据的输入输出,(即他们之间有连接),
地址总线引脚
为了指定输入输出数据时的源头或目的地, CPU上备有 “ 地址总线引脚”。
其中 A 表示 Address (地址) , 16 个地址总线引脚所能指定的地址共有 65536 个, 用二进制数表示的话就是 0000000000000000 ~ 1111111111111111. 因此 Z80 可以指定 65536 个数据存储单元(内存存储单元或 I/O 地址),进行信息的输入输出。
一旦指定了存取数据的地址, 就可以使用数据总线引脚进行数据的输入输出了。 Z80 CPU 的数据总线引脚共有 8 个, 用代号 D0 ~ D7表示, D 表示 Data ,后面的数字0 ~ 7表示二进制中各个数字的位置。 Z80 CPu 可以一次性地输入输出 8 比特的数据, 这意味着如果想要输入输出位数(比特数) 大于 8比特的数据,就要以 8 比特作为单位切分这个数据。
作为内存的 TC5517 也有地址总线引脚和数据总线引脚。 这些引脚需要同 Z80 CPU 上带有相同代号的引脚相连, 一块 TC5517 上可以存储 2048 个 8 比特的数据。如下所示:
可是由于用于输入程序的指拨开关是以 8 比特为一个单位指定内存地址的, 所以我们只使用 TC5517 上的 A0~ A7这 8个引脚, 并把剩余的 A8~ A10 引脚连接到 0V 上(这些引脚上的值永远是 0)
(指拨开关的位置) 虽然总共有 2048 个存储单元,最终却只能使用其中的 256 个,稍微有些浪费。
2.4 连接 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 所示)。
因为 Z80 PIO 上也有 D0~D7 的数据总线引脚,所以先把它们和 Z80CPU 中带有同样代号的引脚连接起来。这样 CPU 和 PIO 就能使用这 8个引脚交换数据了。
接下来要把 Z80 PIO 的 B/A 和 C/D 引脚分别连接到 Z80 CPU 的地址总线引脚 A0 和 A1 上。
若表示 IC 引脚作用的代号上划有横线,则表示通过赋予该引脚 0(0V)可使之有效。(通0V电源)
反之若没有横线,则表示通过赋予该引脚 1(+5V)可使之有效。(通 +5V 电源)
因此若赋予 B/A 引脚 1 则表示选中 B,反之赋予 0 则表示选中 A。同样地,若赋予 C/D 引脚 1 则表示选中的是 C(C 即 Control,表示控制模式);反之赋予 0 则表示选中的是 D(D 即 Data,表示数据模式)。
过 Z80 CPU 的 A0~A7(00000000~11111111 共 256 个地址)地址总线引脚可以选择内存(TC5517)中的存储单元。同样地,使用 Z80CPU 的 A0~A1(00~11 共 4 个地址)地址总线引脚也可以选择 I/O (Z80 PIO)中的寄存器。
Z80 CPU 的 A8~A15 地址总线引脚尚未使用,所以什么都不连接。在电路图中可以用代号 NC(NoConnection,未连接)表示引脚什么都不连接。IC 上的引脚有些只用于输出,有些只用于输入,还有些是输入输出两用的。
对于只用于输出的引脚,不需要使用时的处理方法是这个引脚什么都不连接。
而对于只用于输入或输入输出两用的引脚,不需要使用时的处理方法则是把这个引脚上的电压固定成是 +5V 或 0V。
2.5 连接时钟信号
正如前文所述, Z80 CPU 和 Z80 PIO 的运转离不开时钟信号。 为了传输时钟信号, 就需要把时钟发生器的 8 号引脚和 Z80 CPU 的 CLK(CLK 即 Clock,时钟)引脚、Z80 PIO 的 CLK 引脚分别连接起来**。时钟发生器的 8 号引脚与 +5V 之间的电阻用于清理时钟信号。**
我们可以把 Z80 CPU 和 Z80 PIO 在时钟信号下运转的情景, 想象成是它们在跟随着滴答滴答响的时钟同步做动作。
2.6 连接用于区分读写对象是内存还是 I/O 的引脚
至此,我们已经先后把 Z80 CPU 连接到了 TC5517 和 Z80 PIO 上,这两次连接都使用了地址总线引脚 A0 和 A1
如果仅仅这样连接, 当地址的最后两位是 00、01、10 和 11 时,CPU 就无法区分访问的是 TC5517 中的存储单元,还是 Z80 PIO 中的寄存器了。
解决问题的引脚 : MREQ(Memory Request,内存请求)引脚和 IORQ (I/O Request, I/O 请求)。
当 Z80 CPU 和内存之间有数据输入输出时,MREQ 引脚上的值是 0,反之则是 1。
当 Z80 CPU 和 I/O 之间有数据输入输出时,IORQ 引脚上的值是 0,反之则是 1。
CE 引脚:
内存: 若把 TC5517 的 CE(即 Chip Enable,选通芯片)引脚设成 0, 则 TC5517 在电路中被激活,若设成 1,则从电路中隔离。 因为此时TC5517 进入了高阻抗状态,所以即便它上面的引脚已经接入了电路也不会接收任何电信号。
I/O : 在 Z80 PIO 中,则是通过将 CE 引脚和 IORQ 引脚同时设为 0 或 1,来达到与 TC5517 的 CE 引脚相同的效果。若同时设为 0,则 Z80 PIO 在电路中被激活,若同时设为 1 则从电路中隔离(之所以使用两个引脚是因为这样更适合使用了多个 I/O 的情况)。== I/O 具有特殊性==
对内存和 I/O 而言, 还必须要分清 CPU 是要输入数据还是要输出数据。—— RD 引脚和 WR引脚。
Z80 CPU 的 RD 引脚(即 Read,表示输入,为 0 时执行输入操作)和 WR 引脚(即 Write,表示输出,为 0 时执行输出操作)了。
Z80 PIO虽然只有 RD 引脚,但由于数字 IC 引脚上的值要么是 0 要么是 1,所以只用 1 个 RD 引脚也能区分是输入还是输出,0 的话是输入,1 的话就是输出(如表 2.2 所示)。
2.7 连接剩余的控制引脚
CPU、内存、I/O 中不但有地址总线引脚、数据总线引脚,还有其他引脚,通常把这些引脚统称为“控制引脚”。之所以这样命名时因为这些引脚上输入输出的电信号具有控制 IC 的功能。
MI 引脚和 INT引脚: M1 是用于同步的引脚,INT 引脚是用于从 Z80 PIO 向 Z80 CPU发出中断请求的引脚。首先把 Z80 CPU 的 M1 引脚(即 Machine Cycle 1,机器周期 1)和 INT 引脚(即 Interrupt,中断)与 Z80 PIO 上标有相同代号的引脚连接起来。
所谓中断就是让 CPU 根据外部输入的数据执行特定的程序。![在这里插入图片描述](
?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0NTg3ODU1,size_16,color_FFFFFF,t_70)
中断对于计算机的运行来说很重要。
RESET 引脚(即 Reset,重置)。一旦把 Z80 CPU 的 RESET 引脚(即 Reset,重置)上的值先设成 0
再还原成 1,CPU 就会被重置,重新从内存 0 号地址上的指令开始顺序往下执行。
重置 CPU 可以通过按键开关完成。按键开关需要经过电阻接在 +5V 和 0V 之间。请仔细地观察这一部分的电路图,可以看出RESET 引脚上平时是 +5V(即 1)。当按下按键开关时,RESET 引脚就变成了 0V(即 0),而放开按键开关后又会回到 +5V(即 1)。电阻是为了防止短路而加入的,否则一旦按下了按键开关,+5V 和 0V 就会直接接到一起发生短路。像这样通过加入电阻把 +5V 和 0V 连接起来的方法在电路图中随处可见(如图 2.8 所示)。
电容的作用:
连接在 RESET 引脚上的电容,用于在电路接通电源时自动重置CPU。电容就好像一个充电电池,具有储存电荷的功能。在通电后的一刹那,由于电容正在充电,所以 RESET 引脚上的电压并不会立刻上升到 +5V。而完成充电后,RESET 引脚的电压会变为 +5V,这样就相当于 RESET 引脚上的值从 0 变成了 1,重置了一次 CPU。
总线:
总线是连接到 CPU 中数据引脚、地址引脚、控制引脚上的电路的统称。使用快动开关可以使 Z80 CPU 的 BUSRQ 引脚(即 Bus Request,总线请求)上的值在 0 和 1 之间切换。
若将 BUSRQ 引脚的值设为 0,则 Z80 CPU 从电路中隔离。当处于这种隔离状态时,就可以不通过CPU,手动地向内存写入程序了。
像这样不经过 CPU 而直接从外部设备读写内存的行为叫作 DMA(Direct Memory Access,直接存储器访问)。在诸位所使用的个人计算机里,硬盘等设备要读写内存时使用的就是 DMA。
DMA 与 CPU的合作任务
当 Z80 CPU 从电路中隔离后,BUSAK 引脚(即 Bus Acknowledge,响应总线请求)上的值就会变成 0。也就是说,把 BUSRQ 引脚上的值设成 0 以后,还要确认 BUSAK 引脚上的值已经变成了 0,然后才能进行 DMA。
Z80 CPU 的其他控制引脚并未使用。所以要把 WAIT 引脚和 NMI引脚上的值设为 1,即连接到 +5V 上。之所以在连接时加入电阻,是为了便于今后加入开关等元件。请诸位先记住一个词——上拉(Pull-up),指的就是像这样通过加入电阻把元件的引脚和 +5V 连接起来。剩下的 HALT 引脚和 ASTB 引脚什么都不连接。
Z80 PIO 的 PA0~PA7(PA 表示 Port A)以及 PB0~PB7(PB 表示Port B)用于与外部设备进行输入输出,所以稍后要把它们分别连接到指拨开关和 LED 上。对于剩下的几个引脚可以这样处理:将 IEI 引脚上拉,IEO 引脚、ASTB 引脚、ARDY 引脚、BSTB 引脚和 BRDY 引脚则什么都不连接。
其实计算机的工作原理非常简单。CPU在时钟信号的控制下解释、执行内存中存储的程序,按照程序中的指令从内存或 I/O 中把数据输入到 CPU 中,在 CPU 内部进行运算,再把运算结果输出到内存或 I/O 中。无论是小型的微型计算机,还是高性能的个人计算机,其工作原理都是相同的。
2.8 连接外部设备, 通过DMA输入程序
下面我们继续布线,这次将计算机主机系统和外部设备连接起来。我们要使用 2 个指拨开关和 1 个按键开关,向地址总线引脚和数据总线引脚发送电信号,然后通过 DMA 将数据总线上的数据存储到内存。下面我们就先将这些元件连接到电路中。
将右侧最上方的一个指拨开关连接到作为内存的TC5517 的数据总线引脚 D0~D7 上。
再将它下面紧挨着它的指拨开关连接到 TC5517 的地址总线引脚 A0~A7 上。
第 3 个指拨开关则通过电阻接到 +5V 上,这样拨动这个指拨开关就可以输入 +5V 或 0V 的信号了。
接下来将用于控制内存写入的按键开关连接到 TC5517 的 WE 引脚上。
为了写入数据,还要将 TC5517 的 RD 引脚上拉起来,连接到 +5V上,然后把 CE 引脚连接到 0V 上。
把这些元件都连接起来以后,就可以拨动指拨开关,用二进制数设定地址总线引脚和数据总线引脚上的数据了。设定完后按下按键开关,数据就会被写入 TC5517 中。
但是如果这些开关直接连接到了 TC5517 的各个引脚上,在程序执行时,开关的状态就会对电路产生影响。因此要使用 74367,在程序执行时把开关从电路中隔离出来。74367 是一种叫作“三态总线缓冲器”的 IC。在这个 IC 的电路图符号中,有用三角形标志代表的缓冲器,表示使电信号从右向左直接通过。但是,只有在 74367 的 G1 引脚和 G2引脚同时为 0 的时候,电信号才能通过。而当 G1 引脚和 G2 引脚同时为 1 时,74367 就会与电路隔离。
一旦打开了 Z80 CPU 的 BUSRQ 引脚连接着的开关,就可以通过 BUSAK 引脚输出 0 得知 CPU 进入了 DMA 状态。因此只要把 BUSAK引脚连接到 4 个 74367 的 G1 引脚和 G2 引脚上,就可以实现通过DMA 向内存写入数据了。
2.9 连接用于输入输出的外部设备
下面轮到把指拨开关和 LED 连接到 Z80 PIO 上了, 当微型计算机运行起来后, 指拨开关可用于从外部输入数据, LED 可用于向外部输出数据。
用于输入数据的指拨开关, 要连接到 Z80 PIO 的 PA0 ~ PA7 引脚上。 连接时没有使用 74367 是为了在程序运行中可以通过 Z80 PIO 从指拨开关获得输入的数据。
表示输出数据的 LED 要通过电阻连接到 +5V 上, 依据惯例, 输入 0V 点亮 LED , LED 要通过 7404 这样的 IC 连接到 Z80 PIO 的 PB0 ~ PB7 引脚上, 在 7404 的电路图符号上, 末端带有一个小圆圈的三角形符号表示反相器,作用是将左侧输入的电信号反转后(即 0 变 1、1 变 0)输出到右侧。通过这样的设计,当Z80 PIO 的 PB0~PB7 引脚上的值为 0 时 LED 就会熄灭,为 1 时 LED就会点亮。
74367 和 7404 上也都有 Vcc 引脚和 GND 引脚。请将它们分别连接到 +5V 和 0V 上。对于 74367 和7404 中未使用的引脚(标有 NC 的引脚),或者什么都不连接,或者将它们连接到 GND 上。
2.10 输入测试程序并进行调试
微型计算机尽管硬件组装好了, 但若没有输入软件, 计算机还是不能工作的, 所以即使为微星计算机接通了电源, 它也什么都执行不了。
下面编写一段测试程序。 编写时应该使用哪种编程语言呢? BASIC ? C 语言? Java? 其实这些语言都无法使用, 因为作为计算机大脑的 CPU 只能解释一种编程语言, 那就是靠罗列二进制数构成的机器语言(原生代码)。
如下展示了一段用机器语言编写的测试程序。 程序是指令和 数据的集合, 表示指令或数据的数值是以 8 比特为一个单位存储到内存中的, 这段程序只实现了一个简单的功能,那就是通过拨动连接到 Z80 PIO上的指拨开关控制LED的亮或灭。
接通了微型计算机的电源后,请按下 Z80 CPU 上的 DMA 请求开关。在这个状态下,拨动用于输入内存程序和指定内存输入地址的两个指拨开关,把代码清单 2.1 所示的程序一行接一行地输入内存。
先来输入第一行代码,拨动用于指定地址的指拨开关,设定出第一行代码所在的内存地址 00000000,然后拨动用于输入程序的指拨开关,设定出程序代码 00111110。再然后按下用于向内存写入程序的按键开关。
接下来输入第二行代码,设定出内存地址 00000001,设定出程序代码11001111,再次按下按键开关。反复进行这三步操作,直至输入完程序代码的最后一行。
所有的指令都输入完成后,按下用于重置 CPU 的按键开关,控制 DMA 请求的快动开关就会还原成关闭状态,与此同时程序也就运行起来了。(如照片 2.2 所示)。程序一旦运行起来,就可以用第 3个指拨开关控制 LED的亮与灭, 只要拨动指拨开关, LED的亮灭就会随之改变。 LED并不会只亮一下, 而是一直亮着, 时刻保持指拨开关上的状态。
在单片机广泛应用的今天,CPU、I/O、内存都被集成到了一块 IC 上。
举报