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

Subversion Repositories sub86

[/] [sub86/] [trunk/] [sub86.v] - Diff between revs 3 and 4

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

Rev 3 Rev 4
Line 42... Line 42...
`define jne2  5'b11000
`define jne2  5'b11000
`define mul   5'b11001
`define mul   5'b11001
`define mul2  5'b11010
`define mul2  5'b11010
 always @(posedge CLK or negedge RSTN)
 always @(posedge CLK or negedge RSTN)
   if(!RSTN) begin
   if(!RSTN) begin
      EAX <= 32'b0; EBX <= 32'b0; ECX <= 32'b0; EDX <= 32'b0;
      ESP <= 32'b011111111; PC  <= 32'b0;
      EBP <= 32'b0; ESP <= 32'b011111111; PC  <= 32'b00000;
 
      eqF <= 1'b0; lF <= 1'b0; gF <= 1'b0;
      eqF <= 1'b0; lF <= 1'b0; gF <= 1'b0;
      state <=5'b00000; prefx <= 1'b0; cry <= 1'b0;
      state <=5'b0; prefx <= 1'b0; cry <= 1'b0;
      end
      end
   else
   else
      begin
      begin
       state <= nstate; prefx <= nprefx; cry <= ncry;
       state <= nstate; prefx <= nprefx; cry <= ncry;
       case (cmpr)
       case (cmpr)
Line 66... Line 65...
         if (dest==3'b101) EBP <= alu_out; else EBP<=EBP;
         if (dest==3'b101) EBP <= alu_out; else EBP<=EBP;
        end
        end
       else if (state==`mul)
       else if (state==`mul)
        begin
        begin
         EAX <= {EAX[30:0],1'b0};
         EAX <= {EAX[30:0],1'b0};
         if (EDX[0] == 1'b1) EBX <= EBX + EAX; else EBX <= EBX;
         if (EDX[0] == 1'b1) EBX <= EAX+EBX; else EBX <= EBX;
         EDX <= {1'b0,EDX[31:1]};
         EDX <= {1'b0,EDX[31:1]};
         ECX <= ECX; ESP <= ESP; EBP <= EBP;
         ECX <= ECX; ESP <= ESP; EBP <= EBP;
        end
        end
       else if (state==`mul2)
       else if (state==`mul2)
        begin
        begin
Line 129... Line 128...
    3'b101 : regdest = EBP;
    3'b101 : regdest = EBP;
    3'b111 : regdest = D  ;
    3'b111 : regdest = D  ;
    default: regdest = EBX;
    default: regdest = EBX;
   endcase
   endcase
// alu
// alu
always@(regdest,regsrc,ID,cry,Zregsrc,Sregsrc,sft_out,adder_out,sub_out)
always@(state,regdest,regsrc,ID,cry,Zregsrc,Sregsrc,sft_out,adder_out,sub_out)
 begin
  if (state == `fetch )
  case (ID[15:10])
  case (ID[15:10])
   6'b000000 : {ncry,alu_out} =             adder_out ; // ADD , carry generation
   6'b000000 : {ncry,alu_out} =             adder_out ; // ADD , carry generation
   6'b000010 : {ncry,alu_out} = {cry,regdest | regsrc}; // OR
   6'b000010 : {ncry,alu_out} = {cry,regdest | regsrc}; // OR
   6'b000100 : {ncry,alu_out} =             adder_out ; // ADD , carry use
   6'b000100 : {ncry,alu_out} =             adder_out ; // ADD , carry use
   6'b000110 : {ncry,alu_out} =               sub_out ; // SUB , carry use
   6'b000110 : {ncry,alu_out} =               sub_out ; // SUB , carry use
Line 146... Line 145...
   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'b110000 : {ncry,alu_out} = {cry,   sft_out[31:0]}; // SHIFT
   6'b110100 : {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
 end
  else {ncry,alu_out} = {cry,regdest         };
// Main instruction decode
// Main instruction decode
always @(ID,state,EDX)
always @(ID,state,EDX)
 begin
 begin
   // One cycle instructions, operand selection
   // One cycle instructions, operand selection
   if (state == `fetch)
   if (state == `fetch)
Line 216... Line 215...
assign  A       = (state == `call2) ?  ESP          : EBX      ;
assign  A       = (state == `call2) ?  ESP          : EBX      ;
assign  shtr    =       ID[12]      ?  ECX[4:0]     : EBX[4:0] ;
assign  shtr    =       ID[12]      ?  ECX[4:0]     : EBX[4:0] ;
assign  Q       = (state == `call2) ?  incPC        : regsrc   ;
assign  Q       = (state == `call2) ?  incPC        : regsrc   ;
assign  WEN     = (ID[15:8]==8'h90) ?  1'b1         :
assign  WEN     = (ID[15:8]==8'h90) ?  1'b1         :
                  (state == `call2) ?  1'b0         :
                  (state == `call2) ?  1'b0         :
                  (dest  == 3'b111) ?  1'b0         :
                  (dest  == 3'b111) ?  1'b0         : 1'b1     ;
                                       1'b1         ;
 
assign      tst = sft_in >>> (shtr);
assign      tst = sft_in >>> (shtr);
assign  sft_out = (src   == 3'b111) ? tst                : //sar
assign  sft_out = (src   == 3'b111) ? tst                : //sar
                  (src   == 3'b101) ? (sft_in >>  shtr ) : //shr
                  (src   == 3'b101) ? (sft_in >>  shtr ) : //shr
                                      (sft_in <<  shtr ) ; //shl
                                      (sft_in <<  shtr ) ; //shl
assign  Sregsrc =       ID[8]       ? { {16{regsrc[15]}} , regsrc[15:0] } :
assign  Sregsrc =       ID[8]       ? { {16{regsrc[15]}} , regsrc[15:0] } :
Line 241... Line 239...
assign   pc_eq  = ( eqF   ) ? pc_jp : incPC;
assign   pc_eq  = ( eqF   ) ? pc_jp : incPC;
assign   pc_neq = ( eqF   ) ? incPC : pc_jp;
assign   pc_neq = ( eqF   ) ? incPC : pc_jp;
assign   pc_jp  = incPC+{ID,EBX[15:0]};
assign   pc_jp  = incPC+{ID,EBX[15:0]};
assign adder_out= nncry   + regsrc + regdest;
assign adder_out= nncry   + regsrc + regdest;
assign   sub_out= regdest - regsrc - nncry;
assign   sub_out= regdest - regsrc - nncry;
assign    nncry = ID[12] ? cry : 1'b0;
assign    nncry = (ID[12] ? cry : 1'b0);
endmodule
endmodule
 
 
 No newline at end of file
 No newline at end of file

powered by: WebSVN 2.1.0

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