Difference between revisions of "CPUProject"

From ATI public wiki
Jump to: navigation, search
m
 
(70 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 =
[[File:BlockDiagram.png|400px|right]]
+
Currently, there are two different CPU implementations:
== Functionality Requirements ==
+
* [[picoCPU]]: a very simple, simulation oriented CPU written in VHDL.
The CPU is supposed to be able to perform the following operations:
+
* 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.
* 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 ==
+
= picoAssembler =
===Instruction Format===
+
PicoAssembler is a simple, reconfigurable assembler that can be used together with the processors described above
Our CPU's instuction has 8 bit of upcode and one operand that can be as long as 32 bit.
+
More info on this can be found on the [[PicoAssembler user manual and syntax reference]] page.
First 2 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
+
|-
+
| 1|| Add_A_B || A <-- A + B                    || XX00 0000 || 00 000 0000 10 || ----    || ----    || PC_out+1 
+
|-
+
| 2|| Add_A_Mem || A <-- A + Mem[Operand]      || XX00 0001 || 00 000 0000 00 || ----    || Operand || PC_out+1 
+
|-
+
| 3|| Add_A_Dir || A <-- A + Operand            || XX00 0010 || 00 000 0000 01 || Operand || ----    || PC_out+1 
+
|-
+
| 4|| Sub_A_B || A <-- A - B                    || XX00 0011 || 00 000 0001 10 || ----    || ----    || Example 
+
|-
+
| 5|| Sub_A_Mem || A <-- A - Mem[Operand]      || Example || 00 000 0001 00 || ----    || Operand || PC_out+1 
+
|-
+
| 6|| Sub_A_Dir || A <-- A - Operand            || Example || 00 000 0001 01 || Operand || ---- || PC_out+1 
+
|-
+
| 7|| IncA || A <-- A + 1                      || Example || 00 000 0000 11 || ----    || ---- || PC_out+1 
+
|-
+
| 8|| DecA || A <-- A - 1                      || Example || 00 000 0001 11 || ----    || ---- || PC_out+1
+
|-
+
| 9|| ShiftArithR || A <-- A(7) & A(7 downto 1)  || Example || 00 000 0111 00 || ---- || ---- || PC_out+1   
+
|-
+
| 10|| ShiftArithL || A <-- A(7) & A(5 downto 0)& '0' || Example || 00 000 1000 00 || ---- || ---- || PC_out+1   
+
|-
+
| 11|| ShiftA_R || A <-- A(6 downto 0)& '0' || Example || 00 000 1010 00 || ---- || ---- || PC_out+1   
+
|-
+
| 12|| ShiftA_L || A <-- '0' & A(7 downto 1)  || Example || 00 000 1011 00 || ---- || ---- || PC_out+1   
+
|-
+
| 13|| RRC || A <-- C & A(7 downto 1) ,C<--  A(0)  || Example || 00 000 1110 XX || ---- || ---- || PC_out+1   
+
|-
+
| 14|| RLC || A <-- A(6 downto 0) & C ,C<--  A(7) || Example || 00 000 1111 XX || ---- || ---- || PC_out+1 
+
|-
+
| 15|| And_A_B || A <-- A and B                  || Example || 00 000 0100 10 || ----    || ---- || PC_out+1 
+
|-
+
| 16|| OR_A_B || A <-- A or B                    || Example || 00 000 0101 10 || ----    || ---- || PC_out+1 
+
|-
+
| 17|| XOR_A_B || A <-- A xor B                  || Example || 00 000 0110 10 || ----    || ---- || PC_out+1 
+
|-
+
| 18|| FlipA || A <-- not (A)                    || Example || 00 000 1100 00 || ----    || ---- || PC_out+1 
+
|-
+
| 19|| NegA || A <-- not(A) + 1                  || Example || 00 000 1001 00 || ---- || ---- || PC_out+1 
+
|-
+
| 20|| Jmp || PC <-- Operand                    || Example || 00 000 0010 XX || ---- || ---- || Depends 
+
|-
+
| 21|| JmpZ || if Z = 1: PC <-- Operand || Example || 00 000 0010 XX || ---- || ---- || Depends 
+
|-
+
| 22|| JmpOV || if OV = 1: PC <-- Operand || Example || 00 000 0010 XX || ---- || ---- || Depends 
+
|-
+
| 23|| JmpC || if C = 1: PC <-- Operand || Example || 00 000 0010 XX || ---- || ---- || Depends 
+
|-
+
| 24|| Jmp_rel || PC <-- PC + Operand  || Example || 00 000 0010 XX || ---- || ---- ||  Depends 
+
|-
+
| 25|| JMPEQ || if EQ = 1: PC <-- Operand || Example || 00 000 0010 XX || ---- || ---- || Depends 
+
|-
+
| 26|| ClearZ || Z <--- 0 || Example || 00 000 0010 XX || ---- || ---- ||  PC_out+1 
+
|-
+
| 27|| ClearOV || OV <--- 0 || Example || 00 000 0010 XX || ---- || ---- || PC_out+1   
+
|-
+
| 28|| ClearC || C <--- 0 || Example || 00 100 0010 XX || ---- || ---- || PC_out+1   
+
|-
+
| 29|| ClearACC || ACC <-- 0 || Example || 00 000 1101 XX || ---- || ---- || PC_out+1 
+
|-
+
| 30|| LoadPC  || PC <---- A || Example || 00 000 0010 XX || ---- || ---- || A 
+
|-
+
| 31|| SavePC || A <---- PC || Example || 00 000 0011 01 || PC || ---- || PC_out+1   
+
|-
+
| 32|| Load_A_Mem || A <-- Mem[Operand] || Example || 00 000 0011 00 || ---- || Operand || PC_out+1   
+
|-
+
| 33|| Store_A_Mem || Mem[Operand] <-- A || Example || 00 000 0010 XX || ---- || Operand || PC_out+1   
+
|-
+
| 34|| Load_B_Dir || B <-- Operand || Example || 01 000 0010 XX || Operand || ---- || PC_out+1   
+
|-
+
| 35||Load_B_Mem || B <-- Mem[Operand] || Example || 11 000 0010 XX || ---- || Operand || PC_out+1   
+
|-
+
| 36|| PUSH || Mem [0 + SP] <--- A,SP <--- SP + 1 || Example || 00 000 0010 XX || ---- || SP || PC_out+1 
+
|-
+
| 37|| POP || A <--- Mem [0 + SP - 1],SP <--- SP - 1 || Example || 00 000 0011 00 || ---- || SP - 1 || PC_out+1 
+
|-
+
| 38|| NOP || NOP || Example || 00 000 0010 XX || ---- || ---- || PC_out+1 
+
|-
+
| 39|| HALT || HALT || Example || 00 000 0010 XX || ---- || ---- || 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==
+
[[File:DPU.png|400px|right]]
+
 
+
 
+
===Flags===
+
* Zero Flag (Z)
+
* Overflow Flag (OV):
+
* Carry Flag (C):
+
 
+
== Control unit==
+
== Instruction Memory (ROM) ==
+
== Data Memory ==
+
[[File:DataMem.png|400px|right]]
+
== Functional Testing ==
+
 
+
= Assembler =
+
==Python Assembly translator==
+
A simple assembly translator was designed to make debugging process faster. Here you can see 32 bit version of the code:
+
+
<source lang="javascript" collapse="true" first-line="2">
+
import re
+
InstructionOpCode = {
+
 
+
                'Add_A_B': "000000",
+
                'Add_A_Mem': "000001",
+
                'Add_A_Dir': "000010",
+
                'Sub_A_B': "000011",
+
                'Sub_A_Mem': "000100",
+
                'Sub_A_Dir': "000101",
+
                'IncA': "000110",
+
                'DecA': "000111",
+
                'And_A_B': "001000",
+
                'OR_A_B': "001001",
+
                'XOR_A_B': "001010",
+
                'FlipA': "001011",
+
                'NegA': "001100",
+
                'Jump': "001101",
+
                'JmpZ': "001110",
+
                'JmpOV': "001111",
+
                'Jmp_rel': "010000",
+
                'JMPEQ': "010001",
+
                'ClearZ': "010010",
+
                'ClearOV': "010011",
+
                'LoadPC': "010100",
+
                'SavePC': "010101",
+
                'ShiftArithR': "010110",
+
                'ShiftArithL': "010111",
+
                'ShiftA_R': "011000",
+
                'ShiftA_L': "011001",
+
                'Load_A_Mem': "011010",
+
                'Store_A_Mem': "011011",
+
                'Load_B_Dir': "011100",
+
                'Load_B_Mem': "011101",
+
                'JmpC': "011110",
+
                'ClearC': "011111",
+
                'ClearACC': "100000",
+
                'RRC':   "100001",
+
                'RLC': "100010",
+
                'PUSH': "111100",
+
                'POP': "111101",
+
                'NOP': "111110",
+
                'HALT': "111111",
+
 
+
}
+
AssemblyFile = open('Assembly.txt', 'r+')
+
MachineCodeFile = open('MachineCode.txt', 'w')
+
counter=0
+
for line in AssemblyFile:
+
 
+
    for key in InstructionOpCode:
+
        if key in line:
+
            operand= "00000000"
+
            if "Mem" in line:
+
                operand = re.findall(r'\d+',line)[0]
+
            elif "Jmp" in line:
+
                operand = re.findall(r'\d+',line)[0]
+
            elif "Dir" in line:
+
                operand = re.findall(r'\d+',line)[0]
+
            operand = "00000000"+"00000000"+"00000000"+ operand
+
            MachineCodeFile.write(str(counter)+ " =>  "+ "\"00"+InstructionOpCode[key]+operand+'\",'+'\n')
+
            counter +=1
+
 
+
MachineCodeFile.close()
+
AssemblyFile.close()
+
</source>
+
==Java Assembler==
+
 
+
 
+
<source lang="javascript" collapse="true" first-line="2">
+
 
+
</source>
+
 
+
= 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.