计算机发展历程
其中DNIAC机是十进制机器,EDVAC机是二进制机器
下图是计算机硬件技术的迭代
下图是现代计算机发展方向
其中科学计算机的体积发展是从小到大,民用计算机的体积发展是从大到小
计算机语言的发展
下图是计算机语言的层次结构
其中每一个语言都有相应的虚拟机器对应,这些虚拟机器都有自己相应的功能
计算机体系结构与计算机组成
下图便是两者的区别
计算机系统的基本组成
下图便是一个计算机的基本组成
其中CPU便是计算机的核心,而CU又是CPU的核心。因此我们将在以下的课程着重将此此部分
计算机及硬件的基本组成
下图是冯诺依曼计算机硬件框图
存储器用来存放数据和程序
控制器用来指挥程序运行
运算器用来进行相应的算术运算及逻辑运算
输入设备用来将信息转换成机器能识别的形式
输出设备用来将结果转换成人们熟悉的形式
数据在计算机中的执行过程:我们通过输入设备输入相关数据以后,数据到达运算器,运算器对其进行相关计算,运算以后计算机从存储器和控制器读取相应的数据发送到输出设备,由输出设备输出相关数据
计算机性能指标
计算机的性能指标主要与机器字长,存储容量以及运算速度有关
机器字长
计算机所处理的数据是以二进制数为单位的,CPU一次处理数据的位数叫做机器字长
机器字长越长,CPU一次能处理的二进制位数就越多,也意味着其运算速度越快
机器字长越长,硬件所需要的电路越多,其造价也越贵
存储容量
存储容量表示计算机能存放二进制信息的总位数
主存因受技术限制,其容量一般较小,是当今科学急需突破的一个瓶颈
一个存储单元所能够存储的所有单位数据总量叫做这个存储单元的存储字长
辅存容量指计算机系统中联机运行的辅助存储器容量
MAR的位数反应了存储单元的数量
MDR但应了每个存储单元的大小
常用的数量单位如下:
描述存储容量,文件大小时:K = 2 ^ 10, M = 2 ^ 20, G = 2 ^ 30, T = 2 ^ 40
描述频率速率时: K = 10 ^ 3, M = 10 ^ 6, G = 10 ^ 9, T = 10 ^12
主存储器的计算
在地址寄存器和存储体间存在译码器和驱动器。
其中译码器用于将每个输入的二进制代码译成对应的输出高、低电平信号或另外一个代码。二进制译码器将输入的n位二进制代码变换成2^n个不同状态,每种状态都是一个存储单元。如上图,每一行都是一个存储单元,每一个方块都是存储单元的一个存储单位,所有的单元加起来就是这个存储单位的存储字长
运算速度
时钟周期是CPU中最小的时间单位,每一条指令的执行至少要1个时钟周期
一个程序的执行中,CPU的执行时间就是这个程序运行所需要花费的时间,计算公式为(指令条数*CPI)/主频,或者(指令条数*CPI)*时钟周期
IPS指CPU每秒能够执行的指令数,计算公式为 主频/平均CPI
计算机的工作流程
如下是计算机的大致工作过程
如下是使用计算机的两个步骤
当我们使用高级语言时,仅需要编写程序。但我们使用汇编语言时,则需要编写每一个指令
下图是一个程序编写的例子
如上图可知,同一个程序不同的表示会有不同的运行步骤,选择更合适的形式编写程序,可以提高程序的运行效率
下面我们对指令的应用进行一个演示
如上图所示,一个指令由操作码和地址码两部分组成。操作码表示执行的指令,地址码所表示的地址存储着要操作的数据。
在上例中,ACC为寄存器。第一行指令的地址码是0x1000,也就是8。我们找到地址8,发现该地址存储的是x。我们回到第一行发现,该指令正好对x进行了操作。
下图是以计算机的视角展示计算机对这些指令的执行
注:PC为程序首地址
如下图是计算机运行时所涉及的三大元件,它们分别执行相应的功能
主存储器中的两个寄存器都是按地址存储数据的
紫色长框中便是常见的运算器中的寄存器,它们在不同的运算中存放不同的数据。
比如在加法运算中,ACC累加器存放运算时被加数以及运算结果和。X操作数寄存器存放运算时加数
在乘法运算时,ACC累加器存放运算结果乘积的高位。MQ乘商寄存器存放运算时乘数和运算结果乘积的低位。X操作数寄存器存放运算时除数
下图便是计算机的具体工作过程
编码
编码或代码通常指一种在人和机器之间进行信息转换的系统。换句话说,编码便是人类与机器交流的基础。有时候我们将编码理解成是密码(机密),这种想法过于片面,起始大多数编码并不是这样的。
计算机编程语言就是一套编码系统
当我们使用某种计算机编程语言以表示出某个特定的计算过程的行为就叫编写程序
所谓的程序分为两个方面:程:计算过程。序:序列。因此一个程序也叫做一个计算过程的序列
举个例子:1+2整体是一个计算过程,+3 +4 +5的行为叫做计算过程序列
进制与位
通常一个数量表示系统(如十进制)都会有位的概念,接下来我们以十进制数进行演示:
一个十进制数每一位数由0-9的数字进行表示,起始位级(数的最右边)大小为10^0,每升一个位级(向左移动一位),大小乘10
37 = 30 + 7
37 = 30*10^1 + 7*10^0
437 = 400 + 30 + 7
437 = 4*10^2 + 30*10^1 + 7*10^0
由此可见,一个数字在不同的位级所表示的数量不同,比如百位上表示百这个数量,十位上表示十这个数量
由于计算机只认识二进制数,所以我们需要认识二进制数
一个二进制数每一位数由0-1的数字进行表示,起始位级(数的最右边)大小为2^0,每升一个位级(向左移动一位),大小乘2
11(二进制) = 1*2^1 + 1*2^0 = 3(十进制)
101(二进制) = 1*2^2 + 0*2^1 + 1*2^0 = 5 (十进制)
汇编语言
计算机是由很多部件组成的,这些部件在正确的组织下运行会对计算机产生相应机器指令,使得计算机能够按照我们的意愿去执行相应的行为
机器指令其实就是一串二进制数字,如:010101011111B,而这些机器指令由CPU部件,也称为叫中央处理器,转换成高低电频后驱动计算机运行。
每一个机器指令都有属于自己的逻辑含义
接下来我们借用DOSBox进行观察
如图显示了一些机器指令,该软件将机器指令以十六进制表示的。上图中左半部分是机器指令,其冒号左边是一串相同的16进制数字叫做段地址,冒号右边数字从上到下由小变大,叫做偏移地址。左右结合表示内存编号。因此内存编号 = 段地址:偏移地址
图中右半部分是汇编指令。
由于机器指令编程时过于复杂,所以就有了更为简单的汇编指令用来表示机器指令以适应人类的逻辑思维
如下便是一个汇编指令:
MOV AX,0005H
具体含义:move表示移动,本指令将0005H移动到一个叫AX的寄存器中
由于CPU并不理解汇编语言,所以就有了叫编译器的软件用来把汇编语言翻译成机器指令给CPU执行
所谓编译器就是将一种表示系统翻译(编译)成另外一种表示系统的工具
汇编语言分为以下几种:
1.汇编指令:汇编指令可以通过编译器(翻译软件)表示成机器指令(机器码)
2.伪指令:用来告诉编译器某处汇编指令应如何翻译
3.其他符号:+ - * /由编译器来处理
CPU与内存
同一串16进制的机器码既可以是数据又可以是指令,而CPU通过机器码存在的寄存器来区分是否是哪一种含义
内存的最小单元是一个字节
一个字节等于八个二进制位,由于二进制位也叫做比特位,所以一个字节也等于八个比特位
比如:F0是一个16进制数,一个字节大小,由8个二进制位构成,其二进制展开如下:
F0 = 1111 0000B,一共有8个比特位,因为很清晰的验证了1byte = 8bit
一个字节大小的数字的表示范围:
二进制表示:00000000到11111111十六进制表示:00到FF十进制表示:0到255
如下是一些常见的计量单位之间的转换
1KB = 1024byte
1MB = 1024KB
1GB = 1024MB
机器指令需要由CPU去执行,而CPU从内存中读取机器指令,但其本身也存放了一部分的指令和数据
CPU读取内存流程:
从物理信息上看,当我们拆开机箱时可以发现cpu和内存条都是插在一块电路板上(主板),因此cpu可以与内存条通过主板上的电路通信,这样也就实现了信息的读取
而这个电路至少要包括三种信息(线):1.内存编号信息(地址线) 2.数据信息(数据线) 3.读或写:CPU从内存读取数据再把执行结果写入内存(控制线)
电路上相关的线的作用:
1.地址线的数量决定了CPU的寻址能力
2.数据线的数量决定了CPU与其他部件进行数据传送时,一次性传送多少数据的能力
3.控制线的数量就决定了CPU它对其他主板上部件的控制能力
机器指令在内存即内存储器中存放 ,其中绝大多数的指令和数据都是存放在主内存中
计算机通过电路来表示内存地址,使用0或者1来表示高低电平
我们假设一共有10根地址线,它能表示的地址0000000000到1111111111,因此内存地址总是从0开始
CPU在执行指令时需要去内存中寻找数据,而寻找内存地址的能力叫做寻址能力,CPU由地址线的数量决定能够表示的地址范围以及地址数量
假设只有一根地址线,也就是只有一根表示地址信息的线路 0或者1 这就是物理上的限制
假设有10地址线 表示地址范围就变成了0 - 1023 可以寻找地址数量就是1024因此我们可以得到
补码
计算机在内存中存储数字都是以补码的形式存储的
我们使用的数字有两种解析方式:1.有符号形式(二进制数据首位为符号位 0表示整数 1表示负数)和无符号形式(二进制数据首位不是符号位,而是正常表示大小的位级)
如下我们以二进制数1000
1000 0111 -7 87
反码:正数原码和反码一致,负数符号位不变,其余取反 负数反码 1111 1000 F8
补码 = 反码+1 1111 1001 F9
补码得到源码:
符号位不变,其他取反
1 000 0110
+1
1 000 0111 原码
这样设计的好处是为了方便计算,只用一条电路就可以完成正数和负数的计算
FC 1111 1100 换算10进制无符号252 有符号是-124
存储器的分类
易失:容易丢失数据
非易失:不容易丢失数据
磁芯存储器现如今已被淘汰
存取时间:从存储器接收到读(或写)的命令,到从存储器读出(或写入)信息所需要的时间,称为存储器存取时间。
物理地址:存储器里以字节为单位存储信息,每一个字节单元都有自己唯一的存储器地址,称为物理地址
该类存储器存储数据时,先定位某个小区域,再在小区域顺序查找
RAM随机存取存储器
ROM只读存储器
存储器的三个主要特性的关系
没有哪个存储器是可以同时满足速度,容量和价格三种要求,因此便有了不同的存储结构之间相互组合便有了具体的存储系统层次结构
注:寄存器和缓存属于CPU的一部分
存储系统层次结构
由于主存的容量是有限的,所以就有了辅存来扩展容量。
主存和辅存的结合解决了存储系统的容量问题,由硬件和操作系统共同解决
主存和辅存之间存在一个虚拟存储器,用来增加主存和辅存的容量。
虚拟存储器的存储地址叫做虚地址或逻辑地址,指由程序提供的地址。虚拟存储器将虚地址转换为逻辑地址后对数据进行存取,这一过程对程序员是透明的。
而主存储器的存储地址叫做实地址或物理地址,指有效的存储器地址。
CPU与主存中间存在着缓存,缓存和主存的结合解决了CPU与主存速度不匹配问题,由硬件完成
半导体存储芯片的基本结构
存储芯片由具有记忆功能的存储矩阵,译码驱动电路和读/写单路等构成,如下便是一个芯片的内部构造
存储芯片包含三部分:译码驱动,存储矩阵, 读/写电路。
译码驱动电路分为译码器和驱动器,译码器会输出某一条线路的高电平信号,驱动器是为了保证译码器输出的高电平稳定可靠的,可以理解为将电信号放大的部件。其作用是将通过地址总线的地址送来的地址号翻译成对应存储单元的选择信号
存储矩阵是由一个一个的存储元构成;
读写电路是连通存储元的电路,用来完成读写操作
以地址线10和数据线4为例,计算芯片容量
芯片容量 = 2 ^ 10 * 4 = 1K * 4位
存储芯片依靠地址总线,数据总线,控制总线(片选线+读/写控制线)与外部链接。
地址线:单项输入,用来读取和写入数据,接收地址信息,通常是CPU通过地址总线传来的
数据线:双向传输,实现数据的传输,其位数与芯片可读出或写入的数据位数有关
片选线:传输芯片选择信号或者芯片使能信号,用于选择芯片 ,判断所给出的地址是否是针对这个存储芯片的地址,被选择的存储单元与字节是否在此芯片当中。用 CS(有上划线)或CE(有上划线)信号判断
读写控制线:可能一条,可能有两条
当有一条时:WE负责读写的限制
当有两条时:OE负责读,WE负责写
上图中一共有32片存储芯片,每组存储芯片容量为16K * 1 * 8 = 16K * 1 * 2 ^ 3 = 16K * 8
因为有4组,所以总容量量16K * 8 * 4 = 64K * 8;
上图中的四组存储芯片从左到右依次是第一组到第四组。每一组存储芯片的地址都不同,如2第一组存储芯片地址为0到16K-1,第四组存储芯片的地址为48K到64K-1
因此当访问地址为65535,进行写操作时。只有最后一组存储芯片有效,为低电平,其他三组无效为高电平,数据会存储在最后一组芯片中
半导体存储芯片内部的对存储元的译码驱动方式
半导体存储芯片的译码驱动方式主要是用于:地址总线给出了地址后如何在内存中找到存储单元
为此有以下几种方法:线选法和重合法
接下来我们依次讲解以下方法:
线选法:直接以系统的地址线作为存储器芯片的片选信号,为此只需把用到的地址线与存储器芯片的片选端直接相连即可,其特点是一根字选线对应一根存储单元
上图以16*8位存储芯片为例:数据通过四根地址线A0,A1,A2,A3进行输入,这四根地址线可以表示 16 个存储单元,在内存中对应了16根字线,即上图字线的0到15。在上图中选中了字线0进行传输到矩阵中0,0到0,7的八根位线,这8根位线直接为单元内每一位传输数据,由读/写控制电路进行数据的读选通输出D0到D7所对应的信息
重合法:上图可知,有两个地址译码器分别为行地址译码器和列地址译码器,行和列的交汇处共同锁定一个单元,该单元便是我们要找的存储单元
例如:选中行地址译码器为 00000,这时0这一整行都被选中。然后让列地址译码器为00000,这时0这一整列都被选中。此时是0行0列的这个单元就是要门要找的单元
随机存储存储器
随机存储器可以分为:静态RAM(SRAM) 与 动态 RAM(DRAM) 。根据不同的特性在电脑中承担的任务也不同
静态RAM
基本电源电路:用于存储 0/1 代码的那一块电路
如下是静态RAM的基本电路
触发器用于保存数据,保存电路的状态
当进行数据传输时,片选器选中的整行的行开关会被全部打开,但是只有开通着的列地址上的触发器才会被保存数据。
如下我们以一个实际芯片进行举例:
上图是一个Intel2114 RAM芯片
A0~A9 是10根地址线,说明有1K的存储单元
I/O1~I/O4 是四根数据线,可以存放 4位的数据,一次读取四位的数据
WE,CS 分别是片选线与读写控制线,低电平有效
由此组成了一个 1K x 4位的芯片,这个存储矩阵由 64 x 64 个基本单元电路组成
动态RAM
如下便是动态RAM基本单元电路
常见的动态RAM基本单元电路有三管式和单管式两种。与静态RAM的触发器不同,动态RAM使用电容存储数据,电容中有电荷为1否则为0
在上图中C为电容
动态RAM刷新
存取周期:对于某个单元存取一次数据所用的时间
刷新周期:存储单元恢复一次原状态的时间间隔
动态RAM的刷新有三种方式,下图表现的是集中刷新
集中刷新:在规定的一个刷新周期内,对全部的存储单元逐行进行刷新
上图以对一个 128 x 128矩阵的存储芯片进行刷新,存取周期为 0.5us,刷新周期为2ms,一共有4000个存取周期。
对128行进行逐行刷新共需 64us(128个存取周期)。
此时剩下的3872个存取周期,用来让 CPU,I/O设备读,写维持信息。
在4000个存取周期中有64us不能进行读/写,CPU,I/O设备只能等待,因此这段时间被称为死时间,访存区成为死区。
死时间率为 128/4000=3.2%。这也是集中刷新的缺点。
分散刷新:对每行存取单元的刷新分散到每个存储周期完成。将每个单元的存储周期分为两段,每段为0.5us,tM 段用于tR,tM 可以用于CPU等设备的读写操作;tR用于刷新。这样的好处就是没有死区
上图是一个128 x 128的矩阵,2ms为一个刷新周期,可以将数据刷新156遍,但是刷新太过频繁,系统性能会降低
存储周期是0.5us,并且在2ms内将所有行刷新一遍,因此每隔15.6us刷新一行,刷新这一行的死时间为 0.5us。如果说将这段死时间进行合理安排,比如安排CPU译码则避免了内存CPU的信息传输,避免了死时间,提升了工作效率
只读存储器
接下来我们将详细讲解不同类型的只读存储器
MOS 管不可进行改变,只读
通过熔丝实现了一种一次性编程,熔丝断开为0,熔丝未断为1
是一种破坏性的编程,经过一次性编程后,只读
D端正电压形成浮动栅,S和D不导通为0
D端不加正电压不形成浮动栅,S和D导通为1
EPROM价格便宜,集成度高
EEPROM电可擦洗重写
比EEPROM块,具备RAM功能