|  |   | 
| (69 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 CPUwithout 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|thumb|right]] | + | Currently, there are two different CPU implementations: | 
| − | == Functionality Requirements ==
 | + | * [[picoCPU]]: a very simple, simulation oriented CPU written in VHDL. | 
| − | The CPUis supposed tobe able to perform thefollowing 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 beas 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 themoment 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 bealso implemented with theones 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|thumb|right]] | + |  | 
| − |   | + |  | 
| − |   | + |  | 
| − | ===Flags===
 | + |  | 
| − | * Zero Flag (Z)
 | + |  | 
| − | * Overflow Flag (OV):
 | + |  | 
| − | * Carry Flag (C):
 | + |  | 
| − |   | + |  | 
| − | == Control unit==
 | + |  | 
| − | == Instruction Memory (ROM) ==
 | + |  | 
| − | == Data Memory ==
 | + |  | 
| − | [[File:DataMem.png|400px|thumb|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 =
 | + |  | 
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.
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.