概述
历史上控制器的类型主要有两种:微程序控制和硬布线控制。微程序控制一般与CISC指令系统配套,控制多周期数据通路。硬布线控制多与RISC指令系统配套,控制单周期或流水线数据通路。这里主要讨论硬布线控制。
控制器的作用是发出控制信号,控制数据通路处理加工数据。在前面的数据通路实验中,通过手动输入控制信号完成运算过程的控制;增加了控制器之后,通过控制器产生控制信号完成运算过程。
控制器产生控制信号的依据是指令。指令存放在指令存储器中。控制器从指令存储器中逐条取出指令,根据指令的功能产生相应的控制信号。控制器实验的硬件是在前面数据通路的基础上,增加指令存储器、控制器等部件,因此可以看成是一个简单的模型计算机。
指令系统
实验计算机指令字长为14位,指令格式如表 1所示。 其中opcode为4位的操作码,所以最多可有16条指令;rs1、rs2和rd为2位的寄存器号,所以有4个通用寄存器,并且R0寄存器的值恒为零;imm为补码表示的4位立即数。
13 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
0 |
|
opcode |
rs1 |
rs2 |
rd |
imm |
实验计算机设计了R型和I型运算指令、B型分支指令以及M型访存指令,指令功能及操作码编码见表 2。
R型指令的两个源操作数均来自寄存器,分别由rs1和rs2给出寄存器号。I型指令的一个源操作数来自寄存器,由rs1给出寄存器号;另一个源操作数是立即数,由指令的imm字段提供。运算结果存入由rd指定的寄存器中。
B型指令根据rs1和rs2的大小关系决定是顺序执行下一条指令,还是跳转去执行地址为imm的指令。
指令类型 | 指令助记符 | opcode | 功能 |
---|---|---|---|
R型 |
add rd, rs1, rs2 |
0001 |
rd←(rs1)+(rs2) |
sub rd, rs1, rs2 |
0010 |
rd←(rs1)-(rs2) |
|
and rd, rs1, rs2 |
0011 |
rd←(rs1)∧(rs2) |
|
or rd, rs1, rs2 |
0100 |
rd←(rs1)∨(rs2) |
|
xor rd, rs1, rs2 |
0101 |
rd←(rs1)⊕(rs2) |
|
I型 |
addi rd, rs1, #imm |
0110 |
rd←(rs1)+imm |
andi rd, rs1, #imm |
0111 |
rd←(rs1)∧imm |
|
ori rd, rs1, #imm |
1000 |
rd←(rs1)∨imm |
|
xori rd, rs1, #imm |
1001 |
rd←(rs1)⊕imm |
|
B型 |
beq rs1, rs2, #imm |
1010 |
if (rs1)=(rs2) goto imm |
bne rs1, rs2, #imm |
1011 |
if (rs1)≠(rs2) goto imm |
|
blt rs1, rs2, #imm |
1100 |
if (rs1)<(rs2) goto imm |
|
bge rs1, rs2, #imm |
1101 |
if (rs1)≥(rs2) goto imm |
|
M型 |
load rd, rs1, #imm |
1110 |
rd←Mem[(rs1)+imm] |
store rs2, rs1, #imm |
1111 |
Mem[(rs1)+imm]←(rs2) |
下面给出一个例子,使用上述指令系统,编写一个计算斐波那契数列的程序。 斐波那契数列(Fibonacci sequence)是指这样一个数列:{1,1,2,3,5,8,13,21…},它的首项为1,第2项也为1,且从第3项起,每一项都等于它前两项之和。用符号定义如下:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n ≥ 3,n ∈ N*)。
-
汇编语言程序
addi r1, r0, 1 # r1:term1 addi r2, r0, 1 # r2:term2 loop: add r3, r1, r2 # nextTerm = term1 + term2 addi r1, r2, 0 # term1 = term2 addi r2, r3, 0 # term2 = nextTerm beq r0, r0, loop # 循环
-
机器指令程序
0b01100000010001 0b01100000100001 0b00010110110000 0b01101000010000 0b01101100100000 0b10100000000010