硬布线控制实验(RI)
注:“RI”表示控制器支持R型和I型运算指令。
实验原理
在前面数据通路的基础上,增加指令存储器、控制器等部件,构成一个可以完成R型和I型运算指令的计算机核心。原理框图如图 1。寄存器堆和ALU连成的数据通路是运算器数据通路实验完成的,下面介绍指令部件和控制器。

指令部件
指令部件包括指令存储器和程序计数器。根据指令系统的设计,指令存储器的字长是14位。作为实验计算机,只需要存放简单的程序,所以指令存储器的容量只有16个存储单元,可以存放16条指令。因此指令存储器的地址需4位,由程序计数器PC提供。
程序计数器PC可使用计数器组件。复位时PC值为0,即第一条指令的地址。在Clk上升沿到来时,PC值加1,即顺序执行。
控制器
控制器以指令opcode作为输入,为数据通路中所有单元产生控制信号。
图 1运算指令数据通路中,需要产生如下控制信号:
-
多路器的选择信号Ysel:为0时,选择将寄存器堆的RD2输出数据送给ALU的Y输入端;为1时,ALU的Y操作数来自指令中的立即数imm。
-
ALU的运算控制信号:根据前面ALU实验的设计,需要产生ALU的M、S1、S0控制信号。
-
寄存器堆的写允许信号RegWr:为1时,当在CLK时钟上升沿到来,寄存器堆执行写入操作。
因为指令系统的简单和规整,控制器的设计就是设计译码器来确定控制信号。对于指令系统中的R型和I型指令,控制器根据opcode的值,译码产生数据通路上的各个控制信号,实现指令功能。
下面以addi rd, rs1, imm
指令为例,分析指令的译码。该指令将rs1寄存器的值与立即数imm相加,结果存入rd寄存器。
rs1寄存器的值已经通过寄存器堆的RD1连接到了ALU的X输入端。为了将立即数imm送给ALU的Y输入端,需要使多路器的控制信号Ysel为1。ALUop应控制ALU进行加法运算,如果采用前面实验的ALU电路,控制信号M、S1、S0均为0。为了将运算结果写入寄存器堆,RegWr信号应为1。
图 2数据通路图直观地反映了上述分析,绿色通路表示有效的信息流,控制信号用红色表示。

指令译码的真值表如表 1所示。表中只给出了addi指令的控制信号取值,类似地可以分析出其他指令的控制信号取值。有了真值表,就可以进一步得到指令译码器的电路。
输入 |
输出 |
备注 |
||||
opcode |
Ysel |
M |
S1 |
S0 |
RegWr |
|
0001 |
add |
|||||
0010 |
sub |
|||||
0011 |
and |
|||||
0100 |
or |
|||||
0101 |
xor |
|||||
0110 |
1 |
0 |
0 |
0 |
1 |
addi |
0111 |
andi |
|||||
1000 |
ori |
|||||
1001 |
xori |
实验任务
验证任务
控制器的作用是控制指令的执行,所以需要通过执行指令来检验控制器的设计。例 1给出了一个测试程序。
addi r2, r0, 9 ori r3, r0, 10 sub r1, r2, r3 xor r1, r2, r1 and r3, r3, r1
-
用测试程序初始化指令存储器。
例 1给出的是符号指令组成的程序。 首先要将符号指令逐条翻译为机器指令,才能作为指令存储器的内容。
下面以第一条指令
addi r2, r0, 9
为例,说明翻译为机器指令的方法。 查指令编码表可知addi
的操作码为0110
, 按照指令格式,将0110
填入位13~10。 该指令的rd寄存器号为2,rs1寄存器号为0,立即数为9(十进制),将寄存器号和立即数以二进制形式填写到指令的对应字段,如下所示。 该指令没有使用rs2寄存器,对应字段填0。13
10
9
8
7
6
5
4
3
0
opcode
rs1
rs2
rd
imm
0110
00
00
10
1001
地址:机器指令 符号指令 0: 0x1829 addi r2, r0, 9 1: 0x203a ori r3, r0, 10 2: 0x0ad0 sub r1, r2, r3 3: ...... xor r1, r2, r1 4: ...... and r3, r3, r1
将翻译好的机器指令依次填入指令存储器相应地址的存储单元,即初始化ROM组件的内容。操作方法见ROM实验。
-
仿真运行测试程序,分析运行结果。
启动仿真后,第一条指令就已经在运行中。 通过点击时钟输入引脚改变CLK的状态,在CLK的上升沿保存指令的执行结果,同时进入下一条指令。 如果需要重新执行,点击Reset输入引脚,然后点击CLK,使PC为0,则程序回到第一条指令。
根据指令功能对每条指令的仿真结果进行分析。如果运行结果与预期不符,应分析查找故障原因,例如控制器产生的控制信号是否正确。
为便于观察运行情况,可在电路中添加一些「探测器」(Probe)(见几个有用的组件)。如果需要记录在图表中,则需设置「标签」(Label)属性。
-
验证更多指令(选做)
例 1测试程序只包含了部分运算指令,自己编写程序进行更全面的验证。