探究计算机CPU、内存与IO的之间的线路图关系

前言

想要掌握计算机工作原理,最好的方法是自己收集零件,试着组装一台微型计算机,本文带着大家,在纸上/屏幕上体验一次微型计算机的制作过程。(附电路图如下)

制作微型计算机所需的必要原件

  • CPU(CPU的计算机的大脑,负责解释执行程序。)
  • 内存(负责储存程序和数据)
  • I/O(全称:input/output,负责讲计算机和外部设备连接在一起)

本文中我们使用Z80 CPU、TC5517、Z80 PIO。此外,需要用到的辅助原件有:时钟发生器,指拨开关(输入程序),发光二极管(LED,输出程序)。

连接电源、CPU和内存

电源

计算机原件和普通电器一样,需要接通电源才可以工作,Z80 CPU、TC5517、Z80 PIO上都有Vcc引脚和GND引脚,这一对引脚用于给原件供电。

将 +5V 电源连接到各个 Vcc引脚,0V 电源连接到各个GND引脚,时钟发生器也要连接。接通电源后,这些原件就可以正常工作了。

(至于它为什么叫这个名字,哪边连多少伏电压之类的问题,我不清楚,我认为在这里也没必要先纠结这个,我们主要是讨论计算机的组成原理,这些不是我们探究的重点。)

0V表示数字0,+5V表示数字1,这就是二进制中的0和1。这也就是为什么二进制在计算机中如此重要,因为电压只有"有"和"无"两种状态。

通常1个二进制数(也就是一个0或1)表示的信息称作"1比特",8个二进制数连在一起,称作"1字节"。

1字节 = 1B = 8位 = 8比特

CPU上的地址和数据总线引脚

地址总线引脚

目的:与其他东西进行数据的输入输出。(其他东西指的是内存和I/O)

为了:指定输入输出时的源头或目的地。

基于以上目的,CPU有设计了"地址总线引脚"。Z80 CPU地址总线引脚有16个,A0~A15表示,A代表address。 16个地址总线引脚所能指定的地址共65536个,因为2的16次方等于65530。 因此Z80 CPU可以与65536个数据存储单元进行信息的输入输出。

数据总线引脚

Z80 CPU的数据总线引脚共有8个,D0~D7,D表示data。 Z80 CPU可以一次性输入输出8比特,也就是1字节的数据,也就是1B。 如果要输入输出大与8比特的数据,就要以8比特为单位切分这个数据。

内存上的地址和数据总线引脚

作为内存的 TC5517 上也有地址总线引脚(A0~A10)和地址总线引脚(D0~D7)。这些引脚需要同 Z80 CPU 上带有相同代号的引脚相连。(这里只用A0~A7)

连接I/O

先解了作为 I/O 的 Z80 PIO 的结构。 Z80 PIO 上共有 4 个寄存器。2 个用于设定 PIO 本身的功能,2 个用于存储数据。 这 4 个寄存器分别叫作端口 A 控制、端口 A 数据、端口 B 控制和端口 B 数据。 Z80 PIO 有 2 个端口,端口 A 和端口 B,最多可以连接 2 个用于输入输出 8 比特数据的外部设备。

寄存器是位于 CPU 和 I/O 中的数据存储器。 端口就是 I/O 与外部设备之间输入输出数据的场所,可以把端口(Port)想象成是轮船装卸货物的港口。

把Z80 PIO上的D0 ~ D7的数据总线引脚与Z80 CPU 上有同样代号的引脚连接起来,用于传输数据。

要把 Z80 PIO 的 B/A 和 C/D 引脚分别连接到 Z80 CPU 的地址总线引脚 A0 和 A1 上。(这里省略了具体如何选中的规则)

连接时钟信号

把时钟发生器的 8 号引脚和 Z80 CPU 的 CLK(CLK 即 Clock,时钟)引脚、Z80 PIO 的 CLK 引脚分别连接起来。

如何区分读写对象是内存还是I/O

我们已经把CPU和内存与I/O连接好了,但是有个问题:内存与I/O地址总线连接到CPU上的同一块地方,在某些特定情况下(当地址的最后两位是 00、01、10 和 11 时),CPU就无法区分读写对象是内存还是I/O。

为了解决这个问题,其实多设置几个引脚就好了,就是特定的引脚规定是读写哪个,并且是读还是写,并不复杂,多加引脚就行。

多加了:MREQ, IORQ, CE, RD, WR。具体连接方式略

其余引脚补充(略读)

除了地址总线引脚和地址总线引脚,其他称为控制引脚。

Z80 CPU

引脚的代号 方向 作用
A0~A15 输出 指定地址
D0~D7 输入输出 输入输出数据
MREQ 输出 把输入输出对象设定为内存
IORQ 输出 把输入输出对象设定为1/O
RD 输出 输出数据
WR 输出 输入数据
BUSRQ 输入 接收DMA请求
BUSAK 输出 响应DMA请求
M1 输出 用于同步
INT 输入 接收中断请求
CLK 输入 接收时钟信号
RESET 输入 重置
WAIT 输入 (这里未使用)
NMI 输入 (这里未使用)
HALT 输出 (这里未使用)
RFSH 输出 (这里未使用)

内存 TC5517

引脚的代号 方向 作用
A0~A10 输入 指定地址
D0~D7 输入输出 输入输出数据
CE 输入 在电路中激活IC
RD 输入 读出数据
WE 输入 写入数据

Z80 PIO

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

连接外部设备

将图中右侧最上方的一个指拨开关连接到TC5517 的数据总线引脚 D0~D7 上。 下面的指拨开关连接到 TC5517 的地址总线引脚 A0~A7 上。

拨动这个指拨开关就可以输入 +5V 或 0V 的信号了。

将用于控制内存写入的按键开关连接到 TC5517 的 WE 引脚上。

把这些元件都连接起来以后,就可以拨动指拨开关,用二进制数设定地址总线引脚和数据总线引脚上的数据了。 设定完后按下按键开关,数据就会被写入 TC5517 中。

通过 DMA 输入程序

略,大致知道就是通过一个开关,把指拨开关上的数据输入进去了。

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

把指拨开关和 LED 连接到 Z80 PIO 上了。

指拨开关可用于从外部输入数据,LED 可用于向外部输出数据。


指拨开关连接到 Z80 PIO 的 PA0~PA7 引脚上。

LED 要通过 7404 这样的 IC 连接到 Z80 PIO 的 PB0~PB7 引脚上。


电源:74367 和 7404 上也都有 Vcc 引脚和 GND 引脚。请将它们分别连接到 +5V 和 0V 上。这俩是干嘛的我也不清楚,就理解成辅助布线的吧。

输入程序进行调试

至此,硬件方面大功告成!下面写入测试程序,不是C,Java之类的,而是机器语言。

程序是指令和数据的集合,表示指令或数据的数值是以 8 比特为一个单位存储到内存中的。这段程序只实现了一个简单的功能,那就是通过拨动连接到 Z80 PIO 上的指拨开关控制 LED 的亮或灭。

地址				程序

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
  • 接通电源
  • 按下DMA请求开关
  • 在这个状态下,拨动用于输入内存程序和指定内存输入地址的两个指拨开关
    • 先来输入第一行代码
    • 拨动用于指定地址的指拨开关,设定出第一行代码所在的内存地址 00000000
    • 然后拨动用于输入程序的指拨开关,设定出程序代码 00111110
    • 再然后按下用于向内存写入程序的按键开关
    • 接下来输入第二行代码
    • 设定出内存地址 00000001,设定出程序代码11001111,再次按下按键开关。
    • 反复进行这三步操作
    • 直至输入完程序代码的最后一行。所有的指令都输入完成
  • 按下用于重置 CPU 的按键开关,控制 DMA 请求的快动开关就会还原成关闭状态。

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


至此!大功告成!

本篇内容参考了《计算机是怎样跑起来的》一书。

相关推荐
BangRaJun1 天前
LNCollectionView-替换幂率流体
算法·ios·设计
bobz9652 天前
飞牛云目前最新镜像不可用
设计
我码玄黄9 天前
Figma入门-实战列表页
产品经理·figma·设计·原型设计
编程老船长16 天前
第2章 系统设计实战指南:角色定义、功能模块与接口分析
后端·uml·设计
我码玄黄17 天前
Figma入门-旋转效果
产品经理·设计·交互设计
Goboy19 天前
汽车电子架构 | 故事起源
程序员·架构·设计
Goboy19 天前
汽车电子架构 | 必备技能一文读懂 AUTOSAR
程序员·架构·设计
玩AI的小胡子24 天前
保持角色一致性!flux新模型redux用法(含模型与工作流)
aigc·ai绘画·flux·设计·comfyui
WujieLi1 个月前
独立开发沉思录周刊:vol21.概率的误区:重复不等于必然
程序员·产品·设计
架构悟道1 个月前
不当愣头青、聊聊软件架构中的那些惯用的保命手段
java·分布式·架构·设计·高可用·可靠性·容错