硬布线控制实验(Ⅰ)

实验目的

  1. 理解I型和R型整数运算指令的功能。

  2. 理解单周期数据通路的组成结构及其信息加工过程。

  3. 掌握单周期硬布线控制信号的产生原理和设计方法。

实验原理

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

cu arch 1
图 1. 运算指令数据通路及控制

指令部件

指令部件包括指令存储器和程序计数器。根据指令系统的设计,指令存储器的字长是14位。作为实验计算机,只需要存放简单的程序,所以指令存储器的容量只有16个存储单元,可以存放16条指令。因此指令存储器的地址需4位,由程序计数器PC提供。复位时PC值为0,即第一条指令的地址。在Clk上升沿到来时,PC值加1,即顺序执行。

指令存储器是只读存储器,可以使用存储器实验中学习的ROM模块,在初始化时写入要执行的指令编码。运行时只提供读访问,根据输入地址,输出该地址单元存储的指令。 根据指令系统设计,一条指令包含5个部分,opcode指定指令功能,连接到控制器的输入;rs1、rs2、rd连接到寄存器堆三个端口的地址;imm作为运算数经多路器连接到ALU的Y输入端。

控制器

控制器以指令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数据通路图直观地反映了上述分析,绿色通路表示有效的信息流,红色表示有效的控制信号。

cu flow addi 1
图 2. addi指令的信息流及控制

指令译码的真值表如表 1所示。表中只给出了addi指令的控制信号取值,类似地可以分析出其他指令的控制信号取值。有了真值表,就可以进一步得到指令译码器的电路。

表 1. R型和I型指令的译码
指令助记符 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. 设计控制器

    根据各个指令的功能,设计表 1的输出取值。使用真值表生成电路图,操作方法见电路生成

  2. 连接电路

    按照图 1将各个子电路连接起来,并添加Reset输入引脚和CLK时钟输入引脚。

    程序计数器PC可使用计数器组件,该组件位于菜单项“Components/组件 ➤ Memory/存储器 ➤ Counter/计数器”。

  3. 仿真验证

    因为控制器的作用是控制指令的执行,所以需要通过执行指令来检验控制器的设计。例 1给出了一个测试程序的例子。

    例 1. 运算指令测试程序示例
    addi r1, r0, #10
    ori  r2, r0, #11
    sub  r3, r1, r2
    xor  r3, r1, r3
    and  r3, r3, r2
    1. 例 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:
    2. 仿真运行程序,验证电路是否正确。

      启动仿真后,第一条指令就在运行中。 通过点击时钟输入引脚改变CLK的状态,在CLK的上升沿保存指令的执行结果,同时进入下一条指令。 如果需要重新执行,点击Reset输入引脚,然后点击CLK,使PC为0,则程序回到第一条指令。

      为便于观察运行情况,可在电路中添加一些“Probe/探测器”(见几个有用的组件)。如果需要记录在图表中,则需设置“Label/标签”属性。

  4. 验证更多指令

    例 1测试程序只包含了部分运算指令,自己编写程序进行更全面的验证。

  5. 实验结果分析

    对仿真结果进行分析。