# 中央处理器:数据通路和控制器
# 单周期数据通路设计
# CPU 功能及其与计算机性能的关系
# CPU 基本功能
(1)控制指令执行顺序
(2)控制指令执行操作
(3)控制操作时序
(4)对数据进行运算
(5)对访存或 I/O 访问进行控制
(6)异常和中断处理
# CPU 执行过程
- 取指令
- PC+1 送 PC
- 指令译码
- 进行主存地址运算
- 取操作数
- 进行算术 / 逻辑运算
- 存结果
- 判断和检测 “异常” 事件
- 若有异常,则自动切换到异常处理程序
- 检测是否有 “中断” 请求,有则转中断处理
计算机性能 (程序执行快慢) 由三个关键因素决定:
- 指令数目、CPI、时钟周期
- 指令数目由编译器和指令集决定
- 时钟周期和 CPI 由 CPU 的实现来决定
# 时钟周期、CPU 周期、指令周期区别
# 组成指令功能的四种基本操作
- 读取某一主存单元的内容,并将其装入某个寄存器
- 把一个数据从某个寄存器存入给定的主存单元中
- 把一个数据从某个寄存器送到另一个寄存器或者 ALU
- 进行某种算术运算或逻辑运算,将结果送入某个寄存器
# 数据通路 (DataPath)
指令执行过程中,数据所经过的路径,包括路径中的部件。它是指令的执行部件。
# 数据通路的基本结构
- 数据通路由两类部件组成
- 组合逻辑元件(也称操作元件)
- 存储元件(也称状态元件)时钟信号控制
- 元件间的连接方式
- 总线连接方式
- 分散连接方式
- 数据通路如何构成?
- 由 “操作元件” 和 “存储元件” 通过总线方式或分散方式连接而成
- 数据通路的功能是什么?
- 进行数据存储、处理、传送
- 单周期控制器设计
# 操作元件
- 加法器
- 多路选择器
- 算术逻辑部件
- 译码器
# 存储元件
寄存器
有一个写使能(Write Enable-WE)信号
0: 时钟边沿到来时,输出不变
1: 时钟边沿到来时,输出开始变为输入
若每个时钟边沿都写入,则不需 WE 信号
寄存器组
两个读口(组合逻辑操作):
busA 和 busB 分别由 RA 和 RB 给出地址。
地址 RA 或 RB 有效后,经一个 “取数时间 (AccessTime)”,BusA 和 BusB 有效。
一个写口(时序逻辑操作):写使能为 1 的情况下,时钟边沿到来时,busW 传来的值开始被写入 RW 指定的寄存器中。
存储器
- Data Out:32 位读出数据
- Data In: 32 位写入数据
- Address:读写公用一个 32 位地址
- 读操作(组合逻辑操作):地址 Address 有效后,经一个 “取数时间 AccessTime”,Data Out 上数据有效。
- 写操作(时序逻辑操作) :写使能为 1 的情况下,时钟 Clk 边沿到来时,Data In 传来的值开始被写入 Address 指定的存储单元中。
# 取指令部件
所有指令操作:
- 取指令
- 更新 PC
# R 型指令 (以 add 和 sub 为代表)
Ra, Rb, Rw 分别对应指令的 rs, rt, rd
指令 “add rd, rs, rt” 的控制信号应为?
ALUctr=add,RegWr=1
# I 型指令
# ori 等逻辑运算指令
立即数零扩展,并与 rs 内容做 “或” 运算
Ori 指令的控制信号:RegDst=1;RegWr=1;ALUSrc=1;ALUctr=or
# lw 访存指令
RegDst=1, RegWr=1, ALUctr=add, ExtOp=1, ALUSrc=1, MemWr=0, MemtoReg=1
# sw 存数指令
RegDst=x, RegWr=0, ALUctr=add, ExtOp=1, ALUSrc=1, MemWr=1, MemtoReg=x,不涉及 RegDst,MemtoReg 信号
# branch 指令
RegDst=x, RegWr=0, ALUctr=sub, ExtOp=x, ALUSrc=0, MemWr=0, MemtoReg=x, Branch=1
PC 是一个 32 位地址:
顺序执行时: PC [31:0] = PC [31:0] + 4
转移执行时: PC [31:0]= PC [31:0] + 4 + SignExt [Imm16] * 4
MIPS 按字节编址,每条指令为 32 位,占 4 个字节,故 PC 的值总是 4 的倍数,即后两位为 00,因此,PC 只需要 30 位即可。
顺序执行时: PC [31:2] = PC [31:2] + 1
转移执行时: PC [31:2] = PC [31:2] + 1 + SignExt [Imm16]
取指令时:指令地址 = PC [31:2] 串接 “00”
# J 型指令
RegDst=ExtOp=ALUSrc=MemtoReg=ALUctr=x, RegWr=0, MemWr=0, Branch=0, Jump=1
# 单周期数据通路的实现
# 单周期控制器设计
取址
取指部件由旧控制信号控制,会不会有问题?
不会,因为 PC 输入端的值不会写入直到下个 Clk 到来
只要保证下个 Clk 来之前能产生正确的 PC 即可!
译码
更新 PC
# 指令与控制信号关系表
# 时钟周期
lw 指令的执行时间最长,它所花时间作为时钟周期
单周期处理器的 CPI 为 1,然而,实际上,单周期处理器并不是最优选择,因为一些指令可能只需要很短的时间完成,而其他指令可能需要较长的时间。为了更好地利用硬件资源,提高性能,现代处理器通常采用流水线(Pipeline)架构,允许多条指令同时在不同的阶段执行,从而降低整体执行时间。
# 微程序控制器设计与异常处理
# 硬连线路设计和微程序设计
硬连线路设计的特点:
- 优点:速度快,适合于简单或规整的指令系统,例如,MIPS 指令集。
- 缺点:它是一个多输入 / 多输出的巨大逻辑网络。对于复杂指令系统来说,结构庞杂,实现困难;修改、维护不易;灵活性差。甚至无法用有限状态机描述!
微程序控制器的基本思想:
- 仿照程序设计的方法,编制每个指令对应的微程序
- 每个微程序由若干条微指令构成,各微指令包含若干条微命令(一条微指令相当于一个状态,一个微命令就是状态中的控制信号)
- 所有指令对应的微程序放在只读存储器中,执行某条指令时,取出对应微程序中的各条微指令,对微指令译码产生对应的微命令,这个微命令就是控制信号。
- 这个只读存储器称为控制存储器(Control Storage),简称控存 CS 。
微程序设计的特点:具有规整性、可维性和灵活性,但速度慢。
# 异常和中断处理
程序执行过程中,CPU 会遇到一些特殊情况,使正在执行的程序被 “中断”
此时,CPU 中止原来正在执行的程序,转到处理异常情况或特殊事件的程序去执行,执行后再返回到原被中止的程序继续执行
内部 “异常”:在 CPU 内部发生的意外事件或特殊事件
按发生原因分为硬故障中断和程序性中断两类
- 硬故障中断:如电源掉电、硬件线路故障等
- 程序性中断:执行某条指令时发生的 “例外 (Exception)”,如溢出、缺页、越界、越权、非法指令、除数为 0、堆栈溢出、访问超时、断点、单步、系统调用等
按处理方式分为故障 (fault)、自陷 (Trap) 和终止 (Abort) 三类
- 故障:执行指令引起的异常事件,如溢出、缺页、堆栈溢出、访问超时等
- 自陷:预先安排的事件,如单步跟踪、系统调用 (执行访管指令) 等(自愿中断)
- 终止:硬故障事件,机器将 “终止”,调出中断服务程序来重启操作系统
外部 “中断”:在 CPU 外部发生的特殊事件,通过 “中断请求” 信号向 CPU 请求处理
- 如实时钟、控制台、打印机缺纸、外设准备好、采样计时到、DMA 传输结束等
# 中断和异常的区别
- 产生源不相同,异常是由 CPU 产生的,而中断是由硬件设备产生的。
- 中断是异步的,这意味着中断可能随时到来;而异常是 CPU 产生的,所以,它是时钟同步的。
- 当处理中断时,处于中断上下文中;处理异常时,处于进程上下文中。