第二章:微处理器与总线
微型计算机组成
传统电子计算机由五大部分组成:运算器、控制器、存储器(内部存储器、外部存储器)、输入设备、输出设备。
外部设备:外部存储器、输入出设备。
主机:运算器、控制器、、内部存储器。
(微处理器)中央处理器(CPU):运算器、控制器。
微处理器(CPU)
简称\(\mu P\),内部集成了控制器、运算器和若干高速存储单元(寄存器)。
控制器 | 运算器(ALU) | 寄存器 |
---|---|---|
指令寄存器+指令译码器+控制电路 | ||
主要负责指令译码和执行 | 主要负责算术或逻辑运算及位移操作 | 主要用来存放经常使用的数据 |
存储器
该处存储器主要指内存:用来存放数据与程序;每个内存单元规定存放8位二进制数,每个内存单元都用一个地址来标识。
读操作:
CPU发送地址信息\(\Rightarrow\)地址总线传输地址信息到存储其译码电路\(\Rightarrow\)译码后选中对应存储单元\(\Rightarrow\)CPU发送读控制命令\(\Rightarrow\)选中内容被读出并传输到数据总线上。
写操作:
CPU发送地址信息\(\Rightarrow\)地址总线传输地址信息到存储其译码电路\(\Rightarrow\)译码后选中对应存储单元\(\Rightarrow\)CPU发送写控制命令\(\Rightarrow\)通过数据总线将数据写入对应存储单元
I/O接口
CPU与I/O设备间的连接信息交换不能直接进行,必须通过中间部件作为两者之间的桥梁,即I/O接口。
总线
按传送方向:
单向总线 | 双向总线 |
---|---|
只能向一个方向传送信息 | 在两个方向传送信息 |
按传送信息:
地址总线(AB) | 数据总线(DB) | 控制总线(CB) |
---|---|---|
用于传送CPU发送地址信息(单向) | 传送数据信息(双向) | 传送控制信号、时序信号、状态信息。 |
目的指明与CPU信息交换的内存单元或I/O设备 | 数据总线宽度与CPU处理数据字长相同 |
微型计算机
以微处理器为核心,配上存储器、输出入接口电路以及总线组成的计算机。
单片机:微处理器、存储器、输入出接口集成到一块芯片上。
微型计算机系统
微处理器基本结构
运算器
(Arithmetic Logic Unit)ALU逻辑运算单元:主要负责算术逻辑运算及位移操作。
ALU有两输入两输出
累加器A(输入) | 内部数据总线(输入) |
---|---|
总线内容可老子数据寄存器(DR)也可来自寄存器阵列(RA)中的某个寄存器 |
内部数据总线(输出) | 标志寄存器(FR) |
---|---|
将运算结果送回内部总线,再送回累加器A(在A中暂存) | 传输运算结果特征的标志信息 |
控制器
由指令寄存器、指令译码器、定时及产生各种控制信号的控制逻辑单元组成。
指令寄存器(IR):用于存放从存储器取出的要指令的指令。 |
---|
指令译码器(ID):对IR的指令进行译码,以确定该指令要执行的操作。 |
可编程逻辑阵列(PLA):又称定时与控制电路,用于产生取指令和执行指令所需的各种微操作控制信号。 |
寄存器阵列
通常包括若干通用寄存器或专用寄存器。
累加器(A):与ALU配合完成各种算术逻辑运算,运算前作为ALU的输入,运算后用来保存结果;指令操作下,可对累加器中的内容进行位移、比较及各种运算。CPU对I/O接口的读写一般也通过累加器进行。 |
---|
数据寄存器(DR):用于暂存数据或指令,(读存储器时若读出为指令,先暂存入DR再由内部数据总线送到IR;若读出为数据,通过内部总线送到有关寄存器或运算器) |
程序计数器(PC):又称指令地址寄存器,用于存放正待取出的指令地址。PC总指向下一条指令。 改变程序为非顺序执行称为转移。 |
地址寄存器(AR):用于存放正要取出的指令或操作数地址。(取指令时,将PC中存放的指令地址送到AR中,再根据此地址取指令)(取操作数时,操作数地址通过内部数据总线送到AR,再根据此地址从存储器中取操作数) |
标志寄存器(FR):用于存放运算产生的进位、溢出、全零、符号及奇偶性等状态变化。 |
8086微处理器
内部结构
总线接口部件(BIU)
由段寄存器(CS,DS,SS,ES),指令指针寄存器(IP),地址加法器,指令队列缓冲器,总线控制电路组成。
主要任务:
- 形成访问存储器或I/O端口的物理地址。
- 从内存的代码段中取指令送到指令队列缓冲器中。
- 读取操作参数参加EU运算或存放运算结果到指定地址。
指令队列缓冲器:(8086为6个字节)(8088为4个字节),在EU执行指令的同时,会从内存中取下指令,并采用(先进先出)FIFO原则,操作原则如下。
- 指令队列缓冲器中存满1条指令后,EU立即开始执行。
- 指令队列缓冲器中只要空出(2个->8086)(1个->8088)是BIU自动执行取指令操作,直到填满为止。
- EU执行的指令需要对存储器或I/O设备存取数据时,BIU在执行完当前总线周期的下一周期对指定内存单元或I/O设备进行存取操作,数据经BIU交由EU处理。
- 当EU执行完转移、跳转(如Jump)指令时,要消除指令队列缓冲器,并要求BIU从新的地址重新开始取指令,新取得第一条指令直接经过指令队列送去EU执行,后取的填入指令队列缓冲器。
地址加法器和段寄存器
作用是形成20位的物理地址(把逻辑地址变换为物理地址,采用"段加偏移"技术),以便访问1MB的存储单元。
总线控制电路
将8086/8088CPU的内部总线与外部总线相连,包括16条数据总线,20条地址总线和若干条控制总线。
执行部件EU
EU主要由算术逻辑部件(ALU)、通用寄存器组(AX,BX,CX,DX,SP,BP,DI,SI)、状态寄存器(F)、EU控制电路组成,且与外部总线无联系。
主要任务:
- 从BIU的指令队列缓冲器中取指令进行译码、执行。
- 负责所有算术、逻辑运算及16位偏移地址计算。
- 向BIU提供指令的执行结果和16位偏移地址。
算术逻辑运算单元(ALU)
完成16位或8位的二进制运算,运算结果通过内部总线送到BIU的内部寄存器,等待写入存储器。
16位暂存器用来暂存参加运算的操作数,把ALU运算的结果特征(进位、溢出等)置入标志寄存器F中。
EU控制电路
是控制、定时、状态逻辑电路,接收从BIU中指令队列取来的指令,经过指令译码形成各种定时控制信号,对EU的各个部件实现特定的定时操作。
寄存器组
通用寄存器
数据寄存器:4个16位寄存器AX,BX,CX,DX,又可以拆分位低八位和高八位寄存器。
特定用途:
AX(Accumulater):作累加器 |
---|
BX(Base Register):作基址寄存器(用来存放一个数据区的基地址(首地址)) |
CX(Count Register):作计数寄存器(用来存放数据串元素的个数) |
DX(Data Register):作数据寄存器(可在除法中存放余数) |
指针寄存器和变址寄存器
SP(Stack Pointer):堆栈指针寄存器 |
---|
BP(Base Pointer):堆栈基址指针寄存器 |
SI(Source Index):指源变址寄存器 |
DI(Destination Index):目的变址寄存器 |
段寄存器
CS(Code Segment):代码段寄存器,用于存放当前代码段的段地址 |
---|
DS(Data Segment):数据段寄存器,用于存放当前数据段的段地址 |
SS(Stack Segment):堆栈寄存器,用于存放当前堆栈段的段地址 |
ES(Extra Segment):附加段寄存器,用于存放当前附加段的段地址 |
控制寄存器
指令指针寄存器(IP):用于存放BIU要取出的下一条要执行指令的段内偏移地址,实现对代码段指令的跟踪。
标志寄存器(F):
状态标志位
CF(Carry Flag):进位标志,产生进位时CF=1,计算方法CF=最高位进位XORSUB(减法SUB=1,加法SUB=0) |
---|
PF(Parity Flag):奇偶标志,结果的低八位“1”的个数为偶数时,PF=1 |
AF(Auxiliary Carry Flag):辅助进位标志,D3位向D4位有进位或借位时AF=1 |
ZF(Zero Flag):零标志,表示一个算术或逻辑运算的结果是否为0 |
SF(Sign Flag):符号标志,运算结果的最高位为1,则SF=1,反之SF=0 |
OF(Overflow Flag):溢出标志,带符号数运算时是否产生了算术溢出(超出计算机表示数的范围)。补码运算OF=最高位进位XOR次高位 |
控制标志位
DF(Direction Flag):方向标志,用于字符串处理指令操作。DF=1变址寄存器地址自动递减,DF=0时变址寄存器自动递增。 |
---|
IF(Interrupt-enable Flag):中断允许标志,用于控制CPU可屏蔽中断。IF=1允许中断,IF=0禁止中断。 |
TF(Trap Flag):单步陷阱标志(单步工作标志),用于控制单步中断。TF=1,CPU进入单步工作模式,TF=0时CPU正常执行程序。 |
引脚信号及功能
8086与8088之间的差别:8086有16个地址/数据复用引脚,8088只有8个地址/数据复用引脚。
最大模式:系统中通常含有两个或多个微处理器,除了8086/8088以外的处理器可以是协处理器或I/O处理器。
最小模式:系统中只有8086/8088一个微处理器。
括号内为最大模式下重定义的名称。
\(AD_0-AD_{15}\)分时复用的地址/数据总线,传输地址时以三态输出,传输数据时以双向三态输入/出 |
---|
\(A_{19}/S_6-A_{16}/S_3\)分时复用的地址/状态总线,T1状态输出最高4位,T2-T4状态输出状态信息 |
\(\overline{BHE}/S_7(Bus-High-Enable/Status)\):高8位数据总线允许/状态复用引脚 |
\(\overline{RD}(Read)\):读信号\(\overline{RD}=0\)时表示CPU将要执行一个对存储器或I/O端口的读操作(取决于\(M/\overline{IO}\)) |
\(READY\):输入(高电平有效),准备就绪信号,解决CPU与慢速存储器或I/O的同步问题,在总线周期的\(T_3\)周期开始采样\(READY\)引脚,,若为低电平,在\(T_3\)结束后加入若干\(T_W\)个等待周期 |
\(\overline{TEST}\):输入(低电平有效),与WAIT指令结合使用,CPU执行WAIT指令时每隔5个时钟对此引脚进行测试,引脚为高电平时继续执行WAIT指令,反之为低电平时执行WAIT的下一条指令 |
\(INTR(Interrupt-Request)\):可屏蔽中断请求信号,输入(电平触发,高电平有效),为高电平时代表外部设备向CPU申请中断,当中断允许为IF=1时,触发中断 |
\(NMI(Non-Maskable-Interrupt)\):非屏蔽中断请求信号,输入(边沿触发,高电平有效),不受中断允许标志位IF的限制 |
\(RESET\):复位信号,输入(高电平有效),高电平至少保持4个时钟周期 |
\(CLK\)时钟信号,8086/8088时钟频率为5MHZ |
\(MN/\overline{MX}\)最小/最大模式控制信号,接5VCPU处于最小模式,反之为最大模式 |
---|
最小模式部分引脚
\(\overline{INTA}\) :中断响应信号,输出(低电平有效),表示CPU响应了外设的可屏蔽中断 |
---|
\(ALE\):地址锁存允许信号,(输出高电平有效)提供给锁存器8282/8283的控制信号,表示\(AD_0-AD_{15}\)输出的为地址信息 |
\(\overline{DEN}\):数据允许信号,\(\overline{DEN}=1\)时不能传送数据,DMA工作方式设置为高阻态。 |
\(DT/\overline{R}\):数据发送/接收控制信号,用于控制8286/8287(数据总线收发器)的传输方向,高电平数据发送,低电平数据接收,DMA工作方式设置为高阻态。 |
\(\overline{WR}\):三态输出,低电平有效,低电平时表示CPU进行存储器或I/O写操作,具体对象由\(M/\overline{IO}\)决定。 |
\(M/\overline{IO}\):三态输出,高电平表示CPU与存储器之间进行数据传输,低电平表示CPU与IO间进行数据传输 |
\(HOLD\):总线请求信号(输入,高电平有效),除CPU以外的其他主控部件要求占用总线时,通过此引脚向CPU发送一个高电平信号,若CPU允许让出总线控制线,在当前总线周期操作完成后,\(HLDA\)引脚送出一个高电平信号。 |
\(HLDA\):总线请求响应信号 |
\(A_{19}/S_6-A_{16}/S_3\):
访问I/O端口时,不使用这四条引线(A19A16=0),**状态信息S6=0用于表示8088/8086与总线相连**,故T2T4状态时S6=0,S5表示中断允许标志位IF的当前设置。
\(\overline{BHE}/S_7(Bus-High-Enable/Status)\)
\(\overline{BHE}\)在总线周期的\(T_1\)状态时输出,\(S_7\)在T2~T4时输出。\(\overline{BHE}/S_7\)输出\(\overline{BHE}\)信号时,表示总线高8位\(AD_{15}-AD_8\)上数据有效,同时可与A0一起产生存储器的选择逻辑信号。
\(RESET\)过程:CPU内部各寄存器被设置为初值(CS初始化为FFFH,其他寄存器均被初始化为0000H)
总线结构及总线周期时序
锁存器、总线控制器、收发器
8282/8283地址锁存器
\(DI_0-DI_7\):数据输入端口 | \(DO_0-DO_7\)数据输出端口 |
---|---|
\(\overline{OE}\)三态输出的允许信号,低电平允许数据输出 | \(STB\)选通脉冲,下降沿实现数据锁存 |
8288总线控制器
最大模式下8086/8088不直接产生总线控制信号
8288将8086送来的状态信号\(\overline{S_0}\)、\(\overline{S_1}\)、\(\overline{S_2}\),进行译码后,与输入控制信号\(\overline{AEN}、CEN、IOB\)结合产生总线命令和控制信号。
8288由状态译码器、命令信号发生器、控制信号发生器及控制逻辑四部分组成。
8288产生的ALE及DEN信号与最小模式方式时相同,但DEN信号的极性相反。
引脚功能
8286/8287总线收发器
引脚功能
\(T\)传送方向控制信号 | \(\overline{OE}\)输出允许信号 | 状态 |
---|---|---|
x | 1 | 两个方向均不能传送数据 |
1 | 0 | \(A_0-A_7\)输入端,\(B_0-B_7\)输出端 |
0 | 0 | \(B_0-B_7\)输入端,\(A_0-A_7\)输出端 |
\(T\)引脚与8086数据收发信号\(DT/\overline{R}\)相连(\(DT/\overline{R}\)=1,数据写,\(DT/\overline{R}\)=0数据读)
\(\overline{OE}\)与数据允许信号\(\overline{DEN}\)相连(当CPU与存储器或者IO进行数据交换时\(\overline{DEN}\)=0)
总线收发器可以提高数据总线的负载能力。
系统总线结构
时钟周期(状态周期):CPU处理动作最小时间单位。
时钟信号作为CPU工作最小单位,所有功能以此为基准,8086/8088时钟信号频率为5MHZ,时钟周期T=200ns
总线周期(机器周期):CPU通过总线对存储器(I/O)端口进行一次读(或一次写)操作所需要的时间称为总线周期,一个基本总线周期由4个时钟周期组成。
指令周期:一条指令从存储器取出到执行所需的时间称为指令周期(至少包含一个总线周期)。指令不同,指令周期也不同。
8086最小模式的系统总线结构
\(T_1\) | 前半周期CPU将要访问的地址(存储器或外设)放入\(AD_0-AD_{15},S_3-S_6\),并将\(\overline{BHE}\)置为低电平(表示\(S_3-S_6\))允许使用;同时\(ALE\)置为高电平,在\(T_1\)的后半周期变为低电平。下降沿触发锁存器\(STB\)实现数据锁存。 |
---|---|
\(T_2\) | 前半周期结束地址输出,\(AD_0-AD_{15}\)变为高阻态,\(S_3-S_6,\overline{BHE}\)输出周期状态信息,持续到\(T_4\);\(\overline{RD}\)置低指示本周期进行读操作,\(\overline{DEN}\)置低数据允许传输,上述两个引脚持续到\(T_4\)开始 |
\(T_3\) | 无变化 |
\(T_4\) | 前半周期CPU从数据总线取走数据(\(T_3-T_4\)开始这段时间,从存储器或外设读出的数据应放在数据总线上,若数据未准备就绪,使CPU的\(READY\)线拉低,在\(T_3-T_4\)间插入若干个\(T_w\),直到数据准备就绪,使\(READY\)拉高,进入\(T_4\)周期) |
\(M/\overline{IO}\):用于指示CPU对存储器/外设进行操作,在读总线周期内该引脚四个时钟周期内不发生变化。
\(DT/\overline{R}\):高电平\(Data-Transmit\),低电平\(Read\),在读总线周期内该引脚四个时钟周期内不发生变化。
\(T_1\) | 前半周期将要写入的地址放入\(AD_0-AD_{15},S_3-S_6\),并将\(\overline{BHE}\)置为低电平(表示\(S_3-S_6\))允许使用;同时\(ALE\)置为高电平,在\(T_1\)的后半周期变为低电平。下降沿触发锁存器\(STB\)实现数据锁存。 |
---|---|
\(T_2\) | 前半周期结束地址输出,\(AD_0-AD_{15}\)变为高阻态,\(S_3-S_6,\overline{BHE}\)输出周期状态信息,持续到\(T_4\);\(\overline{WR}\)置低指示本周期进行读操作,\(\overline{DEN}\)置低数据允许传输,上述两个引脚持续到\(T_4\)开始 |
\(T_3\) | 无变化 |
\(T_4\) | 存储器应在(\(\overline{WR},\overline{DEN}\)拉低到\(T_4\)的前半周期)内将数据从数据总线取走,否则通过\(READY\)线使\(CPU\)插入等待周期\(T_W\) |
存储器管理
基本概述
位(Bit):计算机存储的一位二进制信息(0或1)
字节(Byte):每八位二进制信息组组成一个字节
字(Word):一字为16位二进制信息,由两个字节组成,高八位为高字节,低八位为低字节
地址:存储器内以字节为单位存储信息,为了正确的存放与存储信息每一个单元给予一个存储器地址。
地址从0开始编号顺序每隔一个单元顺序加1。(计算机中,地址用二进制表示且为无符号数)
存储容量:存储单元的数目称为存储容量,存储容量大小与地址总线根数有关。计算机内以KB,MB为存储容量的一种基本单位,\(2^{10}=1024B=1KB,1024KB=1MB\)
8086/8088的字长为16位,一个字存入存储器有以下规定
- 一个字存入存储器要占有相继两个存储单元
- 存放时低八位字节存入低地址单元,高八位字节存入高地址存储单元
- 存储器中两字节单元组成一个字单元,字单元的地址采用低八位字节存储单元单元
非规则存放:存放字时,低八位字节在奇数地址开始存放,按该方式存放的字未非规则字
规则存放:存放字时,高八位字节在偶数地址开始存放,按该方式存放的字未规则字
对8086CPU规则字的存取可用一个总线周期完成,非规则字的存取需要两个总线周期
存储器分段技术
8086/8088CPU采用了段加偏移技术使寻址范围达到1M字节。
分段技术:8086系统将1M字节存储器空间划分为若干逻辑段(最多包含64KB长的连续存储单元,最大段10000H=64KB)。
每一段的起始地址(段基址)为能被16整除的地址(即段首址的地址码的最低4位二进制数均为0)。
另外,一段的首地址的高16位称为该段的段地址,段地址分别由CS、SS、DS、ES四个段寄存器给出。
偏移地址:任意相邻两个段地址相距16个字节的存储单元(如\(0200H-0201H\),为两个段地址,相差\(0001H\)可表示16个字节存储单元),因段内最多可包含\(2^{16}=64KB\)存储空间,故段内任一存储单元的地址可以用相对于段首址的16位偏移量来表示。
物理地址(实际地址):任意存储单元对应的唯一20位二进制地址码
逻辑地址:用段地址及偏移地址指明某一内存单元的内存单元的地址,格式为:段地址:偏移地址
逻辑地址->物理地址
\[物理地址=段地址*16+偏移地址 \]或,段地址左移四位+偏移地址
当某个单元段地址不变时,偏移地址也不会变。
如:
代码段占有\(8KB=2^{13}=10,0000,0000,0000B=2000H\),CS段基址为\(02000H\),尾地址为\(02000H+2000h=04000H\)
数据段占有\(2KB=2^{11}=1000,0000,0000B=800H\),DS段紧接CS尾地址\(04000H\),则尾地址为\(04000H+800H=04800H\)
堆栈段只有\(1KB=2^{10}=100,0000,0000B=400H\),SS段基址为\(04800H\),尾地址为\(04800H+400H=04C00H\)
分段存储
代码段CS | 指令代码存放区,取指令时物理地址为\(CS*16+IP\) |
---|---|
堆栈段SS | 以"后进先出"原则进行数据操作,用于暂时存放一批需要保护的数据或地址,物理地址为\(SS*16+SP\) |
数据段DS | 物理地址\(DS*16+寻址方式对应的16为地址\) |
附加段ES |