概述

历史上控制器的类型主要有两种:微程序控制和硬布线控制。微程序控制一般与CISC指令系统配套,控制多周期数据通路。硬布线控制多与RISC指令系统配套,控制单周期或流水线数据通路。这里主要讨论硬布线控制。

控制器的作用是发出控制信号,控制数据通路处理加工数据。在前面的数据通路实验中,通过手动输入控制信号完成运算过程的控制;增加了控制器之后,通过控制器产生控制信号完成运算过程。

控制器产生控制信号的依据是指令。指令存放在指令存储器中。控制器从指令存储器中逐条取出指令,根据指令的功能产生相应的控制信号。控制器实验的硬件是在前面数据通路的基础上,增加指令存储器、控制器等部件,因此可以看成是一个简单的模型计算机。

指令系统

实验计算机指令字长为14位,指令格式如表 1所示。 其中opcode为4位的操作码,所以最多可有16条指令;rs1、rs2和rd为2位的寄存器号,所以有4个通用寄存器,并且R0寄存器的值恒为零;imm为补码表示的4位立即数。

表 1. 指令格式

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的指令。

表 2. 指令助记符、操作码编码及功能
指令类型 指令助记符 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*)。

例 1. 计算斐波那契数列的程序
  1. 汇编语言程序

         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 # 循环
  2. 机器指令程序

    0b01100000010001
    0b01100000100001
    0b00010110110000
    0b01101000010000
    0b01101100100000
    0b10100000000010

实验安排

硬布线控制一共安排了Ⅰ、Ⅱ、Ⅲ三个实验项目。 项目Ⅰ完成R型和I型运算指令的控制; 项目Ⅱ除了R型和I型运算指令,还要完成B型分支指令的控制; 项目Ⅲ增加M型访存指令的控制。 在编写上,项目Ⅰ和项目Ⅱ是独立的,既可以依次完成项目Ⅰ和项目Ⅱ,也可以直接从项目Ⅱ开始。项目Ⅲ是递增的,需要先完成项目Ⅰ或项目Ⅱ。