CPUProject
From ATI public wiki
CPU project is one of the projects designed in department of computer engineering at TTU as a lab project. The main aims of this project are:
- Developing a generic CPU without any fancy feature
- Writing a compiler for it
- Compiling GCC for this architecture
- Booting a light linux on it
Contents
CPU Design
Functionality Requirements
The CPU is supposed to be able to perform the following operations:
- Addition/Subtraction
- Increment/Decrement
- Arithmetic and Logical Shift
- Bitwise AND, OR, XOR and NOT
- Negation
- Load/Store
- Unconditional Branch (jump)
- Branch if zero / Branch if Overflow / Branch if Carry
- Clear Registers/Flags
- PUSH / POP
- NOP/HALT
Architecture
Instruction Format
Our CPU's instuction has 8 bit of upcode and one operand that can be as long as 32 bit. First 3 bits of OPcode are at the moment reserved.
Instruction Set (IS)
The following instrcutions designed for the CPU:
Instruction | Register Transfer Language | OpCode | DPU Command | Data To DPU | MemAddress | Next PC |
---|---|---|---|---|---|---|
Add_A_B | A <-- A + B | Example | 00 000 0000 10 | ---- | ---- | PC_out+1 |
Add_A_Mem | A <-- A + Mem[Operand] | Example | 00 000 0000 00 | ---- | Operand | PC_out+1 |
Add_A_Dir | A <-- A + Operand | Example | 00 000 0000 01 | Operand | ---- | PC_out+1 |
Sub_A_B | A <-- A - B | Example | 00 000 0001 10 | ---- | ---- | Example |
Sub_A_Mem | A <-- A - Mem[Operand] | Example | 00 000 0001 00 | ---- | Operand | PC_out+1 |
Sub_A_Dir | A <-- A - Operand | Example | 00 000 0001 01 | Operand | ---- | PC_out+1 |
IncA | A <-- A + 1 | Example | 00 000 0000 11 | ---- | ---- | PC_out+1 |
DecA | A <-- A - 1 | Example | 00 000 0001 11 | ---- | ---- | PC_out+1 |
And_A_B | A <-- A and B | Example | 00 000 0100 10 | ---- | ---- | PC_out+1 |
OR_A_B | A <-- A or B | Example | 00 000 0101 10 | ---- | ---- | PC_out+1 |
XOR_A_B | A <-- A xor B | Example | 00 000 0110 10 | ---- | ---- | PC_out+1 |
FlipA | A <-- not (A) | Example | 00 000 1100 00 | ---- | ---- | PC_out+1 |
NegA | A <-- not(A) + 1 | Example | Example | ---- | ---- | PC_out+1 |
Jmp | PC <-- Operand | Example | Example | ---- | ---- | Depends |
JmpZ | if Z = 1: PC <-- Operand | Example | Example | ---- | ---- | Depends |
JmpOV | if OV = 1: PC <-- Operand | Example | Example | ---- | ---- | Depends |
Jmp_rel | PC <-- PC + Operand | Example | Example | ---- | ---- | Depends |
JMPEQ | if EQ = 1: PC <-- Operand | Example | Example | ---- | ---- | Depends |
ClearZ | Z <--- 0 | Example | Example | ---- | ---- | PC_out+1 |
ClearOV | OV <--- 0 | Example | Example | ---- | ---- | PC_out+1 |
LoadPC | PC <---- A | Example | Example | ---- | ---- | A |
SavePC | A <---- PC | Example | Example | PC | ---- | PC_out+1 |
ShiftArithR | A <-- A(7) & A(7 downto 1) | Example | Example | ---- | ---- | PC_out+1 |
ShiftArithL | A <-- A(7) & A(5 downto 0)& '0' | Example | Example | ---- | ---- | PC_out+1 |
ShiftA_R | A <-- A(6 downto 0)& '0' | Example | Example | ---- | ---- | PC_out+1 |
ShiftA_L | A <-- '0' & A(7 downto 1) | Example | Example | ---- | ---- | PC_out+1 |
Load_A_Mem | A <-- Mem[Operand] | Example | Example | ---- | Operand | PC_out+1 |
Store_A_Mem | Mem[Operand] <-- A | Example | 00 000 0010 -- | ---- | Operand | PC_out+1 |
Load_B_Dir | B <-- Operand | Example | 00 000 0010 -- | Operand | ---- | PC_out+1 |
Load_B_Mem | B <-- Mem[Operand] | Example | 00 000 0010 -- | ---- | Operand | PC_out+1 |
JmpC | if C = 1: PC <-- Operand | Example | 00 000 0010 -- | ---- | ---- | Depends |
ClearC | C <--- 0 | Example | 00 000 0010 -- | ---- | ---- | PC_out+1 |
ClearACC | ACC <-- 0 | Example | Example | ---- | ---- | PC_out+1 |
RRC | A <-- C & A(7 downto 1) ,C<-- A(0) | Example | Example | ---- | ---- | PC_out+1 |
RLC | A <-- A(6 downto 0) & C ,C<-- A(7) | Example | Example | ---- | ---- | PC_out+1 |
PUSH | Mem [0 + SP] <--- A,SP <--- SP + 1 | Example | 00 000 0010 -- | ---- | SP | PC_out+1 |
POP | A <--- Mem [0 + SP - 1],SP <--- SP - 1 | Example | Example | ---- | SP - 1 | PC_out+1 |
NOP | NOP | Example | 00 000 0010 -- | ---- | ---- | PC_out+1 |
HALT | HALT | Example | 00 000 0010 -- | ---- | ---- | PC |
Other instructions implementation
the follwoing instructions can be also implemented with the ones in IS:
- Call "function_name":
PUSH SavePC Push Jmp "function address" POP
- Return:
POP Add_A_Dir 4 LoadPC