美文网首页
计组实验添加指令

计组实验添加指令

作者: 萍水间人 | 来源:发表于2019-03-23 21:02 被阅读0次

    惭愧惭愧, 之前一直不知道计组实验究竟是在干嘛, 所以基本没花时间。
    今天用了大概两个小时左右将基本的流程都看明白了。

    基本操作

    指令添加

    bne

    分析一下beq指令的格式:
    beq 的op 为 000100


    beq指令

    我们知道beq指令是需要根据ALU的零信号来判断, 如果零信号有效, 也就是两个数据相等则跳转。(在这里跳转的含义就是NPC的值被修改为一个新的值)

    先从最简单的bne指令开始。

    op : 000101

    bne指令 对比

    说明一下NPCOp = 01的时候就是计算i类型跳转指令(其实也就bne和beq两条)姚跳转的地址。
    所以我们只需要去修改 NPCOp[0]就行啦。

    ok, 貌似到这里第一条指令就添加完成了。

    sll & srl

    这也是一条R类型的指令

    op = 000000, funct = 000000

    sll & srl

    添加jr指令

    这条指令的含义就是PC的值直接变为某个寄存器的值, 需要注意的是jr指令本身是一条R类型的指令。

    想: 既然PC的值在执行jr这条指令的时候, 必须要得到寄存器的一个值, 而且是Rs这个寄存器号对应的值, 那就必须有一条线

    所以,修改NPC


    修改NPC NPC_JR

    想法是这样子的, NPC既然要读取到寄存器RS端输出的值, 就必须有一给线连接着,
    所以NPC的输入端多加一根线,

    同时要绑定引脚

    同时和寄存器的输出绑定。

    和寄存器的输出绑定

    这样JR指令就添加完了?(小纠结)
    别忘了修改一下控制信号的表示

    jalr 指令

    JALR指令是需要跳转并链接寄存器的

    JALR 指令格式

    由于是jal 和jr指令的复合体
    而且还是R类型的指令, 所以我修改了这两个地方

    slti指令

    slti

    slti指令需要对立即数做有符号扩展,

    这是符号扩展的模块


    符号扩展 做有符号扩展

    还需要修改ALU?
    突然懵逼,分不清楚slt和slti的区别了, slt是用来比较寄存器的, slti是用来比较做符号扩展的立即数的

    所以ALU那里需要一个多路选择器?
    maybe

    但是在这之前我们需要给ALU的A输入端添加一个二路选择器。??

    不好意思抽风了, 不需要这个的
    slti 的格式和 lw, sw, addi,这些指令的格式是一样的
    需要选择rt 寄存器进行写入

    也需要对ALU的B输入口进行选择


    还需要修改一下ALU的运算

    由于ALU对B口有选择, 所以还是沿用slt的判断方法。


    sltiu

    这条指令类似, 只需要把符号扩展的信号改成无符号的扩展就行了

    从逻辑上来说, 默认应该是无符号扩展

    上一条slti 的指令好像抽风了, 应该要改成这样子的


    sll & sra & srl & lui

    这几条指令的特点是都需要移位,
    然后, rs这个字段都为0,
    接着, shamt 作为 A 输入口, rt(要被移位的数据)作为B输入口??

    这些指令全部都需要对ALU进行修改。。。
    先看怎么扩展ALU的功能吧。。

    扩展ALU的功能 新定义的宏值 新添加一个多路选择器

    woc它居然在译码的时候直接略过了shamt!!!。。。
    这就很神奇了

    添加译码 添加指令 对A输入端进行选择

    参考之前的多路选择器我们发现, ctrl控制单元还需要增加一个输出
    这个输出用来控制多路选择器的行为

    但是在这之前我们还需要决定那几个输出是被选择的。


    这里默认AregSel信号为0, 只有当遇到那几个特殊的信号的时候才需要置1

    然后我就添加了一个多路选择器

    同时修改了ALU的A输入口的绑定引脚

    当然这个地方给它全部填


    相关文章

      网友评论

          本文标题:计组实验添加指令

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