本文从基础使用开始,说明16bit-CPU中各个参数的意义,同时举几个例子。
基础使用
.s文件对应massem.pl,basic_microcode文件对应uassem.pl,两个分别编译出一个.ram文件与两个.rom文件。
然后分别向RAM和ROM中Load image以上三个文件,就能够将你的程序写入这个CPU开始执行了。
接下来来讲ram和rom的编译语言规则,我们不会讲如何修改两个pl文件,只讲关于.s文件和basic_microcode文件的文字规则,以及整个线路的各引脚作用。
各个元件
ram相关
计算机中有很多种代码:
- add、mul等属于计算型0~15 dst型
add r1, r2, r3 #r1=r2+r3
mul r1, r2, r3 #r1=r2*r3
sub r1, r2, r3 #r1=r2-r3
- jnez属于单数字型 sti型
jnez r1, aa #跳转到aa行运行
----------------------------------------
40: addrsel=pc imload=1
aluop=sub op2sel=0
这段是jnez 的底层代码,
addrsel=pc对应了'addrsel=pc' => 0 << 7
意思是第0左移七位,即第八位为0.
addrsel对应的第七第八位是PC的多路复用器的选择位,对应关系如下
00:pc
01:immed存储的是jnez第二个参数
10:alout当前ALU计算输出
11:sreg当前reg的steg输出位
imload=1对应了
- sw、li单数字赋值 di型
li r5,x
#给寄存器reg中r5位存x
sw r0, 256
#给内存RAM中第256字节存r0的数值,十进制的256是十六进制的100
以上不是用语不是很贴合,但是尽可能做到好理解。
如何在ram内构造循环?
ram中任意一行开头使用以下方式可以存储一个值在x中,x的值为x所在行。
~~~~
x:~~~~
jnez r1,x
#这段的意思是如果r1!=0,则返回x所在行,x可是设置为一个数字,可也以和这段一样实现一个for循环
ram常用语句
除了各种语句和其匹配 参数的调用,还有以下这些:
- a:
在每行开头使用可以将a=此行行数,之后可以用a作为一个数字参数使用,编译自动识别数字。 - goto xxx:
到xxx语句,运行完本行就会进入这条语句,编译出来的decisionROM为xxx语句在controlROM中所在行。 - if z then pcincr else jump
z代表了ALU的z参数,pcincr和jump都是语句,如果z就是ALU输出为zero,运行pcincr,else,运行jump。
rom
在rom里创建新的语句首先要理解rom控制器每一个输出控制位置对应的作用。
如何在rom中制作循环?
我们先来看这段编译,我们可以看出来,代码分成了两个部分,一部分是后面的语句,一部分是前面的数字,那么前面的数字代表了什么呢?
后面的语句对应了前面的两组数字,两组数字前后分别对应了控制cpu线路的control ROM和控制control ROM的decision ROM。
举个例子,jnez(40:)的代码。
第一句:前侧数字为00004000 8282,其中,00004000对应了二进制的第十五位为1其他为0,控制了imload;而8282对应了decision输出两条数字82/82,这个数字通过cond位选择z\n\c中的一个来选择是第一条还是第二条。
(关于znc在ALU段说明)(此时cond位:17、18位=00)
控制imload作用为让immed读入RAM程序中的数字,这里.s文件中在0006行用loop:存储了一个数loop=0006,在编译.s到.ram中会把loop变成常数0006来使用。(上文我的程序有做修改,源文件中loop在0006行)
第二句:进入82行,前侧数字位00000021 8687,其中,00000021对应了aluop(0001)和op2sel(10),控制ALU用减法,op2sel控制ALU低位输入为0000;而86/87分别对应下一条指令。
下面是jnez循环的重点,在RAM接收jnez前7个控制字的时候,后面数字字第二组为jnez语法的第一个参数,ALU高位输入是这个参数,即r1。
以上,此时ALU计算得r1-0000,计算结果输出在aluout,但是ALU中加配了z参数,所以还有一个输出是z,当输出为zero时,z=1。也就是r1=0,z=1,其他时候z=0.
所以当r1!=0,下一条指令从86行读取,r1==0,下一条指令从87行读取。
第三句:进入86/87行,前侧数字位00000800 0000/00000a00 0000。对应下一条指令都是0000,说明要进行下一次轮回了。
00000800,控制pcload=1,即pc+1,进入下一条RAM中的语句。
00000a00,控制pcsle=01,pcload=1,pcsle选择下一条语句为immed中存储的行数,第一局中我们将loop作为行数输入进了immed中,此时又进入到了loop所在行,完成了循环。
以上就是jnez语句的解析,现在我们了解了jnez语句在电路和ROM中的运行了,总结出以下几点:
- immed可以作为我们while循环的开头存点
当然,如果要做老师说的第二层,我们就要封装到ROM中,所以简单的loop:加jnez语句的应用是不足够的。作为一个语句,所以我们不仅要会使用,我们要理解底层,然后才能做出jnez级别的语句。 - z可以作为判断我们while循环的跳出判断
- 通过z改变decisionROM中的下一位选择,就可以通过线路中(reg或者ram)的数据来让计算机判断接下来进行的步骤。