一、课设题目:
设计一台嵌入式CISC模型计算机,完成功能:输入包含5个整数(有符号数)的数组M,按从小到大的顺序输出这5个整数。
参考书籍:计算机原理课程设计(第二版)陈智勇
源文件见最底
二、CICS模型机数据通路框图
三总线架构:数据总线,指令总线,地址总线
课本里面做的那个题目采用的是单总线结构的模型,所以有些地方需要注意
举个例子:
三总线的取指令过程如下:
三、微程序控制器逻辑结构框图
四、指令系统
(1)指令格式
系统中共设计了11条指令:IN1(输入),MOV(将一个数送入寄存器),CMP(比较),OUT1(输出),JB(无符号数的小于后跳转),JL有符号数跳转,JMP(无条件跳转),INC(自增1),DEC(自减1),LAD(从RAM取值)、STO(将值存入RAM)
指令格式如下:
下列指令格式中的 Rs:源寄存器 Rd:目的寄存器
- I/O指令。
输入(IN1)指令采用双字长指令,格式如下:
15-12 | 11 10 | 9 8 | 7-0 |
操作码 | x x | Rd | xxxxxxxx |
输出(OUT1)指令采用双字长指令,格式如下:
15-12 | 11 10 | 9 8 | 7-0 |
操作码 | Rs | x x | xxxxxxxx |
- 转移指令。
无条件转移指令(JMP)采用双字节指令,格式如下:
15-12 | 11 10 | 9 8 | 7-0 |
操作码 | x x | x x | addr |
无符号数条件转移指令(JB)
15-12 | 11 10 | 9 8 | 7-0 |
操作码 | x x | x x | addr |
有符号数条件转移指令(JL)
15-12 | 11 10 | 9 8 | 7-0 |
操作码 | x x | x x | addr |
其中“地址”就是要转移的地址值
- 自增1(INC)指令,单字节指令,格式如下:
15-12 | 11 10 | 9 8 | 7-0 |
操作码 | x x | Rd | xxxxxxxx |
- 自减1(DEC)指令,单字节指令,格式如下:
15-12 | 11 10 | 9 8 | 7-0 |
操作码 | x x | Rd | xxxxxxxx |
- 比较(CMP)指令,单字节指令,格式如下:
15-12 | 11 10 | 9 8 | 7-0 |
操作码 | Rs | Rd | xxxxxxxx |
- MOV指令。双字节指令。其格式如下:
15-12 | 11 10 | 9 8 | 7-0 |
操作码 | x x | Rd | im |
- STO指令。双字节指令。其格式如下:
15-12 | 11 10 | 9 8 | 7-0 |
操作码 | Rs | Rd | xxxxxxxx |
其中Rd存放的是目的操作数所在的地址,Rs存放的是源操作数
- LAD指令。双字节指令。其格式如下:
15-12 | 11 10 | 9 8 | 7-0 |
操作码 | Rs | Rd | xxxxxxxx |
其中Rd存放的是目的操作数,Rs存放的是源操作数所在的地址
- 对源寄存器Rs和目的寄存器Rd的规定:
Rs或者Rd | 选定的寄存器 |
00 | R0 |
01 | R1 |
10 | R2 |
11 | R3 |
模型机规定数据采用定点整数补码表示,单字长为8位,其格式如下:
7 | 6 5 4 3 2 1 0 |
符号位 | 尾数 |
T1、T2、T3、T4 与 CLR、Q 之间的关系图:
(2)指令编码
如下图所示:
助记符 | 指令格式 | 功能 | |||
15-12 | 11 10 | 9 8 | 7-0 | ||
IN1 Rd | 0001 | x x | Rd | xxxxxxxx | 输入设备->Rd |
MOV Rd im | 0010 | x x | Rd | im | Im->Rd |
JMP addr | 0011 | x x | x x | addr | addr->PC |
CMP Rs Rd | 0100 | Rs | Rd | xxxxxxxx | Rs-Rd,锁存OF,ZF |
INC Rd | 0101 | x x | Rd | xxxxxxxx | (Rd)+1->Rd |
DEC Rd | 0110 | x x | Rd | xxxxxxxx | (Rd)-1->Rd |
STO Rs (Rd) | 0111 | Rs | Rd | xxxxxxxx | Rs->(Rd) |
LAD (Rs) Rd | 1000 | Rs | Rd | xxxxxxxx | (Rs)->Rd |
OUT1 Rs | 1001 | Rs | x x | xxxxxxxx | Rs->输出设备 |
JB addr | 1010 | x x | x x | addr | Addr->PC |
JL addr | 1011 | x x | x x | addr | addr->PC |
注:xxxxxxxx表示什么数值都可以,默认00000000,其实我觉得JB和JL来说是一样的,所以可以砍掉其中一个,不砍影响也不大。
五、微程序
(1)流程图
编码随意,但是紧跟在p字段后面的一定要考虑清楚,上面标的数字是用二进制的六位微地址转换成十六进制的,例如01(16)=00 0001(2)
(2)逻辑转移表达式
SE5<=NOT(CF AND NOT(ZF) AND P3 AND T4);
//这SE4和SE5是一样的逻辑,把一个砍了也可以,留着也行,不影响程序运行
SE4<=NOT(CF AND NOT(ZF) AND P2 AND T4);
//用于P2跳转,也就是JB,通过判断标志位来进行跳转,举例如下:
CMP R1,R2 JB process :当R1比R2小的时候,跳转到process程序段,因为CMP指令 的功能就是将R1-R2然后保存状态位,例如CF、ZF等等
所以P2后面的微地址设置为:01 0000(2)=10(16)理由:P2测试字段只能更改SE4位的数值
SE3<=NOT(I15 AND P1 AND T4);
SE2<=NOT(I14 AND P1 AND T4);
SE1<=NOT(I13 AND P1 AND T4);
SE0<=NOT(I12 AND P1 AND T4);
//P1可以控制四位二进制,也就是可以产生十六种译码方式,进行十六路跳转
微地址:xx0000-xx1111即可,不能与P2、P3所用的冲突
(3)微指令代码表
CISC模型机系统使用的微指令采用全水平型微指令,字长为27位,其中微命令字段为18位,P字段为3位,后继微地址为6位,其格式如下:
六、汇编语言及其机器语言
算法思想:先从外界传入5个整数存入RAM单元,而后用R0存放最外层的循环次数,R1来存放地址,用R2,R3来存放两个相互比较的数,首先从R1的地址开始,用R3来存放大的数,如果在比较的过程中有更大的数,则进行交换,最后的数就会成为最大的数,然后将R0自减,以此进入下一次循环。在比较结束之后进行结果的输出。
如果题目是十个整数,那么只需要修改汇编代码中的三个部分,即ROM里面的部分修改成下面的样子,将5个数的排序变成十个数的排序就可以了,注意一个问题,由于从五个数变成了十个数,400us的仿真时间是不够的,需要自己手动修改一下仿真时长,具体时间你们自己试一下,调到排序好就可以了。
仿真时间修改可以参照这个毕业设计预习:maxplus2入门教程 - 5319zl - 博客园 (cnblogs.com)
汇编语句及机器码
助记符 | 地址 | 机器代码 | 十六进制 | 功能 |
MOV R0 05H | 00 | 0010 0000 0000 0101 | 2005 | 05H->R0 |
MOV R1 00H | 01 | 0010 0001 0000 0000 | 2100 | 0->R1,设置初始地址 |
L1: IN1 R2 | 02 | 0001 0010 0000 0000 | 1200 | 输入一个数到R2 |
STO R2 [R1] | 03 | 0111 1001 0000 0000 | 7900 | 将R2的值存入R1对应的地址单元 |
INC R1 | 04 | 0101 0001 0000 0000 | 5100 | 自增R1 |
CMP R1 R0 | 05 | 0100 0100 0000 0000 | 4400 | 比较R1,R0的大小 |
JB L1 | 06 | 1010 0000 0000 0010 | A002 | 若R1<R0,跳转L1 |
MOV R0 04H | 07 | 0010 0000 0000 0100 | 2004 | 4->R0,设置外循环值为4 |
MOV R1 00H | 08 | 0010 0001 0000 0000 | 2100 | 0->R1,设置RAM的初始地址0 |
L2: LAD [R1] R2 | 09 | 1000 0110 0000 0000 | 8600 | 取R1所对应地址单元的值赋值给R2 |
INC R1 | 0A | 0101 0001 0000 0000 | 5100 | 自增R1 |
CMP R0 R1 | 0B | 0100 0001 0000 0000 | 4100 | 比较R1,R0的大小 |
JB L4 | 0C | 1010 0000 0001 0110 | A016 | 若R0<R1,跳转L4 |
LAD [R1] R3 | 0D | 1000 0111 0000 0000 | 8700 | 取R1所对应地址单元的值赋值给R3 |
CMP R3 R2 | 0E | 0100 1110 0000 0000 | 4E00 | 比较R3,R2的大小 |
JL L3 | 0F | 1011 0000 0001 0001 | B011 | 若R3<R2,跳转L4 |
JMP L2 | 10 | 0011 0000 0000 1001 | 3009 | 跳转L2 |
L3: STO R2 [R1] | 11 | 0111 1001 0000 0000 | 7900 | 将R2的值存入R1对应的地址单元 |
DEC R1 | 12 | 0110 0001 0000 0000 | 6100 | R1自减 |
STO R3 [R1] | 13 | 0111 1101 0000 0000 | 7D00 | 将R3的值存入R1对应的地址单元 |
INC R1 | 14 | 0101 0001 0000 0000 | 5100 | R1自增 |
JMP L2 | 15 | 0011 0000 0000 1001 | 3009 | 跳转L2 |
L4: DEC R0 | 16 | 0110 0000 0000 0000 | 6000 | R0自减 |
MOV R1 00H | 17 | 0010 0001 0000 0000 | 2100 | 设置R1的值为0 |
CMP R1 R0 | 18 | 0100 0100 0000 0000 | 4400 | 比较R1,R0的大小 |
JB L2 | 19 | 1010 0000 0000 1001 | A009 | 如果R1<R0,跳转L2 |
MOV R0 05H | 1A | 0010 0000 0000 0101 | 2005 | 设置循环值为5 |
MOV R1 00H | 1B | 0010 0001 0000 0000 | 2100 | 设RAM初始地址为0 |
L5: LAD [R1] R2 | 1C | 1000 0110 0000 0000 | 8600 | 取R1所对应地址单元的值赋值给R2 |
OUT R2 | 1D | 1001 1000 0000 0000 | 9800 | 将R2输出到LED |
INC R1 | 1E | 0101 0001 0000 0000 | 5100 | R1自增 |
CMP R1 R0 | 1F | 0100 0100 0000 0000 | 4400 | 比较R1,R0的大小 |
JB L5 | 20 | 1010 0000 0001 1100 | A01C | 如果R1<R0,跳转L5 |
七、功能仿真
根据上述的设计,构建了模型机的相关的波形图。我们首先设置 CLR=1,CLK=200.0ns,设置其 end time 为 400.0us 根据IN1指令对应的周期输入 5 个值:54,55,56,12,81(十六进制)。结果如图:在输入指令上面输入
第一个输入:
第二个输入:
第三个输入:
第四个输入:
第五个输入:
在五个输入都输入之后,RAM里面就存入了五个十六进制数(补码),最后的输出和排序结果如下:
百度云盘地址:链接:https://pan.baidu.com/s/1Axqsg8q73MpY-eLq0dBNIA
提取码:1234