计组课设报告

实验目的

  1. 深入理解基本模型计算机的功能、组成知识。

  2. 深入学习计算机各类典型指令的执行流程。

  3. 学习微程序控制器的设计过程和相关技术,掌握LPM_ROM的配置方法。

  4. 在掌握部件单元电路实验的基础上,进一步将单元电路组成系统,构造一台基本模型计算机。

  5. 定义五条机器指令,并编写相应的微程序,上机调试,掌握计算机整机概念。掌握微程序的设计方法,学会编写二进制微指令代码表。

  6. 通过熟悉较完整的计算机的设计,全面了解并掌握微程序控制方式计算机的设计方法。

实验环境

  • 机房PC
  • Quartus II
  • 计算机组成原理试验箱

实验原理

基本原理

在部件实验过程中,控制信号是⼈为模拟产⽣的。⽽本实验将能在微程序控制器的作用下⾃动产⽣一系列控制信号,从而实现指令对应的特定功能。实验中,数据通路的控制由微程序控制器完成,整个指令周期由微指令组成的序列来完成,完成了指令到微程序的对应。

指令格式

  1. 指令格式

    采用寄存器直接寻址方式,其格式如下:

    其中OP-CODE为操作码,rs为源寄存器,rd为目的寄存器,000110分别对应R0R1R2

  2. 数据通路框图

  3. 微指令格式

    微指令各字段功能如下:

    • S3-S0MCn:指示ALU的操作。注意:M0代表算术操作,为1代表逻辑操作;Cn0代表无进位,为1代表有进位。ALU的功能表如下:

    • WERAM控制信号。为0时配合A9-A801控制RAM读,为1时配合A9-A811控制RAM写。

    • A9-A8000110分别代表SW_B、RAM、LED的选通信号,11代表无效。

    • ABC:分别产生输入选通信号、输出选通信号、P(1)-P(4)LDPC信号。具体功能如下表所示:

      其中:

      • LD..代表相应寄存器的输入选通信号;

      • LDPCA无效时控制程序计数器PC自增,在A字段为LOAD时将总线数据输入PC

      • ..-B代表将对应部件的数据附加到总线上。

    • uA5-uA0:微程序控制器的微地址输出信号,是下一条要执行的微指令的微地址。

实验步骤

指令设计

本次设计完成如下8条指令:

  • MOV BYTE PTR [OP2], [OP1]00 OP1 OP2

    将内存[OP1]处一字节复制至[OP2]处。

    可以通过将[OP1]处一字节内容加载到R0,再将R0内容输入到内存[OP2]处实现。

  • XCHG R0, [OP1]10 OP1

    交换寄存器R0和内存[OP1]处开始一字节的内容。

    可以通过将R0内容加载到DR1,将内存[OP1]处开始一字节加载到R0,最后将DR1的内容加载到[OP1]处实现。

  • CLR R020

    清零寄存器R0

    可以利用ALU输出0并加载到R0实现。

  • PUSH BYTE PTR [OP1]30 OP1

    将内存[OP1]处开始的一字节压入栈中。

    需要用内存[0FEh]处模拟SP。先读取[OP1]处一字节存到DR2,再利用ALU运算输出0FEh附加到AR进而读取出SP,然后将其加载到DR1,再用ALU输出DR1-1写入内存,最后将DR1-1附加到AR,将DR2写入内存。

  • POP BYTE PTR [OP1]40 OP1

    将栈顶开始一字节内容弹出到内存[OP1]处。

    PUSH相似。只不过要把DR1-1改为DR1+1,而且操作数应当在最后读取,最后一步写入内存可以复用。

  • CALL [OP1]50 OP1

    将下一条指令的地址压入栈中,并将PC的值修改为内存[OP1]处的内容。

    取操作数后将PC输入到DR2,然后复用PUSH后边的一些操作即可。

  • RET60

    将栈顶内容弹出给PC

    POP相似,但最后要把DR2写入PC

  • JMP [OP1]70 OP1

    PC的值修改为内存[OP1]处的内容。

    读取内存[OP1]处的一字节并输入到PC即可。

这套指令主要模拟了栈的行为和函数调用与返回的行为。

设计的指令用RAM的底部两字节模拟BPSP寄存器,记录当前栈帧的基址和栈顶地址。

由于ROM大小不够,没有单独设计PUSH BPMOV BP, SPLEAVE,而是分别用PUSH BYTE PTR [0FFh]MOV BYTE PTR [0FFh], [0FEh]MOV BYTE PTR [0FFh], [0FEh]; POP BYTE PTR [0FFh]代替。

微程序流程图

通过相应微操作控制CPU数据流,可设计指令写入ROM中并整理出微程序流程图如下:

graph TB
START(运行微程序)-->
01h[01h 01ED82\nPC->AR, PC+1]-->
02h[02h 00C048\nRAM->BUS, BUS->IR]-->P1S{"P(1)"}
P1S-->MOV
P1S-->XCHG
P1S-->CLR
P1S-->JMP

subgraph  
MOV(MOV)-->
08h[08h 01ED98\nPC->AR, PC+1]-->
18h[18h 00E019\nRAM->BUS, BUS->AR]-->
19h[19h 00901A\nRAM->BUS, BUS->R0]-->
1Ah[1Ah 01ED9B\nPC->AR, PC+1]-->
1Bh[1Bh 00E01C\nRAM->BUS, BUS->AR]-->
1Ch[1Ch 038201\nR0->BUS, BUS->RAM]-->
END0>01h]
end

subgraph  
XCHG(XCHG)-->
09h[09h 01EDA0\nPC->AR, PC+1]-->
20h[20h 00E021\nRAM->BUS, BUS->AR]-->
21h[21h 01A222\nR0->DR1]-->
22h[22h 009023\nRAM->BUS, BUS->R0]-->
23h[23h FB8A01\nDR1->BUS, BUS->RAM]-->
END1>01h]
end

subgraph  
CLR(CLR)-->
0Ah[0Ah 399A01\n0->R0]-->
END2>01h]
end

subgraph  
JMP(JMP)-->
0Fh[0Fh 01ED9D\nPC->AR, PC+1]-->
1Dh[1Dh 00E01E\nRAM->BUS, BUS->AR]-->
1Eh[1Eh 00D181\nRAM->BUS, BUS->PC]-->
END3>01h]
end
graph TB
START(运行微程序)-->
01h[01h 01ED82\nPC->AR, PC+1]-->
02h[02h 00C048\nRAM->BUS, BUS->IR]-->P1S{"P(1)"}

P1S-->PUSH
P1S-->POP
P1S-->CALL
P1S-->RET

subgraph  
PUSH(PUSH)-->
0Bh[0Bh 01EDA8\nPC->AR, PC+1]-->
28h[28h 00E029\nRAM->BUS, BUS->AR]-->
29h[29h 00B02A\nRAM->BUS, BUS->DR2]-->
2Ah[2Ah C99A2B\n1->R0]-->
2Bh[2Bh 01A22C\nR0->DR1]-->
2Ch[2Ch 09EA2D\n~DR1->AR]-->
2Dh[2Dh 00A02E\nRAM->BUS, BUS->DR1]-->
2Eh[2Eh F78A2F\nDR1-1->BUS, BUS->RAM]-->
2Fh[2Fh F5EA30\nDR1-1->BUS, BUS->AR]-->
30h[30h AB8A01\nDR2->BUS, BUS->RAM]-->
END0>01h]
end

subgraph  
POP(POP)-->
0Ch[0Ch C99A31\n1->R0]-->
31h[31h 01A232\nR0->DR1]-->
32h[32h 09EA33\n~DR1->AR]-->
33h[33h 00A034\nRAM->BUS, BUS->DR1]-->
34h[34h 078A04\nDR1+1->BUS, BUS->RAM]-->
04h[04h F9EA35\nDR1->AR]-->
35h[35h 00B036\nRAM->BUS, BUS->DR2]-->
36h[36h 01EDB7\nPC->AR, PC+1]-->
37h[37h 00E030\nRAM->BUS, BUS->AR]-->
30h
end

subgraph  
CALL(CALL)-->
0Dh[0Dh 01EDB8\nPC->AR, PC+1]-->
38h[38h 01BC39\nPC->DR2]-->
39h[39h 00E03A\nRAM->BUS, BUS->AR]-->
3Ah[3Ah 00D1AA\nRAM->PC]-->
2Ah
end

subgraph  
RET(RET)-->
0Eh[0Eh C99A3B\n1->R0]-->
3Bh[3Bh 01A23C\nR0->DR1]-->
3Ch[3Ch 09EA3D\n~DR1->AR]-->
3Dh[3Dh 00A03E\nRAM->BUS, BUS->DR1]-->
3Eh[3Eh 078A3F\nDR1+1->BUS, BUS->RAM]-->
3Fh[3Fh F9EA05\nDR1->AR]-->
05h[05h 00B003\nRAM->BUS, BUS->DR2]-->
03h[03h A9DB81\nDR2->PC]-->
END3>01h]
end
graph TB
START(控制台微程序)-->
00h[00h 018110\nR0->DR1]-->
P4S{"P(4)"}

P4S --> KWE
P4S --> KRD
P4S --> RP

subgraph  
KWE("KWE(01b)")-->
11h[11h 01ED94\nPC->AR, PC+1]-->
14h[14h 062011\nSW->BUS, BUS->RAM]-->11h
end

subgraph  
KRD("KRD(00b)")-->
10h[10h 01ED92\nPC->AR, PC+1]-->
12h[12h 00A010\nSW->BUS, BUS->RAM]-->10h
end

subgraph  
RP("RP(11b)")-->
13h[13h 008001\nPC->AR, PC+1]-->
END0>01h]
end

测试程序

RAM中编写测试程序如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
00h:
50 20 - CALL [20h]
70 26 - JMP [26h]
...

08h:
30 FF - PUSH BP
00 FE FF - MOV BP, SP
30 21 - PUSH BYTE PTR [21h]
30 22 - PUSH BYTE PTR [22h]
30 23 - PUSH BYTE PTR [23h]
30 24 - PUSH BYTE PTR [24h]
20 - CLR R0
10 25 - XCHG R0, [25h]
00 FF FE - MOV SP, BP
40 FF - POP BP
60 - RET
...

20h:
08 CA FE BA BE CB 00
...

FEh:
FE FE - (SP, BP)

测试程序是一个无限循环,循环中用调用一个函数,在函数中先保存了调用者的栈帧,然后将一些内容压栈,将R0清零,最后恢复调用者栈帧并返回。

实验总结

通过这次课程设计,我对CPU的工作有了更加深入的认识。在设计指令的过程中,我对计算机的内部构造有了更为直观的感受,控制单元和数据通路让我认识到硬件和软件之间的紧密联系。

虽然课堂上学习了很多理论知识,但在实际操作和设计中我才真正意识到理论与实践的差异。在设计和仿真的过程中,很多细节问题都是理论中未提到的,需要通过实验和调试才能发现和解决。这让我更深刻地体会到计算机组成原理不仅仅是理论知识的积累,更需要大量的实践和经验。