Class Central is learner-supported. When you buy through links on our site, we may earn an affiliate commission.

# Build a Modern Computer from First Principles: From Nand to Tetris (Project-Centered Course)

### Overview

Class Central Tips

### Syllabus

• Introduction
• Course introduction and overview, the roles of abstraction and implementation in systems design, the road ahead.
• Boolean Functions and Gate Logic
• We will start with a brief introduction of Boolean algebra, and learn how Boolean functions can be physically implemented using logic gates. We will then learn how to specify gates and chips using a Hardware Description Language (HDL), and how to simulate the behaviour of the resulting chip specifications using a hardware simulator. This background will set the stage for Project 1, in which you will build, simulate, and test 15 elementary logic gates. The chipset that you will build this module will be later used to construct the computer's Arithmetic Logic Unit (ALU) and memory system. This will be done in modules 2 and 3, respectively.
• General Course Information
• General Course Information
• Boolean Arithmetic and the ALU
• Using the chipset that we've built in the previous module, we will now proceed to build a family of adders -- chips designed to add numbers. We will then take a big step forward and build an Arithmetic Logic Unit. The ALU, which is designed to perform a whole set of arithmetic and logical operations, is the computer's calculating brain. Later in the course we will use this ALU as the centerpiece chip from which we will build the computer's Central Processing Unit, or CPU. Since all these chips operate on binary numbers (0's and 1's), we will start this module with a general overview of binary arithmetic, and only then delve into building the ALU.
• Memory
• Having built the computer's ALU, this module we turn to building the computer's main memory unit, also known as Random Access Memory, or RAM. This will be done gradually, going bottom-up from elementary flip-flop gates to one-bit registers to n-bit registers to a family of RAM chips. Unlike the computer's processing chips, which are based on combinational logic, the computer's memory logic requires a clock-based sequential logic. We will start with an overview of this theoretical background, and then move on to build our memory chipset.
• Machine Language
• A critically important aspect of building a new computer system is designing the low-level machine language, or instruction set, with which the computer can be instructed to do various things. As it turns out, this can be done before the computer itself is actually built. For example, we can write a Java program that emulates the yet-to-be-built computer, and then use it to emulate the execution of programs written in the new machine language. Such experiments can give us a good appreciation of the bare bone "look and feel" of the new computer, and lead to decisions that may well change and improve both the hardware and the language designs. Taking a similar approach, in this module we assume that the Hack computer and machine language have been built, and write some low-level programs using the Hack machine language. We will then use a supplied CPU Emulator (a computer program) to test and execute our programs. This experience will give you a taste of low-level programming, as well as a solid hands-on overview of the Hack computer platform.
• Computer Architecture
• Let's recap the last four modules: we've built some elementary logic gates (module 1), and then used them to build an ALU (module 2) and a RAM (module 3). We then played with low-level programming (module 4), assuming that the overall computer is actually available. In this module we assemble all these building blocks into a general-purpose 16-bit computer called Hack. We will start by building the Hack Central Processing Unit (CPU), and we will then integrate the CPU with the RAM, creating a full-blown computer system capable of executing programs written in the Hack machine language.
• Assembler
• Every computer has a binary machine language, in which instructions are written as series of 0's and 1's, and a symbolic machine language, also known as assembly language, in which instructions are expressed using human-friendly mnemonics. Both languages do exactly the same thing, and are completely equivalent. But, writing programs in assembly is far easier and safer then writing in binary. In order to enjoy this luxury, someone has to translate our symbolic programs into binary code that can execute as-is on the target computer. This translation service is done by an agent called assembler. The assembler can be either a person who carries out the translation manually, or a computer program that automates the process. In this module and final project in the course we learn how to build an assembler. In particular, we'll develop the capability of translating symbolic Hack programs into binary code that can be executed as-is on the Hack platform. Each one of you can choose to accomplish this feat in two different ways: you can either implement an assembler using a high-level language, or you can simulate the assembler's operation using paper and pencil. In both cases we give detailed guidelines about how to carry out your work.

### Taught by

Shimon Schocken and Noam Nisan

## Reviews

4.9 rating, based on 28 Class Central reviews

4.9 rating at Coursera based on 3574 ratings

Start your review of Build a Modern Computer from First Principles: From Nand to Tetris (Project-Centered Course)

• The perfect course, clear, simple and well taught, so much so that it can be taken with no previous experience in computer science, the fact that the course is project-oriented ensures that you understood well the whole unit. The progression of theâ€¦
• Must-take course for all aspiring programmers and computer scientists!

This course covers the basics of how computers work (CPU and memory) from the simplest computer part: the NAND gate.

It excellently nudges the learner towards the concept of abstraction, an important skill for all computer scientists. Additionally, it is filled with engaging (although maybe repetitive) exercises that forces you to abstract your way up to the very top.

Overall, this course was very enjoyable and enlightening.
A year before I took this course I had already read the part of the book on which the course is based and done most of the exercises, so the time I spent per week was mostly spent watching the videos and reading some additional material. Without preâ€¦
• Even with 1+ year professional experience in software industry it was not clear to me how a program written in high level language gets executed in machine level and "Nand to Tetris" is exactly the course that I was looking for. Building a computerâ€¦
• Its one of the best course I've taken so far (Among Proglang at coursera).
You get to build the whole computer hardware in Part 1, from a Nand gate to building half adder to full adder to ALU to memory to CPU to assembler (and write some assembly code as well!)

I highly recommend this course to anyone whose serious about computer science. You can't beat this course in terms of "hands on"!

Just Fantastic!
• Alex
Absolutely amazing course. The teachers are clear and easy to understand, the videos are high quality and contain great (and very useful) visual material to supplement the content. The graded assignments are quite difficult if you're new to low-leveâ€¦
• What I intrigued the most was the additional word after its title â€“ â€˜Project-Centered Courseâ€™. It seemed like the most effective way to get new knowledge in my head while not losing my focus and interest. I also love the concept. There is no prerequisite at all, and everything would be built one by one from the basis.

In this course, everything is provided and explained clearly. For a person who has no background such as myself, it might be a bit tough and watched several times repeatedly, and sometimes a bit of additional research is required. However, it is certainly achievable, and mostly enjoyable. The professors are kind-hearted and have a sense of humor.
• Arman Rafian
The BEST class I have ever taken online or offline. That is not hyperbole.

It does take some time though, but since your progress carries over from session to session you can go as slow as you want with no penalty. The instructors are clearly very interested in their course, and it has a great team of mentors and other classmates that generally answer any question quite quickly on the forums. If you ever were interested in how computers work from the ground up, or simply wanted a course that is beautifully project centered then look no further.
• Anonymous
This is one of the best courses in online computer science education. The teachers are awesome. They are able to explain tough concepts in a simple way. They have created a course that lets you tackle a huge amount of knowledge step by step. The course itself is great. It is built around projects. Theory never gets in the way of real practice. Everything you learn you apply almost immediately. The projects in the course are not simple programs. You will get to build a simulation of a computer from the ground up including an assembler, a compiler, a tokenizer, a parser, and much much more. Highly recommend this course to anyone interested in how computers really work on the inside.
• Artem
It is a nice course to get the "feeling" of how computers actually work. It doesn't provide you with much in-depth knowledge of computer architecture (most of the things in this course are greatly simplified), but it does provide you with a substantial understanding of the underlying processes and, which I think is far more important, it gives a very thorough understanding of what a powerful tool abstraction is and how it is used in computer design.

All in all, I think that this course does not give a lot of practical knowledge, but it does give intuitive understanding, which is excellent in building your Computer Science foundation.
• Abhijit
This is the first MOOC for which I have a verified certificate.
It revised my concept from engineering days and helped me understand sequential and computational circuits better.
The use of simulator give feel of developing actual computer and I was able to start taking more courses in computer architecture and assembly programming post this course.
• Anonymous
It is a very good course. Thank you very much. Also the book is good too.
Also I highly recommend to read 'Code' by Charlez Petzold
• Anonymous
Best MOOC every created. Period. The course is very well organized and the projects can be challenging but it is so rewarding to get it done. Just do it.
• Node
This is absolutely best course I have ever taken in my CS career. I happily paid 49x2 dollars for this course and also bought the book .
In the world where Compluter Science education system is just making people literate by training them how to code, this course has enlightened me with various detailed aspect of the subject.
• Anonymous
This is a great course. It takes you on a full journey of starting with a simple virtual electronic gate and allows you to build virtual computer and add OS to it. How cool is that!
You'd learn a lot of interesting intricate details about hardware and computers. I very much recommend this course.
• This is an amazing course and taught me lots about computer hardware architecture. I plan to take the second part very soon!
• Pawel Mirecki
• Aleksandr

### Never Stop Learning.

Get personalized course recommendations, track subjects and courses with reminders, and more.