⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sparc_lib.vhd

📁 ERC32 经典的sparc v7 cpu
💻 VHD
📖 第 1 页 / 共 5 页
字号:
              when "1110" => Result.Mnemo := FBULE;              when "1111" => Result.Mnemo := FBO;              when others => NULL;            end case; -- cond                        if a_bit = '0' then              Result.a := 0; -- Result.a is a natural.            else              Result.a := 1;            end if;                      when "111" => -------------- OP + OP2 testing --------------            case cond is  -- 3rd level              when "0000" => Result.Mnemo := CBN;              when "0001" => Result.Mnemo := CB123;              when "0010" => Result.Mnemo := CB12;              when "0011" => Result.Mnemo := CB13;              when "0100" => Result.Mnemo := CB1;              when "0101" => Result.Mnemo := CB23;              when "0110" => Result.Mnemo := CB2;              when "0111" => Result.Mnemo := CB3;              when "1000" => Result.Mnemo := CBA;              when "1001" => Result.Mnemo := CB0;              when "1010" => Result.Mnemo := CB03;              when "1011" => Result.Mnemo := CB02;              when "1100" => Result.Mnemo := CB023;              when "1101" => Result.Mnemo := CB01;              when "1110" => Result.Mnemo := CB013;              when "1111" => Result.Mnemo := CB012;              when others => NULL;            end case; -- cond            if a_bit = '0' then              Result.a := 0; -- Result.a is a natural.            else              Result.a := 1;            end if;                      when "000" => -------------- OP + OP2 testing --------------            Result.Mnemo  := UNIMP;          when others =>            Result.Mnemo := ILLEGAL; -- Unknown and illegal instruction        end case; -- op2              when "11" => -------------- OP testing --------------              Result.asi := ToNatural(asi);                case op3 is  -- 2nd level: OP + OP3 testing -------          when "000000" => Result.Mnemo := LD;          when "000001" => Result.Mnemo := LDUB;          when "000010" => Result.Mnemo := LDUH;          when "000011" => Result.Mnemo := LDD;          when "000100" => Result.Mnemo := ST;          when "000101" => Result.Mnemo := STB;          when "000110" => Result.Mnemo := STH;          when "000111" => Result.Mnemo := I_STD;          when "001001" => Result.Mnemo := LDSB;          when "001010" => Result.Mnemo := LDSH;          when "001101" => Result.Mnemo := LDSTUB;          when "001111" => Result.Mnemo := SWAP;          when "010000" => Result.Mnemo := LDA;          when "010001" => Result.Mnemo := LDUBA;          when "010010" => Result.Mnemo := LDUHA;          when "010011" => Result.Mnemo := LDDA;          when "010100" => Result.Mnemo := STA;          when "010101" => Result.Mnemo := STBA;          when "010110" => Result.Mnemo := STHA;          when "010111" => Result.Mnemo := STDA;          when "011001" => Result.Mnemo := LDSBA;          when "011010" => Result.Mnemo := LDSHA;          when "011101" => Result.Mnemo := LDSTUBA;          when "011111" => Result.Mnemo := SWAPA;          when "100000" => Result.Mnemo := LDF;          when "100001" => Result.Mnemo := LDFSR;          when "100011" => Result.Mnemo := LDDF;          when "100100" => Result.Mnemo := STF;          when "100101" => Result.Mnemo := STFSR;          when "100110" => Result.Mnemo := STDFQ;          when "100111" => Result.Mnemo := STDF;          when "110000" => Result.Mnemo := LDC;          when "110001" => Result.Mnemo := LDCSR;          when "110011" => Result.Mnemo := LDDC;          when "110100" => Result.Mnemo := STC;          when "110101" => Result.Mnemo := STCSR;          when "110110" => Result.Mnemo := STDCQ;          when "110111" => Result.Mnemo := STDC;          when others =>             Result.Mnemo := ILLEGAL; -- Unknown and illegal instruction        end case; -- op3              when "10" => -------------- OP testing --------------              case op3 is  -- 2nd level: OP + OP3 testing -------          when "000000" => Result.Mnemo := ADD;          when "000001" => Result.Mnemo := I_AND;          when "000010" => Result.Mnemo := I_OR;          when "000011" => Result.Mnemo := I_XOR;          when "000100" => Result.Mnemo := SUB;          when "000101" => Result.Mnemo := ANDN;          when "000110" => Result.Mnemo := ORN;          when "000111" => Result.Mnemo := XNOR;          when "001000" => Result.Mnemo := ADDX;          when "001010" => Result.Mnemo := UMUL; -- SPARC v.8          when "001011" => Result.Mnemo := SMUL; -- SPARC v.8          when "001100" => Result.Mnemo := SUBX;          when "001110" => Result.Mnemo := UDIV; -- SPARC v.8          when "001111" => Result.Mnemo := SDIV; -- SPARC v.8          when "010000" => Result.Mnemo := ADDcc;          when "010001" => Result.Mnemo := ANDcc;          when "010010" => Result.Mnemo := ORcc;          when "010011" => Result.Mnemo := XORcc;          when "010100" => Result.Mnemo := SUBcc;          when "010101" => Result.Mnemo := ANDNcc;          when "010110" => Result.Mnemo := ORNcc;          when "010111" => Result.Mnemo := XNORcc;          when "011000" => Result.Mnemo := ADDXcc;          when "011010" => Result.Mnemo := UMULcc; -- SPARC v.8          when "011011" => Result.Mnemo := SMULcc; -- SPARC v.8          when "011100" => Result.Mnemo := SUBXcc;          when "011110" => Result.Mnemo := UDIVcc; -- SPARC v.8          when "011111" => Result.Mnemo := SDIVcc; -- SPARC v.8          when "100000" => Result.Mnemo := TADDcc;          when "100001" => Result.Mnemo := TSUBcc;          when "100010" => Result.Mnemo := TADDccTV;          when "100011" => Result.Mnemo := TSUBccTV;          when "100100" => Result.Mnemo := MULScc;          when "100101" => Result.Mnemo := SLL;          when "100110" => Result.Mnemo := SRL;          when "100111" => Result.Mnemo := SRA;          when "101000" => Result.Mnemo := RDY;          when "101001" => Result.Mnemo := RDPSR;          when "101010" => Result.Mnemo := RDWIM;          when "101011" => Result.Mnemo := RDTBR;          when "110000" => Result.Mnemo := WRY;          when "110001" => Result.Mnemo := WRPSR;          when "110010" => Result.Mnemo := WRWIM;          when "110011" => Result.Mnemo := WRTBR;          when "110100" => --- FPop1 instructions ---            case opf is              when "000000001" => Result.Mnemo := FMOVs;              when "000000101" => Result.Mnemo := FNEGs;              when "000001001" => Result.Mnemo := FABSs;              when "000101001" => Result.Mnemo := FSQRTs;              when "000101010" => Result.Mnemo := FSQRTd;              when "000101011" => Result.Mnemo := FSQRTq;              when "001000001" => Result.Mnemo := FADDs;              when "001000010" => Result.Mnemo := FADDd;              when "001000011" => Result.Mnemo := FADDq;              when "001000101" => Result.Mnemo := FSUBs;              when "001000110" => Result.Mnemo := FSUBd;              when "001000111" => Result.Mnemo := FSUBq;              when "001001001" => Result.Mnemo := FMULs;              when "001001010" => Result.Mnemo := FMULd;              when "001001011" => Result.Mnemo := FMULq;              when "001001101" => Result.Mnemo := FDIVs;              when "001001110" => Result.Mnemo := FDIVd;              when "001001111" => Result.Mnemo := FDIVq;              when "001101001" => Result.Mnemo := FsMULd; -- SPARC v.8              when "001101110" => Result.Mnemo := FdMULq; -- SPARC v.8              when "011000100" => Result.Mnemo := FiTOs;              when "011000110" => Result.Mnemo := FdTOs;              when "011000111" => Result.Mnemo := FqTOs;              when "011001000" => Result.Mnemo := FiTOd;              when "011001001" => Result.Mnemo := FsTOd;              when "011001011" => Result.Mnemo := FqTOd;              when "011001100" => Result.Mnemo := FiTOq;              when "011001101" => Result.Mnemo := FsTOq;              when "011001110" => Result.Mnemo := FdTOq;              when "011010001" => Result.Mnemo := FsTOi;              when "011010010" => Result.Mnemo := FdTOi;              when "011010011" => Result.Mnemo := FqTOi;              when others =>                Result.Mnemo := ILLEGAL; -- Unknown and illegal instruction            end case; -- opf                      when "110101" => --- FPop2 instructions ---            case opf is              when "001010001" => Result.Mnemo := FCMPs;              when "001010010" => Result.Mnemo := FCMPd;              when "001010011" => Result.Mnemo := FCMPq;              when "001010101" => Result.Mnemo := FCMPEs;              when "001010110" => Result.Mnemo := FCMPEd;              when "001010111" => Result.Mnemo := FCMPEq;              when others =>                Result.Mnemo := ILLEGAL; -- Unknown and illegal instruction            end case; -- opf                    when "110110" => Result.Mnemo := CPop1;          when "110111" => Result.Mnemo := CPop2;          when "111000" => Result.Mnemo := JMPL;          when "111001" => Result.Mnemo := RETT;          when "111010" => --- Ticc instructions ---            case cond is  -- 3rd level              when "0000" => Result.Mnemo := TN;              when "0001" => Result.Mnemo := TE;              when "0010" => Result.Mnemo := TLE;              when "0011" => Result.Mnemo := TL;              when "0100" => Result.Mnemo := TLEU;              when "0101" => Result.Mnemo := TCS;              when "0110" => Result.Mnemo := TNEG;              when "0111" => Result.Mnemo := TVS;              when "1000" => Result.Mnemo := TA;              when "1001" => Result.Mnemo := TNE;              when "1010" => Result.Mnemo := TG;              when "1011" => Result.Mnemo := TGE;              when "1100" => Result.Mnemo := TGU;              when "1101" => Result.Mnemo := TCC;              when "1110" => Result.Mnemo := TPOS;              when "1111" => Result.Mnemo := TVC;              when others => NULL;            end case; -- cond                    when "111011" => Result.Mnemo := FLUSH;          when "111100" => Result.Mnemo := SAVE;          when "111101" => Result.Mnemo := RESTORE;          when others =>            Result.Mnemo := ILLEGAL; -- Unknown and illegal instruction        end case; -- op3              when "01" =>  -------------- OP testing --------------        Result.Mnemo := CALL;        Result.disp30 := disp30;              when others => NULL;    end case; -- op          return Result;  end Transcribe; -- function    -------------------------------------  function iccEvaluation(Mnemonic : SuperInstMnemonic;                         icc      : std_logic_vector) return boolean is  begin      if (       (Mnemonic = BA) or      (Mnemonic = BNE  and icc(Z_ICC) = '0') or      (Mnemonic = BE   and icc(Z_ICC) = '1') or      (Mnemonic = BG   and (icc(Z_ICC) or (icc(N_ICC) xor icc(V_ICC))) = '0')or      (Mnemonic = BLE  and (icc(Z_ICC) or (icc(N_ICC) xor icc(V_ICC))) = '1')or      (Mnemonic = BGE  and (icc(N_ICC) xor icc(V_ICC)) = '0') or      (Mnemonic = BL   and (icc(N_ICC) xor icc(V_ICC)) = '1')or      (Mnemonic = BGU  and ((icc(C_ICC) = '0') and (icc(Z_ICC) = '0')) ) or      (Mnemonic = BLEU and ((icc(C_ICC) = '1') or (icc(Z_ICC) = '1')) ) or      (Mnemonic = BCC  and icc(C_ICC) = '0') or      (Mnemonic = BCS  and icc(C_ICC) = '1') or      (Mnemonic = BPOS and icc(N_ICC) = '0') or      (Mnemonic = BNEG and icc(N_ICC) = '1') or      (Mnemonic = BVC  and icc(V_ICC) = '0') or      (Mnemonic = BVS  and icc(V_ICC) = '1')         ) then return TRUE;    end if;       return FALSE;     end iccEvaluation; -- function    -------------------------------------  function TiccEval(Mnemonic : SuperInstMnemonic;                    icc      : std_logic_vector) return boolean is  begin        if (       (Mnemonic = TA) or      (Mnemonic = TNE  and icc(Z_ICC) = '0') or      (Mnemonic = TE   and icc(Z_ICC) = '1') or      (Mnemonic = TG   and (icc(Z_ICC) or (icc(N_ICC) xor icc(V_ICC))) = '0')or      (Mnemonic = TLE  and (icc(Z_ICC) or (icc(N_ICC) xor icc(V_ICC))) = '1')or      (Mnemonic = TGE  and (icc(N_ICC) xor icc(V_ICC)) = '0') or      (Mnemonic = TL   and (icc(N_ICC) xor icc(V_ICC)) = '1')or      (Mnemonic = TGU  and ((icc(C_ICC) = '0') and (icc(Z_ICC) = '0')) ) or      (Mnemonic = TLEU and ((icc(C_ICC) = '1') or (icc(Z_ICC) = '1')) ) or      (Mnemonic = TCC  and icc(C_ICC

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -