Line 63... |
Line 63... |
`define sdv4 6'b101011
|
`define sdv4 6'b101011
|
`define div1 6'b101100
|
`define div1 6'b101100
|
`define leas 6'b101101
|
`define leas 6'b101101
|
`define calla 6'b101110
|
`define calla 6'b101110
|
`define calla2 6'b101111
|
`define calla2 6'b101111
|
|
`define shft3 6'b110000
|
`define init 6'b000000
|
`define init 6'b000000
|
|
|
always @(posedge CLK)
|
always @(posedge CLK)
|
if ((CE ==1'b1) || (RSTN ==1'b0))
|
if ((CE ==1'b1) || (RSTN ==1'b0))
|
begin
|
begin
|
Line 120... |
Line 121... |
endcase
|
endcase
|
case(state) // EDX control
|
case(state) // EDX control
|
`init : EDX <= 32'b0;
|
`init : EDX <= 32'b0;
|
`sdv1 : EDX <= smlEAX;
|
`sdv1 : EDX <= smlEAX;
|
`div1 : EDX <= EAX;
|
`div1 : EDX <= EAX;
|
`sdv3 : if (nlF==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'h01ff00;
|
`init : ESP <= 32'h01f1fc;
|
`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
|
Line 282... |
Line 283... |
else if (state==`call) nstate = `call2; else if (state==`call2) nstate = `fetch;
|
else if (state==`call) nstate = `call2; else if (state==`call2) nstate = `fetch;
|
else if (state==`calla) nstate = `calla2;else if (state==`calla2)nstate = `fetch;
|
else if (state==`calla) nstate = `calla2;else if (state==`calla2)nstate = `fetch;
|
else if (state==`ret) nstate = `ret2; else if (state==`ret2) nstate = `fetch;
|
else if (state==`ret) nstate = `ret2; else if (state==`ret2) nstate = `fetch;
|
else if((state==`shift)&&!(EBX_shtr==5'b0)) nstate=`shift;
|
else if((state==`shift)&&!(EBX_shtr==5'b0)) nstate=`shift;
|
else if((state==`shift)&& (EBX_shtr==5'b0)) nstate=`shft2;
|
else if((state==`shift)&& (EBX_shtr==5'b0)) nstate=`shft2;
|
|
else if (state==`shft2) nstate = `shft3;
|
else nstate = `fetch;
|
else nstate = `fetch;
|
end
|
end
|
end
|
end
|
assign ssregsrc = regsrc;
|
assign ssregsrc = regsrc;
|
assign ssregdest= regdest;
|
assign ssregdest= regdest;
|
Line 298... |
Line 300... |
(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 ) ? 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 );// (regsrc < regdest) ? 1'b1 : 1'b0;
|
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 );// (regsrc < regdest) ? 1'b1 : 1'b0;
|
Line 326... |
Line 328... |
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);
|
assign EBX_shtr = EBX[4:0] - 1'b1;
|
assign EBX_shtr = EBX[4:0] - 1'b1;
|
assign smlEAX = EAX[31] ? ((~EAX) + 1) : EAX;
|
assign smlEAX = EAX[31] ? ((~EAX) + 1) : EAX;
|
assign smlECX = ECX[31] ? ((~ECX) + 1) : ECX;
|
assign smlECX = ECX[31] ? ((~ECX) + 1) : ECX;
|
assign divF1 = ({ECX[30:0],1'b0} > EDX) ? 1'b1 : 1'b0;
|
assign divF1 = ({ECX[31:0],1'b0} > {1'b0,EDX}) ? 1'b1 : 1'b0;
|
assign divF2 = (EBX_shtr == 5'b00000) ? 1'b1 : 1'b0;
|
assign divF2 = (EBX_shtr == 5'b00000) ? 1'b1 : 1'b0;
|
endmodule
|
endmodule
|
|
|
No newline at end of file
|
No newline at end of file
|