import java.io.FileNotFoundException;
public class simpleCPU {
// enumaration of instructions
final static int ADD = 0;
final static int ADDi = 1;
final static int NAND = 2;
final static int NANDi = 3;
final static int SRL = 4;
final static int SRLi = 5;
final static int LT = 6;
final static int LTi = 7;
final static int CP = 8;
final static int CPi = 9;
final static int CPI = 10;
final static int CPIi = 11;
final static int BZJ = 12;
final static int BZJi = 13;
final static int MULT = 14;
final static int MULTi = 15;
public static void main(String[] args) throws FileNotFoundException {
/*
Functions Prototypes:
Hardware(int,int) --> Constructor, Initialize #Switch,#Led
If initialize with 0,0 , window wont appear.
Switch & Led Functions,
void setLed(int,boolean) --> Sets given index of led on/off, index range N:0
void setLed(int) --> Sets all leds
boolean getSwitch(int) --> Gets given index of switch, index range N:0
int getSwitch(int,int) --> Gets switches range of parameter1 and parameter2
int getSwitch() --> Gets all switch
Memory Functions,
void setAddress(short) --> Assigns address
void setDataIn(long) --> Assigns data in
void setWriteEnable() --> Enables write to memory
void resetWriteEnable() --> Disables write to memory
long getDataOut() --> Returns data out
void loadProgram() --> Loads memin.txt
void dumpMemory() --> Dumps memory to memout.txt
string hexToBin(string) --> Converts hexadecimal to binary
void posedge() --> Positive edge of clock
Every assigns realizes after call this function
void setClockPeriod(int) --> Period of clock, Default 500
*/
// Use Hardware class
Hardware sCPU = new Hardware(0,0);
long instr;
long A,B,Astar,Bstar;
int pc = 0;
boolean rst=false;
// Load program to memory array
sCPU.loadProgram();
// Instructions of simpleCPU
while(true){
sCPU.posedge();
instr = sCPU.getDataOut()>>28;
//System.exit(1);
if(rst){
sCPU.resetWriteEnable();
sCPU.setAddress((short) 0);
sCPU.setDataIn(0);
}
else {
switch((int)instr){
case ADD:
A = (sCPU.getDataOut()>>14)&0x00003FFF; //data_fromRAM[23:14];
B = sCPU.getDataOut()&0x00003FFF; //data_fromRAM[9:0];
sCPU.setAddress((short) B); //addr_toRAM = B;
sCPU.posedge(); //@(posedge clk);
Bstar = sCPU.getDataOut(); //data_fromRAM;
sCPU.setAddress((short) A); //addr_toRAM = A;
sCPU.posedge(); //@(posedge clk);
Astar = sCPU.getDataOut() + Bstar; //data_fromRAM + Bstar;
sCPU.setDataIn(Astar); //data_toRAM = Astar;
sCPU.setWriteEnable(); //wrEn = 1;
sCPU.posedge();//@(posedge clk);
sCPU.resetWriteEnable(); //wrEn = 0;
pc = pc + 1;
sCPU.setAddress((short) pc);//addr_toRAM = pc;
break;
case ADDi:
A = (sCPU.getDataOut()>>14)&0x00003FFF; //data_fromRAM[23:14];
B = sCPU.getDataOut()&0x00003FFF; //data_fromRAM[9:0];
sCPU.setAddress((short)A); //addr_toRAM = A;
sCPU.posedge(); //@(posedge clk);
Astar = sCPU.getDataOut() + B; //data_fromRAM + B;
sCPU.setDataIn(Astar); //data_toRAM = Astar;
sCPU.setWriteEnable(); //wrEn = 1;
sCPU.posedge(); //@(posedge clk);
sCPU.resetWriteEnable(); // wrEn = 0;
pc = pc + 1;
sCPU.setAddress((short) pc); //addr_toRAM = pc;
break;
case NAND:
A = (sCPU.getDataOut()>>14)&0x00003FFF; //data_fromRAM[23:14];
B = sCPU.getDataOut()&0x00003FFF; //data_fromRAM[9:0];
sCPU.setAddress((short) B); //addr_toRAM = B;
sCPU.posedge(); //@(posedge clk);
Bstar = sCPU.getDataOut(); //data_fromRAM;
sCPU.setAddress((short) A); //addr_toRAM = A;
sCPU.posedge(); //@(posedge clk);
Astar = ~(sCPU.getDataOut() & Bstar); //~(data_fromRAM & Bstar);
sCPU.setDataIn(Astar); //data_toRAM = Astar;
sCPU.setWriteEnable(); //wrEn = 1;
sCPU.posedge(); //@(posedge clk);
sCPU.resetWriteEnable(); //wrEn = 0;
pc = pc + 1;
sCPU.setAddress((short) pc); //addr_toRAM = pc;
break;
case NANDi:
A = (sCPU.getDataOut()>>14)&0x00003FFF; //data_fromRAM[23:14];
B = sCPU.getDataOut()&0x00003FFF; //data_fromRAM[9:0];
sCPU.setAddress((short) A); //addr_toRAM = A;
sCPU.posedge(); //@(posedge clk);
Astar = ~(sCPU.getDataOut() & B); //~(data_fromRAM & B); // check !!
sCPU.setDataIn(Astar); //data_toRAM = Astar;
sCPU.setWriteEnable(); //wrEn = 1;
sCPU.posedge(); //@(posedge clk);
sCPU.resetWriteEnable(); //wrEn = 0;
pc = pc + 1;
sCPU.setAddress((short) pc);//addr_toRAM = pc;
break;
case SRL:
A = (sCPU.getDataOut()>>14)&0x00003FFF; //data_fromRAM[23:14];
B = sCPU.getDataOut()&0x00003FFF; //data_fromRAM[9:0];
sCPU.setAddress((short) B); //addr_toRAM = B;
sCPU.posedge();//@(posedge clk);
Bstar = sCPU.getDataOut();//data_fromRAM;
sCPU.setAddress((short) A); //addr_toRAM = A;
sCPU.posedge();//@(posedge clk);
Astar = sCPU.getDataOut(); //data_fromRAM;
if(Bstar < 32){
Astar = Astar >> Bstar;
}
else {
Astar = Astar << (Bstar - 32);
}
sCPU.setDataIn(Astar); //data_toRAM = Astar;
sCPU.setWriteEnable(); //wrEn = 1;
sCPU.posedge(); //@(posedge clk);
sCPU.resetWriteEnable(); //wrEn = 0;
pc = pc + 1;
sCPU.setAddress((short) pc); //addr_toRAM = pc;
break;
case SRLi:
A = (sCPU.getDataOut()>>14)&0x00003FFF; //data_fromRAM[23:14];
B = sCPU.getDataOut()&0x00003FFF; //data_fromRAM[9:0];
sCPU.setAddress((short) A); //addr_toRAM = A;
sCPU.posedge(); //@(posedge clk);
Astar = sCPU.getDataOut(); //data_fromRAM;
if(B < 32){
Astar = Astar >> B;
}
else {
Astar = Astar << (B - 32);
}
sCPU.setDataIn(Astar); //data_toRAM = Astar;
sCPU.setWriteEnable(); //wrEn = 1;
sCPU.posedge(); //@(posedge clk);
sCPU.resetWriteEnable(); //wrEn = 0;
pc = pc + 1;
sCPU.setAddress((short) pc);//addr_toRAM = pc;
break;
case LT:
A = (sCPU.getDataOut()>>14)&0x00003FFF; //data_fromRAM[23:14];
B = sCPU.getDataOut()&0x00003FFF; //data_fromRAM[9:0];
sCPU.setAddress((short) B); //addr_toRAM = B;
sCPU.posedge(); //@(posedge clk);
Bstar = sCPU.getDataOut(); //data_fromRAM;
sCPU.setAddress((short) A); //addr_toRAM = A;
sCPU.posedge(); //@(posedge clk);
Astar = (sCPU.getDataOut() < Bstar) ? 1 : 0; //(data_fromRAM < Bstar) ? 1 : 0;
sCPU.setDataIn(Astar); //data_toRAM = Astar;
sCPU.setWriteEnable(); //wrEn = 1;
sCPU.posedge(); //@(posedge clk);
sCPU.resetWriteEnable(); //wrEn = 0;
pc = pc + 1;
sCPU.setAddress((short) pc); //addr_toRAM = pc;
break;
case LTi:
A = (sCPU.getDataOut()>>14)&0x00003FFF; //data_fromRAM[23:14];
B = sCPU.getDataOut()&0x00003FFF; //data_fromRAM[9:0];
sCPU.setAddress((short) A); //addr_toRAM = A;
sCPU.posedge(); //@(posedge clk);
Astar = B;
sCPU.setDataIn(Astar); //data_toRAM = Astar;
sCPU.setWriteEnable(); //wrEn = 1;
sCPU.posedge(); //@(posedge clk);
sCPU.resetWriteEnable(); //wrEn = 0;
pc = pc + 1;
sCPU.setAddress((short) pc); //addr_toRAM = pc;
break;
case CP:
A = (sCPU.getDataOut()>>14)&0x00003FFF; //data_fromRAM[23:14];
B = sCPU.getDataOut()&0x00003FFF; //data_fromRAM[9:0];
sCPU.setAddress((short) B);//addr_toRAM = B;
sCPU.posedge(); //@(posedge clk);
Bstar = sCPU.getDataOut(); //data_fromRAM;
sCPU.setAddress((short) A); //addr_toRAM = A;
sCPU.posedge(); //@(posedge clk);
Astar = Bstar;
sCPU.setDataIn(Astar); //data_toRAM = Astar;
sCPU.setWriteEnable(); //wrEn = 1;
sCPU.posedge(); //@(posedge clk);
sCPU.resetWriteEnable(); //wrEn = 0;
pc = pc + 1;
sCPU.setAddress((short) pc); //addr_toRAM = pc;
break;
case CPi:
A = (sCPU.getDataOut()>>14)&0x00003FFF; //data_fromRAM[23:14];
B = sCPU.getDataOut()&0x00003FFF; //data_fromRAM[9:0];
sCPU.setAddress((short) A); //addr_toRAM = A;
sCPU.posedge(); //@(posedge clk);
Astar = B;
sCPU.setDataIn(Astar); //data_toRAM = Astar;
sCPU.setWriteEnable(); //wrEn = 1;
sCPU.posedge(); //@(posedge clk);
sCPU.resetWriteEnable(); //wrEn = 0;
pc = pc + 1;
sCPU.setAddress((short) pc); //addr_toRAM = pc;
break;
case BZJ:
A = (sCPU.getDataOut()>>14)&0x00003FFF; //data_fromRAM[23:14];
B = sCPU.getDataOut()&0x00003FFF; //data_fromRAM[9:0];
sCPU.setAddress((short)B);//addr_toRAM = B;
sCPU.posedge(); //@(posedge clk);
Bstar = sCPU.getDataOut(); //data_fromRAM;
sCPU.setAddress((short) A); //addr_toRAM = A;
sCPU.posedge(); //@(posedge clk);
Astar = sCPU.getDataOut(); //data_fromRAM;
if(Bstar == 0){
pc = (int) Astar;
}
else {
pc = pc + 1;
}
sCPU.setAddress((short) pc); //addr_toRAM = pc;
break;
case BZJi:
A = (sCPU.getDataOut()>>14)&0x00003FFF; //data_fromRAM[23:14];
B = sCPU.getDataOut()&0x00003FFF; //data_fromRAM[9:0];
sCPU.setAddress((short) A); //addr_toRAM = A;
sCPU.posedge(); //@(posedge clk);
Astar = sCPU.getDataOut(); //data_fromRAM;
pc = (int) (Astar + B);
sCPU.setAddress((short) pc); //addr_toRAM = pc;
break;
case MULT:
A = (sCPU.getDataOut()>>14)&0x00003FFF; //data_fromRAM[23:14];
B = sCPU.getDataOut()&0x00003FFF; //data_fromRAM[9:0];
sCPU.setAddress((short) B);//addr_toRAM = B;
sCPU.posedge(); //@(posedge clk);
Bstar = sCPU.getDataOut(); //data_fromRAM;
sCPU.setAddress((short) A); //addr_toRAM = A;
sCPU.posedge(); //@(posedge clk);
Astar = sCPU.getDataOut() * Bstar; //data_fromRAM * Bstar;
sCPU.setDataIn(Astar); //data_toRAM = Astar;
sCPU.setWriteEnable(); //wrEn = 1;
sCPU.posedge(); //@(posedge clk);
sCPU.resetWriteEnable(); //wrEn = 0;
pc = pc + 1;
sCPU.setAddress((short) pc); //addr_toRAM = pc;
break;
case MULTi:
A = (sCPU.getDataOut()>>14)&0x00003FFF; //data_fromRAM[23:14];
B = sCPU.getDataOut()&0x00003FFF; //data_fromRAM[9:0];
sCPU.setAddress((short) A); //addr_toRAM = A;
sCPU.posedge(); //@(posedge clk);
Astar = sCPU.getDataOut() * B; //data_fromRAM * B;
sCPU.setDataIn(Astar); //data_toRAM = Astar;
sCPU.setWriteEnable(); //wrEn = 1;
sCPU.posedge(); //@(posedge clk);
sCPU.resetWriteEnable(); //wrEn = 0;
pc = pc + 1;
sCPU.setAddress((short) pc); //addr_toRAM = pc;
break;
}
}
// For testing the results
sCPU.dumpMemory();
}
}
}
|
|