一、课程设计目的
1. 融会贯通所学知识,设计和调试一台模型计算机;
2. 进一步掌握计算机组成的基本原理,建立整机概念;
3. 学习设计和调试计算机的步骤和方法。培养综合实践及独立分析、解决问题的能力;培养工程设计和研究能力。
二、课程设计设备
1. 硬件:PC机;
2. 软件:Windows操作系统,dsvlab1.0仿真软件。
三、课程设计要求
1. 独立思考,独立设计,独立调试;
2. 按照要求完成课程设计作品,作品能正常运行;
3. 撰写课程设计报告,设计报告要求层次清楚、整洁规范、不得互相抄袭。
四、课程设计任务
1.设计一台模型机,要求模型机的指令集如下图所示:
指令 | 符号 | 功能说明 | |
算数逻辑命令 | 加法 | ADD M | A+(M)→A |
减法 | SUB M | A-(M)→A | |
比较 | CMP M | A-(M) | |
加1 | INC | A+1→A | |
清零 | CLA | 0→A | |
访存指令 | 取数 | LDA M | (M)→A |
存数 | STA M | A→M | |
无条件跳转 | JMP M | 无条件跳转至M | |
相等则跳转 | BEQ M | 相等则跳转至M | |
I/O指令 | 输入 | IN | SW→A |
其中:M表示存储单元地址,(M)表示M存储单元中的内容,A表示累加寄存器。
2.编写程序,求S=1+2+3+…+N,0<N<20,N从数据开关输入,S存入存储器,并在模型机上运行此程序。
3.调试成功后,整理出设计文档,包括:电路总框图、微程序控制器电路图、微指令格式表、微程序代码表、指令代码表。
五、设计思路
本实验基于简单系统,对其作出适当的调整和修改。简单模型操作系统指令位数与样本系统有所差异,所以本实验针对实际情况对部分指令作了适当的位数调整。简单模型机中的微指令长度为24位,正好用3片EPROM2716来存放,如果指令长度增加,3片EPROM2716就放不下,所以用4片EPROM2716。此模型的算术逻辑运算指令比上次多了6条指令,只有满足比较结果相等的条件才能实现此操作。需要做的工作有:
1.增加一片D型触发器74LS75作为状态条件寄存器,用于保存74LS81的A=B输出引脚的值。
2.在微指令格式中增加一个判别测试位P(2)和一个标志影响位LDSC.LDSC位高电平有效,只有此位为1的微指令才会影响状态条件寄存器的值。
3.修改微地址形成电路,在电路中使用P(2)来进行判别测试,并根据状态条件寄存器的值形成正确的跳转地址。
4.通过总线将微程序控制器同运算器、存储器等联机,组成一台计算机,用微程序控制器控制模型机数据通路,运行由十条机器指令组成的简单程序。
六、实验内容与步骤
1. 模型机数据通路总体设计。根据指令集的功能要求设计模型机的数据通路,画出对应的模型机电路图。
<图1 数据通路总框图>
<图2 模型机电路图>
2. 微程序控制器设计,请在下面画出微程序控制器详细电路图,并标出各种信号。
<图3 微程序控制器电路图>
3. 微指令格式设计,请将微指令格式填入表1中。
表1 微指令格式
位 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
控制信号 | LDPC | LDAR | LDSC | /ALU-B | /PC-B | /SW-B | /R0-B | P(2) | P(1) | μA4 | μA3 | μA2 | μA1 | μA0 |
位 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 |
控制信号 | S3 | S2 | S1 | S0 | M | /CN | /CE | WE | /LOAD | LDR0 | LDDR1 | LDDR2 | LDIR |
4. 微指令格式设计,请完成微指令流程图。
<图4 微指令流程图>
5. 存储器中需要存储的代码
表2 存储器存储的代码
00000000001101000000011101001010 |
00000000001100000010011010000010 |
00000000001101000011010110000011 |
00000000001001000100011110110000 |
00000000001001001001011110000101 |
00000000001101010000011100000110 |
00000100101101100000001110000010 |
00000000001001001001011110001000 |
00000000001101010000011100001001 |
00000011000101100000001110000010 |
00000000001001001001011110011110 |
00000000001101010000011100001100 |
00000011000101000000001110000010 |
00000000000101100000001110000010 |
00000000001001100001011110000010 |
00000000001001000001011001101011 |
00000000001101100000011010000010 |
00000000001101000011010110000100 |
00000000001101000011010110000111 |
00000000001101000011010110001010 |
00000000001101010000011100001101 |
00000001100101100000001110000010 |
00000000001101000011010110001110 |
00000000001101000011010110001111 |
00000000001101000011010110011011 |
00000000001101000000011110000001 |
00000000001011000000011100000010 |
00000000001000000010011110000010 |
00000000 |
00010000 |
00001111 |
00100000 |
00001111 |
00110000 |
00001111 |
01000000 |
01010000 |
01100000 |
00001111 |
01110000 |
00001111 |
10000000 |
00000000 |
00001011 |
6. 微程序代码设计,请将微程序代码填入表3中,设计明细如图5所示。
表3 微程序二进制代码表
26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |||
S3 | S2 | S1 | S0 | M | WE | /CE | /Cn | /LOAD | LDR0 | LDDR1 | LDDR2 | LDIR | LDPC | LDAR | LDSC | R0-B | PC-B |
|
| P(2) | P(1) | uA4 | uA3 | uA2 | uA1 | uA0 | |||
00 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | ||
01 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | ||
02 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | ||
03 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | ||
04 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | ||
05 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | ||
06 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | ||
07 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | ||
10 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | ||
11 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | ||
12 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | ||
13 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | ||
14 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | ||
15 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | ||
16 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | ||
17 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | ||
20 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | ||
21 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | ||
22 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | ||
23 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | ||
24 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | ||
25 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | ||
26 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | ||
27 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | ||
30 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | ||
31 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | ||
32 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | ||
33 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
位 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
地址 | P(2) | P(1) | uA4 | uA3 | uA2 | uA1 | uA0 |
00 | 0 | 1 | 0 | 0 | 0 | 0 | 1 |
01 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
02 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
03 | 0 | 0 | 1 | 0 | 0 | 0 | 0 |
04 | 0 | 0 | 0 | 0 | 1 | 0 | 1 |
05 | 0 | 0 | 0 | 0 | 1 | 1 | 0 |
06 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
07 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
10 | 0 | 0 | 0 | 1 | 0 | 0 | 1 |
11 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
12 | 0 | 0 | 0 | 1 | 0 | 1 | 1 |
13 | 0 | 0 | 0 | 1 | 1 | 0 | 0 |
14 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
15 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
16 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
17 | 0 | 0 | 1 | 1 | 0 | 1 | 0 |
20 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
21 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
22 | 0 | 0 | 0 | 0 | 1 | 1 | 1 |
23 | 0 | 0 | 0 | 1 | 0 | 1 | 0 |
24 | 0 | 0 | 0 | 1 | 1 | 0 | 1 |
25 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
26 | 0 | 0 | 0 | 1 | 1 | 1 | 0 |
27 | 0 | 0 | 0 | 1 | 1 | 1 | 1 |
30 | 0 | 0 | 1 | 1 | 0 | 1 | 1 |
31 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
32 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
33 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
<图5 微指令设计明细>
00 | Do nothing(next 01) |
01 | 输入PC进行初始化(next 02) |
02 | PC->BUS->AR PC+1(next 03) |
03 | AR=0 RAM选中输出0000(IN)-->IR-->P?->20 (next 20) |
04 | AR=2 RAM选中输出ADDR 17(IN)-->AR RAM-->DR2(1011) (next 05) |
05 | R0-->BUS-->DR1(next 06) |
06 | A+B-->BUS-->R0(next 02) |
07 | AR=4 RAM选中输出ADDR 17(IN)-->AR RAM-->DR2(1011) (next 10) |
10 | R0-->BUS-->DR1(next 11) |
11 | A-B-->BUS-->R0(next 02) |
12 | AR=6 RAM选中输出ADDR 17(IN)-->AR RAM-->DR2(1011) (next 13) |
13 | R0-->BUS-->DR1(next 14) |
14 | A CMP B-->BUS(next 02) |
15 | A+1-->BUS-->R0(next 02) |
16 | AR=12 RAM选中输出ADDR 17(IN)-->AR RAM-->R0(1011) (next 02) |
17 | AR=14 RAM选中输出ADDR 17(IN)-->AR(next 32) |
20 | SW->R0 (next 02) |
21 | PC->BUS->AR PC+1(next 04) |
22 | PC->BUS->AR PC+1(next 07) |
23 | PC->BUS->AR PC+1(next 12) |
24 | R0-->BUS-->DR1(next 15) |
25 | CLA 0 ->BUS->R0(next 02) |
26 | PC->BUS->AR PC+1(next 16) |
27 | PC->BUS->AR PC+1(next 17) |
30 | PC->BUS->AR PC+1(next 33) |
31 | Do nothing(next 01) |
32 | R0-->BUS-->RAM(next 02) |
33 | AR=16 RAM选中输出ADDR 000(IN)-->BUS-->PC(000) (next 02 |
7. 微程序代码设计,请将微程序代码填入表4中。
表4 机器指令表
序号 | 指令格式 | 指令二进制代码 | 长度(bit) |
1 | IN | 00000000 | 8bit |
2 | ADD | 00010000 | 16bit |
3 | STA | 01110000 | 16bit |
4 | JMP | 10000000 | 16bit |
5 | SUB | 00100000 | 16bit |
6 | CMP | 00110000 | 16bit |
7 | INC | 01000000 | 8bit |
8 | CLA | 01010000 | 8bit |
9 | LDA | 01100000 | 16bit |
10 | BEQ | 10010000 | 16bit |
8. 程序设计,编写程序,求S=1+2+3+…+N,0<N<20,N从数据开关输入,S存入存储器,并在模型机上运行此程序,填入表5中。
表5 内存中的程序与数据
内存地址 | 内容 | 含义 |
0 | 0 | IN N |
1 | 100000 | STA N |
2 | 11011 | |
3 | 1110000 | CLA |
4 | 100000 | STA S |
5 | 11100 |
|
6 | 100000 | STA count |
7 | 11101 |
|
10 | 1100000 | IN |
11 | 100000 | STA count |
12 | 11101 |
|
13 | 10000 | ADD S |
14 | 11100 |
|
15 | 100000 | STA S |
16 | 11100 |
|
17 | 10000000 | LDA count |
20 | 11101 |
|
22 | 11011 |
|
23 | 10010000 | BEQ→ |
24 | 10111 |
|
25 | 110000 | JMP→10 |
26 | 1000 |
|
27 | 10000000 | LDA S |
30 | 11100 |
|
31 | 110000 | JMP→ |
32 | 11001 |
|
33 |
| 存放N |
34 |
| 存放S |
35 |
| 存放count |
36 |
|
|
37 |
|
|
9. 按照以上设计修改电路,修改RAM内容,修改微程序存储区内容,在模型机上运行程序,观察运行过程和结果,如果有错,找到并改正错误,一直到正确为止。注意电路的初始化过程和输入地址、数据的时机。
七、课程设计总结
1.心得体会
计算机组成原理实验课即将结束,通过多次实验,了解了计算机内部的结构,规模电路的构造,让我的眼界大开。
仍记得第一次计算机实验课时,对各种模块的功能都不懂,原本是每天都要面对的工具,却不知它的内部结构,通过二进制01就可以实现如此之多的功能,这些外行可以不懂,但我们作为计算机科学与技术专业的学生,不能不懂,也要去深入了解计算机的工作原理。通过学习《计算机组成原理》,了解了计算机基本的五大部件,运算器、控制器、存储器、输入设备、输出设备。而这次实验这次课程设计我获益良多,平时我们能见到的都是计算机的外部结构,在计算机组成原理的学习中,逐步对计算机的内部结构有了一些了解,但始终都停留在理论阶段。而在本次实验,让我们自己设计设计一台模型机,包含算数逻辑命令、访存指令、I/O指令,让我对运算器的内部结构有了更深的了解,并且对计算机组成原理也有了更深层次的理解,同时这次课程设计还锻炼了我的实验动手能力,也培养了我的认真负责的科学态度。
由于本次实验需要设计的地方过多,原理也比较复杂,老师很细心地一步一步的讲每个部件的做法,从简单到复杂,从容易到困难,初步把模型机完成。通过这次实验,更清楚意识到每个部件都对计算机都息息相关,了解计算机的基本组成和基本原理,构建整体意识,为以后设计芯片电路打下了一定的基础。
设计微程序模型机的过程中无疑会遇到很多问题,例如接线的过程,这是一个需要耐心,细心的环节,一是要在过程中不断测试集成电路接线的可行性,二是要在接线时尽量避免线路的重合。再者就是对指令译码的原理理解必须透彻,不能够在原模型机的基础上扩展指令数量,只能对现有的指令进行改进。
总的来说,这几次实验让我在计算机组成原理有了更深层次的认识,自己也收获良多,感谢周老师对本人的大力协助,让我和我的组员们能高效地解决遇到的问题。时间有限,只能做一个模型机实验,但是通过软件做电路,在以后的日子也可以自己做一下后面的实验,让自己的知识储备更加丰富。
2.经验教训
这次课程设计要求连线仔细认真,不能有半点错误,在刚做这个实验的时候,我就由于粗心没有正确的设置手动开关SW-B和ALU-B,导致存入的数据不正确
我在连线过程中也自己总结出了避免出错的方法,就是在接线图上将已经连接好的部分作上记号,连接完后再检查一遍各个分区的条数是否和实验接线图上的一样,如果一样就可以进行下面的实验步骤,就算出错了,改起来也容易多了。
3.注意事项
2.连线的时候一定要细心,清楚该线要连到哪个接口,要实现什么功能。
3.要在了解的基础上理清思路,再做设计。