Difference between revisions of "CPUProject"

From ATI public wiki
Jump to: navigation, search
 
(76 intermediate revisions by 2 users not shown)
Line 1: Line 1:
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:
+
CPU project is one of the projects designed in department of computer engineering at TTU as a lab project to provide students with some tools for studying CPU architecture.
* Developing a generic CPU without any fancy feature
+
* Writing a compiler for it
+
* Compiling GCC for this architecture
+
* Booting a light linux on it
+
  
= CPU Design=
+
= CPU implementations =
 +
Currently, there are two different CPU implementations:
 +
* [[picoCPU]]: a very simple, simulation oriented CPU written in VHDL.
 +
* A [[More Advanced CPU]]: a synthesizable CPU written in VHDL. It has also some more advanced features compared to the picoCPU, like stack, pipeline, etc.
  
== Functionality Requirements ==
+
= picoAssembler =
The CPU is supposed to be able to perform the following operations:
+
PicoAssembler is a simple, reconfigurable assembler that can be used together with the processors described above
* Addition/Subtraction
+
More info on this can be found on the [[PicoAssembler user manual and syntax reference]] page.
* 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:
+
{| class="wikitable"
+
|-
+
! 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
+
 
+
== DataPath unit==
+
===Flags===
+
== Control unit==
+
== Instruction Memory (ROM) ==
+
== Data Memory ==
+
 
+
== Functional Testing ==
+
 
+
= Assembler =
+
 
+
= Compiler =
+

Latest revision as of 15:32, 24 November 2015

CPU project is one of the projects designed in department of computer engineering at TTU as a lab project to provide students with some tools for studying CPU architecture.

CPU implementations

Currently, there are two different CPU implementations:

  • picoCPU: a very simple, simulation oriented CPU written in VHDL.
  • A More Advanced CPU: a synthesizable CPU written in VHDL. It has also some more advanced features compared to the picoCPU, like stack, pipeline, etc.

picoAssembler

PicoAssembler is a simple, reconfigurable assembler that can be used together with the processors described above More info on this can be found on the PicoAssembler user manual and syntax reference page.