OpenCores
URL https://opencores.org/ocsvn/plasma/plasma/trunk

Subversion Repositories plasma

[/] [plasma/] [trunk/] [vhdl/] [control.vhd] - Diff between revs 194 and 284

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 194 Rev 284
Line 119... Line 119...
         c_source := C_FROM_PC_PLUS4;
         c_source := C_FROM_PC_PLUS4;
         pc_source := FROM_BRANCH;
         pc_source := FROM_BRANCH;
         alu_function := ALU_ADD;
         alu_function := ALU_ADD;
         branch_function := BRANCH_YES;
         branch_function := BRANCH_YES;
 
 
      when "001010" =>   --MOVZ  if(!r[rt]) r[rd]=r[rs]; /*IV*/
      --when "001010" =>   --MOVZ  if(!r[rt]) r[rd]=r[rs]; /*IV*/
--         c_source := C_FROM_REG_SOURCE_EQZ;
      --when "001011" =>   --MOVN  if(r[rt]) r[rd]=r[rs];  /*IV*/
 
 
      when "001011" =>   --MOVN  if(r[rt]) r[rd]=r[rs];  /*IV*/
 
--         c_source := FROM_REG_SOURCE_NEZ;
 
 
 
      when "001100" =>   --SYSCALL
      when "001100" =>   --SYSCALL
         is_syscall := '1';
         is_syscall := '1';
 
 
      when "001101" =>   --BREAK s->wakeup=1;
      when "001101" =>   --BREAK s->wakeup=1;
         is_syscall := '1';
         is_syscall := '1';
 
 
      when "001111" =>   --SYNC  s->wakeup=1;
      --when "001111" =>   --SYNC  s->wakeup=1;
 
 
      when "010000" =>   --MFHI  r[rd]=s->hi;
      when "010000" =>   --MFHI  r[rd]=s->hi;
         c_source := C_FROM_MULT;
         c_source := C_FROM_MULT;
         mult_function := MULT_READ_HI;
         mult_function := MULT_READ_HI;
 
 
      when "010001" =>   --FTHI  s->hi=r[rs];
      when "010001" =>   --FTHI  s->hi=r[rs];
Line 202... Line 200...
 
 
      when "101101" =>   --DADDU r[rd]=r[rs]+u[rt];
      when "101101" =>   --DADDU r[rd]=r[rs]+u[rt];
         c_source := C_FROM_ALU;
         c_source := C_FROM_ALU;
         alu_function := ALU_ADD;
         alu_function := ALU_ADD;
 
 
      when "110001" =>   --TGEU
      --when "110001" =>   --TGEU
      when "110010" =>   --TLT
      --when "110010" =>   --TLT
      when "110011" =>   --TLTU
      --when "110011" =>   --TLTU
      when "110100" =>   --TEQ 
      --when "110100" =>   --TEQ 
      when "110110" =>   --TNE 
      --when "110110" =>   --TNE 
      when others =>
      when others =>
      end case;
      end case;
 
 
   when "000001" =>   --REGIMM
   when "000001" =>   --REGIMM
      rt := "000000";
      rt := "000000";
Line 235... Line 233...
         branch_function := BRANCH_GEZ;
         branch_function := BRANCH_GEZ;
 
 
      when "00001" =>   --BGEZ    branch=r[rs]>=0;
      when "00001" =>   --BGEZ    branch=r[rs]>=0;
         branch_function := BRANCH_GEZ;
         branch_function := BRANCH_GEZ;
 
 
      when "10010" =>   --BLTZALL r[31]=s->pc_next; lbranch=r[rs]<0;
      --when "10010" =>   --BLTZALL r[31]=s->pc_next; lbranch=r[rs]<0;
         c_source := C_FROM_PC_PLUS4;
      --when "00010" =>   --BLTZL   lbranch=r[rs]<0;
         pc_source := FROM_LBRANCH;
      --when "10011" =>   --BGEZALL r[31]=s->pc_next; lbranch=r[rs]>=0;
         branch_function := BRANCH_LTZ;
      --when "00011" =>   --BGEZL   lbranch=r[rs]>=0;
 
 
      when "00010" =>   --BLTZL   lbranch=r[rs]<0;
 
         pc_source := FROM_LBRANCH;
 
         branch_function := BRANCH_LTZ;
 
 
 
      when "10011" =>   --BGEZALL r[31]=s->pc_next; lbranch=r[rs]>=0;
 
         c_source := C_FROM_PC_PLUS4;
 
         pc_source := FROM_LBRANCH;
 
         branch_function := BRANCH_GEZ;
 
 
 
      when "00011" =>   --BGEZL   lbranch=r[rs]>=0;
 
         pc_source := FROM_LBRANCH;
 
         branch_function := BRANCH_GEZ;
 
 
 
          when others =>
          when others =>
          end case;
          end case;
 
 
   when "000011" =>   --JAL    r[31]=s->pc_next; s->pc_next=(s->pc&0xf0000000)|target;
   when "000011" =>   --JAL    r[31]=s->pc_next; s->pc_next=(s->pc&0xf0000000)|target;
Line 352... Line 337...
         rd(5) := '1';
         rd(5) := '1';
         pc_source := FROM_BRANCH;   --delay possible interrupt
         pc_source := FROM_BRANCH;   --delay possible interrupt
         branch_function := BRANCH_NO;
         branch_function := BRANCH_NO;
      end if;
      end if;
 
 
   when "010001" =>   --COP1
   --when "010001" =>   --COP1
   when "010010" =>   --COP2
   --when "010010" =>   --COP2
   when "010011" =>   --COP3
   --when "010011" =>   --COP3
   when "010100" =>   --BEQL   lbranch=r[rs]==r[rt];
   --when "010100" =>   --BEQL   lbranch=r[rs]==r[rt];
      a_source := A_FROM_PC;
   --when "010101" =>   --BNEL   lbranch=r[rs]!=r[rt];
      b_source := B_FROM_IMMX4;
   --when "010110" =>   --BLEZL  lbranch=r[rs]<=0;
      alu_function := ALU_ADD;
   --when "010111" =>   --BGTZL  lbranch=r[rs]>0;
      pc_source := FROM_LBRANCH;
 
      branch_function := BRANCH_EQ;
 
 
 
   when "010101" =>   --BNEL   lbranch=r[rs]!=r[rt];
 
      a_source := A_FROM_PC;
 
      b_source := B_FROM_IMMX4;
 
      alu_function := ALU_ADD;
 
      pc_source := FROM_LBRANCH;
 
      branch_function := BRANCH_NE;
 
 
 
   when "010110" =>   --BLEZL  lbranch=r[rs]<=0;
 
      a_source := A_FROM_PC;
 
      b_source := B_FROM_IMMX4;
 
      alu_function := ALU_ADD;
 
      pc_source := FROM_LBRANCH;
 
      branch_function := BRANCH_LEZ;
 
 
 
   when "010111" =>   --BGTZL  lbranch=r[rs]>0;
 
      a_source := A_FROM_PC;
 
      b_source := B_FROM_IMMX4;
 
      alu_function := ALU_ADD;
 
      pc_source := FROM_LBRANCH;
 
      branch_function := BRANCH_GTZ;
 
 
 
   when "100000" =>   --LB     r[rt]=*(signed char*)ptr;
   when "100000" =>   --LB     r[rt]=*(signed char*)ptr;
      a_source := A_FROM_REG_SOURCE;
      a_source := A_FROM_REG_SOURCE;
      b_source := B_FROM_SIGNED_IMM;
      b_source := B_FROM_SIGNED_IMM;
      alu_function := ALU_ADD;
      alu_function := ALU_ADD;
Line 431... Line 393...
      alu_function := ALU_ADD;
      alu_function := ALU_ADD;
      rd := rt;
      rd := rt;
      c_source := C_FROM_MEMORY;
      c_source := C_FROM_MEMORY;
      mem_source := MEM_READ16;    --address=(short)imm+r[rs];
      mem_source := MEM_READ16;    --address=(short)imm+r[rs];
 
 
   when "100110" =>   --LWR    //Not Implemented
   --when "100110" =>   --LWR    //Not Implemented
 
 
   when "101000" =>   --SB     *(char*)ptr=(char)r[rt];
   when "101000" =>   --SB     *(char*)ptr=(char)r[rt];
      a_source := A_FROM_REG_SOURCE;
      a_source := A_FROM_REG_SOURCE;
      b_source := B_FROM_SIGNED_IMM;
      b_source := B_FROM_SIGNED_IMM;
      alu_function := ALU_ADD;
      alu_function := ALU_ADD;
      mem_source := MEM_WRITE8;   --address=(short)imm+r[rs];
      mem_source := MEM_WRITE8;   --address=(short)imm+r[rs];
Line 456... Line 419...
      a_source := A_FROM_REG_SOURCE;
      a_source := A_FROM_REG_SOURCE;
      b_source := B_FROM_SIGNED_IMM;
      b_source := B_FROM_SIGNED_IMM;
      alu_function := ALU_ADD;
      alu_function := ALU_ADD;
      mem_source := MEM_WRITE32;  --address=(short)imm+r[rs];
      mem_source := MEM_WRITE32;  --address=(short)imm+r[rs];
 
 
   when "101110" =>   --SWR    //Not Implemented
   --when "101110" =>   --SWR    //Not Implemented
   when "101111" =>   --CACHE
   --when "101111" =>   --CACHE
   when "110000" =>   --LL     r[rt]=*(long*)ptr;
   --when "110000" =>   --LL     r[rt]=*(long*)ptr;
   when "110001" =>   --LWC1 
   --when "110001" =>   --LWC1 
   when "110010" =>   --LWC2 
   --when "110010" =>   --LWC2 
   when "110011" =>   --LWC3 
   --when "110011" =>   --LWC3 
   when "110101" =>   --LDC1 
   --when "110101" =>   --LDC1 
   when "110110" =>   --LDC2 
   --when "110110" =>   --LDC2 
   when "110111" =>   --LDC3 
   --when "110111" =>   --LDC3 
   when "111000" =>   --SC     *(long*)ptr=r[rt]; r[rt]=1;
   --when "111000" =>   --SC     *(long*)ptr=r[rt]; r[rt]=1;
   when "111001" =>   --SWC1 
   --when "111001" =>   --SWC1 
   when "111010" =>   --SWC2 
   --when "111010" =>   --SWC2 
   when "111011" =>   --SWC3 
   --when "111011" =>   --SWC3 
   when "111101" =>   --SDC1 
   --when "111101" =>   --SDC1 
   when "111110" =>   --SDC2 
   --when "111110" =>   --SDC2 
   when "111111" =>   --SDC3 
   --when "111111" =>   --SDC3 
   when others =>
   when others =>
   end case;
   end case;
 
 
   if c_source = C_FROM_NULL then
   if c_source = C_FROM_NULL then
      rd := "000000";
      rd := "000000";

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.