初见

logisim|计算机组成结课设计|16bit-CPU|调试

2020-06-19  本文已影响0人  讲故事的万物

本文从基础使用开始,说明16bit-CPU中各个参数的意义,同时举几个例子。

基础使用

.s文件对应massem.pl,basic_microcode文件对应uassem.pl,两个分别编译出一个.ram文件与两个.rom文件。

ram文件编译 rom文件编译

然后分别向RAM和ROM中Load image以上三个文件,就能够将你的程序写入这个CPU开始执行了。

接下来来讲ram和rom的编译语言规则,我们不会讲如何修改两个pl文件,只讲关于.s文件和basic_microcode文件的文字规则,以及整个线路的各引脚作用。

各个元件

ram相关

RAM各位控制

计算机中有很多种代码:

add r1, r2, r3  #r1=r2+r3
mul r1, r2, r3  #r1=r2*r3
sub r1, r2, r3  #r1=r2-r3
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对应了

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常用语句

除了各种语句和其匹配 参数的调用,还有以下这些:


rom

在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。


原程序r1为参数
r2为参数

以上,此时ALU计算得r1-0000,计算结果输出在aluout,但是ALU中加配了z参数,所以还有一个输出是z,当输出为zero时,z=1。也就是r1=0,z=1,其他时候z=0.
所以当r1!=0,下一条指令从86行读取,r1==0,下一条指令从87行读取。


r1!=0 r1=00

第三句:进入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中的运行了,总结出以下几点:

上一篇 下一篇

猜你喜欢

热点阅读