This project implements the control block of an 8-bit CPU design building off the SAP-1.
The control block is implemented using a 6 stage sequential counter for sequencing micro-instructions, and a LUT for corresponding op-code to operation(s).
Mnemonic | Opcode | Function |
---|---|---|
HLT | 0x0 | Stop processing |
NOP | 0x1 | No operation |
ADD {address} | 0x2 | Add B register to A register, leaving result in A |
SUB {address} | 0x3 | Subtract B register from A register, leaving result in A |
LDA {address} | 0x4 | Put RAM data at {address} into A register |
OUT | 0x5 | Put A register data into Output register and display |
STA {address} | 0x6 | Store A register data in RAM at {address} |
JMP {address} | 0x7 | Change PC to {address} |
Control Signal | Array | Component | Function |
---|---|---|---|
CP | 14 | PC | Increments the PC by 1 |
EP | 13 | PC | Enable signal for PC to drive the bus |
LP | 12 | PC | Tells PC to load value from the bus |
nLma | 11 | MAR | Tells MAR when to load address from the bus |
nLmd | 10 | MAR | Tells MAR when to load memory from the bus |
nCE | 9 | RAM | Enable signal for RAM to drive the bus |
nLr | 8 | RAM | Tells RAM when to load memory from the MAR |
nLi | 7 | IR | Tells IR when to load instruction from the bus |
nEi | 6 | IR | Enable signal for IR to drive the bus |
nLa | 5 | A Reg | Tells A register to load data from the bus |
Ea | 4 | A Reg | Enable signal for A register to drive the bus |
Su | 3 | ALU | Activate subtractor instead of adder |
Eu | 2 | ALU | Enable signal for Adder/Subtractor to drive the bus |
nLb | 1 | B Reg | Tells B register to load data from the bus |
nLo | 0 | Output Reg | Tells Output register to load data from the bus |
Stage | HLT | NOP | STA | JMP |
---|---|---|---|---|
T0 | Ep, nLma | Ep, nLma | Ep, nLma | Ep, nLma |
T1 | Cp | Cp | Cp | Cp |
T2 | nCE, nLi | nCE, nLi | nCE, nLi | nCE, nLi |
T3 | ** | - | nEi, nLma | nEi, Lp |
T4 | - | Ea, nLmd | - | |
T5 | - | nLr | - |
Stage | LDA | ADD | SUB | OUT |
---|---|---|---|---|
T0 | Ep, nLma | Ep, nLma | Ep, nLma | Ep, nLma |
T1 | Cp | Cp | Cp | Cp |
T2 | nCE, nLi | nCE, nLi | nCE, nLi | nCE, nLi |
T3 | nEi, nLma | nEi, nLma | nEi, nLma | Ea, nLo |
T4 | nCE, nLa | nCE, nLb | nCE, nLb | - |
T5 | - | Eu, nLa | Su, Eu, nLa | - |
Name | Description | I/O | Width | Trigger |
---|---|---|---|---|
clk | Clock signal | I | 1 | Edge Transition |
rst_n | Set stage to 0 | I | 1 | Active Low |
ui_in[3:0] | Opcode | I | 4 | NA |
uo_out[7] | If 1, the system is halted | O | 1 | Active High |
uo_out[6:0] | control_signals[14:8] | O | 7 | NA |
uio_out[7:0] | control_signals[7:0] | O | 8 | NA |
ui_oe[7:0] | All Bidirectional pins are outputs | O | 8 | NA |
uio_in[7:0] | Unused | I | 8 | NA |
ena | Unused | I | 1 | Active High |
The control block can be tested by:
ui_in[3:0]
input pins.uo_out[7:0]
and uio_out[7:0]
output pins for the control signals and halt status# | Input | Output | Bidirectional |
---|---|---|---|
0 | opcode[0] | SIG_RAM_LOAD_N | SIG_OUT_LOAD_N |
1 | opcode[1] | SIG_RAM_EN_N | SIG_REGB_LOAD_N |
2 | opcode[2] | SIG_MAR_MEM_LOAD_N | SIG_REGB_EN |
3 | opcode[3] | SIG_MAR_ADDR_LOAD_N | SIG_ADDER_SUB |
4 | SIG_PC_LOAD | SIG_REGA_EN | |
5 | SIG_PC_EN | SIG_REGA_LOAD_N | |
6 | SIG_PC_INC | SIG_IR_EN_N | |
7 | halted | SIG_IR_LOAD_N |