8-bit computer in Verilog
This project contains:
a 8-bit CPU with a basic instruction set
256 bytes of RAM
Build an exemple:
./asm/asm.py tests/multiplication_test.asm > memory.list
Run the computer:
Instruction
Description
lda
Alias for mov A M D
sta
Alias for mov M A D
ldi r D
Load D into r register
mov r M D
Copy the data at memory address D into register r
mov r2 r1
Copy register r1 into r2
mov M r D
Copy the data from register r into memory in address D
Legend:
D is a byte of data. It can be a memory address or directly the data depending on the instruction.
r is a register.
M means "memory", it's used to tell to the mov
instruction the source/destination of the copy.
Instruction
Description
add
Perform A = A + B (A, B are registers)
adc
Perform A = A + B + carry (A, B are registers)
sub
Perform A = A - B (A, B are registers)
inc
Perform A = A + 1 (A is a register)
dec
Perform A = A - 1 (A is a register)
cmp
Perform A - B without updating A, just update flags
Instruction
Description
and
Perform A = A AND B (A, B are registers)
or
Perform A = A OR B (A, B are registers)
xor
Perform A = A XOR B (A, B are registers)
Instruction
Description
jmp D
Jump to D
jz D
Jump to D if flag zero is set
jnz D
Jump to D if flag zero is not set
je D
Jump to D if register A equals register B after cmp
(alias jz
)
jne D
Jump to D if register A doesn't equal register B after cmp
(alias jnz
)
jc D
Jump to D if carry flag is set
jnc D
Jump to D if carry flag is not set
call D
Call sub-routine D
ret
Return to the parent routine
Instruction
Description
nop
Do nothing
hlt
Halt the CPU
Instruction
Description
in D
Put the content of the data bus in the A register and set D on address bus
out D
Put the content of accumulator on the data bus and set D on address bus
Instruction
Description
push r
Push the content of register r on the stack
pop r
Pop the content from the stack and put it into register r
T1 and T2 are always FETCH_PC
and FETCH_INST
.
List of instruction associated with states:
Instruction
T3
T4
T5
T6
T7
NOP
ALU
ALU_EXEC
ALU_STORE
CMP
ALU_EXEC
OUT
FETCH_PC
SET_ADDR
OUT
IN
FETCH_PC
SET_ADDR
IN
HLT
HALT
JMP
FETCH_PC
JUMP
LDI
FETCH_PC
SET_REG
MOV
MOV_FETCH
MOV_LOAD
MOV_STORE
CALL
FETCH_PC
SET_REG
FETCH_SP
PC_STORE
TMP_JUMP
RET
INC_SP
FETCH_SP
RET
PUSH
FETCH_SP
REG_STORE
POP
INC_SP
FETCH_SP
SET_REG
States versus signals enabled:
States
II
CI
CO
RFI
RFO
EO
EE
MI
RO
RI
HALT
J
SO
SD
SI
MEM/IO
ALU_EXEC
X
ALU_STORE
X
X
FETCH_INST
X
X
FETCH_PC
X
X
X
FETCH_SP
X
X
HALT
X
INC_SP
X
IN
X
X
JUMP
*
*
*
MOV_FETCH
*
*
*
MOV_LOAD
*
*
*
*
MOV_STORE
*
*
*
*
OUT
X
X
PC_STORE
X
X
REG_STORE
X
X
X
X
RET
X
X
X
SET_ADDR
X
X
SET_REG
X
X
TMP_JUMP
X
X
X
X
X
CLK:
+-+ +-+ +-+ +-+ +-+ +-+ +
| | | | | | | | | | | | |
| | | | | | | | | | | | |
+ +-+ +-+ +-+ +-+ +-+ +-+
CYCLE_CLK:
+---+ +---+
| | | |
| | | |
+ +---+---+ +---+---+
MEM_CLK:
+---+ +---+
| | | |
| | | |
+---+ +---+---+ +---+
INTERNAL_CLK:
+---+ +---+
| | | |
| | | |
+---+---+ +---+---+ +