1135 字
6 分钟
西电计组课设

实验目的#

最重要的,咱先来确定一下实验的目标和思路。

本次计组实验课设要求我们设计并实现一个微程序,即在 ROM 中存储一系列微指令,完成某些我们自定义的功能。

其次是思路,实验手册中给的微指令有 24 位,每一位都是有用的,咱们需要弄清楚每一位的作用,才能设计出符合要求的微程序。

24..2120191817 1615..1312..109..65..0
S[3..0]MCnWEA9 A8ABCuA

高 6 位主要是和 ALU 的操作相关:

SM=0 (Mathmatical)M=1 (Logical)
0000A+CNA + CNA\overline{A}
0001(AB)+CN(A \lor B) + CN(AB)\overline{(A \lor B)}
0010(AB)+CN(A \lor \overline{B}) + CN(A)B(\overline{A}) \land B
00110CN0 - CN00
0100A+(AB)+CNA + (A \land \overline{B}) + CN(AB)\overline{(A \land B)}
0101(AB)+(AB)+CN(A \lor B) + (A \land \overline{B}) + CNB\overline{B}
0110ABCNA - B - CNABA \oplus B
0111(AB)CN(A \land \overline{B}) - CNABA \land \overline{B}
1000A+(AB)+CNA + (A \land B) + CN(A)B(\overline{A}) \lor B
1001A+B+CNA + B + CN(AB)\overline{(A \oplus B)}
1010(AB)+(AB)+CN(A \lor \overline{B}) + (A \land B) + CNBB
1011(AB)CN(A \land B) - CNABA \land B
1100A+A+CNA + A + CN11
1101(AB)+A+CN(A \lor B) + A + CNABA \lor \overline{B}
1110(AB)+A+CN(A \lor \overline{B}) + A + CNABA \lor B
1111ACNA - CNAA

最简单的开始#

就拿 R0->DR1 这个微操作举例,上学期我们都学过计组,那么我们就知道这个微操作的微命令应该是 R0outDR1in

而当我们去查看实验操作手册里面的说明可以发现,ABC 字段的作用已经给你了,我们只需要进行相应的解析,然后就能得到下面这张表:

nop 是无操作

A(15..13)FuncdescriptionB(12..10)FuncdescriptionC(9..7)Func
0 0 0nop0 0 0nop0 0 0nop
0 0 1LDRiBUS->Ri0 0 1RS-BRs->BUS0 0 1P(1)
0 1 0LDDR1BUS->DR10 1 0RD-BRd->BUS0 1 0
0 1 1LDDR2BUS->DR20 1 10 1 1
1 0 0LDIRBUS->IR1 0 01 0 0P(4)
1 0 1LOAD1 0 1ALU-BALU->BUS1 0 1LDAR
1 1 0LDARBUS->AR1 1 0PC-BPC->BUS1 1 0LDPC

还有 A9A8 对应的操作:

A9 A8Funcdescription
0 0SW-BSW->BUS
0 1RAM-BRAM->BUS
1 0OUT-BOUT->BUS
1 1nop

显而易见,R0out 对应 RS-B, DR1in 对应 LDDR1,C 字段没有我们需要的操作,那么我们就确定了微指令的 ABC 字段。

又因为我们当前的操作不需要 ALU 和外部 IO,所以 ALU 相关的操作置 0, A9A8 置 1即可。

最后就能得出 R0->DR1 操作除去微地址的微指令为 0000 0001 1010 0010 00

正式开始#

我们先来看一下实验手册中给出的微指令流程图:

可以看到左侧的 运行微程序 部分当中,指令会先被送入 IR 指令寄存器,然后进行解析得出 P[1] 信号,根据 P[1] 电路可以判断指令应该跳到地址进行下一步数据的读取。

数据的读取需要依靠 AR 地址寄存器指定数据在 RAM 中的位置,而 AR 的值则是由 PC 程序计数器提供的,PC 的值会在每次时钟上升沿时加 1(C 字段必须是 101, PC 才会自增),从而实现顺序读取指令。

因此如果我们要设计 ADD 这种指令,我们需要知道它在基本模型机当中要执行的微操作有哪些,以微程序流程图中的 ADD 指令为例:

  1. 01ED83 取地址:PC -> ARPC + 1 -> PC
  2. 00E004 读数据的地址:RAM[AR] -> AR
  3. 00B005 读数据:RAM[AR] -> DR2
  4. 01A206 读寄存器数据:R0 -> DR1
  5. 919A01 做加法:DR1 + DR2 -> R0

你没看错,是 00E004 而不是 00ED0401A206 也一样,手册有错误,注意甄别~

这些微操作我们通过数据通路框图来推理:

ADD 指令需要 5 条微指令来完成,概括就是取值+操作。

而我在本次课程设计中实现的是栈的基本操作:栈初始化 INIT、入栈 PUSH 、出栈 POP以及查看栈顶元素 TOP,思路和 ADD 指令类似。

PUSH#

入栈操作用 C 语言描述的话就是:array[--top] = value

这里 --top 是因为栈顶指针是从高地址向低地址增长的。

所以 PUSHI 指令的微操作大概可以描述为:

  1. 保存栈顶指针
  2. 将输入的值存入 RAM[栈顶指针]
  3. 更新栈顶指针

PUSH 操作之前需要先确定栈顶指针的初始值

栈顶指针可以保存在 R0 中,后续通过 DR1 进行类似保护现场的操作。

所以,PUSH 指令的微操作可以设计为:

  1. 临时保存栈顶指针:R0 -> DR1
  2. 保存输入值:DR1-1 -> AR, [获取需要的数据 -> R0], R0 -> RAM[AR]
  3. 更新栈顶指针:DR1-1 -> R0

PUSH 指令获取数据的方式可以有两种:

  1. 实验箱手动输入值
  2. RAM 中的值寻址入栈

了解了 PUSH 指令的微操作框架之后,后续的指令微操作就很好设计了,也是类似的。

下面是我的计组课设流程图,仅供参考:

绘图工具: mermaid

西电计组课设
https://yang-zhihang.github.io/posts/xdu/computer-architecture/curriculumn-design/
作者
ZamYang
发布于
2025-09-10
许可协议
CC BY-NC-SA 4.0