美文网首页初见
logisim|计算机组成结课设计|16bit-CPU|调试

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

作者: 讲故事的万物 | 来源:发表于2020-06-19 10:44 被阅读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、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中制作循环?

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

    • immed可以作为我们while循环的开头存点
      当然,如果要做老师说的第二层,我们就要封装到ROM中,所以简单的loop:加jnez语句的应用是不足够的。作为一个语句,所以我们不仅要会使用,我们要理解底层,然后才能做出jnez级别的语句。
    • z可以作为判断我们while循环的跳出判断
    • 通过z改变decisionROM中的下一位选择,就可以通过线路中(reg或者ram)的数据来让计算机判断接下来进行的步骤。

    相关文章

      网友评论

        本文标题:logisim|计算机组成结课设计|16bit-CPU|调试

        本文链接:https://www.haomeiwen.com/subject/zksjxktx.html