计算机组成原理课程设第一部分使用logisim软件设计一个模型机器,包括但不限于CPU,主存,实现至少4条指令,在其上编织并执行一个程序(最好是循环程序)。
logisim设计相应的课程设计逻辑电路。
1. 课程设计基本完成作业
具体电路功能为
(1)有清晰是时序逻辑。
(2)有完整的微操作发生器(四条基本指令:ADD LDA JMP STP)。
(3)数据传递正确,并能运行出结果,结果存在ACC(累加器)中。
2. 课程设计选做作业
具体电路功能为
(1)有清晰是时序逻辑。
(2)有完整的微操作发生器(八条基本指令、建议可以实现一个循环程序段)。
(3)数据传递正确,并能运行出结果,结果存在ACC(累加器)中。
相关文档
该指令集设计为8位的指令字长,高四位为OP,低四位为地址码或者立即数。
我首先设计并完成了8条指令:LDA(取数) ADD STA(存数) SHL SHR NOT JMP STP(停止)
为了实现循环又添加了4条指令:CMP INC LDI(取数至ID寄存器) JE
如下图所示
需要注意的是在相关文档中,提到在数据寻址时,高位自动补1010,在跳转指令寻址时高位自动补0001
比如:0000 0001 识别为LDA [1010 0001]; 1100 0001 识别为JMP [0001 0001] 如下图所示
故而需要在寻址时设计一个 根据指令不同 自动补齐高位的电路。(在下面的指令寄存器电路模块有所体现)。
在此举几个例子:
· ADD
EF:
T0: PC->MAR; 1->R
T1: M[MAR]->MDR; PC+1->PC
T2: MDR->IR
T3:
EX:
T0: Ad(IR)->MAR; 1->R
T1: M[MAR]->MDR
T2: MDR->X
T3: X+ACC->ACC
· LDA
EF:
T0: PC->MAR; 1->R
T1: M[MAR]->MDR; PC+1->PC
T2: MDR->IR
T3:
EX:
T0: Ad(IR)->MAR; 1->R
T1: M[MAR]->MDR
T2: MDR->ACC
T3:
FE是取指令周期,EX是执行周期。这里不考虑间址周期。
周期 |
时钟 |
微操作(本文件中hex(op)码) |
LDA(0) |
CMP(1) |
ADD(2) |
INC(3) |
STA(4) |
LDI(5) |
SHL(6) |
SHR(8) |
NOT(a) |
JMP(c) |
STP(e) |
JE(f) |
FE |
T0 |
PC->MAR |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
1->R |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
||
T1 |
M[MAR]->MDR |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
|
PC+1->PC |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
||
T2 |
MDR->IR |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
|
T3 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
EX |
T0
|
Ad(IR)->MAR |
√ |
|
√ |
|
√ |
√ |
|
|
|
√ |
|
|
Ad(IR)->CMPer |
|
√ |
|
|
|
|
|
|
|
|
|
|
||
1->R |
√ |
|
√ |
|
|
√ |
|
|
|
|
|
|
||
1->W |
|
|
|
|
√ |
|
|
|
|
|
|
|
||
T1
|
M[MAR]->MDR |
√ |
√ |
√ |
|
|
√ |
|
|
|
|
|
|
|
ACC->MDR |
|
|
|
|
√ |
|
|
|
|
|
|
|
||
ID->CMPer |
|
√ |
|
|
|
|
|
|
|
|
|
|
||
T2 |
MDR->X |
|
|
√ |
|
|
|
|
|
|
|
|
|
|
MDR->ACC |
√ |
|
|
|
|
|
|
|
|
|
|
|
||
MDR->M[MAR] |
|
|
|
|
√ |
|
|
|
|
|
|
|
||
Ad(IR)->PC |
|
|
|
|
|
|
|
|
|
√ |
|
√ |
||
STOP |
|
|
|
|
|
|
|
|
|
|
√ |
|
||
¬AC->AC |
|
|
|
|
|
|
|
|
√ |
|
|
|
||
ACC<<< |
|
|
|
|
|
|
√ |
|
|
|
|
|
||
ACC>>> |
|
|
|
|
|
|
|
√ |
|
|
|
|
||
ID+1->ID |
|
|
|
√ |
|
|
|
|
|
|
|
|
||
MDR->ID |
|
|
|
|
|
√ |
|
|
|
|
|
|
||
T3 |
X+ACC->ACC |
|
|
√ |
|
|
|
|
|
|
|
|
|
现在的上传资源好像不能自己定积分了,默认就是5积分?
这个图实在太大,截图显示不清楚,可以使用logisim打开我完成的电路图看。
以上是整体的MOG图,左下角一排是输入引脚,最上面一排是输出引脚,最左侧是一个译码器,根据输入的4位OP码译码选择指令,中间和右侧这整一大片是对微操作的选择电路。关于选择电路主要就是根据微操做时间表上的节拍和周期以及指令类型进行选择。
当完成微操作内部时,可以通过下图中的按钮进入一个调整页面,调整其他程序调用它时的显示样式。
可以看到这张图比刚才还大。。。
我来分部解说一下:
1. 时钟控制器
2. 存储器
3. 微操作发生器
4. ALU(加法器 位移操作器 操作数寄存器X)
5. 程序计数器
6. 相等标志位
7. ID寄存器
8. 指令寄存器IR
9. 门控电路和时钟控制电路
1. 右键存储器 Load Image... 载入数据code
首先将数据清零,然后观察存储器数据是这样的
根据起那面的指令设计,不难理解这里面的程序是这样的
00: LDA [A0]
21: ADD [A1]
43: STA ACC,[A3]
C1: JMP 11
60: SHL
80: SHR
A0: NOT
E0: END
2. 接下来再load image cycle 这是一个循环程序
具体内容是这样的 首先给IDload一个数,然后比较这个数是否与某个立即数相等,如果相等则结束,否则进入循环:
ID++,继续比较是否和一个立即数相等,如果相等,这跳出循环,否则继续循环。
详细的汇编指令不在赘述。
0613有更新:
其实这里我理解错老师的意思了,老师说的ID其实是一个变址寄存器,在比较的时候时
cmp [ID],立即数
这种形式的,?,我就不再做修改了,大家只要理解循环的思路,这个也是很容易做出来的。