写在前面
首先很感谢各位西电的学长在互联网上开源了自己的计组课设,实验的第一个下午我对着手册看了三四个小时还没看明白,后来看了一些学长写的文章以及和班上同学讨论了才大致理清了思路,其中包括但不限于以下文章:
本文主要讲解实验原理思路,具体微操作设计建议阅读上述两篇文章。
实验原理
本次实验主要是让用户建立从上层软件到底层硬件的全局宏观认识。
首先,我们需要对程序执行方式有基本理解:我们平时写的C语言会首先被编译为汇编语言(ASM), 然后汇编语言再被解析为一系列的微操作($\mu$op)随着时钟脉冲执行。
显然,高级语言/汇编是面向用户的,微操作是面向系统设计者的。用户无需关心指令是怎么在机器上微操作随着时钟脉冲执行的,仅需知道指令的操作码、操作数、以及返回值即可;系统设计者无需关心用户的实际使用中调用了几次指令,仅需设计好指令对应的微操作流水即可。而我们在这个实验中就是承担系统设计者的角色,所以,我们需要根据一些实际需求(用户实际编程需要)提供解决方案(指令),并设计微操作完成指令的执行。
问题来了,最直接的我们要做的,很简单,就是要设计微操作(即修改ROM_5.mif
),那我们要为哪些指令设计微操作呢,基本地,可以尝试仿照参考手册上的一些指令作初步修改,体验一下微操作执行方式(比如手册上的ADD,你可以按照ALU的表,修改为SUB等等) 实现方法就是把第15条的微操作内容改为 619A01
注意事项 !!!
注意!!!!
- 下面这个流程图里很多微操作是错印的(比如0/D,9/1),最正确不会出错的只有
ROM_5.mif
文件 这些微操作前面的 01/02/10均为八进制,不是十进制!不是十进制!不是十进制!
栈设计
R0: 指向栈顶的指针
汇编及其机器码
Function Operator Operand Init 00H \<null> PUSH $IMM 30H \<null> POP 40H \<null> GetTop 60H \<null> PUSH [addr] 20H **H(8-bit address) Init
需配合IN,将IN的值作为栈的起始地址
无返回值PUSH $IMM
需配合IN,将IN的值压入栈内
无返回值POP
弹出栈顶元素
无返回值GetTop
获取栈顶元素的值
返回值为8bit数值PUSH [addr]
将地址为addr的值压入栈内
无返回值微操作流程图
Q&A
RAM和ROM有什么联系?
- RAM是可读可写的存储器,一般地,我们会把要执行的汇编指令加载到内存,我们常说的“读内存”也是说的用AR读RAM
- ROM是固定烧录、不可修改的存储器,用来存储一个个用于执行汇编指令的微操作(不能修改的理由很简单:系统提供的汇编指令是固定的,所以用于实现这些汇编指令的步骤(微操作)也是固定的)
红框里的操作是什么?
- 指令是16bit,但是PC一次只能读8bit,第一次
PC+1
在02
微操作,是取操作Operator,第二次PC+1
是取操作数Operand
- 指令是16bit,但是PC一次只能读8bit,第一次
最后
本文仅为知识共享目的,希望能帮到你!