• MIPS rev.1 指令参数


    由于MIPS各个版本之间的操作数会变,如果出现无法识别的情况

    需要根据官方的MIPS instruction手册逐条核对,此处的版本为Rev.1

        
        //******MIPS-55*********//
        parameter   //SPECIAL OP LIST   5-0
                    ADDU    =   6'b100001,
                    SUBU    =   6'b100011,
                    ADD     =   6'b100000,
                    SUB     =   6'b100010,
                    AND     =   6'b100100,
                    OR      =   6'b100101,
                    XOR     =   6'b100110,
                    NOR     =   6'b100111,
                    SLT     =   6'b101010,
                    SLTU    =   6'b101011,
                    SRL     =   6'b000010,
                    SRA     =   6'b000011,
                    SLL     =   6'b000000,
                    SLLV    =   6'b000100,
                    SRLV    =   6'b000110,
                    SRAV    =   6'b000111,
                    JR      =   6'b001000,
                    JALR    =   6'b001001,
                    MULT    =    6'b011000,
                    MULTU   =   6'b011001,
                    DIV     =   6'b011010,
                    DIVU    =   6'b011011,
                    MFHI    =   6'b010000,
                    MFLO    =   6'b010010,
                    MTHI    =   6'b010001,
                    MTLO    =   6'b010011,
                    BREAK   =   6'b001101,
                    SYSCALL =   6'b001100,
                    TEQ     =   6'b110100,
                    //SPECIAL 2 func
                    CLZ        =   6'b100000,
                    MUL        =   6'b000010,
                    //REGIMM OP LIST 20-16
                    BLTZ    =   5'b00000,
                    BGEZ    =   5'b00001,
                    //COP0 OP LIST 
                    ERET    =   6'b011000,  //5-0&&25TH=1
                    MFC0    =   5'b00000,   //20-16
                    MTC0    =   5'b00100,
                    //OPCODE FIELD  31-26
                    ADDI    =   6'b001000,
                    ADDIU   =   6'b001001,
                    ANDI    =   6'b001100,
                    ORI     =   6'b001101,
                    XORI    =   6'b001110,
                    LW      =   6'b100011,
                    SW      =   6'b101011,
                    BEQ     =   6'b000100,
                    BNE     =   6'b000101,
                    BLEZ    =   6'b000110,
                    BGTZ    =   6'b000111,
                    SLTI    =   6'b001010,
                    SLTIU   =   6'b001011,
                    LUI     =   6'b001111,
                    J       =   6'b000010,
                    JAL     =   6'b000011,
                    LB      =   6'b100000,//    Load Byte Function=6'h24    
                    LBU     =   6'b100100,//    1Load Byte Unsigned 
                    LH      =   6'b100001,//    Load high 
                    LHU     =   6'b100101,//    Load High Unsigned
                    SB      =   6'b101000,//    Send Byte
                    SH      =   6'b101001,//    Send High
                    
                    SPECIAL =   6'b000000,
                    SPECIAL2=    6'b011100,
                    REGIMM  =   6'b000001,
                    COP0    =   6'b010000;  
    
        //ALU OPCODE                
        parameter   _ADDU   =   4'b0000;    //r=a+b unsigned
        parameter   _ADD    =   4'b0010;    //r=a+b signed
        parameter   _SUBU   =   4'b0001;    //r=a-b unsigned
        parameter   _SUB    =   4'b0011;    //r=a-b signed
        parameter   _AND    =   4'b0100;    //r=a&b
        parameter   _OR     =   4'b0101;    //r=a|b
        parameter   _XOR    =   4'b0110;    //r=a^b
        parameter   _NOR    =   4'b0111;    //r=~(a|b)
        
        parameter   _LUI    =   4'b1000;    //r={b[15:0],16'b0}
        parameter   _SLT    =   4'b1011;    //r=(a-b<0)?1:0 signed
        parameter   _SLTU   =   4'b1010;    //r=(a-b<0)?1:0 unsigned
        parameter   _SRA    =   4'b1100;    //r=b>>>a 
        parameter   _SLL    =   4'b1110;    //r=b<<a
        parameter   _SRL    =   4'b1101;    //r=b>>a
        
        parameter    _SYSCALL =   4'b1000,
                    _BREAK    =   4'b1001,
                    _TEQ      =   4'b1101;
                
        wire [5:0]  op        =  instr[31:26];
        assign      rs        =  instr[25:21];
        assign      rt        =  instr[20:16];
        assign      rd        =  instr[15:11];
        wire [5:0]  func      =  instr[5:0];
        
        wire [4:0]  shamt     =  instr[10:6];
        wire [15:0] imm       =  instr[15:0];
        wire [25:0] addr      =  instr[25:0];
        
        parameter   SIGN      =   1'b1;
        parameter   UNSIGN    =   1'b0;
        wire     imm_sign     =   (op==ANDI||op==ORI||op==XORI)?UNSIGN:SIGN;
        
        wire [31:0] shamt_ext =   {27'b0,shamt};
        wire [31:0] imm_ext   =   imm_sign?{{(16){imm[15]}},imm}:{16'b0,imm};
    
        reg  [31:0] load_data,clz_data;
        
        assign    waddr    =    (op==SPECIAL||op==SPECIAL2)?    rd:    (op==JAL)    ?5'b11111:rt;
        
  • 相关阅读:
    mybatis专题(一)-----入门、配置
    如何在抽象类中注入bean
    spring是如何解决循环依赖的?
    Java 程序员必须了解的计算机底层知识!
    数据库底层到底是怎么设计的?
    关于Rigidbody,Collider和CharacterController三者之间的关系和用法的总结
    泛型c#(深入理解c#)
    协程的NullReferenceException 错误
    进度条的制作unity
    Rigidbody.Is Kinematic和碰撞体
  • 原文地址:https://www.cnblogs.com/liutianchen/p/7199680.html
Copyright © 2020-2023  润新知