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

Subversion Repositories sub86

[/] [sub86/] [trunk/] [sub86.v] - Diff between revs 9 and 10

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

Rev 9 Rev 10
Line 10... Line 10...
output  [1:0] BEN;
output  [1:0] BEN;
wire          nncry,neqF,ngF,nlF,naF,nbF,divF1,divF2;
wire          nncry,neqF,ngF,nlF,naF,nbF,divF1,divF2;
reg    [31:0] EAX,EBX,ECX,EDX,EBP,ESP,PC,regsrc,regdest,alu_out;
reg    [31:0] EAX,EBX,ECX,EDX,EBP,ESP,PC,regsrc,regdest,alu_out;
reg     [5:0] state,nstate;
reg     [5:0] state,nstate;
reg     [2:0] src,dest;
reg     [2:0] src,dest;
reg           RD,cry,ncry,prefx,nprefx,cmpr,eqF,gF,lF,aF,bF;
reg           WR,RD,cry,ncry,prefx,nprefx,cmpr,eqF,gF,lF,aF,bF;
wire   [31:0] pc_ja,pc_jae,pc_jb,pc_jbe,pc_jg,pc_jge,pc_jl,pc_jle,pc_eq,pc_jp,pc_neq,pc_sh;
wire   [31:0] pc_ja,pc_jae,pc_jb,pc_jbe,pc_jg,pc_jge,pc_jl,pc_jle,pc_eq,pc_jp,pc_neq,pc_sh;
wire   [31:0] Sregsrc,Zregsrc,incPC,sft_out,smlEAX,smlECX;
wire   [31:0] Sregsrc,Zregsrc,incPC,sft_out,smlEAX,smlECX;
wire   [32:0] adder_out,sub_out;
wire   [32:0] adder_out,sub_out;
wire    [4:0] EBX_shtr;
wire    [4:0] EBX_shtr;
wire signed [31:0] ssregsrc, ssregdest;
wire signed [31:0] ssregsrc, ssregdest;
Line 126... Line 126...
        `sdv3       : if (nbF==1'b0) EDX <= EDX - ECX; else EDX <= EDX;
        `sdv3       : if (nbF==1'b0) EDX <= EDX - ECX; else EDX <= EDX;
        `sdv4       : if (EBX[31] == 1'b1) EDX <= ((~EDX) + 1); else EDX<=EDX;
        `sdv4       : if (EBX[31] == 1'b1) EDX <= ((~EDX) + 1); else EDX<=EDX;
        default     : if (dest==3'b010) EDX <= alu_out; else EDX<=EDX;
        default     : if (dest==3'b010) EDX <= alu_out; else EDX<=EDX;
      endcase
      endcase
      case(state)  // ESP control
      case(state)  // ESP control
        `init       : ESP <= 32'h01f1fc;
        `init        : ESP <= 32'h03b1fc;
        `call,`calla: ESP <= ESP - 4'b0100;
        `call,`calla: ESP <= ESP - 4'b0100;
        `ret2       : ESP <= ESP + 4'b0100;
        `ret2       : ESP <= ESP + 4'b0100;
       default: if (dest==3'b100) ESP <= alu_out; else ESP<=ESP;
       default: if (dest==3'b100) ESP <= alu_out; else ESP<=ESP;
      endcase
      endcase
      if (dest==3'b101) EBP <= alu_out; else EBP<=EBP;  // EBP control 
      if (dest==3'b101) EBP <= alu_out; else EBP<=EBP;  // EBP control 
      case(state)  // PC control
      case(state)  // PC control
       `init        : PC<=32'h00;
       `init        : PC<=32'h0020000;
       `jae2        : PC<=pc_jae;
       `jae2        : PC<=pc_jae;
       `jbe2        : PC<=pc_jbe;
       `jbe2        : PC<=pc_jbe;
       `ja2         : PC<=pc_ja ;
       `ja2         : PC<=pc_ja ;
       `jb2         : PC<=pc_jb ;
       `jb2         : PC<=pc_jb ;
       `jge2        : PC<=pc_jge;
       `jge2        : PC<=pc_jge;
Line 194... Line 194...
   6'b001010 : {ncry,alu_out} =               sub_out ;  // SUB , carry generation
   6'b001010 : {ncry,alu_out} =               sub_out ;  // SUB , carry generation
   6'b001100 : {ncry,alu_out} = {cry,regdest ^ regsrc};  // XOR
   6'b001100 : {ncry,alu_out} = {cry,regdest ^ regsrc};  // XOR
   6'b100010 : {ncry,alu_out} = {cry,          regsrc};  // MOVE
   6'b100010 : {ncry,alu_out} = {cry,          regsrc};  // MOVE
   6'b101101 : {ncry,alu_out} = {cry,         Zregsrc};  // MOVE
   6'b101101 : {ncry,alu_out} = {cry,         Zregsrc};  // MOVE
   6'b101111 : {ncry,alu_out} = {cry,         Sregsrc};  // MOVE
   6'b101111 : {ncry,alu_out} = {cry,         Sregsrc};  // MOVE
   //6'b110000 : {ncry,alu_out} = {cry, sft_out[31:0]};  // SHIFT
 
   //6'b110100 : {ncry,alu_out} = {cry, sft_out[31:0]};  // SHIFT
 
   default   : {ncry,alu_out} = {cry,regdest         };  // DO NOTHING
   default   : {ncry,alu_out} = {cry,regdest         };  // DO NOTHING
  endcase
  endcase
  else if (state == `shift ) {ncry,alu_out} = {cry,sft_out           };
  else if (state == `shift ) {ncry,alu_out} = {cry,sft_out           };
  else {ncry,alu_out} = {cry,regdest         };
  else {ncry,alu_out} = {cry,regdest         };
// Main instruction decode
// Main instruction decode
always @(ID,state,ECX,EBX_shtr,EAX,divF1,divF2)
always @(ID,state,ECX,EBX_shtr,EAX,divF1,divF2)
 begin
 begin
   // One cycle instructions, operand selection
   // One cycle instructions, operand selection
   if ((state == `fetch) || (state ==`shift))
   if ((state == `fetch) || (state ==`shift))
     casex ({ID[15:14],ID[13],ID[9],ID[7]})
     casex ({ID[15:12],ID[10:9],ID[7]})
      5'b10x00  : begin RD=0; src=ID[5:3]; dest= 3'b111; end  // store into ram (x89 x00)
      7'b10x0000  : begin RD=0;WR=1; src=ID[5:3]; dest= 3'b111; end  // store into ram (x89 x00)
      5'b10010  : begin RD=1; src= 3'b111; dest=ID[5:3]; end  // load from ram  (x8b x00)
      7'b100xx10  : begin RD=1;WR=0; src= 3'b111; dest=ID[5:3]; end  // load from ram  (x8b x00)
      5'b10110  : begin RD=0; src= 3'b111; dest=ID[5:3]; end  // load bl with immediate
      7'b101xx10  : begin RD=0;WR=0; src= 3'b111; dest=ID[5:3]; end  // load bl with immediate
      5'b10x11  : begin RD=0; src=ID[2:0]; dest=ID[5:3]; end  // reg2reg xfer   (x8b xC0)
      7'b10xxx11  : begin RD=0;WR=0; src=ID[2:0]; dest=ID[5:3]; end  // reg2reg xfer   (x8b xC0)
      5'b00x11  : begin RD=0; src=ID[2:0]; dest=ID[5:3]; end  // alu op
      7'b00xxx11  : begin RD=0;WR=0; src=ID[2:0]; dest=ID[5:3]; end  // alu op
      default   : begin RD=0; src=ID[5:3]; dest=ID[2:0]; end  // shift
      default   : begin RD=0;WR=0; src=ID[5:3]; dest=ID[2:0]; end  // shift
     endcase
     endcase
   else if (state==`ret)
   else if (state==`ret)
        begin src = 3'b011; dest = 3'b100; RD=0; end
        begin src = 3'b011; dest = 3'b100; RD=0; WR=0; end
   else if (state==`sdv3)
   else if (state==`sdv3)
        begin src = 3'b001; dest = 3'b010; RD=0; end
        begin src = 3'b001; dest = 3'b010; RD=0; WR=0; end
   else begin src = 3'b000; dest = 3'b000; RD=0; end
   else begin src = 3'b000; dest = 3'b000; RD=0; WR=0; end
   // instructions that require more than one cycle to execute
   // instructions that require more than one cycle to execute
   if (state == `fetch)
   if (state == `fetch)
   begin
   begin
    casex(ID)
    casex(ID)
     16'h90e9: nstate = `jmp;
     16'h90e9: nstate = `jmp;
Line 290... Line 288...
   end
   end
 end
 end
assign ssregsrc = regsrc;
assign ssregsrc = regsrc;
assign ssregdest= regdest;
assign ssregdest= regdest;
assign  IA      = PC                ;
assign  IA      = PC                ;
assign  A       =((state == `call2)|(state == `calla2)) ?  ESP          : EBX      ;
assign  A       =((state == `call2)|(state == `calla2)|((WR==1)&(ID[2:0]==3'b100))) ?  ESP          : EBX      ;
assign  Q       =((state == `call2)|(state == `calla2)) ?  incPC        : regsrc   ;
assign  Q       =((state == `call2)|(state == `calla2)) ?  incPC        : regsrc   ;
assign  WEN     = (CE    ==   1'b0) ?  1'b1         :
assign  WEN     = (CE    ==   1'b0) ?  1'b1         :
                  ({ID[15:9],ID[7]}==8'h88)?  1'b0  :
                  (WR    ==   1'b1) ?  1'b0         :
                  (state == `call2) ?  1'b0         :
                  (state == `call2) ?  1'b0         :
                  (state == `calla2)?  1'b0         : 1'b1     ;
                  (state == `calla2)?  1'b0         : 1'b1     ;
assign  Sregsrc =       ID[8]       ? { {16{regsrc[15]}} , regsrc[15:0] } :
assign  Sregsrc =       ID[8]       ? { {16{regsrc[15]}} , regsrc[15:0] } :
                                      { {24{regsrc[7] }} , regsrc[7:0]  } ;
                                      { {24{regsrc[7] }} , regsrc[7:0]  } ;
assign  Zregsrc =       ID[8]       ? {  16'b0           , regsrc[15:0] } :
assign  Zregsrc =       ID[8]       ? {  16'b0           , regsrc[15:0] } :
                                      {  24'b0           , regsrc[7:0]  } ;
                                      {  24'b0           , regsrc[7:0]  } ;
assign      BEN =((state == `call2)|(state == `calla2)) ? 1'b1 : { prefx   , ID[8]        } ;
assign      BEN =((state == `call2)|(state == `calla2)) ? 1'b1 : { prefx   , ID[8]        } ;
assign     neqF = (regsrc == regdest) ? 1'b1 : 1'b0;
assign     neqF = (regsrc == regdest) ? 1'b1 : 1'b0;
assign      nbF = (regsrc  > regdest) ? 1'b1 : 1'b0;
assign      nbF = (regsrc  > regdest) ? 1'b1 : 1'b0;
assign      naF = ~(nlF | neqF );// (regsrc  < regdest) ? 1'b1 : 1'b0;
assign      naF = ~(nlF | neqF );
assign      nlF = (ssregsrc  > ssregdest) ? 1'b1 : 1'b0;
assign      nlF = (ssregsrc  > ssregdest) ? 1'b1 : 1'b0;
assign      ngF = ~(nbF | neqF );// (regsrc  < regdest) ? 1'b1 : 1'b0;
assign      ngF = ~(nbF | neqF );
assign    incPC = PC + 3'b010;
assign    incPC = PC + 3'b010;
assign   pc_jge = (eqF|gF) ? pc_jp : incPC;
assign   pc_jge = (eqF|gF) ? pc_jp : incPC;
assign   pc_jle = (eqF|lF) ? pc_jp : incPC;
assign   pc_jle = (eqF|lF) ? pc_jp : incPC;
assign   pc_jg  = (gF    ) ? pc_jp : incPC;
assign   pc_jg  = (gF    ) ? pc_jp : incPC;
assign   pc_jl  = (lF    ) ? pc_jp : incPC;
assign   pc_jl  = (lF    ) ? pc_jp : incPC;

powered by: WebSVN 2.1.0

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