Project developed for the class of Digital System lectured by @Edmar-Bellorini by the students @Daniel-Boll @Felipi-Matozinho @Pablo-Hugen which compose the super team BDT (CFDT).
NEANDER is a computer architecture based on a 1945 description by John von Neumann and others in the First Draft of a Report on the EDVAC. That document describes a design architecture for an electronic digital computer with these components:
- A processing unit that contains an arithmetic logic unit and processor registers
- A control unit that contains an instruction register and program counter
- Memory that stores data and instructions
- External mass storage
- Input and output mechanisms
- Components
1.1. Arithmetic Logic Unit
1.2. Control Unit
1.3. Memory - Adaptations
2.1. JN and JZ - Implementation
3.1. Requirements
3.2. Instalation
3.3. Run
3.4. Structure
The Arithmetic Logic Unit as the image on the left suggest has 3 main components, which are:
- ALU (core): This component is capable of execute any logical or arithmetic, under NEANDER constraints. They are
ADD,NOT,OR,AND,LDA. Most of them can operate from two different sourcesADD,ORand theANDoperator extrictly both from theACregister and the data bus.NOTonly operate data from theACregister and theLDAonly from the data bus. Every ALU operation is stored under theACregister. - AC: Is the register to keep the operations data.
- FLAGS: As the name suggests is the FLAGS that points properties from the
ACregister current data.
The Memory Unit has 4 components, which are:
- MUX 2x8: This mux selects if the address that will be sent to
MAR(Memory Address Register) is comming from thePC(Program Counter) or the data bus. - MAR: Store the address received from the previous MUX an sent it to the
RAM(Random Access Memory). - RAM: Is a memory of 256 bytes. On the read mode the memory will store in the
MDRthe data equivalent of the address passed from theMAR, otherwise in the write mode the memory will store on the address available inMARthe data comming from the data bus. - MDR/MBR: Both the
MDRand the data bus will receive the data from theRAMif it's in the read mode.
The Control Unit is responsible for handling all the instructions related logic, like decoding and storing a instruction. It is divided in 4 main submodules
- CU (Core): As the NEANDER is 8 clock-cycle-based all instructions will have the same time to execute, even though it don't need to make actions up until the cycle end. For every instruction the 3 firsts pulses are dedicated for searching the instruction and the increment of the
PC. What the other 5 pulses does is trivial and it's up to the reader. - PC (Program Counter): Stores the address of the next instruction to be executed. The only way of changing it is via jump instructions (
JMP,JNorJZ). - IR (Instruction Register): Contains the current instruction data.
- Decoder: Output the instruction in a format like
8 bitsin ->11 bitsout. From those 8 bits that enters, actually only 4 MSbits are used.
As no documentation on how to implent the jumps JN (Jump if Negative) and JZ (Jump if Zero) was provided we decided to adapt it using a MUX2x11 that when the selector is '1' the output is equivalent of a normal JMP otherwise the output will be equivalent as a NOP.
As we had and ally, or as we call a god's gift, called Pablo we manage to come up and turn a masive one root folder structure to a well delightful syntatic-tree design.
Anyone with make can easily run as follows
You will have to have installed the following programs (git|gh-cli) ghdl gtkwave make
gh repo clone Matozinho/neanderor
git clone git@github.com:Matozinho/neander.gitor if you are old as a NEANDER itself
git clone https://github.com/Matozinho/neander.gitcd neander
make clean # just as good practice 😉
make # Will compile
make run STOPTIME=(stop time needed) MEM=(memfile)
make view # Will open GTKWave.
├── assets
│ ├── mem
│ │ ├── 1neanderram.mem
│ │ ├── 2neanderram.mem
│ │ ├── 3neanderram.mem
│ │ ├── 4neanderram.mem
│ │ ├── 5neanderram.mem
│ │ ├── 6neanderram.mem
│ │ ├── 7neanderram.mem
│ │ ├── 8_JZneanderram.mem
│ │ ├── 9neanderram.mem
│ │ └── neanderram.mem
│ ├── neander.gtkw
│ └── waves
│ └── tb_neander.ghw
├── Makefile
├── neanderram.mem
├── README.md
└── src
└── neander
├── components
│ ├── alu
│ │ ├── alu.vhdl
│ │ ├── components
│ │ │ ├── ac.vhdl
│ │ │ ├── alu_mux.vhdl
│ │ │ ├── core.vhdl
│ │ │ ├── fadder_8.vhdl
│ │ │ ├── fadder.vhdl
│ │ │ └── flags.vhdl
│ │ └── testbench
│ │ └── tb_alu.vhdl
│ ├── cu
│ │ ├── components
│ │ │ ├── cicles
│ │ │ │ ├── add_cicle.vhdl
│ │ │ │ ├── and_cicle.vhdl
│ │ │ │ ├── hlt_cicle.vhdl
│ │ │ │ ├── jmp_cicle.vhdl
│ │ │ │ ├── jn_cicle.vhdl
│ │ │ │ ├── jz_cicle.vhdl
│ │ │ │ ├── lda_cicle.vhdl
│ │ │ │ ├── nop_cicle.vhdl
│ │ │ │ ├── not_cicle.vhdl
│ │ │ │ ├── or_cicle.vhdl
│ │ │ │ └── sta_cicle.vhdl
│ │ │ ├── control_ffjk7.vhdl
│ │ │ ├── count07.vhdl
│ │ │ ├── decoder.vhdl
│ │ │ ├── ir.vhdl
│ │ │ └── uc_core.vhdl
│ │ ├── cu.vhdl
│ │ └── testbench
│ ├── ffjktd.vhdl
│ ├── mem
│ │ ├── components
│ │ │ ├── as_ram.vhdl
│ │ │ ├── mar.vhdl
│ │ │ ├── mdr.vhdl
│ │ │ ├── mem_mux.vhdl
│ │ │ └── neanderram.mem
│ │ ├── mem.vhdl
│ │ └── testbench
│ └── pc
│ ├── components
│ │ ├── pc_mux.vhdl
│ │ └── rip.vhdl
│ └── pc.vhdl
├── neander.vhdl
└── testbench
├── tb_neander.ghw
├── tb_neander.gtkw
├── tb_neander.vhdl
├── tb_ula_mem.ghw
└── tb_ula_mem.vhdl
19 directories, 56 filesThanks goes to these wonderful people (emoji key):
Daniel Boll 💻 📖 |
Felipi Lima Matozinho 💻 📖 |
Pablo Alessandro Santos Hugen 💻 📖 |
This project follows the all-contributors specification. Contributions of any kind welcome!



