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

Subversion Repositories sub86

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /
    from Rev 5 to Rev 6
    Reverse comparison

Rev 5 → Rev 6

/sub86/trunk/sub86.v
7,7 → 7,7
output [31:0] Q;
output WEN;
output [1:0] BEN;
wire nncry,neqF,ngF,nlF,naF,nbF;
wire nncry,neqF,ngF,nlF,naF,nbF,divF1,divF2;
reg [31:0] EAX,EBX,ECX,EDX,EBP,ESP,PC,regsrc,regdest,alu_out;
reg [5:0] state,nstate;
reg [2:0] src,dest;
56,12 → 56,18
`define sml2 6'b100101
`define sml3 6'b100110
`define sml4 6'b100111
`define sdv1 6'b101000
`define sdv2 6'b101001
`define sdv3 6'b101010
`define sdv4 6'b101011
`define div1 6'b101100
`define init 6'b000000
always @(posedge CLK)
begin
case (state) // cry control
`sml1 : cry <= EAX[31] ^ ECX[31];
default : cry <= ncry & RSTN;
`sml1,`sdv1: cry <= EAX[31] ^ ECX[31];
`div1 : cry <= 1'b0;
default : cry <= ncry & RSTN;
endcase
prefx <= nprefx & RSTN;
state <= nstate & {6{RSTN}};
74,6 → 80,9
`mul2 : EAX <= EBX;
`sml1 : EAX <= smlEAX;
`sml3 : if (cry==1'b0) EAX <= EBX; else EAX <= ((~EBX) + 1'b1);
`sdv1,`div1 : EAX <= 32'b0;
`sdv3 : if (nlF==1'b0) EAX <= EAX + ( 1 << EBX_shtr); else EAX <=EAX;
`sdv4 : if (cry==1'b1) EAX <= ((~EAX) + 1'b1); else EAX <= EAX;
default: if (dest==3'b000) EAX <= alu_out; else EAX<=EAX;
endcase
case(state) // EBX control
83,14 → 92,28
`lea2 : EBX<={ID[7:0],ID[15:8], EBX[15:0]}+EBP;
`mul,`sml2 : if (ECX[0] == 1'b1) EBX <= EAX+EBX; else EBX <= EBX;
`shift : EBX<={EBX[31:5],EBX_shtr};
`sdv1 : EBX<={EAX[31],ECX[31],EBX[29:0]};
`div1 : EBX<={ 2'b00,EBX[29:0]};
`sdv2 : if (divF1==1'b0 ) EBX <= {EBX[31:5],(EBX[4:0]+1'b1)}; else EBX <= EBX;
`sdv3 : if (divF1==1'b1 ) EBX <= {EBX[31:5],EBX_shtr}; else EBX <= EBX;
default : if (dest==3'b011) EBX <= alu_out; else EBX <= EBX;
endcase
case(state) // ECX control
`mul,`sml2 : ECX <= {1'b0,ECX[31:1]};
`sml1 : ECX <= smlECX;
`sml1,`sdv1 : ECX <= smlECX;
`div1 : ECX <= ECX;
`sdv2 : if (divF1==1'b0 ) ECX <= {ECX[30:0],1'b0}; else ECX<=ECX;
`sdv3 : if((divF1==1'b1 ) && (divF2==1'b0)) ECX <= {1'b0,ECX[31:1]}; else ECX<=ECX;
`sdv4 : if (EBX[30] == 1'b1) ECX <= ((~ECX) + 1); else ECX<=ECX;
default : if (dest==3'b001) ECX <= alu_out; else ECX<=ECX;
endcase
if (dest==3'b010) EDX <= alu_out; else EDX<=EDX; // EDX control
case(state) // EDX control
`sdv1 : EDX <= smlEAX;
`div1 : EDX <= EAX;
`sdv3 : if (nlF==1'b0) EDX <= EDX - ECX; 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;
endcase
case(state) // ESP control
`init : ESP<=32'h00ff;
`call : ESP<=ESP - 4'b0100;
112,7 → 135,7
`jne2 : PC<=pc_neq;
`jmp2,`call2 : PC<=pc_jp ;
`ret2 : PC<=D ;
`mul,`mul2,`sml1,`sml2,`sml3,`sml4,
`mul,`mul2,`sml1,`sml2,`sml3,`sml4,`sdv1,`sdv2,`sdv3,`sdv4,`div1,
`shift : PC<=PC ;
default : if (nstate == `shift) PC<=PC; else PC<=incPC ;
endcase
160,7 → 183,7
else if (state == `shift ) {ncry,alu_out} = {cry,sft_out };
else {ncry,alu_out} = {cry,regdest };
// Main instruction decode
always @(ID,state,ECX,EBX_shtr)
always @(ID,state,ECX,EBX_shtr,EAX,divF1,divF2)
begin
// One cycle instructions, operand selection
if ((state == `fetch) || (state ==`shift))
175,6 → 198,8
endcase
else if (state==`ret)
begin src = 3'b011; dest = 3'b100; end
else if (state==`sdv3)
begin src = 3'b001; dest = 3'b010; end
else begin src = 3'b000; dest = 3'b000; end
// instructions that require more than one cycle to execute
if (state == `fetch)
197,7 → 222,9
16'h90c3: nstate = `ret;
16'hc1xx: nstate = `shift;
16'hd3xx: nstate = `shift;
16'hf7e1: nstate = `mul;
16'hf7e1: nstate = `mul;
16'hf7f9: nstate = `sdv1;
16'hf7f1: nstate = `div1;
16'hafc1: nstate = `sml1;
default : nstate = `fetch;
endcase
213,7 → 240,12
else if (state==`sml1) nstate = `sml2;
else if((state==`sml2)&&!(ECX==32'b0)) nstate=`sml2;
else if((state==`sml2)&& (ECX==32'b0)) nstate=`sml3;
else if (state==`sml1) nstate = `sml3;
else if (state==`div1) nstate = `sdv2;
else if (state==`sdv1) nstate = `sdv2;
else if((state==`sdv2) && (divF1 == 1'b0) ) nstate=`sdv2;
else if((state==`sdv2) && (divF1 == 1'b1) ) nstate=`sdv3;
else if((state==`sdv3) && (divF2 == 1'b0) ) nstate=`sdv3;
else if((state==`sdv3) && (divF2 == 1'b1) ) nstate=`sdv4;
else if (state==`jmp) nstate = `jmp2; else if (state==`jmp2) nstate = `fetch;
else if (state==`jne) nstate = `jne2; else if (state==`jne2) nstate = `fetch;
else if (state==`je ) nstate = `je2 ; else if (state==`je2 ) nstate = `fetch;
271,6 → 303,8
assign sub_out= regdest - regsrc - nncry;
assign nncry = (ID[12] ? cry : 1'b0);
assign EBX_shtr = EBX[4:0] - 1'b1;
assign smlEAX = EAX[31] ? ((~EAX) + 1) : EAX;
assign smlECX = ECX[31] ? ((~ECX) + 1) : ECX;
assign smlEAX = EAX[31] ? ((~EAX) + 1) : EAX;
assign smlECX = ECX[31] ? ((~ECX) + 1) : ECX;
assign divF1 = ({ECX[30:0],1'b0} > EDX) ? 1'b1 : 1'b0;
assign divF2 = (EBX_shtr == 5'b00000) ? 1'b1 : 1'b0;
endmodule

powered by: WebSVN 2.1.0

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