Difference between revisions of "CPUProject"
From ATI public wiki
								
												
				|  (Created page with "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 witho...") | |||
| Line 4: | Line 4: | ||
| * Compiling GCC for this architecture | * Compiling GCC for this architecture | ||
| * Booting a light linux on it | * Booting a light linux on it | ||
| + | |||
| = CPU Design= | = CPU Design= | ||
| + | |||
| == Functionality Requirements == | == Functionality Requirements == | ||
| The CPU is supposed to be able to perform the following operations: | The CPU is supposed to be able to perform the following operations: | ||
| Line 19: | Line 21: | ||
| * NOP/HALT   | * NOP/HALT   | ||
| − | == Instruction Set  | + | == 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:   | The following instrcutions designed for the CPU:   | ||
| {| class="wikitable" | {| class="wikitable" | ||
| |- | |- | ||
| − | ! Instruction !!  | + | ! Instruction !! Register Transfer Language !! OpCode !! DPU Command !! Data To DPU !! MemAddress !!  Next PC | 
| |- | |- | ||
| − | | Add_A_B || A <-- A + B || Example ||  | + | | Add_A_B || A <-- A + B                    || Example || 00 000 0000 10 || ----    || ---- || PC_out+1    | 
| |- | |- | ||
| − | | Add_A_Mem ||  | + | | Add_A_Mem || A <-- A + Mem[Operand]       || Example || 00 000 0000 00 || ----    || Operand || PC_out+1    | 
| |- | |- | ||
| − | | Add_A_Dir ||  | + | | Add_A_Dir || A <-- A + Operand            || Example || 00 000 0000 01 || Operand || ---- || PC_out+1    | 
| |- | |- | ||
| − | | Sub_A_B ||  | + | | Sub_A_B || A <-- A - B                    || Example || 00 000 0001 10 || ----    || ---- || Example    | 
| |- | |- | ||
| − | | Sub_A_Mem ||  | + | | Sub_A_Mem || A <-- A - Mem[Operand]       || Example || 00 000 0001 00 || ----    || Operand || PC_out+1    | 
| |- | |- | ||
| − | | Sub_A_Dir ||  | + | | Sub_A_Dir || A <-- A - Operand            || Example || 00 000 0001 01 || Operand || ---- || PC_out+1    | 
| |- | |- | ||
| − | | IncA ||  | + | | IncA || A <-- A + 1                       || Example || 00 000 0000 11 || ----    || ---- || PC_out+1    | 
| |- | |- | ||
| − | | DecA ||  | + | | DecA || A <-- A - 1                       || Example || 00 000 0001 11 || ----    || ---- || PC_out+1  | 
| |- | |- | ||
| − | | And_A_B ||  | + | | And_A_B || A <-- A and B                  || Example || 00 000 0100 10 || ----    || ---- || PC_out+1    | 
| |- | |- | ||
| − | | OR_A_B ||  | + | | OR_A_B || A <-- A or B                    || Example || 00 000 0101 10 || ----    || ---- || PC_out+1    | 
| |- | |- | ||
| − | | XOR_A_B ||  | + | | XOR_A_B || A <-- A xor B                  || Example || 00 000 0110 10 || ----    || ---- || PC_out+1    | 
| |- | |- | ||
| − | | FlipA ||  | + | | FlipA || A <-- not (A)                    || Example || 00 000 1100 00 || ----    || ---- || PC_out+1    | 
| |- | |- | ||
| − | | NegA ||  | + | | NegA || A <-- not(A) + 1                  || Example || Example || ---- || ---- || PC_out+1    | 
| |- | |- | ||
| − | | Jmp ||  | + | | Jmp || PC <-- Operand                     || Example || Example || ---- || ---- || Depends    | 
| |- | |- | ||
| − | | JmpZ ||  | + | | JmpZ || if Z = 1: PC <-- Operand || Example || Example || ---- || ---- || Depends    | 
| |- | |- | ||
| − | | JmpOV ||  | + | | JmpOV || if OV = 1: PC <-- Operand || Example || Example || ---- || ---- || Depends    | 
| |- | |- | ||
| − | | Jmp_rel ||  | + | | Jmp_rel || PC <-- PC + Operand  || Example || Example || ---- || ---- ||  Depends    | 
| |- | |- | ||
| − | | JMPEQ ||  | + | | JMPEQ || if EQ = 1: PC <-- Operand || Example || Example || ---- || ---- || Depends    | 
| |- | |- | ||
| − | | ClearZ ||  | + | | ClearZ || Z <--- 0 || Example || Example || ---- || ---- ||   PC_out+1    | 
| |- | |- | ||
| − | | ClearOV ||  | + | | ClearOV || OV <--- 0 || Example || Example || ---- || ---- || PC_out+1     | 
| |- | |- | ||
| − | | LoadPC  ||  | + | | LoadPC  || PC <---- A || Example || Example || ---- || ---- || A    | 
| |- | |- | ||
| − | | SavePC ||  | + | | SavePC || A <---- PC || Example || Example || PC || ---- || PC_out+1     | 
| |- | |- | ||
| − | | ShiftArithR ||  | + | | ShiftArithR || A <-- A(7) & A(7 downto 1)  || Example || Example || ---- || ---- || PC_out+1     | 
| |- | |- | ||
| − | | ShiftArithL ||  | + | | ShiftArithL || A <-- A(7) & A(5 downto 0)& '0' || Example || Example || ---- || ---- || PC_out+1     | 
| |- | |- | ||
| − | | ShiftA_R ||  | + | | ShiftA_R || A <-- A(6 downto 0)& '0' || Example || Example || ---- || ---- || PC_out+1     | 
| |- | |- | ||
| − | | ShiftA_L ||  | + | | ShiftA_L || A <-- '0' & A(7 downto 1)  || Example || Example || ---- || ---- || PC_out+1     | 
| |- | |- | ||
| − | | Load_A_Mem ||  | + | | Load_A_Mem || A <-- Mem[Operand] || Example || Example || ---- || Operand || PC_out+1     | 
| |- | |- | ||
| − | | Store_A_Mem ||  | + | | Store_A_Mem || Mem[Operand] <-- A || Example || 00 000 0010 -- || ---- || Operand || PC_out+1     | 
| |- | |- | ||
| − | | Load_B_Dir ||  | + | | Load_B_Dir || B <-- Operand || Example || 00 000 0010 -- || Operand || ---- || PC_out+1     | 
| |- | |- | ||
| − | | Load_B_Mem ||  | + | | Load_B_Mem || B <-- Mem[Operand] || Example || 00 000 0010 -- || ---- || Operand || PC_out+1     | 
| |- | |- | ||
| − | | JmpC ||  | + | | JmpC || if C = 1: PC <-- Operand || Example || 00 000 0010 -- || ---- || ---- || Depends    | 
| |- | |- | ||
| − | | ClearC ||  | + | | ClearC || C <--- 0 || Example || 00 000 0010 -- || ---- || ---- || PC_out+1     | 
| |- | |- | ||
| − | | ClearACC ||  | + | | ClearACC || ACC <-- 0 || Example || Example || ---- || ---- || PC_out+1     | 
| |- | |- | ||
| − | | RRC ||  | + | | 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 || NOP || Example || 00	000 0010 -- || ---- || ---- || PC_out+1    | 
| |- | |- | ||
| − | | HALT ||  | + | | HALT || HALT || Example || 00	000 0010 -- || ---- || ---- || PC    | 
| |} | |} | ||
| ===Other instructions implementation=== | ===Other instructions implementation=== | ||
| Line 115: | Line 122: | ||
|   Add_A_Dir 4 |   Add_A_Dir 4 | ||
|   LoadPC |   LoadPC | ||
| + | |||
| + | == DataPath unit== | ||
| + | ===Flags=== | ||
| + | == Control unit== | ||
| + | == Instruction Memory (ROM) == | ||
| + | == Data Memory == | ||
| == Functional Testing == | == Functional Testing == | ||
Revision as of 19:28, 4 December 2014
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
