计算机组织与体系结构课程设计
计组课设报告
实验目的
深入理解基本模型计算机的功能、组成知识。
深入学习计算机各类典型指令的执行流程。
学习微程序控制器的设计过程和相关技术,掌握LPM_ROM的配置方法。
在掌握部件单元电路实验的基础上,进一步将单元电路组成系统,构造一台基本模型计算机。
定义五条机器指令,并编写相应的微程序,上机调试,掌握计算机整机概念。掌握微程序的设计方法,学会编写二进制微指令代码表。
通过熟悉较完整的计算机的设计,全面了解并掌握微程序控制方式计算机的设计方法。
实验环境
- 机房PC
- Quartus II
- 计算机组成原理试验箱
实验原理
基本原理
在部件实验过程中,控制信号是⼈为模拟产⽣的。⽽本实验将能在微程序控制器的作用下⾃动产⽣一系列控制信号,从而实现指令对应的特定功能。实验中,数据通路的控制由微程序控制器完成,整个指令周期由微指令组成的序列来完成,完成了指令到微程序的对应。
指令格式
指令格式
采用寄存器直接寻址方式,其格式如下:
其中
OP-CODE为操作码,rs为源寄存器,rd为目的寄存器,00、01、10分别对应R0、R1、R2。数据通路框图
微指令格式
微指令各字段功能如下:
S3-S0、M、Cn:指示ALU的操作。注意:M为0代表算术操作,为1代表逻辑操作;Cn为0代表无进位,为1代表有进位。ALU的功能表如下:
WE:RAM控制信号。为0时配合A9-A8的01控制RAM读,为1时配合A9-A8的11控制RAM写。A9-A8:00、01、10分别代表SW_B、RAM、LED的选通信号,11代表无效。A、B、C:分别产生输入选通信号、输出选通信号、P(1)-P(4)和LDPC信号。具体功能如下表所示:
其中:
LD..代表相应寄存器的输入选通信号;LDPC在A无效时控制程序计数器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 R0:20清零寄存器
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后边的一些操作即可。RET:60将栈顶内容弹出给
PC。和
POP相似,但最后要把DR2写入PC。JMP [OP1]:70 OP1将
PC的值修改为内存[OP1]处的内容。读取内存
[OP1]处的一字节并输入到PC即可。
这套指令主要模拟了栈的行为和函数调用与返回的行为。
设计的指令用RAM的底部两字节模拟BP和SP寄存器,记录当前栈帧的基址和栈顶地址。
由于ROM大小不够,没有单独设计PUSH BP、MOV BP, SP、LEAVE,而是分别用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 | 00h: |
测试程序是一个无限循环,循环中用调用一个函数,在函数中先保存了调用者的栈帧,然后将一些内容压栈,将R0清零,最后恢复调用者栈帧并返回。
实验总结
通过这次课程设计,我对CPU的工作有了更加深入的认识。在设计指令的过程中,我对计算机的内部构造有了更为直观的感受,控制单元和数据通路让我认识到硬件和软件之间的紧密联系。
虽然课堂上学习了很多理论知识,但在实际操作和设计中我才真正意识到理论与实践的差异。在设计和仿真的过程中,很多细节问题都是理论中未提到的,需要通过实验和调试才能发现和解决。这让我更深刻地体会到计算机组成原理不仅仅是理论知识的积累,更需要大量的实践和经验。