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
|