一.课设性质,目的,任务
《计算机组成与系统结构课程设计》是计算机学院各专业集中实践性环节之一,是学习完《计算机组成与系统结构》课程后进行的一次全面的综合练习。其目的是综合运用所学计算机原理知识,设计并实现一台模型计算机,以便巩固所学的知识,提高分析问题和解决问题的能力。
二.课设基本理论
1、掌握算术、逻辑、移位运算实验,熟悉ALU运算控制位的运用。
2、掌握存储器组织、读写方式及与总路线组成的数据通路,掌握地址总线、数据总线的工作原理。
3、掌握指令结构和指令取指、执行工作过程。
4、掌握CPU的微程序控制原理。
三. 题目
综合运用所学计算机原理知识,设计并实现具有以下16条指令的指令集结构的模型计算机:
编号 | 助记符 | 机器指令码 | 说明 |
0 | SUB Rd,Rs | 0000 RdRs 110 0000 0000 | Rd-Rs→Rd |
1 | ADD Rd,Rs | 0001 RdRs 110 0010 0000 | Rd+Rs→Rd |
2 | AND Rd,Rs | 0010 RdRs 110 0100 0000 | Rd&Rs→Rd (Rd和Rs相与) |
3 | DEC Rd | 0011 Rd00 110 0110 0000 | 将Rd值减1 |
4 | CLR Rd | 0100 Rd00 110 1000 0000 | 将Rd清零 |
5 | RL Rd | 0101 Rd00 110 1010 0000 | Rd循环左移一位 |
6 | RRC Rd | 0110 Rd00 110 1100 0000 | Rd带进位右移一位 |
7 | MOV Rd,Rs | 0111 RdRs 110 1110 0000 | Rs→Rd |
8 | LDI Rd,* | 1000 Rd00 XXXXXXXX 111 0000 0000 | 将指令中的立即数(第二字节)送入Rd |
9 | OUT IOH,Rs | 1001 00Rs Rs送到高字节显示 111 0010 0000 | Rs→i/o(数据开关)高字节 |
10 | LDA Rd,M | 1010 Rd00 XXXXXXXX XXXXXXXX 三个字节 将16位地址取出来 送到Rd寄存器 111 0100 0000 | [M] →Rd |
11 | STA M,Rs | 1011 00Rs XXXXXXXX XXXXXXXX 将Rs内容存到这16位地址中 111 0110 0000 | Rs→[M] |
12 | JMP M | 1100 0000 XXXXXXXX XXXXXXXX 跳转到某个地址 111 1000 0000 | [M]→PC,即跳转到M所指单元 |
13 | JZ M | 1101 0000 XXXXXXXX XXXXXXXX 111 1010 0000 | 当Z=1时,跳转到M所指单元 |
14 | JC M | 1110 0000 XXXXXXXX XXXXXXXX 111 1100 0000 | 当CY=1时,跳转到M所指单元 |
15 | HALT | 1111 0000 111 1110 0000 6A0 | 停机 |
设计提示:
1、上表中,机器指令码的高4位为指令操作码,M为16位存储器地址, Rs为源寄存器,Rd为目的寄存器,占2位,并规定:
Rs或Rd | 选定的寄存器 |
00 01 10 11 | R0 R1 R2 R3 |
2、在微程序中,微地址001为取指,微指令为BF FB F8。
3、各指令指行阶段微程序入口地址的确定方式:
微地址位号 | 10 9 | 8 7 6 5 | 4 3 2 1 0 |
内容 | 1 1 | IR7~IR4 | 0 0 0 0 0 |
例如,第5条指令”RL Rd” 的指令码为0101 Rd00 则指令码的高4位IR7~IR4为0101,由上表知,微程序入口微地址为: 11 0101 00000 ,即6A0H。
4、主要步骤:
(1)按照第3点的方法,给出所有16条指令的微程序入口微地址;
(2)通过分析每条指令的功能明确其的微程序流程,可参考实验指导书图3-4-1、图3-2-2、图3-3-1;
(3)写出每条微指令的微命令,即24个微控制位信号,可参考实验指导书表3.4.1、表3.2.1、表3.3.1和“微控制器编程手册”第2章。
(4)建议采用逐条指令设计实现的方式,一条实现并用汇编语句测试通过后(指令功能、下址顺序均正确)再进行下一条的设计。
5、检查
模型计算机设计完成后,用所给的测试程序check_1.asm(测12条非转移指令)和check_2.asm(测3条转移指令)检查正确性。检查方法:在测试程序中#load s本人的.IS微指令程序,实验箱电源关闭重启并连接,装载后选择“运行”或“单步”执行。
check_1.asm运行的正确结果为:寄存器R0R1R2R3分别显示00112233,IOH显示33。
check_2.asm运行的正确结果为:寄存器R0R1R2R3分别显示00112233,如果显示EE则执行有错误。
四.微程序流程图(树形图)
五.机器指令程序的说明(微指令地址,指令码,助记符)
- 实验源代码
过程分析:
Check20_1.ASM 实验源代码如下:
Check20_1.ASM 实验源代码如下:
2、微指令地址
;分段/RISC模型机指令系统;助记符 操作数 指令码 长度;-----------------------------------------------------;Rd-Rs→RdSUB R0,R0 00 1SUB R0,R1 01 1SUB R0,R2 02 1SUB R0,R3 03 1SUB R1,R0 04 1SUB R1,R1 05 1SUB R1,R2 06 1SUB R1,R3 07 1SUB R2,R0 08 1SUB R2,R1 09 1SUB R2,R2 0A 1SUB R2,R3 0B 1SUB R3,R0 0C 1SUB R3,R1 0D 1SUB R3,R2 0E 1SUB R3,R3 0F 1;Rd+Rs→RdADD R0,R0 10 1ADD R0,R1 11 1ADD R0,R2 12 1ADD R0,R3 13 1ADD R1,R0 14 1ADD R1,R1 15 1ADD R1,R2 16 1ADD R1,R3 17 1ADD R2,R0 18 1ADD R2,R1 19 1ADD R2,R2 1A 1ADD R2,R3 1B 1ADD R3,R0 1C 1ADD R3,R1 1D 1ADD R3,R2 1E 1ADD R3,R3 1F 1;Rd&Rs→Rd (Rd和Rs相与)AND R0,R0 20 1AND R0,R1 21 1AND R0,R2 22 1AND R0,R3 23 1AND R1,R0 24 1AND R1,R1 25 1AND R1,R2 26 1AND R1,R3 27 1AND R2,R0 28 1AND R2,R1 29 1AND R2,R2 2A 1AND R2,R3 2B 1AND R3,R0 2C 1AND R3,R1 2D 1AND R3,R2 2E 1AND R3,R3 2F 1;将Rd值减1DEC R0 30 1DEC R1 34 1DEC R2 38 1DEC R3 3C 1;将Rd清零CLR R0 40 1CLR R1 44 1CLR R2 48 1CLR R3 4C 1;Rd循环左移一位RL R0 50 1RL R1 54 1RL R2 58 1RL R3 5C 1;Rd带进位右移一位RRC R0 60 1RRC R1 64 1RRC R2 68 1RRC R3 6C 1;Rs→RdMOV R0,R0 70 1MOV R0,R1 71 1MOV R0,R2 72 1MOV R0,R3 73 1MOV R1,R0 74 1MOV R1,R1 75 1MOV R1,R2 76 1MOV R1,R3 77 1MOV R2,R0 78 1MOV R2,R1 79 1MOV R2,R2 7A 1MOV R2,R3 7B 1MOV R3,R0 7C 1MOV R3,R1 7D 1MOV R3,R2 7E 1MOV R3,R3 7F 1;将指令中的立即数(第二字节)送入RdLDI R0,* 80 2LDI R1,* 84 2LDI R2,* 88 2LDI R3,* 8C 2;Rs→I/O(数据开关)高字节OUT IOH,R0 90 1OUT IOH,R1 91 1OUT IOH,R2 92 1OUT IOH,R3 93 1;[M] →RdLDA R0,* A0 3LDA R1,* A4 3LDA R2,* A8 3LDA R3,* AC 3;Rs→[M]STA *,R0 B0 3STA *,R1 B1 3STA *,R2 B2 3STA *,R3 B3 3;[M]→PC,即跳转到M所指单元JMP * C0 3;当Z=1时,跳转到M所指单元JZ * D0 3;当CY=1时,跳转到M所指单元JC * E0 3;停机HALT "" F0 1
六.微型机微指令表
微址00002)1) | M23 | M22 | M21 | M20 | M19 | M18 | M17 | M16 | 代码 | M15 | M14 | M13 | M12 | M11 | M10 | M9 | M8 | 代码 | M7 | M6 | M5 | M4 | M3 | M2 | M1 | M0 | 代码 | 后续微址 | 说明 |
E/M | IP | MWR | R/M | o2 | o1 | O0 | OP | M | CN | S2 | S2 | S0 | X2 | X1 | X0 | XP | W | ALU | Iu | IE | IR | Icz | Ids | ||||||
0600 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 07 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 06 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 88 | +1 | Rd->AX |
0601 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 05 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 06 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 00 | +1 | Rs->BX |
0602 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0F | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 91 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 92 | 0001 | AX-BX->Rd |
0620 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 07 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 06 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 88 | +1 | Rd->AX |
0621 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 05 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 06 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 00 | +1 | Rs->BX |
0622 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0F | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 99 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 92 | 0001 | AX+BX->Rd |
0640 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 07 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 06 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 80 | +1 | Rd->AX |
0641 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 05 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 06 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 00 | +1 | Rs->BX |
0642 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0F | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 11 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 92 | 0001 | AX&BX->Rd |
0660 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 07 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 06 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 80 | +1 | Rd->AX |
0661 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0F | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 1 | 29 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 92 | 0001 | AX-1->Rd |
0680 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 07 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 06 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | A0 | +1 | Rd->AX |
0681 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0F | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 21 | 1 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | B2 | 0001 | Ax=0->Rd |
06A0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 07 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 06 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 80 | +1 | Rd->AX |
06A1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0F | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 1 | A9 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 92 | 0001 | RLA->Rd |
06C0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 07 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 06 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 80 | +1 | Rd->AX |
06C1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0F | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | A1 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 92 | 0001 | RRCA->Rd |
06E0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0F | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 06 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 12 | 0001 | Rd=Rs |
0700 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 05 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 04 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 00 | +1 | ROM->BX |
0701 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 4F | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 1 | 39 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 92 | 0001 | BX->Rd |
0720 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0A | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 06 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 12 | 0001 | Rs->IOH |
0740 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 05 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 04 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 20 | +1 | ROM->BL |
0741 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 44 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 34 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 20 | +1 | ROM->BH |
0742 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 43 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 1 | 39 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | C0 | +1 | BX->AR |
0743 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 8F | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 04 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 12 | 0001 | RAM->Rd |
0760 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 05 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 04 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 80 | +1 | ROM->BL |
0761 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 44 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 04 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 00 | +1 | ROM->BH |
0762 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 43 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 1 | 39 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | C0 | +1 | BX->AR |
0763 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | A0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 06 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 12 | 0001 | Rs->RAM |
0780 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 07 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 04 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 00 | +1 | ROM->BL |
0781 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 46 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 04 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 00 | +1 | ROM->BH |
0782 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | C1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 01 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | D2 | 0001 | BX->PC |
07A0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 05 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 3C | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 00 | +1 | ROM->BL |
07A1 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 44 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 3C | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 00 | +1 | ROM->BH |
07A2 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 40 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 38 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 03 | 07A4 | 判定0标志 |
07A4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 00 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 38 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 12 | 0001 | 空操作 |
07A5 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | C1 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 38 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | D2 | 0001 | BX->PC |
07C0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 05 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 04 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 00 | +1 | ROM->BL |
07C1 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 44 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 04 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 00 | +1 | ROM->BH |
07C2 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 40 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 00 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 05 | 07C4 | 判定CY标志 |
07C4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 00 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 00 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 12 | 0001 | 空操作 |
07C5 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | C1 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 1 | 39 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | D2 | 0001 | BX->PC |
07E0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 07 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 07 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | C0 | +1 | PC->AX |
07E1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | C0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 1 | 29 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | D2 | 07E0 | AX-1->PC |
七.结果与指令调试过程
Check_1(截图)
Check_2(截图)
check20_1.asm程序的运行结果
check20_2.asm程序的运行结果
八.存在的问题和体会
1、过程中出现的问题:
(1)时序问题:
在设计RL(Rd循环左移一位)这条微指令时,由于时序关系设置不正确,导致RL指令执行的时序出错。后来重新检查RL指令对应的微指令的时序关系,并且使用CMStudio的时序分析工具进行调试,最终解决问题。
(2)在设计JZ,JC指令的时候,刚开始没有考虑到设计一个空操作,在逻辑上没有实现当CY进位/Z置零跳转是在标志位为1时,跳转到地址转移的微指令地址的下一个地址,出现直接跳转到地址转移的微指令地址入口的情况。后来分别在07A3和07C3设置空操作,并且在07A2和07C2出分别设置跳转地址07A4和07C4,最终解决问题。
2、心得体会:
- 针对需要取立即数的指令(比如 LDI 指令),在设计相应的微指令时,这些微指令应包括读取 ROM 的操作,同时,对于设置微指令的控制信号,要确保在执行指定指令时,能够将 ROM 中的立即数读取到 AX/BX 寄存器中。
- 在设计微指令时,要注意ROM和RAM的区别
ROM 寄存器(只读存储器): ROM 通常用于存储不变的固定数据,如程序代码或常数。在 CMStudio 中,可以通过设置 ROM 的地址线和数据线,将需要的数据存储在 ROM 中。ROM 寄存器一般是只读的,其内容在运行时不能被修改。
RAM 寄存器(随机存储器): RAM 用于存储可读写的数据,如变量、中间结果等。RAM 在 CMStudio 中设计时需要考虑写入和读取操作,以及地址的变化。RAM 寄存器的内容可以在运行时通过指令进行修改。