Course Curriculum
All 47 levels, from the first wire to an FPGA: for each — the task, difficulty, typical time, and a measurable learning outcome.
Part 1 · Basics
From the first wire and a NAND to the program counter: gates, adders, multiplexer, SR latch, D flip-flop, register, ALU, clock.
Part 2 · Advanced Architecture
Instruction decoder and the final Harvard processor with assembler, then peripherals: variable PC step, dual ROM read, IX pointers, buses and I/O ports, status flags, the final Snake.
Part 3 · Verilog
Hardware description language: primitives, module hierarchy, buses, ALU, RAM, datapath, multi-file projects, RTL Viewer, and waveforms.
Part 4 · Computer Design
Control unit, custom instruction set (ISA), memory-mapped I/O, and export to a real Tang Nano 9K FPGA.
Total: ≈ 21 h of pure solving
≈ 28 lessons of 45 minutes of pure solving; with theory, articles, and review — ≈ 40 lessons (30 h).
School implementation formats
Year-long elective
2 lessons a week (45 min each) — all 47 levels fit into one school year.
Half-year club
4 lessons a week — the full course fits into one semester.
Intensive
5 days × 6 hours — a summer school or profile camp format.
Lesson-by-lesson plan
The plan targets the year-long format of two lessons a week: 39 lessons. A regular lesson runs up to 45 minutes; the two finale lessons (parts 2 and 3) take 60. Pure level solving takes ≈28 lessons; the rest is theory, articles, and review. Each level number links to its guide.
| Lesson | Levels | ≈min | Topic | Theory and review | Homework |
|---|---|---|---|---|---|
| 1 | 1, 2 | 15 | Signal and negation | Review: a signal as 0/1 and NAND as a universal gate; after level 2, the concept check on building NOT from NAND. | Read the article on AND, OR, NOT gates. |
| 2 | 3, 4 | 25 | AND, OR and De Morgan | Review the De Morgan article: how to build a missing gate from the ones you have. | Write out AND and OR truth tables on paper for all input combinations. |
| 3 | 5, 6 | 30 | Selection and the first adder | Review: how "all inputs" differs from "at least one", and why adding two bits produces two outputs. | Read the adder anatomy article. |
| 4 | 7, 8 | 45 | Carry and 8-bit addition | Review the adder anatomy article: the carry chain from bit to bit. | Add three pairs of 8-bit numbers by hand and write down the carries. |
| 5 | 9 | 20 | The switch: multiplexer | Review the multiplexer article: a control wire picks the signal route. | Come up with two places in a computer that need to pick one of several signals. |
| 6 | 10 | 25 | Feedback: the SR latch | Review the feedback article: why a circuit with a loop remembers. | Read the SR latch article and sketch its two stable states. |
| 7 | 11 | 30 | D flip-flop | Review the clock and D flip-flop article: writing on the clock edge. | Read the clock and D flip-flop article. |
| 8 | 12 | 30 | Register: the first byte of memory | Review the registers article: eight D flip-flops acting as one cell. | Explain out loud how a register differs from a single flip-flop. |
| 9 | 13 | 30 | Operation select: the ALU scheme | Review the ALU article: the decoder picks the operation, the multiplexer picks the result. | Read the ALU article. |
| 10 | 14 | 40 | The Zero flag and comparison | Review: how subtraction and the zero flag turn a circuit into a device that can compare. | Think about which numbers do not fit into the unsigned 8-bit range. |
| 11 | 15, 16 | 40 | The clock and the program counter | Review the program counter article: PC plus clock makes a machine that steps through a program. | Read the program counter article. |
| 12 | 17 | 30 | The instruction decoder | Review the instruction decoder article: opcode bits become control signals. | Write down all 4 opcodes and their control signals. |
| 13 | 18 | 60 | FINALE: the full Harvard processor | Review the Harvard architecture article: why ROM and RAM are separate and how the instruction cycle runs. | Sketch the processor datapath from memory and check it against the game. |
| 14 | 19, 20 | 35 | Variable PC step | Review the level 19 concept check: the PC step equals the instruction size. | Re-read the program counter article, now with the +2 step. |
| 15 | 21 | 25 | The IX pointer | Review the pointers and index registers article: an address used as data. | Think of a task that is impossible without a pointer. |
| 16 | 22 | 30 | The bus and device conflicts | Review the bus conflicts and address decoder article: everyone stays quiet while one device talks. | Read the bus conflicts article. |
| 17 | 23 | 30 | Assembler and port 254 | Review the assembly article and the LDA/ADD difference using the gamepad port. | Read the assembly article. |
| 18 | 24 | 25 | A pixel on screen | Review: writing a byte to the display address — the first picture drawn by a program. | Draw a cross on the display with a three-line program. |
| 19 | 25 | 30 | Flags and two's complement | Review the two's complement article: number sign and CPU flags. | Read the two's complement article. |
| 20 | 26 | 20 | Pseudo-random numbers | Review: where "randomness" comes from in a deterministic circuit. | Think of how to get a "random" move from a player's keypress. |
| 21 | 27 | 25 | I/O ports | Review the memory-mapped I/O article: the address space as the interface to everything. | Read the memory-mapped I/O article. |
| 22 | 28 | 45 | Branching and movement | Review the branching and loops article and the concept check: JZ is physically a MUX before the PC. | Read the branching and loops article. |
| 23 | 29 | 60 | FINALE: Snake | Review the finished Snake program: RAM as variables, an empty loop as the timer. | — |
| 24 | 30, 31 | 25 | Hello, Verilog and strict choice (XOR) | Review the Verilog for beginners article: a module, its ports, the first textual circuit. | Read the "Verilog is not programming" article. |
| 25 | 32, 33 | 30 | Flow control and first computation | Review: a multiplexer in Verilog and a half adder (XOR + AND). | Read the Verilog half adder article. |
| 26 | 34 | 20 | Module hierarchy: FullAdder | Review the Verilog hierarchy article: a full adder from two half adders. | Read the module hierarchy article. |
| 27 | 35 | 30 | Buses and the 8-bit adder | Review the Verilog buses article: a vector instead of eight wires, and Adder8 from FullAdder. | Read the Verilog buses article. |
| 28 | 36 | 40 | The full ALU | Review: how the familiar circuit of level 14 becomes text and passes the same tests. | Compare the level 14 schematic with the level 36 text line by line. |
| 29 | 37 | 30 | Memory and the clock | Review the concept check: the clock is for storing, not for computing. | Re-read the clock and D flip-flop article in the Verilog context. |
| 30 | 38 | 25 | A counter step by step | Review: register plus adder plus feedback equals a counter; debugging tick by tick. | Read the sequential circuits section of the level guide. |
| 31 | 39 | 30 | RAM as a black box | Review the Verilog hierarchy article: the interface matters more than the insides. | Read the module hierarchy article. |
| 32 | 40 | 40 | The processor datapath | Review: rebuild the whole datapath as text, from registers to the ALU. | Compare the textual datapath with the level 18 schematic. |
| 33 | 41 | 35 | Hierarchy: a CPU from modules | Review the Verilog hierarchy article and multi-file projects: instantiation embeds a circuit. | Split your project into one file per module. |
| 34 | 42 | 20 | RTL Viewer: an X-ray of the circuit | Review: what the synthesizer grew from your text and how to read its schematic. | Open the RTL Viewer for level 40 and find your modules in it. |
| 35 | 43 | 35 | Delays and waveforms | Review the propagation delay article and reading a waveform at the clock edge. | Read the propagation delay article. |
| 36 | 44 | 25 | The control unit | Review the instruction decoder article: the CU is a big decoder without memory. | Write down the opcodes and control signals of your circuit. |
| 37 | 45 | 35 | A custom instruction | Review the crash test: the decoder defines what a command means, not the gates. | Think of an instruction missing from the instruction set. |
| 38 | 46 | 30 | Memory-Mapped I/O | Review the memory-mapped I/O article: address 0xFF as a door to the real world. | Read the memory-mapped I/O article. |
| 39 | 47 | 45 | Materialization: from Verilog to the board | Review the Ershov Board spec article: synthesis into LUTs and flip-flops, routing, flashing the Tang Nano 9K. | — |
Part 1 · Basics · Levels 1–16 · ≈ 330 min
Let there be light!
Task: Connect the signal source (Input) to the receiver (Output).
Negation
Task: Build a NOT gate from a NAND. When the input is 1, the output should be 0.
Perfect pair
Task: Build a logical AND gate.
At least one
Task: Build a logical OR gate.
Strict choice
Task: Build an Exclusive OR (XOR) gate.
Half Adder
Task: Build a Half Adder.
Full Adder
Task: Build a Full Adder: 3 inputs, 2 outputs.
8-bit Adder
Task: Build an 8-bit adder (ADDER8) using FullAdders and buses.
Crossroads
Task: Build a multiplexer (MUX): selects one of two input bits.
Loopback
Task: Build an SR latch from NOR gates. State is held when S=0, R=0.
Smart memory
Task: Build a D flip-flop (DFF). Data is captured on the rising edge of the Clock.
Tangible Memory
Task: Build an 8-bit register from DFFs. Connect its output to LED8.
Operation Selection
Task: Build an operation selector. BusMUX picks the result: ADD, AND, or OR based on OpSelect.
Heart of math
Task: Build an 8-bit ALU (ADD, AND, OR, XOR, NOT, SHL, SHR). Hint: decoder -> operations -> MUX.
System Pulse
Task: Learn the concept of clocking. Press ManualClock and watch the counter on the LED8.
Program Counter
Task: Build a Program Counter (PC) from a Register and ADDER8. Each clock tick increments the address by 1.
Part 2 · Advanced Architecture · Levels 17–29 · ≈ 415 min
Anatomy of a Decoder
Task: Build the recognition logic for 3 opcodes (ADD, STA, JMP) in the decoder. LED indicators on the outputs show which line is active.
FINALE: The Ershov Computer
Task: Build an 8-bit computer! Harvard architecture: ROM (instructions) + RAM (data) + PC + Register + ALU + Decoder + Clock.
Step Forward (PC+2)
Task: Connect BusConstant(2) to the PC Inc input so the PC steps by +2 instead of +1.
Dual Read
Task: Add a second ROM for reading 2-byte operands. PC steps by +2.
Pointers
Task: Add Index Register (IX) for indirect addressing. Implement LDX, LDAX, STAX, INX in the decoder.
Bus Conflict
Task: Fix the data bus conflict: RAM and Gamepad both drive the bus. Add AddrDecoder and BusAND to gate the RAM output.
Gamepad
Task: Write a program that reads the gamepad (port 254) and stores the value in RAM[0].
Manual Pixel
Task: Connect 4 BusConstants to the MatrixDisplay and light up pixel at (0,0).
Negative Check
Task: Learn the JN (Jump if Negative) conditional jump. Run the test program and verify the jump works.
Dice Roll
Task: Connect the LFSR (random number generator) to the data bus via a second BusOR.
Hello, Ports!
Task: Change the constants in the program so the pixel lights up at X=4, Y=12.
Moving Dot
Task: Write a program that moves a dot on the screen using the gamepad.
FINALE: Snake
Task: Write a complete Snake game in assembly!
Part 3 · Verilog · Levels 30–43 · ≈ 360 min
Hello, Wire!
Task: Code is not an algorithm — it is a circuit blueprint. Call the basic AND gate to route your first wires in silicon. Write: and gate1(out, a, b);
Strict Choice in Code (XOR)
Task: Build an XOR gate using only and, or, and not. The built-in xor is disabled. Key rule: lines of code here work simultaneously, like connected conductors, not sequentially.
Flow Control (MUX)
Task: Design a 2→1 multiplexer. If sel=0, out=a; if sel=1, out=b.
First Computation (HalfAdder)
Task: Design a half adder. sum = a XOR b, carry = a AND b.
Module Hierarchy (FullAdder)
Task: Design a full adder. sum = a XOR b XOR c_in, c_out = (a AND b) OR (a AND c_in) OR (b AND c_in). You may use HalfAdder from the previous level.
Data Buses (Adder8)
Task: Design an 8-bit adder. Use 8 full adders (FullAdder) in a ripple-carry chain.
ALU
Task: Build an 8-bit ALU. op_code=0: add (Adder8), op_code=1: bitwise AND. Use Adder8 and Mux modules from previous levels.
Memory and Time
Task: Design an 8-bit register from D flip-flops using generate-for. module Reg8(input wire [7:0] in, input wire clk, output wire [7:0] out);
Step by Step
Task: Design an 8-bit counter: register + adder in feedback. Constant 8'b00000001 = +1.
Random Access Memory
Task: Wrap the built-in RAM256 for reading and writing data by address. RAM256 ports: (clk, we, addr, data, q).
Heart of the CPU
Task: Design the datapath: Counter → ROM → ALU → Register. ROM data: 0→5, 1→7, 2→3, 3→10, 4→2. ALU adds.
System Anatomy
Task: Build the top-level CPU module. Instantiate Reg8 and FullAdder from neighboring files (register.v, full_adder.v) and connect them.
X-Ray for Silicon
Task: Explore the hierarchy through the RTL Viewer (X-ray machine for chips), find the wrong gate at the lowest level, and answer the question.
Freezing Time
Task: Find and fix the bug in FullAdder. The test fails — open the waveform scope and find the wrong carry wire.
Part 4 · Computer Design · Levels 44–47 · ≈ 135 min
Control Unit
Task: Implement the instruction decoder. Input: 4-bit opcode, outputs: control signals (RegWrite, MemWrite, ALUSel, Branch). Use AND/OR/NOT gates.
My ISA
Task: Build an 8-bit ALU. Support three operations: ADD (sel=0), AND (sel=1), OR (sel=2). Use Adder8 for addition, gates for bitwise AND/OR, and a sel decoder with MUX to select the result. Use generate-for loops.
Memory-Mapped I/O
Task: Implement an I/O controller. Writing to address 0xFF updates LEDs (led_out), reading 0xFE returns switch states (switches_in).
Create Computer
Task: Write top.v, instantiate the CPU, and wire the ports. Press "Build Computer" to export the project to Tang Nano 9K.
Related reading
Part 1 · Basics
- Introduction to Circuit Design
- How a Computer Works
- How a Processor Works
- Logic Gates: AND, OR, NOT
- De Morgan's Laws
- XOR Gate
- From Truth Table to Circuit: SOP and POS
- Logic Minimization: Karnaugh Maps
- Anatomy of an Adder
- Information Buses
- Multiplexer: Electronic Switch
- ALU: Heart of Math
- The Magic of Feedback
- Clock and D Flip-Flop
- Registers: First Byte of Memory
- Program Counter