跳转至

LC-3 处理器

在本学期的 ICS 课程中,我们学习了 LC-3 指令集和它的数据通路。现在,在最后一次实验中,你也可以选择写一个 LC-3 处理器,完成对内存的读写操作并实现简单的指令操作。

2.3.1 知识回顾

现在,我们简单带大家回顾一下 LC-3 的相关知识。考虑到这不是 ICS 课的实验,我们不会将其面面俱到地讲解一遍。如果下面的内容与 ICS 介绍的有所出入,请以 ICS 讲解的内容为准。

2.3.1.1 指令集规范

在 LC-3 的 ISA 定义中,计算机的寻址空间为 \(2^{16}\) ,寻址能力为 16 位。翻译过来就是计算机的总存储空间为 \(2^{16}\times 16bits\)。但是,在 FPGA 上我们并不一定能够满足如此规模的存储空间。所以本次实验的地址空间规模可自行指定,不宜过大或过小,能够满足一段程序的正常运行即可。

LC-3 的访存过程主要基于两个寄存器:MAR (Memory Address Register) 内存地址寄存器、MDR (Memory Data Register) 内存数据寄存器。在 LC-3 的读操作中,首先将被访问内存单元的地址放入 CPU 的 MAR 中;然后发送信号通知内存。由此,内存将该单元中存放的数据传送至内存数据寄存器 MDR。在写操作中,首先将被访问内存单元的地址放入 MAR 寄存器,然后将要写入的数据放入 MDR 寄存器,最后向内存发送写信号。由此,MDR 的内容被写入 MAR 指向的内存单元。在我们的实现中,为简化工序,我们可以不使用 MAR、MDR,而是直接操作内存。

除了 MAR 寄存器、MDR 寄存器,LC-3 中涉及到的寄存器还包括:

  • 8 个通用寄存器 R0 - R7,每一个均为 16 位位宽
  • 一个 PC (Program Counter) 程序计数器和 IR 指令寄存器
  • 一个条件码寄存器

LC-3 的指令由操作码和操作数组成,操作码表示该指令是做什么的,操作数表示该次操作的对象是哪些。LC-3 指令的长度是 16 位(一个字长),将这 16 位从左至右依次编号为 bit[15] ~ bit[0],那么 bit[15:12] 代表的就是操作码(同时也意味着该字段最多可表达 \(2^4\) 个操作类型),bit[11:0] 则对应操作数的表示。

在本次实验中,同学们需要实现的指令如下:

parameter INST_ADD  = 4'b0001;
parameter INST_AND  = 4'b0101;
parameter INST_BR   = 4'b0000;
parameter INST_JMP  = 4'b1100;
parameter INST_JSR  = 4'b0100;
parameter INST_LD   = 4'b0010;
parameter INST_LDR  = 4'b0110;
parameter INST_LEA  = 4'b1110;
parameter INST_NOT  = 4'b1001;
parameter INST_ST   = 4'b0011;
parameter INST_STR  = 4'b0111;

★ 2.3.1.2 执行流程

LC-3 指令的执行过程是在控制单元的控制下,精确地、一步一步地完成的。我们称这个执行的步骤顺序为指令周期 (instruction cycle),一个指令周期包括 6 个阶段,即 FETCH(取指令)、DECODE(译码)、EVALUATE ADDRESS(地址计算)、FETCH OPERAND(取操作数)、EXECUTE(执行)、STORE RESULT(存放结果)。下面将介绍每个阶段的操作细节。

取指令

该阶段负责从内存中读取下一条待执行的指令,并将其装入控制单元的指令寄存器 IR。我们知道,一个计算机程序是一组指令的集合,而其中每条指令又表示为一个 bit 序列集合。在冯•诺伊曼模型中指出,程序执行时整个程序的所有指令必须都已保存在内存中。所以要获取下一条指令,前提是知道它在内存中的准确位置。程序计数器 PC 负责的就是这个任务,它记录着下一条指令在内存中的地址。

从内存中取出的指令会进入译码环节。但是,由于当前指令周期完成之后还将读人下一条指令,我们希望此时 PC 内容应修改为是指向下一条指令的地址。所以,在当前 FETCH 阶段还需要补充一个动作,即修改 PC 寄存器的值。这样一来,在下一条指令周期的 FETCH 阶段,下一个内存单元中的指令将被自动装入 IR 寄存器(只要当前指令不去修改 PC 的内容)。

译码

译码操作的任务是分析、检查指令的类型,并确定对应的微结构操作细节。

地址计算

如果指令执行时存在地址计算操作,则在此阶段完成。

取操作数

负责读取指令处理所需要的源操作数。

执行

负责指令的执行操作,不同的操作码在该阶段的操作也多半不同。

存放结果

将来自之前的执行结果将被写入目的寄存器。

题目 2-B-1

请根据以上内容,按要求完成本项练习

2.3.2 串口控制

现在,我们希望可以直接在串口界面输入指令序列,并控制处理器的相应操作。助教在这里提供一种可能的串口命令方案,你也可以根据需要改成自己喜欢的格式。

Image title

示例

下面是一段操作示例。对于给定的 LC-3 汇编程序:

Image title

我们可以输入如下的串口指令序列:

Image title

最终,数码管上显示的结果如下:

Image title

基于上述的指令序列,助教使用的状态机如下:

Image title

第一个状态 MOUNTING 为挂载状态,等待用户输⼊。第二个状态为 DIRECTING,识别用户进行的操作是读、写或是执行,也相当于对串口命令的译码(不是对指令译码)。第三个状态为取操作数;第四个状态为执行状态,这个状态实际上包括了 LC-3 中相对应的 store result 状态。由于⼀切操作都可以直接访问内存,故省去了许多不必要的麻烦。你可以参考助教的实现,也可以根据自己的理解设计状态机(推荐)。你可以参考串口部分的内容实现对于输入序列的处理操作。

提醒

由于使用串口进行数据读写时,读入的是 ASCII 码,因此需要在代码中对地址和指令进行转换。

题目 2-B-2

请根据以上内容,按要求完成本项练习


最后更新: December 14, 2023

评论

Authors: wintermelon008