Implementing a basic single cycle processor in verilog
Simulation Results Demonstarting the following instructions
MOV ACC, R1 ; Load R1 in ACC
XRA R1 ; clears ACC
ADD R5 ; ACC+R5
ADD R6; ACC + R6 (which is R5+R6)
MOV R7, ACC;
The following instructions are supported
Instruction | Opcode | Operand Format | Description |
---|---|---|---|
NOP | 0000 0000 |
None | No operation |
ADD Ri | 0001 xxxx |
Register address | Add ACC with Register Ri, store result in ACC, update C/B |
SUB Ri | 0010 xxxx |
Register address | Subtract Register Ri from ACC, store result in ACC, update C/B |
MUL Ri | 0011 xxxx |
Register address | Multiply ACC with Register Ri, store result in ACC, update EXT |
LSL ACC | 0000 0001 |
None | Logical shift left ACC (no C/B update) |
LSR ACC | 0000 0010 |
None | Logical shift right ACC (no C/B update) |
CIR ACC | 0000 0011 |
None | Circular right shift ACC (no C/B update) |
CIL ACC | 0000 0100 |
None | Circular left shift ACC (no C/B update) |
ASR ACC | 0000 0101 |
None | Arithmetic shift right ACC |
AND Ri | 0101 xxxx |
Register address | Bitwise AND ACC with Ri, store result in ACC (no C/B update) |
XRA Ri | 0110 xxxx |
Register address | Bitwise XOR ACC with Ri, store result in ACC (no C/B update) |
CMP Ri | 0111 xxxx |
Register address | Compare ACC with Ri (ACC - Ri), update C/B (C/B=1 if ACC < Ri, else 0) |
INC ACC | 0000 0110 |
None | Increment ACC, update C/B on overflow |
DEC ACC | 0000 0111 |
None | Decrement ACC, update C/B on underflow |
Br addr | 1000 xxxx |
4-bit address (label) | Branch to address if C/B = 1 |
MOV ACC, Ri | 1001 xxxx |
Register address | Move value from Ri to ACC |
MOV Ri, ACC | 1010 xxxx |
Register address | Move value from ACC to Ri |
Ret addr | 1011 xxxx |
4-bit address (label) | Return to program address |
HLT | 1111 1111 |
None | Halt program execution |