We may earn an affiliate commission when you visit our partners.
Course image
Course image
Coursera logo

Build a Modern Computer from First Principles

From Nand to Tetris (Project-Centered Course)

Shimon Schocken and Noam Nisan

What you’ll achieve:

Read more

What you’ll achieve:

In this project-centered course* you will build a modern computer system, from the ground up. We’ll divide this fascinating journey into six hands-on projects that will take you from constructing elementary logic gates all the way through creating a fully functioning general purpose computer. In the process, you will learn - in the most direct and constructive way - how computers work, and how they are designed.

What you’ll need:

This is a self-contained course: all the knowledge necessary to succeed in the course and build the computer system will be given as part of the learning experience. Therefore, we assume no previous computer science or engineering knowledge, and all learners are welcome aboard. You will need no physical materials, since you will build the computer on your own PC, using a software-based hardware simulator, just like real computers are designed by computer engineers in the field. The hardware simulator, as well as other software tools, will be supplied freely after you enroll in the course.

Course format:

The course consists of six modules, each comprising a series of video lectures, and a project. You will need about 2-3 hours to watch each module's lectures, and about 5-10 hours to complete each one of the six projects. The course can be completed in six weeks, but you are welcome to take it at your own pace. You can watch a TED talk about this course by Googling "nand2tetris TED talk".

*About Project-Centered Courses: Project-centered courses are designed to help you complete a personally meaningful real-world project, with your instructor and a community of learners with similar goals providing guidance and suggestions along the way. By actively applying new concepts as you learn, you’ll master the course content more efficiently; you’ll also get a head start on using the skills you gain to make positive changes in your life and career. When you complete the course, you’ll have a finished project that you’ll be proud to use and share.

Enroll now

What's inside

Syllabus

Introduction
Course introduction and overview, the roles of abstraction and implementation in systems design, the road ahead.
Boolean Functions and Gate Logic
Read more
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
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.

Good to know

Know what's good
, what to watch for
, and possible dealbreakers
Significant practical experience through simulation, including a project where you design a modern computer system, from the ground up, including boolean functions, gate logic, and memory
Taught by two professors in the field of computer science, Shimon Schocken and Noam Nisan
Develops project-management skills as you build a computer system, from the ground up
Teaches foundational skills and knowledge in computer system design
Suitable for beginners with no prior experience in computer science or engineering

Save this course

Save Build a Modern Computer from First Principles: From Nand to Tetris (Project-Centered Course) to your list so you can find it easily later:
Save

Reviews summary

Complete computer architecture journey

Build any modern computer from binary gates to Tetris, in just six (very fun) weeks. learners say: * "Best course I have ever taken... This course permanently changed my perspective on hardware and software along with the relationship between the two..." * "Excellent excellent excellent, just so good. Especially if you only have a theoretical knowledge of computers and want to have some sort of practile knowladge in it..." * "Amazing. As a self-taught software engineer, I didn't have an understanding of computer architecture and how code is actually run. This course demystifies all of that."
The course is supplemented by a comprehensive textbook that provides students with additional background and context for the material covered in the lectures and projects. The textbook is written in a clear and engaging style, and it is packed with helpful diagrams, examples, and exercises.
Professors Shimon Schocken and Noam Nisan of the Hebrew University of Jerusalem are widely respected in the field of computer science and have received numerous awards for their teaching and research. They have a passion for making complex topics accessible to students, regardless of their background or experience.
"Excellent...Just so good. ...you only have a theoretical knowledge of computers and want to have some sort of practile knowladge in it"
This course is a great confidence booster for anyone who wants to learn more about computers. By the end of the course, you will be able to build your own computer from scratch. This is a valuable skill that can help you in your career or personal life.
"This is absolutely the best course on Coursera and by far the most unique."
"I am so excited throughout the course. So looking forward to building something totally new on my own and explore the more magical world of computer science."
Students will gain hands-on experience with the following: * Logic gates * Sequential circuits * Computer architecture * Assembly language * Compilers
"This hands-on approach in this course is what made it interesting for me."
"It helped solidify the connection between hardware and software by making me really think about what happens to all the bits in those A, C and L commands."
This course is a great option for anyone who wants to learn more about how computers work. It is a challenging course, but it is also very rewarding. By the end of the course, you will have a deep understanding of the inner workings of a computer, and you will be able to build your own computer from scratch.
"This course demystifies the hardware operation behind the computer...Well structured and Well Mentored and the fun part is that we implement it on our own"
"I had great fun with the projects! The materials illustrate how processors work clearly, without being overly complex."
In this course, learners will: * Build a 16-bit computer out of 7400-series chips. * Write an assembler for that computer. * Develop assembly language programs to run on that computer. * Describe how they relate to the abstractions found in modern computer systems.
"Challenging, but achievable, and lead to a deep understanding of the material."
"T​his course has touched all the aspects of creating a computer from digital logic to a game emulator. Thanks to the instructor for bringing such course"
This course is difficult, but it is also very rewarding. The difficulty of the course varies depending on your background in computer science. If you have no background in computer science, you may find the course to be very challenging. However, if you have some background in computer science, you may find the course to be more manageable.
"This course is amazing! I really enjoyed working on those projects and learning how to build a real computer."
"The course is one of the best courses in my life."

Activities

Be better prepared before your course. Deepen your understanding during and after it. Supplement your coursework and achieve mastery of the topics covered in Build a Modern Computer from First Principles: From Nand to Tetris (Project-Centered Course) with these activities:
Review Programming Concepts in a Preferred Language
Refreshing your programming skills in a preferred language will provide a solid foundation for the hands-on programming projects in the course.
Browse courses on Programming
Show steps
  • Choose a programming language that you are familiar with.
  • Review basic programming concepts such as variables, data types, control flow, and functions.
Review the Syllabus and Course Materials
Reviewing the syllabus and course materials will help you get familiar with the course structure, topics, and expectations, giving you a head start and laying a strong foundation for your learning journey.
Show steps
  • Thoroughly read the course syllabus to understand the course objectives, grading scheme, and schedule.
  • Examine the course materials, including lecture notes, textbooks, and any online resources, to get an overview of the topics that will be covered.
Practice Binary Arithmetic Operations
Practicing binary arithmetic operations will strengthen your understanding of the fundamental concepts used in computer systems and the course projects.
Browse courses on Binary Arithmetic
Show steps
  • Review the basics of binary number representation and arithmetic.
  • Solve practice problems involving binary addition, subtraction, multiplication, and division.
Five other activities
Expand to see all activities and additional details
Show all eight activities
Participate in a Study Group or Discussion Forum
Engaging in discussions with peers will foster collaboration, enhance your understanding of course material, and expose you to diverse perspectives.
Show steps
  • Join a study group or participate in discussion forums related to the course topics.
  • Actively participate in discussions, ask questions, share your insights, and engage with other students' perspectives.
Design and Simulate a Simple Logic Circuit
Designing and simulating a simple logic circuit will provide you with hands-on experience in applying the concepts of Boolean algebra and logic gates, which are essential for understanding computer architecture.
Browse courses on Logic Gates
Show steps
  • Choose a simple logic function to implement, such as an AND gate or an OR gate.
  • Design the logic circuit using logic gates.
  • Simulate the logic circuit using a circuit simulator to verify its functionality.
Explore Online Tutorials on Computer Architecture
Exploring online tutorials on computer architecture will supplement your understanding of the concepts covered in the course and provide additional insights into the design and operation of computer systems.
Browse courses on Computer Architecture
Show steps
  • Search for reputable online resources and tutorials on computer architecture.
  • Select tutorials that cover topics relevant to the course, such as CPU design, memory organization, and instruction sets.
Write a Summary of a Course Lecture
Summarizing a course lecture will help you reinforce your understanding of the material, identify key concepts, and improve your note-taking skills.
Show steps
  • Choose a lecture topic that you find particularly interesting or challenging.
  • Write a concise summary that captures the main points, key terms, and important concepts discussed in the lecture.
Volunteer at a Local Tech Event or Workshop
Volunteering at a tech event or workshop will provide you with practical experience, allow you to connect with industry professionals, and gain valuable insights into the field of computer systems.
Show steps
  • Identify local tech events or workshops that align with your interests.
  • Reach out to the organizers and express your interest in volunteering.

Career center

Learners who complete Build a Modern Computer from First Principles: From Nand to Tetris (Project-Centered Course) will develop knowledge and skills that may be useful to these careers:
Hardware Architect
A Hardware Architect designs the architecture for computer hardware systems. Typically requires a bachelor's degree in computer engineering or a related field. This course can help build a foundation in computer architecture.
Embedded Systems Engineer
An Embedded Systems Engineer designs, develops, and tests embedded systems, which are computer systems that are built into other devices. Typically requires a bachelor's degree in computer engineering or a related field. This course can help build a foundation in embedded systems design and implementation.
Computer Hardware Engineer
A Computer Hardware Engineer designs, develops, and tests computer hardware components, such as processors, motherboards, and memory. This role typically requires a bachelor's degree in computer engineering or a related field. This course can help build a foundation in hardware design and implementation.
Firmware Engineer
A Firmware Engineer designs, develops, and tests firmware, which is software that is embedded in hardware. Typically requires a bachelor's degree in computer engineering or a related field. This course can help build a foundation in firmware design and implementation.
Software Architect
A Software Architect designs and builds the architecture for software systems. Typically requires a bachelor's degree in computer science or a related field. This course can help build a foundation in software architecture.
Computer Programmer
A Computer Programmer writes and tests code that makes computers perform certain actions. This role typically requires a bachelor's degree in computer science or a related field. This course can help build a foundation in programming and computer architecture.
Data Architect
A Data Architect designs and builds the architecture for data storage and retrieval systems. Typically requires a bachelor's degree in computer science or a related field. This course may be useful for building a foundation in computer architecture and data management.
Software Engineer
A Software Engineer designs, develops, and tests software applications. Typically requires a bachelor's degree in computer science or a related field. This course can help build a foundation in software development and computer architecture.
Database Administrator
A Database Administrator manages and maintains databases, ensuring that they are available and secure. Typically requires a bachelor's degree in computer science or a related field. This course may be useful for building a foundation in database management.
Robotics Engineer
A Robotics Engineer designs, builds, and tests robots. Typically requires a bachelor's degree in robotics, computer engineering, or a related field. This course may be useful for building a foundation in computer architecture and embedded systems.
Systems Administrator
A Systems Administrator manages and maintains computer systems, including hardware, software, and networks. Typically requires a bachelor's degree in computer science or a related field. This course may be useful for building a foundation in systems administration.
Network Architect
A Network Architect designs and builds the architecture for computer networks. Typically requires a bachelor's degree in computer science or a related field. This course may be useful for building a foundation in network architecture.
Computer Scientist
A Computer Scientist performs research to advance our understanding of computer systems and to invent new technologies. Typically requires a master's degree or doctorate. This course may be useful for building a foundation in computer science fundamentals.
Web Developer
A Web Developer designs and develops websites and web applications. Typically requires a bachelor's degree in computer science or a related field. This course may be useful for building a foundation in web development and computer architecture.
Computer Systems Analyst
A Computer Systems Analyst studies the way computers are used to solve problems in an enterprise. This role also designs and develops computer applications and systems. Typically requires a bachelor's degree, but it may be possible to enter this career with experience and certification. This course may be useful for building a foundation.

Reading list

We've selected 41 books that we think will supplement your learning. Use these to develop background knowledge, enrich your coursework, and gain a deeper understanding of the topics covered in Build a Modern Computer from First Principles: From Nand to Tetris (Project-Centered Course).
Provides a comprehensive overview of the fundamental concepts of computing, covering topics such as data structures, algorithms, and computer architecture. It is an excellent resource for gaining a deeper understanding of the theoretical foundations of computer science.
Provides a comprehensive overview of computer systems, covering topics such as computer architecture, operating systems, and networking, It is an excellent resource for gaining a deeper understanding of the underlying principles of computer systems.
Classic textbook on computer organization and design. It provides a comprehensive overview of the hardware and software components of computer systems.
Classic textbook on algorithms. It provides a comprehensive overview of the fundamental algorithms used in computer science.
Provides a comprehensive overview of digital design and computer architecture, covering topics such as logic gates, flip-flops, and microprocessors. It is an excellent resource for gaining a deeper understanding of the hardware components of computer systems.
Provides a comprehensive overview of computer security. It is an excellent resource for gaining a deeper understanding of the principles of computer security.
Provides a comprehensive overview of software engineering. It is an excellent resource for gaining a deeper understanding of the principles of software engineering.
Classic work on software engineering. It provides a number of insights into the challenges of software development.
Provides a number of design patterns that can be used to improve the design of software. It is an excellent resource for gaining a deeper understanding of how to design software that is flexible and maintainable.
Provides a number of tips for writing clean code. It is an excellent resource for gaining a deeper understanding of how to write code that is easy to read and maintain.
Provides a detailed overview of digital design and computer architecture, covering topics such as logic gates, combinational circuits, and sequential circuits. It good reference for understanding the hardware design of computers.
Provides a comprehensive overview of operating systems, covering topics such as process management, memory management, and file systems. It good reference for understanding the fundamental concepts of operating systems.
Provides a comprehensive overview of computer networks, covering topics such as network protocols, routing, and security. It good reference for understanding the fundamental concepts of computer networks.
Provides a comprehensive overview of computer networks. It is an excellent resource for gaining a deeper understanding of the principles of computer networking.
Provides a comprehensive overview of computer systems performance analysis, covering topics such as experimental design, measurement, simulation, and modeling. It good reference for understanding how to evaluate the performance of computer systems.
Provides a comprehensive overview of data structures and algorithms, covering topics such as arrays, linked lists, and trees. It good reference for understanding the fundamental concepts of data structures and algorithms.
Provides a comprehensive overview of machine learning, covering topics such as supervised learning, unsupervised learning, and reinforcement learning. It good reference for understanding the fundamental concepts of machine learning.
Provides a comprehensive overview of deep learning, covering topics such as convolutional neural networks, recurrent neural networks, and generative adversarial networks. It good reference for understanding the fundamental concepts of deep learning.
Provides a comprehensive overview of natural language processing, covering topics such as tokenization, stemming, and machine translation. It good reference for understanding the fundamental concepts of natural language processing.
Provides a comprehensive overview of computer architecture, covering topics such as processor design, memory organization, and I/O devices. It good reference for understanding the underlying principles of computer design.
Provides a comprehensive overview of robotics, covering topics such as kinematics, dynamics, and control. It good reference for understanding the fundamental concepts of robotics.
Provides a comprehensive overview of embedded systems, covering topics such as hardware design, software design, and system integration. It good reference for understanding the fundamental concepts of embedded systems.
Provides a comprehensive overview of systems analysis and design, covering topics such as requirements gathering, analysis, and design. It good reference for understanding the fundamental concepts of systems analysis and design.
Provides a good overview of the fundamentals of computer networks, making it a good resource for students who want to learn how computer networks work.
Provides a good overview of the fundamentals of computer security, making it a good resource for students who want to learn how to protect computer systems from attack.
Many computer architecture courses use this book as a textbook. It provides a good overview of the fundamental concepts of computer architecture and includes plenty of exercises and problems.
Provides a good overview of the fundamentals of data structures and algorithms in Python, making it a good resource for students who want to learn how to design and implement efficient data structures and algorithms in Python.
Provides a comprehensive overview of operating systems. It would be a useful reference for students who want to learn more about how operating systems work.
Provides a good overview of the fundamentals of machine learning, making it a good resource for students who want to learn how to design and implement machine learning algorithms.
Provides a good overview of the fundamentals of algorithms, making it a good resource for students who want to learn how to design and implement efficient algorithms.
Provides a good overview of the fundamentals of operating systems, making it a good resource for students who want to learn how operating systems work.
Provides a good overview of the fundamentals of computer graphics, making it a good resource for students who want to learn how to design and implement computer graphics systems.
Provides a good overview of the fundamentals of computer science using Python, making it a good resource for students who want to learn the basics of computer programming.
Covers the fundamentals of computer logic and design. It great book to read in addition to what is covered in the course and also for someone who wants a deeper understanding of computer design.
Provides a comprehensive overview of computer systems, from the basics of computer hardware to the software that runs on them. It would be a useful reference for students who want to learn more about the full stack of computer systems.
Provides a structured overview of computer organization. It would be a useful reference for students who want to learn more about the different levels of computer organization.

Share

Help others find this course page by sharing it with your friends and followers:

Similar courses

Here are nine courses similar to Build a Modern Computer from First Principles: From Nand to Tetris (Project-Centered Course).
Build a Modern Computer from First Principles: Nand to...
Most relevant
Build Your First Android App (Project-Centered Course)
Most relevant
How to Write a Resume (Project-Centered Course)
How To Create a Website in a Weekend! (Project-Centered...
Design and Make Infographics (Project-Centered Course)
How to Make a Comic Book (Project-Centered Course)
Creating Sounds for Electronic Music
Business Model Canvas: A Tool for Entrepreneurs and...
How to Get Skilled: Introduction to Individual Skills...
Our mission

OpenCourser helps millions of learners each year. People visit us to learn workspace skills, ace their exams, and nurture their curiosity.

Our extensive catalog contains over 50,000 courses and twice as many books. Browse by search, by topic, or even by career interests. We'll match you to the right resources quickly.

Find this site helpful? Tell a friend about us.

Affiliate disclosure

We're supported by our community of learners. When you purchase or subscribe to courses and programs or purchase books, we may earn a commission from our partners.

Your purchases help us maintain our catalog and keep our servers humming without ads.

Thank you for supporting OpenCourser.

© 2016 - 2024 OpenCourser