硬布线控制实验(Ⅰ)
实验原理

指令部件
指令部件包括指令存储器和程序计数器。根据指令系统的设计,指令存储器的字长是14位。作为实验计算机,只需要存放简单的程序,所以指令存储器的容量只有16个存储单元,可以存放16条指令。因此指令存储器的地址需4位,由程序计数器PC提供。复位时PC值为0,即第一条指令的地址。在Clk上升沿到来时,PC值加1,即顺序执行。
控制器
控制器以指令opcode作为输入,为数据通路中所有单元产生控制信号。
图 1运算指令数据通路中,需要产生如下控制信号:
-
多路器的选择信号Ysel:为0时,选择将寄存器堆的RD2输出数据送给ALU的Y输入端;为1时,ALU的Y操作数来自指令中的立即数imm。
-
ALU的运算控制信号:根据前面ALU实验的设计,需要产生ALU的M、S0、S1控制信号。
-
寄存器堆的写允许信号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、S0、S1均为0。为了将运算结果写入寄存器堆,RegWr信号应为1。 图 2数据通路图直观地反映了上述分析,绿色通路表示有效的信息流,红色表示有效的控制信号。

指令译码的真值表如表 1所示。表中只给出了addi指令的控制信号取值,类似地可以分析出其他指令的控制信号取值。有了真值表,就可以进一步得到指令译码器的电路。
指令助记符 | opcode | Ysel | M | S0 | S1 | RegWr |
---|---|---|---|---|---|---|
add |
0001 |
|||||
sub |
0010 |
|||||
and |
0011 |
|||||
or |
0100 |
|||||
xor |
0101 |
|||||
addi |
0110 |
1 |
0 |
0 |
0 |
1 |
andi |
0111 |
|||||
ori |
1000 |
|||||
xori |
1001 |
实验任务
-
设计控制器
-
连接电路
按照图 1将各个子电路连接起来,并添加Reset输入引脚和CLK时钟输入引脚。
程序计数器PC可使用计数器组件,该组件位于菜单项“Components/组件 ➤ Memory/存储器 ➤ Counter/计数器”。
-
仿真验证
因为控制器的作用是控制指令的执行,所以需要通过执行指令来检验控制器的设计。例 1给出了一个测试程序的例子。
例 1. 运算指令测试程序示例addi r1, r0, #10 ori r2, r0, #11 sub r3, r1, r2 xor r3, r1, r3 and r3, r3, r2
-
将例 1程序中的符号指令逐条翻译为机器指令,作为ROM的数据。
下面以第一条指令
addi r1, r0, #10
为例,说明翻译为机器指令的方法。 查指令编码表可知addi
的操作码为0110
, 按照指令格式,将0110
填入位13~10。 该指令的rd寄存器号为1,rs1寄存器号为0,立即数为10(十进制),将寄存器号和立即数以二进制形式填写到指令的对应字段,如下所示。 该指令没有使用rs2寄存器,对应字段填0。13
10
9
8
7
6
5
4
3
0
opcode
rs1
rs2
rd
imm
0110
00
00
01
1010
将上述二进制编码
0b01100000011010
或转换为十六进制的编码0x181A
填入指令存储器(ROM组件)地址为0的单元。类似地,可将例 1中的所有符号指令翻译为机器指令, 将其作为ROM组件的内容。 下面给出前3条指令的机器码,还有两条留给读者翻译。
0: 0x181a 1: 0x202b 2: 0x09b0 3: 4:
-
仿真运行程序,验证电路是否正确。
启动仿真后,第一条指令就在运行中。 通过点击时钟输入引脚改变CLK的状态,在CLK的上升沿保存指令的执行结果,同时进入下一条指令。 如果需要重新执行,点击Reset输入引脚,然后点击CLK,使PC为0,则程序回到第一条指令。
为便于观察运行情况,可在电路中添加一些“Probe/探测器”(见几个有用的组件)。如果需要记录在图表中,则需设置“Label/标签”属性。
-
-
验证更多指令
例 1测试程序只包含了部分运算指令,自己编写程序进行更全面的验证。
-
实验结果分析
对仿真结果进行分析。