LC3 - Skyline-9/CS2110-Notes GitHub Wiki
FETCH
Goal: read next instruction out of memory and write it into Instruction Register
- Remember: PC is always pointing to address of next instruction
Register Transfer Notation
IR <== Mem[(PC)]
- Take contents of PC, put it on bus, and put it onto MAR
- Read out of memory
- Write it into the IR
Control Instructions
- Gate.PC - Puts contents of PC onto the bus
- LD.MAR - Writes into the MAR
- MEM.EN - Enable memory write/read (also wait for R)
- MDRMUX - Not shown in diagram, but there's actually a mux to determine where to write into MDR from
- LD.MDR - Load memory into MDR
- Gate.MDR - Write memory onto main bus
- LD.IR - Write data into IR
ADD
Register Transfer Notation
DR <== (SR1) + (SR2)
Control Instructions
- SR1MUX selects IR[8:6]
- SR2MUX selects SR2OUT
- ALUK selects ADD - Tells ALU which operation to do
- GateALU - Opens data into bus
- DRMUX selects IR[11:9]
- LD.REG - Write into Register
- LD.CC
AND
DR <== (SR1)(SR2)
Basically, add but instead of selecting ADD with ALUK you select AND
Control Instructions
- SR1MUX selects IR[8:6]
- SR2MUX selects SR2OUT
- ALUK selects AND - Tells ALU which operation to do
- GateALU - Opens data into bus
- DRMUX selects IR[11:9]
- LD.REG - Write into Register
- LD.CC
NOT
Register Transfer Notation
DR <== (SR')
Control Instructions
- SR1MUX selects IR[8:6]
- ALUK selects NOT - tells ALU which operation to do
- Gate.ALU - lets data from ALU onto bus
- DRMUX selects IR[11:9]
- LD.REG - write data from bus into register
- LD.CC
LEA
Loading an effective address (never accessing memory) and writing that into the destination register
Register Transfer Notation
DR <= (PC) + SEXT(IR[8:0])
Control Instructions
- ADDR1MUX selects PC - Don't want to send data through bus, just select wire coming from PC
- ADDR2MUX selects IR[8:0] - Remember PCOffset9
- MARMUX selects ADDR ADD - Select output from ADDR
- Gate.MARMUX - Open gate from ADDR onto bus
- DRMUX selects IR[11:9]
- LD.REG - Write into register
Remember, we do not do LD.CC for this one!
JUMP
We are now into control instructions! They all write into PC because they change where our next instruction is in memory
Register Transfer Notation
PC <= (BaseR)
Control Instructions
- SR1MUX selects IR[8:6]
- ADDR1MUX selects SR1OUT - we don't actually want to add but we pass it through
- ADDR2MUX selects 0 - just pass through content
- PCMUX selects ADDR ADD - want to select output from adder
- LD.PC - Load data into PC
LD
Very similar to LEA but now we want to access memory
Register Transfer Notation
DR <= Mem[(PC) + SEXT(IR[8:0])]
Control Instructions
- ADDR1MUX selects PC
- ADDR2MUX selects SEXT([IR8:0])
- MARMUX selects ADDR ADD
- Gate.MARMUX opens to let data from MARMUX onto bus
- LD.MAR - Load data into MAR
- MEM.EN/R - Enable memory read/write
- MDRMUX selects Memory
- LD.MDR - Load data into MDR
- Gate.MDR - Open to let data onto bus
- DRMUX selects [11:9]
- LD.REG - Load data into register
- LD.CC
ST
Register Transfer Notation
Mem[(PC) + SEXT([IR8:0])] <= SR
Writing data from a source register into memory at the location of an effective address (we get using PC relative addressing)
First thing, calculate effective address, then write into memory
Control Instructions
- ADDR1MUX selects PC - send PC into ADDR
- ADDR2MUX selects SEXT([IR8:0]) - Sign extension
- MARMUX selects ADDR ADD
- Gate.MARMUX - sends data onto bus
- LD.MAR - Load data from bus onto MAR
Now, we got our address put into memory to say where we wanna access. Then, set up source register data so we can write it into memory. Goal: source register to MDR
- SR1MUX selects IR[11:9] - Data from source register is found in bits 11 through 9
- ALUK selects Pass Through - puts data from SR1 onto bus
- Gate.ALU - let data onto bus
- MDRMUX selects bus - let data from bus onto the MDR
- LD.MDR - load data into MDR
Now, we have our data in MDR and our address in MAR, so we can just write it into memory
- MEM.EN W - write data into memory
LDR
Register Transfer Notation DR <= Mem[(IR[8:6]) + SEXT(IR[5:0])]
Control Instructions
- SR1MUX selects IR[8:6]
- ADDR1MUX selects SR1OUT
- ADDR2MUX selects SEXT(IR[5:0]) - add offset6
- MARMUX selects ADDR ADD
- Gate.MARMUX - open gate to let data onto bus
- LD.MAR - Write into MAR
- MEM.EN R - Write into memory
- MDRMUX selects memory
- LD.MDR - Load into MDR
- Gate.MDR - Open gate to let data from MDR onto bus
- DRMUX selects IR[11:9]
- LD.REG - Load into register
- LD.CC
STR
Register Transfer Notation
Mem[(IR[8:6]) + SEXT[IR[5:0]]] <= SR
Control Instructions
- SR1MUX selects IR[8:6]
- ADDR1MUX selects SR1OUT
- ADDR2MUX selects SEXT(IR[5:0])
- MARMUX selects ADDR ADD
- Gate.MARMUX
- LD.MAR
Clock 2
- SR1MUX selects IR[11:9]
- ALUK selects Pass Through
- Gate.ALU
- MDRMUX selects Bus
- LD.MDR
Clock 3 12. MEM.EN W
LDI
Register Transfer Notation DR <= Mem[Mem[(PC) + SEXT(IR[8:0]))]]
Control Instructions
- ADDR1MUX selects PC
- ADDR2MUX selects SEXT(IR[8:0]) - PCOffset9
- MARMUX selects ADDR ADD
- Gate.MARMUX
- LD.MAR
Cycle 2
- MEM.EN R - Read memory into MDR
- MDRMUX selects Memory
- LD.MDR
Cycle 3
- Gate.MDR
- LD.MAR
Cycle 4
- MEM.EN R
- MDRMUX selects Memory
- LD.MDR
Cycle 5
- Gate.MDR
- DRMUX selects IR[11:9]
- LD.REG
- LD.CC
STI
Register Transfer Notation Mem[Mem[(PC) + SEXT(IR[8:0]))]] <= SR
Control Instructions
- ADDR1MUX selects PC
- ADDR2MUX selects SEXT(IR[8:0]) - PCOffset9
- MARMUX selects ADDR ADD
- Gate.MARMUX
- LD.MAR
Cycle 2
- MEM.EN R - Read memory into MDR
- MDRMUX selects Memory
- LD.MDR
Cycle 3
- Gate.MDR
- LD.MAR
Cycle 4
- SR1MUX selects IR[11:9]
- ALUK selects Pass Through
- Gate.ALUK
- MDRMUX selects Bus
- LD.MDR
Cycle 5
- MEM.EN W