A 32-bit microprocessor with 42 instructions (including multiplication and division) and 8 X 32 registers and 2048 X 32 Ram with shared stack. An assembler is also available to write programs on the microprocessor using 8086-like assembly.
The full schematic can be found in the rtl.pdf file in the project main directory.
| Register | Description | Number (Binary) |
|---|---|---|
| AX | Accumulator | 000 |
| BX | Base | 001 |
| CX | Counter | 010 |
| DX | Data | 011 |
| SX | Extra | 100 |
| EX | Extra | 101 |
| EY | Extra | 110 |
| EZ | Extra | 111 |
A total of 42 instructions are available to be executed on the microprocessor:
| Instruction | Operand 1 | Operand 2 | Description |
|---|---|---|---|
| NOP | N/A | N/A | No Operation |
| NOT | Reg | N/A | Logical Not |
| OUT | Reg | N/A | Output lower 8-bits of Reg on port |
| PUSH | Reg | N/A | Pop from the stack to Reg |
| POP | Reg | N/A | Push Reg on the stack |
| ST | Reg | memAddr | Store Reg into ram[memAddr] |
| LD | Reg | memAddr | Load from ram[memAddr] into Reg |
| MOV | DST | SRC | Copy SRC to DST |
| CMP | REG 1 | REG 2 | Subtract REG 1 - REG 2 while only changing flags |
| AND | DST | SRC | Logical AND |
| OR | DST | SRC | Logical OR |
| XOR | DST | SRC | Logical XOR |
| XNOR | DST | SRC | Logical XNOR |
| NOR | DST | SRC | Logical NOR |
| NAND | DST | SRC | Logical NAND |
| ADD | DST | SRC | Add SRC and DST |
| SUB | DST | SRC | Subtract SRC from DST |
| MUL | DST | SRC | Multiply DST by SRC , Store the result in DX:AX |
| DIV | DST | SRC | Divide DST by SRC |
| MOVI | DST | imm32 | Copy imm32 to DST |
| ANDI | DST | imm32 | Logical AND |
| ORI | DST | imm32 | Logical OR |
| XORI | DST | imm32 | Logical XOR |
| XNORI | DST | imm32 | Logical XNOR |
| NORI | DST | imm32 | Logical NOR |
| NANDI | DST | imm32 | Logical NAND |
| ADDI | DST | imm32 | Add imm32 and DST |
| SUBI | DST | imm32 | Subtract imm32 from DST |
| MULI | DST | imm32 | Multiply DST by imm32 , Store the result in DX:AX |
| DIVI | DST | imm32 | Divide DST by imm32 |
| HLT | N/A | N/A | Halt Execution |
| SLL | REG | N/A | Shift REG left by 1 |
| SRL | REG | N/A | Shift REG right by 1 |
| JMP | @Label | N/A | Jump to Label [Unconditional Jump] |
| JZ | @Label | N/A | Jump to Label if zero flag is HIGH [Jump Zero] |
| JNZ | @Label | N/A | Jump to Label if zero flag is LOW [Jump Not Zero] |
| JEQ | @Label | N/A | Jump to Label if zero flag is HIGH [Jump Equal] |
| JNEQ | @Label | N/A | Jump to Label if zero flag is LOW [Jump Not Equal] |
| JG | @Label | N/A | Jump to Label if sign flag is LOW and zero flag is LOW [Jump Greater] |
| JL | @Label | N/A | Jump to Label if sign flag is HIGH and zero flag is LOW [Jump Less] |
| JGE | @Label | N/A | Jump to Label if sign flag is LOW or zero flag is HIGH [Jump Greater or Equal] |
| JLE | @Label | N/A | Jump to Label if sign flag is HIGH or zero flag is HIGH [Jump Less or Equal] |
The assembly language used is very similar to the one used in the 8086 with a few differences:
- Labels
- Labels start with the '@' charachter
- The instrcution following the label has to be in a separate line.
- Example:
MOVI CX, 0xF
@Loop
SUBI CX, 0x1
JNZ @Loop
HLT- Comments
- Comments start with the ';' charachter.
; This is a valid comment.- Numbers
- Numbers are written as follows
MOVI AX, 0b101000 ; Use the prefix "0b" for binary,
MOVI BX, 0d40 ; "0d" for decimal,
MOVI CX, 0x28 ; and "0x" for hexadecimal.- Case Sensitivity
- This language is case insensetive.
To run your program on the processor, write it in /chasm/goodisa.asm and run the chasm.py file, then on modelsim, type do ../test/topTst.do to run the program.
; This program calculates the fibbonaci number of the number in the DX register.
nop
nop
@VarInit
movi cx, 0x2 ; Iterator
movi ax, 0x1 ; Auxillary register
movi bx, 0x0 ; Result
movi dx, 0d40 ; Input data
movi ey, 0x1 ; Previous Fibonacci number
movi ex, 0x1 ; Before previous Fibonacci number
@Loop
cmp cx, dx
jeq @EndLoop
mov bx, ey
add bx, ex
mov ax, bx
mov ex, ey
mov ey, ax
addi cx, 0x1
jmp @Loop
@EndLoop
push bx
hlt