文章目录
思维导图
一:内容回顾和一些概念
高级语言编写的程序会被翻译为与之等价指令序列,每条指令的执行,有可能会涉及如下四个周期
- 取指周期:完成取指令
- 间指周期:如果采用间接寻址,需要将形式地址转变为真实地址
- 执行周期:执行指令
- 中断周期:处理中断信号
下图中FE
、IND
、EX
和INT
分别是上面四个周期的缩写,各自对应了如下四个触发器,如果某个触发器为1就表示指令处于某个周期内
一个指令周期内又需要若干微操作序列来完成该指令周期的工作,每个指令周期又由若干时钟周期组成(节拍),CU会在每一个节拍内发出一个微命令,生成对应的微操作
- 微命令和微操作是一一对应的:比如微命令1使得PC o u t _{out} out、MAR i n _{in} in有效,完成对应的微操作(PC)->MAR
每个节拍内可以并行地完成互不冲突的微操作,而且同一个微操作也可能在不同指令的不同阶段被使用
- 上图采用的是定长周期的策略(即便执行周期和中断周期可以在两个节拍内完成,但是我们还是让其耗时三个节拍)
实际上,不同指令的执行周期所需要的节拍数是各不相同的,因此为了简化设计,选择定长的机器周期,以可能出现的最大节拍数为准(通常以访存所需要节拍数作为参考),若实际所需要节拍数较少,可以将微操作安排在机器周期末尾几个节拍上进行
二:硬布线控制
硬布线控制:使用控制单元CU进行逻辑控制
(1)CU如何发出微命令
可以看出,指令间区别最大的地方在于执行周期,像取指周期、间指周期和中断周期都是差不多的。所以,我们只要根据指令操作码、目前的指令周期、节拍信号以及机器状态条件就可以确定现在这个节拍下应该发出哪些微命令。具体来说
-
STEP1:得让CU知道现在执行的是什么命令:首先需要把IR的 n n n位操作码送给操作码译码器( n n n位操作码意味着有2 n ^{n} n种不一样的指令,经过操作码译码器译码后对应的地址选择线就会被选通),CU通过判断对应哪一个输入信号有效,来判断当前执行的是哪一条指令
-
STEP2:得让CU知道当前执行到了该指令的哪一个机器周期:所以需要把
FE
、IND
、EX
和INT
这四个触发器的二进制信息送给CU,CU通过判断对应的值是否为1来判断目前处于哪一个机器周期(需要注意这四个触发器实际上已经被集成在了CPU中)
-
STEP3:得让CU知道当前处在该机器周期的哪一个节拍:因此需要给CU输入一个节拍信号,节拍信号是通过节拍发生器给出的,时钟部件会有规律的发出脉冲信号,每个脉冲信号就是一个时钟周期。节拍发生器在接受到时钟部件发出的信号后,就会让其中的某个输出线导通、节拍信号是循环发出的,当T m _{m} m结束后,就会回到T 0 _{0} 0,此时表示进入了新的机器周期
-
STEP4:最后需要给CU提供机器状态条件:状态条件统称为标志,它们来自于执行单元的返回信息。比如前面说过的来自于运算器的PSW(溢出判断就在这里)、来自于ACC的符号位等,也有可能来自于I/O设备、主存等
这四组信息齐全后,CU就可以给出当前节拍下应该发出的微命令:每个输出的控制信号对应一个微命令,也就是对应一个微操作。例如,如果C
1
_{1}
1对应微操作为
(
P
C
)
(PC)
(PC)->MAR,那么只需让其接到PC
o
u
t
_{out}
out和MAR
i
n
_{in}
in即可
(2)逻辑化表达式
现在最困难的问题在于:CU如何能知道现在应该发出哪条命令?。比如上面的例子中,C 1 _{1} 1被接通后就执行了(PC)->MAR
- C
1
_{1}
1的比较好解释:因为所有指令在取指周期内,第一步需要做的事情就是(PC)->MAR。于是硬件工程师规定:无论是哪一种指令,只要处于取指周期(FE=1),同时还处于第一阶段(T
0
_{0}
0)的话,就要完成(PC)->MAR这样的操作,也即是C
1
_{1}
1对应的操作,其对应的逻辑化表达式为
C
1
C_{1}
C1=
F
E
⋅
T
0
FE·T_{0}
FE⋅T0
说到这里大家可能就已经明白了,只要能写出某一个微命令对应的逻辑化表达式,然后设计相应的逻辑电路即可,但理想很美好,现实很骨感。上面那个例子的逻辑电路设计起来是非常简单的,而且最重要的是该微操作仅出现在取指周期的第一阶段;但有的微操作,例如M(MAR)->MDR它们使用的就非常频繁,那么他们应该怎么设计呢?这就是本节内容的核心。在学习硬件时大家要牢牢把握“逻辑化表达式是电路的数学化描述”这句话的深刻含义
M(MAR)->MDR的逻辑化表达式和电路如下图所示
逻辑化表达式为:
F
E
FE
FE·
T
1
T_{1}
T1+
I
N
D
IND
IND·
T
1
T_{1}
T1(
A
D
D
ADD
ADD+
S
T
A
STA
STA+
L
D
A
LDA
LDA+
J
M
P
JMP
JMP+
B
A
N
BAN
BAN)+
E
X
EX
EX·
T
1
(
A
D
D
+
L
D
A
)
T_{1}(ADD+LDA)
T1(ADD+LDA)
-
F E FE FE· T 1 T_{1} T1:与运算,如果结果为1,就表示需要进行M(MAR)->MDR微操作
-
E X EX EX· T 1 ( A D D + L D A ) T_{1}(ADD+LDA) T1(ADD+LDA):如果处在ADD加法命令或LDA命令的执行周期的 T 1 T_{1} T1阶段也表示需要进行M(MAR)->MDR微操作
三:硬布线控制器设计
- 注意:此部分内容在考试中基本不会涉及,但是对于理解硬布线控制却很有帮助
(1)硬布线控制器设计步骤
硬布线控制器设计步骤如下
①:分析各个阶段的微操作序列(取指,间指,执行、中断)
- 确定哪些指令在什么阶段、在什么条件下会使用到的微操作
②:选择CPU的控制方式
- 采用定长机器周期还是不定长机器周期?每个机器周期安排几个节拍?
- 注意:后面讲解采用同步控制方式(定长机器周期),一个机器周期内安排3个节拍
③:安排微操作时序
- 如何用3个节拍完成整个机器周期内的所有微操作
④:电路设计
- 确定微操作命令的逻辑表达式,并用电路实现
(2)步骤一:分析各个阶段的微操作序列
如果我们能罗列出某个系统在各个阶段的微操作序列,就可以知道在什么情况下需要使用到这个微操作
取指周期(所有指令都一样)
- PC->MAR
- 1->R
- M(MAR)->MDR
- MDR->IR
- OP(IR)->ID(ID是指令译码器)
- (PC)+1->PC
间址周期(所有指令都一样)
- Ad(IR)->MAR(找寻真正地址)
- 1->R
- M(MAR)->MDR
- MDR->Ad(IR)
执行周期(各不相同),例如
CLA:clear ACC指令、ACC清零
- 0->ACC
LDA X:取数指令,把X所指内容取到ACC
- Ad(IR)->MAR
- 1->R
- M(MAR)->MDR
- MDR->ACC
JMP X:无条件转移
- Ad(IR)->PC
BAN X:条件转移,当ACC为负时转移(属于机器状态条件)
- A 0 ⋅ A_{0}· A0⋅Ad(IR)+ A ‾ 0 ⋅ \overline A_{0}· A0⋅(PC)->CP
(3)步骤三:安排微操作时序
- 注意:第二步已经完成,我们会采用定长机器周期,并且每个机器周期内安排三个节拍
安排微操作时序有如下原则:
- 原则一:微操作的先后顺序不得随意更改(比如PC->MAR一定在M(MAR)->MDR之前完成)
- 原则二:被控对象不同的微操作尽量安排在一个节拍内完成(比如PC->MAR控制对象为寄存器,1->R控制对象为主存,因此尽量安排在同一个节拍内完成)
- 原则三:占用时间较短的微操作尽量安排在一个节拍内完成,并允许有先后顺序(比如寄存器之间的交互快于寄存器与主存的交互,因此如果可以的话尽量将其放在一个节拍完成)
比如取指周期,上面得到的微操作序列,在这种原则下是不合适的,因此更改如下
- PC->MAR和1->R由于被控对象不同的,所以放在一个节拍内
- (PC+1)->PC位置随意,只要在PC->MAR之后即可,所以搭配一个M(MAR)->MDR让其在一个节拍内进行。不把M(MAR)->MDR放在后面的原因是因为这是从主存取数据,时间较长,起码得保证一个时钟周期
- 后面两个是CPU内部寄存器的数据传送,因此速度很快,在一个时钟周期内是可以一次同时发出两个微命令的
间址周期安排如下
执行周期的设计可以说是整个设计的核心所在,不同指令的执行周期千差万别,具体如何设计是硬件工程师的任务,在这里我们只是简单了解即可。主要是想让大家明白一点,指令的设计是一个非常严谨的事情,它有哪几个周期,一个周期内有几个节拍,一个节拍要完成哪些微操作,这些都是必须要考虑到的事情
- 设计时会将指令分为非访存,访存和转移指令等
(4)步骤四:组合逻辑设计(电路设计)
①:列出操作时间表:也即列出在取指、间址、执行和中断周期, T 0 T_{0} T0、 T 1 T_{1} T1和 T 2 T_{2} T2节拍内有可能用到的所有微操作
对于取指周期
- 需要用到该微操作的填“1”,否则空
- 注意表格中的状态条件栏:如果填“ I I I”,表示该指令采用间接寻址,需要将间址特征送入,即1->IND;如果填“ I ‾ \overline I I”,表示该指令将直接进入执行周期,即1->EX
对于间址周期
- 注意状态条件栏:如果填"
I
‾
N
‾
D
‾
\overline I \overline N \overline D
IND",表示该指令采用多级间接寻址,直到该状态栏不填任何信息时,才表示结束了间接寻址,可以进入执行周期
③对于执行周期
②:写出微操作命令的最简表达式
从上面的表格中我们可以看到M(MAR)->MDR操作的使用频次
- 对于取指周期,只要处在 T 1 T_{1} T1,无论哪一个指令都要用到M(MAR)->MDR,故为 F E FE FE· T 1 T_{1} T1+ I N D IND IND· T 1 T_{1} T1( A D D ADD ADD+ S T A STA STA+ L D A LDA LDA+ J M P JMP JMP+ B A N BAN BAN)+ E X EX EX· T 1 ( A D D + L D A ) T_{1}(ADD+LDA) T1(ADD+LDA)
- 对于间址周期,只要处在
T
1
T_{1}
T1,并且是
A
D
D
ADD
ADD、
S
T
A
STA
STA、
L
D
A
LDA
LDA、
J
M
P
JMP
JMP
、 B A N BAN BAN指令的话,就要用到M(MAR)->MDR,故为 F E FE FE· T 1 T_{1} T1+ I N D IND IND· T 1 T_{1} T1( A D D ADD ADD+ S T A STA STA+ L D A LDA LDA+ J M P JMP JMP+ B A N BAN BAN)+ E X EX EX· T 1 ( A D D + L D A ) T_{1}(ADD+LDA) T1(ADD+LDA) - 对于执行周期,只要处在 T 1 T_{1} T1,并且是 A D D ADD ADD或 L D A LDA LDA的话,就要用到M(MAR)->MDR,故为 F E FE FE· T 1 T_{1} T1+ I N D IND IND· T 1 T_{1} T1( A D D ADD ADD+ S T A STA STA+ L D A LDA LDA+ J M P JMP JMP+ B A N BAN BAN)+ E X EX EX· T 1 ( A D D + L D A ) T_{1}(ADD+LDA) T1(ADD+LDA)
综上,当逻辑表达式:“ F E FE FE· T 1 T_{1} T1+ I N D IND IND· T 1 T_{1} T1( A D D ADD ADD+ S T A STA STA+ L D A LDA LDA+ J M P JMP JMP+ B A N BAN BAN)+ E X EX EX· T 1 ( A D D + L D A ) T_{1}(ADD+LDA) T1(ADD+LDA)”为1时,就要执行M(MAR)->MDR微操作
③:设计出逻辑表达式对应的电路图
总结
硬布线控制器的设计步骤如下
1:分析每个阶段的微操作序列
2:选择CPU的控制方式
3:安排微操作时序
4:电路设计
- 列出操作时间表
- 写出微操作命令的最简表达式
- 画出逻辑图
硬布线控制器的特点:
- 指令越多,设计和实现就越复杂,因此一般用于RISC(精简指令集系统)
- 如果扩充一条新的指令,则控制器的设计就需要大改,因此扩充指令困难
- 由于使用纯硬件实现控制,因此执行速度很快(微操作控制信号由组合逻辑电路即时产生)