Microprocessors and rPeANUt Eric McCreath Microprocessors There are many well known microprocessors: Intel x86 series, Pentium, Celeron, Xeon, etc. AMD Opteron, Intel Itanium, Motorola 680xx series, PowerPC, SPARC/ UltraSPARC, MIPS, Compaq Alpha, AVR, PIC, ARM, Atom, Tegra, IBM Cell.... We shall investigate the design and operation of the ANU illustrative microprocessor, the rPeANUt. 2 3 Memory The rPeANUt is a 32 bit microprocessor with: 32 bit registers, and 16 bit addresses, memory that is addressable in words of 32 bits. So the total maximum amount of addressable memory is words or 262144 bytes (256KiB). Only the addresses 0x0000 to 0x7FFF are connected to actual memory. Addresses between 0x8000 and 0xFFFFare used for memory mapped IO (although only 3 of these addresses are actually used). 4 Memory When the microprocessor is reset the instruction pointer (IP) is set to 0x0100, so normally a program will be load at this point for execution. Addresses 0x0000 to 0x00FF are reserved for the interrupt vector and other OS code. Also the last 960 words of actual memory is used for the frame buffer. 0x0000-0x00FF Interrupts and OS 0x0100-0x7B3F General Memory 0x7C40-0x7FFF Frame Buffer 0x8000-0xFFFF Not connect to real memory. Used for memory mapped IO. 5 Memory Access Memory contains both data and programs. Memory is accessed via: the MAR (Memory Address Register), the MDR (Memory Data Register), and bus control signals. 6 Memory Access To read from main memory: The CPU places the address it wishes to read from into the MAR. The MAR is placed on the address bus and a read signal is given to the bus. Memory reads this address and writes to the data bus. The contents of the data bus is copied into the MDR. 7 Memory Access To write to main memory: The CPU places the address it wishes to write to into the MAR, also the data the CPU is writing is placed into the MDR. The MAR and MDR is placed on the bus and a write signal is given to the bus. Memory writes the data to the address. 8 CPU (Central Processing Unit) The CPU contains: A control unit, The following 32 bit registers: 8 generally purpose registers these may be used for storing either data or addresses. These are denoted R0, R1, ... R7. 3 constant registers. These are denoted ONE, ZERO, MONE. An instruction register (IR) - which holds the current instruction that is being executed. A status register (SR) - contains status information about the CPU. Bit 0 is used for integer overflow (OF), bit 1 is used for interrupt mask (IM), bit 2 to enable the timer interrupt (TI). 9 CPU (Central Processing Unit) The following 16 bit registers: A stack pointer (SP) - this points to the top of the stack and is used for method calls, method returns, and interrupts. A program counter (PC) - which contains the address of the next instruction to execute. An ALU (Arithmetic Logic Unit) which does 2-complement integer arithmetic and bitwise logic computations. The MAR, MDR, and a number in internal buses for moving information around the CPU. Note that the registers: MAR, MDR, IR and PC are not directly accessible via the instruction set. Although clearly the execution of instructions will effect these registers. 10 Fetch-decode-execute cycle The control unit sequences the movement of data around the CPU. The microprocessor goes through the follow execution cycle: do { IR = mem[PC]; PC = PC + 1; execute_instruction in IR; check for interrupts; } while(!halt); 11 Instruction Set Instructions are all 1 word long (32 bits). Registers have the labels R0,R1,...R7, SP, SR, ONE, ZERO, MONE and take a nibble (4 bits) in the machine code. The encoding of this nibble is: R0 is 0x0, R1 is 0x1, ... , R7 is 0x7, SP is 0x8, SR is 0x9, ONE is 0xB, ZERO is 0xC, and MONE is 0xD. Addresses and values take 16 bits of the 32 bit machine code instruction. Values are sign extended from 16 bits to 32 bits. The format of the instructions is given in the specification document. 12 Assembling Code By Hand Assembly code provides a human readable way of describing the machine code of that is executed on a CPU. The mapping from assembler to machine code is a simple and direct process. This is normally done by the assembler. However, it is useful to be able to do this by hand. It basically involves looking up the table of instructions and putting together the bytes of the instruction based on the format of that instruction. Say we have the assembly instruction: add R5 R2 R3 Looking up the addition instruction in the table we have: add <RS1> <RS2> <RD> => 0x1<RS1><RS2><RD>0000 + Hence "add R5 R2 R3" would assemble to: 0x15230000 13 Load and Store Instruction The "load" instruction let you load data into a register. data could be a literal within the text or may be another location within memory. The Whereas the "store" lets you transfer data from a register to a memory location. store CPU Main memory load 14 Load Addressing Modes All load operations load from main memory into a designated register. There are 4 possible addressing modes: Immediate load - this takes a value from the operand in the instruction, sign extends it, and stores it into a register. Absolute load - this takes the address in the operand and loads the word at this address in main memory into a register. Indirect load - this takes the address in a given register and loads the word at this register's address in main memory into a register. base+displacement load - this adds a value from the operand to a register to give an address, which is used as the address to load from. 15 Store Addressing Modes All store operations store from a designated register into main memory. There are 3 possible addressing modes: Absolute store - this takes the address in the operand and stores the register value at this address in main memory. Indirect store - this takes the address in a given register and stores the source value (also in a register) at the given register's address in main memory. base+displacement store - this adds a value from the operand to a register to give the address. This address is used to store the sources register value. 16 Hello World Example Address 0xFFF0 is the dataIO address for the simple terminal device. When words are written to this address, there is no memory to store this information, rather the word is directed to a simple terminal device. In the simulator this appears with a text area. To implement hello world in rPeANUt one can simply load the character literals into a register and store them to the dataIO address. 0x0100 : load #'H' R1 store R1 0xFFF0 load #'e' R1 store R1 0xFFF0 load #'l' R1 store R1 0xFFF0 load #'l' R1 store R1 0xFFF0 load #'o' R1 store R1 0xFFF0 halt 17 Exercises Read over the spec for rPeANUt. Convert the following instructions to machine code. load #10 R2 halt add R3 R4 R5 move R4 R5 Write a program that prints your name. 18
© Copyright 2024