1 概念
冯·诺伊曼机: ①采用存储程序工作方式: 事先编制好的程序和原始数据送入主存后执行, 取指令
→
\to
→指令译码并计算下条指令地址
→
\to
→取操作数并执行
→
\to
→结果送回主存, 自动逐条执行指令直至程序结束; ②由运算器, 存储器, 控制器, 输入设备, 输出设备 5 部分组成; ③指令和数据均以二进制代码表示, 同等地位存储, 形式上无区别但机器可以区分; ④指令由操作码和地址码组成, 操作码指出指令类型, 地址码指出操作数地址.
(未完待续)
2 计算
2.1 数据表示与运算
定点数: 真值 − - − 整数部分除 2 2 2 取余, 小数部分乘 2 2 2 取整; 最高位为符号位, 正数取 0 0 0, 负数取 1 1 1 → \to → 原码 − - − 按位取反( ∼ \sim ∼) → \to → 反码 − - − 加 1 1 1 → \to → 补码.
异号相加, 同号相减, 永不溢出.
正溢: 正数相加或正数减负数为负 - 本应为正.
负溢: 负数相加或负数减正数为正 - 本应为负.
双符号位: “00” 正数, “11” 负数; “01” 正溢, “10” 负溢.
带标志加减法器: S U B = 1 {\rm SUB}=1 SUB=1 时为减法; a − b = a + ( ∼ b + 1 ) a-b=a+(\sim b+1) a−b=a+(∼b+1).
标志位 | 为 1 1 1 时含义 | 表达式 |
---|---|---|
ZF 零标志 | 结果为 0 0 0 | - |
OF 溢出标志 | 带符号加/减法溢出; 无符号加/减法进错位 |
c
n
−
1
⊕
c
n
−
2
c_{n-1}\oplus c_{n-2}
cn−1⊕cn−2 最高位进位和次高位进位异或 |
SF 符号标志 | 结果为负 | - |
CF 进/错位标志 | 无符号加/减法溢出; 带符号加/减法进错位 |
c
n
−
1
⊕
S
U
B
c_{n-1}\oplus {\rm SUB}
cn−1⊕SUB 最高位进位异或减法标志 |
原码一位乘法: 符号位单独考虑, 类似于竖式计算.
原码加减交替除法: 类似于竖式除法, 默认上商为
1
1
1; 减去除数中间余数为负时, 上商修改为
0
0
0, 下一轮改为加上除数.
补码除法仅当
−
2
n
−
1
/
1
-2^{n-1}/1
−2n−1/1 时会溢出.
单精度浮点数(32b) | 符号 s s s (1b) | 阶码 e e e (8b; 偏置127) | 尾数 f f f (23b) | 值 |
---|---|---|---|---|
规格化非零数 | 0 或 1 | 0 < e < 25 5 ( 10 ) 0<e<255_{(10)} 0<e<255(10) | 任意 | ( − 1 ) s × 2 e − 127 × ( 1. f ) (-1)^s\times2^{e-127}\times(1.f) (−1)s×2e−127×(1.f) |
正零 | 0 | 0 | 0 | + 0 +0 +0 |
负零 | 1 | 0 | 0 | − 0 -0 −0 |
正无穷大 | 0 | 全 1; 即 255 ( 10 ) _{(10)} (10) | 0 | + ∞ +\infty +∞ |
负无穷大 | 1 | 全 1 | 0 | − ∞ -\infty −∞ |
非规划化数(下溢) | 0 或 1 | 0 | 非 0 | ( − 1 ) s × 2 − 126 × ( 0. f ) (-1)^s\times2^{-126}\times(0.f) (−1)s×2−126×(0.f) |
非数 | 0 或 1 | 全 1 | 非 0 | NaN |
浮点数加减计算:
①对阶: 小阶向大阶对齐, 隐藏位还原到尾数.
②尾数加减: 定点原码加减, 注意符号.
③规格化: 右规时尾数右移, 阶码加
1
1
1; 左规时尾数左移, 阶码减
1
1
1; 右规至多一次.
④尾数舍入: 保护位
+
+
+舍入位
+
+
+粘位; 就近舍入(
0
0
0 舍
1
1
1 入), 向
+
∞
+\infty
+∞ 舍入, 向
−
∞
-\infty
−∞ 舍入, 向
0
0
0 舍入.
⑤溢出判断: 右规时会发生阶码上溢;左规时会变为非规格化数.
2.2 性能指标
1
1
1GB
=
2
10
=2^{10}
=210MB
=
2
20
=2^{20}
=220KB
=
2
30
=2^{30}
=230B
=
2
33
=2^{33}
=233b.
存储字数: 存储器地址空间大小.
字长: 一次存取操作的数据量.
主存带宽: 最高数据传输速率.
存取时间: 启动存储器操作到完成操作所经历的时间; 读出时间, 写入时间.
存取周期: 进行一次完整读/写操作所需的全部时间, 即连续两次独立访存之间所需的最小时间间隔.
存储容量
=
=
=存储字数
×
\times
×存储字长.
单位成本
=
=
=总成本
/
/
/总容量.
数据传输速率
=
=
=数据宽度
/
/
/存取周期.
刷新周期: 刷新信号的时间间隔.
死区时间: 无法进行读/写操作的时间.
刷新时间
=
=
=读写周期.
集中刷新死区时间
=
=
=主存行数
×
\times
×刷新时间.
集中刷新死区率
=
=
=死区时间
/
/
/刷新周期.
分散刷新存取周期
=
2
×
=2\times
=2×存取周期.
异步刷新行间隔时间
=
=
=刷新周期
/
/
/主存行数.
异步刷新死区时间
=
=
=读写周期.
模块字长
=
=
=字长
×
\times
×模块数
顺序访存时间
=
=
=模块数
×
\times
×存取周期.
交叉访存时间
=
=
=存取周期
+
(
+(
+(模块数
−
1
)
×
-1)\times
−1)×总线周期.
数据线位数
=
=
=字长
/
/
/位扩展倍数.
片选线位数
=
log
2
=\log_2
=log2字扩展倍数.
SRAM 地址线位数
=
log
2
(
=\log_2(
=log2(总容量
/
/
/寻址单元(
1
1
1B 或字长)
)
)
).
DRAM 地址线位数
=
=
=SRAM 地址线位数
/
2
/2
/2.
引脚数
=
=
=数据线位数
+
+
+片选线位数
+
+
+地址线位数
+
+
+控制线位数(
1
1
1 或
2
2
2).
Cache 命中率
=
(
=(
=(访存总次数
−
-
−访问主存次数
)
/
)/
)/访存总次数.
平均访存周期(同时访问)
=
=
=命中率
×
\times
×Cache 存取周期
+
(
1
−
+(1-
+(1−命中率
)
×
)\times
)×主存存取周期.
平均访存时间(Cache 先行)
=
=
=Cache 存取周期
+
(
1
−
+(1-
+(1−命中率
)
×
)\times
)×主存存取周期.
Cache 系统效率
=
=
=Cache 存取周期
/
/
/平均访存周期.
1
1
1GHz
=
1
0
3
=10^3
=103MHz
=
1
0
9
=10^9
=109Hz;
1
1
1s
=
1
0
3
=10^3
=103ms
=
1
0
6
=10^6
=106μs
=
1
0
9
=10^9
=109ns.
吞吐量/带宽: 单位时间内处理请求数量, 主要取决于主存存取周期.
响应时间: 用户发送请求到对请求做出响应并获取所需结果的时间.
时钟周期: 主时钟脉冲信号宽度, CPU 工作最小时间单位.
主频: 每秒时钟周期数.
CPU 时间: 实际运行时间; 取决于主频, CPI, 指令条数.
时钟周期(ns)
=
1
/
=1/
=1/主频(GHz).
CPU 时间(ns)
=
=
=平均时钟周期数
×
\times
×时钟周期.
CPI(平均执行一条指令所用的时钟周期)
=
=
=平均时钟周期数
/
/
/指令条数.
MIPS(平均每秒执行百万条指令数)
=
=
=指令条数
/
(
/(
/(执行时间(s)
×
1
0
6
)
=
\times 10^6)=
×106)=主频
/
(
/(
/(CPI
×
1
0
6
)
\times 10^6)
×106).
流水线完成时间
=
(
=(
=(指令条数
+
+
+过程段数
−
1
)
×
-1)\times
−1)×时钟周期.
流水线吞吐率
=
=
=指令条数
/
/
/流水线完成时间.
流水加速比
=
(
=(
=(指令条数
×
\times
×过程段数
×
\times
×时钟周期
)
/
)/
)/流水线完成时间.
总线时钟周期: 即机器的时钟周期.
总线时钟频率: 一秒内时钟周期数.
总线传输周期: 一次总线操作所需的时间, 若干个时钟周期; 申请, 寻址, 传输, 结束.
总线工作频率: 一秒内传输周期数.
总线宽度: 同时传输的数据位数.
总线带宽: 最大传输速率.
总线带宽
=
=
=总线工作频率
×
\times
×总线宽度.
信号线数
=
=
=地址总线数
+
+
+数据总线数
+
+
+控制总线数.
每秒 I/O 处理次数
=
=
=外设数据传输速率
/
/
/I/O 接口缓冲寄存器容量.
I/O 处理频率
=
=
=每秒 I/O 处理次数
×
\times
×I/O 处理时钟周期.
3 设计
3.1 格式
定长指令扩展操作码: 操作码 || 地址
k
k
k || 地址
k
−
1
k-1
k−1 || … ; 指令总长为
n
n
n,
k
k
k 个地址总长为
m
m
m, 第
k
k
k 个地址长为
m
k
m_k
mk, 若已分配
N
k
N_k
Nk 个
k
k
k-地址指令, 则还可分配
2
m
k
(
2
n
−
m
−
N
k
)
2^{m_k}(2^{n-m}-N_k)
2mk(2n−m−Nk) 个
k
−
1
k-1
k−1-地址指令.
定长指令多种寻址: 操作码 || 寻址特征 || 形式地址(A).
指令寻址: 顺序寻址, 即 PC 自增; 跳跃寻址, 即将 PC 修改为 JMP 后的地址.
数据寻址 | 有效地址(EA) | 寻址范围 | 访存次数 |
---|---|---|---|
立即寻址 | A 即为操作数 | - | 0 |
直接寻址 | EA = = =A | 2 n 2^n 2n | 1 |
间接寻址 | EA = = =(A) | 2 m 2^m 2m | 2 |
寄存器寻址 | EA = = =R | - | 0 |
寄存器间接寻址 | EA = = =® | 2 r 2^r 2r | 1 |
相对寻址 | EA = = =(PC) + + +A | 2 n 2^n 2n | 1 |
基址寻址 | EA = = =(BR) + + +A | 2 n 2^n 2n | 1 |
变址寻址 | EA = = =A + + +(IX) | 2 r 2^r 2r | 1 |
隐含寻址 | EA 2 _2 2=R | 0 | 0 |
堆栈寻址 | 进出栈时自动加减 SP | - | 1 |
形式地址 n n n bit; 主存字长 m m m bit; 寄存器字长 r r r bit.
中断屏蔽字: 需要屏蔽的中断源(优先级低于自身)及自身的位置 “1”, 优先级高于自身的位置 “0”; 即优先级最高中断源屏蔽字全 “1”, 优先级最低中断源屏蔽字除自身位外全 “0”.
虚拟地址-物理地址转换: 虚页号 || 偏移
→
\to
→ 物理页号 || 偏移.
页表行: 标记/虚页号 || 有效位/装入位(页面是否已调入主存) || 脏位/修改位(是否修改过; 写回) || 引用位/使用位(替换策略) || 物理页号.
顺序多体并行存储器(高位交叉编址): 片内地址
=
=
=体号 || 体内地址.
交叉多体并行存储器(低位交叉编址): 片内地址
=
=
=体内地址 || 体号.
主存字扩展: 主存地址
=
=
=片选(高位) || 片内地址(低位).
Cache 行: 有效位 || 脏位 || 引用位 || 标记 || 数据.
直接相联映射: 固定位置; 标记 || 行号 || 偏移; 行号
=
=
=主存块号 mod Cache 行数; 标记位数
=
log
2
=\log_2
=log2主存块数
−
log
2
-\log_2
−log2Cache 行数.
全相联映射: 任意位置; 标记 || 偏移; 标记位数
=
log
2
=\log_2
=log2主存块数.
组相联映射: 固定组内任意位置; 标记 || 组号 || 偏移; 组号
=
=
=主存块号 mod Cache 组数; 标记位数
=
log
2
=\log_2
=log2主存块数
−
log
2
-\log_2
−log2Cache 组数; 组内
r
r
r 行即为
r
r
r-路组相联.
主存块数
=
=
=主存容量
/
/
/Cache 行长.
Cache 大小
=
(
1
=(1
=(1(仅考虑有效位)
+
+
+ 标记位数
+
log
2
+\log_2
+log2Cache 行长
)
×
)\times
)× Cache 行数.
I/O 端口: I/O 接口中可被 CPU 直接访问的寄存器; 数据端口(可读可写), 状态端口(仅可读), 控制端口(仅可写).
独立编址(I/O 映射): 独立于主存地址对所有 I/O 端口单独编址, 通过专门 I/O 指令表明访问 I/O 地址, I/O 指令地址码给出端口号.
统一编址(存储器映射): 主存地址分出一部分作为 I/O 端口地址, 根据地址范围区分主存和 I/O 端口.
水平型微指令: 操作控制 || 顺序控制(判断测试 || 后继地址).
直接编码: 操作控制每一位对应一个微命令, 选用时该位置 “1”;
n
n
n 个微命令需要
n
n
n 位.
字段直接编码: 操作控制分段, 互斥微命令在同一段, 相容微命令在不同段, 通过译码器发出控制信号;
n
n
n 位段可表示
2
n
−
1
2^n-1
2n−1 个互斥微命令, 预留 “000” 表示不操作.
字段间接编码: 字段中某些微命令需要另一个字段中某些微命令解释.
垂直型微指令: μOP(微操作码) || Rd(目的地址) || Rs(源地址).
硬布线逻辑表达式: 微操作
=
∑
=\sum
=∑指令周期
⋅
\cdot
⋅节拍
⋅
(
∑
\cdot(\sum
⋅(∑当前指令周期当前节拍需要执行微操作的指令
)
)
);
+
+
+ 为逻辑或,
⋅
\cdot
⋅ 为逻辑与.
硬布线控制器节拍: 每个周期有
3
3
3 个节拍; 位操作先后顺序固定; 被控对象不同的微操作尽量在一个节拍内; 占用时间较短的多个微操作尽量安排在一个节拍内并允许有先后顺序.
微程序控制器节拍: 在硬布线控制器节拍基础上, 节拍间插入一个节拍用来确定下一条微指令地址, 故每个周期
6
6
6 个节拍.
3.2 流程
t
R
C
t_{RC}
tRC 为读周期时长;
t
W
C
t_{WC}
tWC 为写周期时长.
通常
W
E
‾
\overline{\rm WE}
WE 高电平时为读信号, 低电平为写信号.
指令周期: 取指周期
→
\to
→间址周期
→
\to
→执行周期
→
\to
→中断周期.
取指周期(FE): 取指令; PC
→
\to
→MAR
→
\to
→地址总线
→
\to
→存储器, CU 读命令
→
\to
→控制总线
→
\to
→存储器, 存储器
→
\to
→数据总线
→
\to
→MDR
→
\to
→IR, CU 控制信号
→
\to
→PC 自增指向下一条指令.
间址周期(IND): 取操作数有效地址; Ad(IR)
→
\to
→MAR
→
\to
→地址总线
→
\to
→存储器, CU 读命令
→
\to
→控制总线
→
\to
→存储器, 存储器
→
\to
→数据总线
→
\to
→MDR.
执行周期(EX): 取操作数并根据操作码产生执行结果.
中断周期(INT): 处理中断请求, 程序断点存入堆栈, SP 指向栈顶; CU 控制信号
→
\to
→SP 自减, SP
→
\to
→MAR
→
\to
→地址总线
→
\to
→存储器, CU 写命令
→
\to
→控制总线
→
\to
→存储器, PC
→
\to
→MDR
→
\to
→数据总线
→
\to
→存储器, CU 中断服务程序入口地址
→
\to
→PC.
异常/中断处理: 关中断
→
\to
→保存现场
→
\to
→异常/中断识别与处理
→
\to
→恢复现场.
关中断: 置 IF
=
0
=0
=0 表示不允许响应新的中断.
保存现场: 程序断点(地址)送入栈或特定寄存器中保存, 被中断时的程序状态字寄存器 PSW 内容送入栈或特定寄存器中保存.
异常/中断识别与处理: 软件识别, CPU 设置状态寄存器记录原因, 系统使用统一查询程序查询状态寄存器以确定类型; 硬件识别(向量中断), 对应处理程序首地址即中断向量, 查询中断向量表转到处理程序.
恢复现场: 程序断点送回 SP, 程序状态送回 PSW.
多重中断运行轨迹: 优先级较低的中断会被优先级较高的中断中断.
指令流水线: 取指(IF) → \to →译码/读寄存器(ID) → \to →执行/计算地址(EX) → \to →访存(MEM) → \to →写回(WB).
总线事务: 请求
→
\to
→仲裁
→
\to
→寻址
→
\to
→传输
→
\to
→释放.
总线定时: 接发双方数据交换过程中总线需要时间上配合关系的控制.
同步定时: 统一时钟信号协调接发双方传送定时关系.
异步定时: 主设备发出请求信号, 从设备接收后发出回答信号.
不互锁: 主设备请求后不等待回答经过一段时间即撤销, 从设备接收并发出回答后经过一段时间即撤销.
半互锁: 主设备请求后必须等待回答才撤销, 从设备接收并发出回答后经过一段时间即撤销.
全互锁: 主设备请求后必须等待回答才撤销, 从设备接收并发出回答后必须等待主设备先撤销请求才撤销.
半同步定时: 信号发出严格参照系统时钟前沿开始, 界首市采用系统时钟后沿时刻识别, 允许设备不同速度; 增设 Wait 响应信号线, 每个时钟到来时采样 Wait 信号线直至有效.
分离定时: 请求和应答分离, 占用总线时直接发送数据而后立即释放.
主设备: 获得总线控制权.
从设备: 被主设备访问, 只能响应主设备发来的命令.
总线仲裁: 多个设备争抢总线控制权时, 选择一个设备优先获得控制权.
集中仲裁: 由总线控制器判优; 请求信号发送到中央控制器
→
\to
→控制器发送允许信号到指定设备
→
\to
→
分布仲裁: 主模块拥有独立仲裁器与仲裁号; 仲裁号发送到共享仲裁总线
→
\to
→仲裁器接收后与自己仲裁号比较
→
\to
→优先级低的不予响应并撤销仲裁号.
链式查询: 轮询固定从 0 0 0 开始.
计数器查询: 轮询可从任意位置开始.
独立请求:
n
n
n 个设备需要
2
n
+
1
2n+1
2n+1 个控制线.
程序查询: CPU 预置传送参数
→
\to
→向 I/O 接口发出命令字启动设备
→
\to
→从接口读取状态信息
→
\to
→周期性或持续查询状态信息直至准备就绪
→
\to
→传送数据
→
\to
→修改地址和计数器
→
\to
→继续读取状态信息直至计数器为
0
0
0.
程序中断: I/O 设备就绪
→
\to
→主动向 CPU 发出中断请求
→
\to
→中断处理, 中断服务程序完成数据传送.
DMA: DMA请求
→
\to
→预处理
→
\to
→数据传送
→
\to
→后处理.
预处理: 主存起始地址
→
\to
→AR(主存地址计数器), I/O 设备地址
→
\to
→DAR(设备地址计数器), 传送长度
→
\to
→WC(传送长度计数器), 启动 I/O 设备.
数据传送: I/O 设备向数据缓冲器写入数据直至将要溢出.
后处理: 将要溢出时发起中断请求, CPU 或主存读取数据.
传送方式: 停止 CPU 访存; DMA 和 CPU 交替访存; 周期挪用/窃取(CPU 正在访存时等待存取周期结束; 同时请求访存时 DMA 优先).
微指令执行过程: 取指令微程序
→
\to
→指令对应微程序
→
\to
→回到取指令微程序入口地址.
取指令微程序: 取指令微程序入口地址(0 号单元)
→
\to
→μPC, (CM)(控制存储器)
→
\to
→μIR; 执行后主存中取出指令已存入 IR.
指令对应微程序: 指令操作码通过微指令地址形成部件产生指令对应微程序入口地址
→
\to
→ μPC, (CM)
→
\to
→ μIR; 逐条取出并执行微指令, 微指令中后继地址
→
\to
→μPC.
3.3 结构
n
n
n 倍字扩展时, 地址线高
log
2
n
\log_2 n
log2n 位用于片选接
log
2
n
\log_2 n
log2n-
n
n
n 译码器.
FA 为全加器;
O
F
=
C
n
⊕
C
n
−
1
{\rm OF}=C_n\oplus C_{n-1}
OF=Cn⊕Cn−1,
S
F
=
F
n
−
1
{\rm SF}=F_{n-1}
SF=Fn−1,
Z
F
=
∼
F
{\rm ZF}=\sim F
ZF=∼F,
C
F
=
C
o
u
t
⊕
C
i
n
{\rm CF}=C_{\rm out}\oplus C_{\rm in}
CF=Cout⊕Cin.
初始化:
Y
Y
Y=乘数,
P
=
0
P=0
P=0, 进位寄存器
C
=
0
C=0
C=0,
C
n
=
32
C_n=32
Cn=32.
C
C
C ||
P
P
P ||
Y
Y
Y 整体右移, 最高位进位移入结果, 仅当乘数当前最低位为
1
1
1 时进行加法,
C
=
C
F
C={\rm CF}
C=CF,
C
n
C_n
Cn 自减直至为
0
0
0.
最终
Y
Y
Y 为乘积.
初始化:
R
=
0
R=0
R=0,
Q
=
Q=
Q=被除数,
C
n
=
32
C_n=32
Cn=32.
默认做减法,
Q
Q
Q 低位上商为
1
1
1;
S
F
=
1
{\rm SF}=1
SF=1 时(即中间余数为负), 下一轮改为加法,
Q
Q
Q 低位上商改为
0
0
0;
R
R
R ||
Q
Q
Q 整体左移,
C
n
C_n
Cn 自减直至为
0
0
0.
最终
Q
Q
Q 为商;
R
R
R 为正时为余数, 为负时加回除数得到余数(恢复余数).