Программа курса
47 уровней от первого провода до FPGA: для каждого — задание, сложность, типичное время и измеримый результат обучения.
Часть 1 · Базовые схемы
От первого провода и NAND до счётчика команд: вентили, сумматоры, мультиплексор, SR-защёлка, D-триггер, регистр, АЛУ, тактовый генератор.
Часть 2 · Продвинутая архитектура
Дешифратор команд и финальный Harvard-процессор с ассемблером, затем периферия: переменный шаг PC, двойное чтение ROM, указатели IX, шины и порты ввода-вывода, флаги, «Змейка».
Часть 3 · Verilog
Язык описания аппаратуры: примитивы, иерархия модулей, шины, АЛУ, RAM, тракт данных, многофайловые проекты, RTL Viewer и временные диаграммы.
Часть 4 · Проектирование компьютера
Блок управления, собственная система команд (ISA), Memory-Mapped I/O и экспорт на реальную FPGA Tang Nano 9K.
Итого: ≈ 21 ч чистого решения
≈ 28 уроков по 45 минут чистого решения; с теорией, статьями и разбором — ≈ 40 уроков (30 ч).
Форматы внедрения в школе
Годовой электив
2 урока в неделю по 45 минут — все 47 уровней проходятся за учебный год.
Полугодовой факультатив
4 урока в неделю — полный курс укладывается в полугодие.
Интенсив
5 дней × 6 часов — формат летней школы или профильной смены.
Поурочное планирование
План рассчитан на годовой формат «2 урока в неделю»: 39 занятий. Обычный урок — до 45 минут; два финальных урока (ФИНАЛ частей 2 и 3) длятся 60. Чистое решение уровней занимает ≈28 уроков, остальное — теория, статьи и разбор. Номер уровня ведёт в его гайд.
| Урок | Уровни | ≈мин | Тема занятия | Теория и разбор | Домашнее задание | Карточка |
|---|---|---|---|---|---|---|
| 1 | 1, 2 | 15 | Сигнал и отрицание | Разбор: сигнал как 0/1 и NAND как универсальный вентиль; после уровня 2 — концепт-чек про NOT из NAND. | Прочитать статью «Логические вентили И, ИЛИ, НЕ». | → |
| 2 | 3, 4 | 25 | AND, OR и де Морган | Разбор статьи «Законы де Моргана»: как собрать недостающий вентиль из того, что есть. | Прогнать таблицы истинности AND и OR на бумаге для всех комбинаций. | → |
| 3 | 5, 6 | 30 | Выбор и первый сумматор | Разбор: чем «строгий выбор» отличается от «хотя бы одного», и почему сложение битов даёт два выхода. | Прочитать статью «Анатомия сумматора». | |
| 4 | 7, 8 | 45 | Перенос и 8-битное сложение | Разбор статьи «Анатомия сумматора»: цепочка переносов от разряда к разряду. | Сложить столбиком три пары 8-битных чисел и выписать переносы. | → |
| 5 | 9 | 20 | Перекрёсток: мультиплексор | Разбор статьи «Мультиплексор: электронный стрелочник»: управляющий провод выбирает маршрут сигнала. | Придумать два места в компьютере, где нужен выбор одного из нескольких сигналов. | → |
| 6 | 10 | 25 | Обратная связь: SR-защёлка | Разбор статьи «Магия обратной связи»: почему схема с петлёй запоминает. | Прочитать статью про SR-защёлку и зарисовать два устойчивых состояния. | |
| 7 | 11 | 30 | D-триггер | Разбор статьи «Тактовый генератор и D-триггер»: запись по фронту такта. | Прочитать статью про такт и D-триггер. | → |
| 8 | 12 | 30 | Регистр: первый байт памяти | Разбор статьи «Регистры: первый байт»: восемь D-триггеров как одна ячейка. | Объяснить кому-нибудь вслух, чем регистр отличается от одного триггера. | → |
| 9 | 13 | 30 | Выбор операции: АЛУ-схема | Разбор статьи «АЛУ — сердце математики»: декодер выбирает операцию, мультиплексор — результат. | Прочитать статью про АЛУ. | → |
| 10 | 14 | 40 | Флаг Zero и сравнение | Разбор: как вычитание и флаг нуля превращают схему в устройство, умеющее сравнивать. | Подумать, какие 8-битные числа не помещаются в беззнаковый диапазон. | → |
| 11 | 15, 16 | 40 | Такт и счётчик команд | Разбор статьи «Счётчик команд»: PC + такт = автомат, исполняющий программу по шагам. | Прочитать статью про счётчик команд. | → |
| 12 | 17 | 30 | Дешифратор команд | Разбор статьи «Дешифратор инструкций»: биты опкода превращаются в управляющие сигналы. | Выписать все 4 опкода и их управляющие сигналы. | → |
| 13 | 18 | 60 | ФИНАЛ: Harvard-процессор целиком | Разбор статьи «Гарвардская архитектура»: почему ROM и RAM разделены и как идёт цикл инструкции. | Зарисовать тракт данных процессора по памяти и сверить с игрой. | → |
| 14 | 19, 20 | 35 | Переменный шаг PC | Разбор концепт-чека уровня 19: шаг счётчика равен размеру инструкции. | Прочитать статью про счётчик команд ещё раз — теперь с шагом +2. | |
| 15 | 21 | 25 | Указатель IX | Разбор статьи «Указатели и индексные регистры»: адрес как данные. | Придумать задачу, где без указателя не обойтись. | |
| 16 | 22 | 30 | Шина и конфликт устройств | Разбор статьи «Конфликты на шине и дешифратор адреса»: кто молчит, когда говорит один. | Прочитать статью про конфликты шины. | → |
| 17 | 23 | 30 | Ассемблер и порт 254 | Разбор статьи «Ассемблер — самый честный язык» и различия LDA/ADD на порте геймпада. | Прочитать статью про ассемблер. | → |
| 18 | 24 | 25 | Пиксель на экране | Разбор: запись байта по адресу дисплея — первый вывод картинки программой. | Нарисовать программой из трёх строк крестик на дисплее. | → |
| 19 | 25 | 30 | Флаги и доп. код | Разбор статьи «Дополнительный код: отрицательные числа»: знак числа и флаги процессора. | Прочитать статью про дополнительный код. | → |
| 20 | 26 | 20 | Псевдослучайные числа | Разбор: откуда в детерминированной схеме берётся «случайность». | Придумать, как получить «случайный» ход от нажатия игрока. | → |
| 21 | 27 | 25 | Порты ввода-вывода | Разбор статьи «Memory-Mapped I/O»: адресное пространство как интерфейс всего. | Прочитать статью про memory-mapped I/O. | → |
| 22 | 28 | 45 | Ветвления и движение | Разбор статьи «Ветвления и циклы» и концепт-чека: JZ физически — MUX перед PC. | Прочитать статью про ветвления и циклы. | → |
| 23 | 29 | 60 | ФИНАЛ: Змейка | Разбор готовой программы Змейки: RAM как переменные, пустой цикл как таймер. | — | → |
| 24 | 30, 31 | 25 | Hello, Verilog и строгий выбор (XOR) | Разбор статьи «Verilog для начинающих»: модуль, порты, первый текст схемы. | Прочитать статью «Verilog — это не программирование». | → |
| 25 | 32, 33 | 30 | Управление потоком и первое вычисление | Разбор: мультиплексор на Verilog и полусумматор (XOR + AND). | Прочитать статью про полусумматор на Verilog. | → |
| 26 | 34 | 20 | Иерархия модулей: FullAdder | Разбор статьи «Verilog: иерархия»: полный сумматор из двух полусумматоров. | Прочитать статью про иерархию модулей. | → |
| 27 | 35 | 30 | Шины и 8-битный сумматор | Разбор статьи «Verilog: шины»: вектор вместо восьми проводов и Adder8 из FullAdder. | Прочитать статью про шины в Verilog. | → |
| 28 | 36 | 40 | Полное АЛУ | Разбор: как знакомая схема из уровня 14 становится текстом и проходит те же тесты. | Сравнить свою схему уровня 14 с текстом уровня 36 построчно. | → |
| 29 | 37 | 30 | Память и такт | Разбор концепт-чека: такт нужен для запоминания, а не для вычисления. | Перечитать статью про такт и D-триггер в Verilog-контексте. | → |
| 30 | 38 | 25 | Счётчик шаг за шагом | Разбор: регистр + сумматор + обратная связь = счётчик; отладка по тактам. | Прочитать статью о последовательностных схемах в гайде уровня. | → |
| 31 | 39 | 30 | RAM как чёрный ящик | Разбор статьи «Verilog: иерархия»: интерфейс важнее внутренностей. | Прочитать статью про иерархию модулей. | → |
| 32 | 40 | 40 | Тракт данных процессора | Разбор: собрать весь тракт данных заново текстом — от регистров до АЛУ. | Сверить текстовый тракт данных со схемой уровня 18. | → |
| 33 | 41 | 35 | Иерархия: CPU из модулей | Разбор статьи «Verilog: иерархия» и многофайловых проектов: инстанцирование — вложение схемы. | Разложить свой проект на файлы по одному модулю. | → |
| 34 | 42 | 20 | RTL Viewer: рентген схемы | Разбор: что синтезатор вырастил из вашего текста и как читать его схему. | Открыть RTL Viewer для уровня 40 и найти в нём свои модули. | → |
| 35 | 43 | 35 | Задержки и осциллограммы | Разбор статьи «Задержка распространения» и чтения временной диаграммы на фронте такта. | Прочитать статью про задержку распространения. | → |
| 36 | 44 | 25 | Устройство управления | Разбор статьи «Дешифратор инструкций»: CU — большой дешифратор без памяти. | Выписать опкоды и управляющие сигналы своей схемы. | → |
| 37 | 45 | 35 | Своя инструкция | Разбор краш-теста: смысл команды задаёт декодер, а не вентили. | Придумать инструкцию, которой не хватает в системе команд. | → |
| 38 | 46 | 30 | Memory-Mapped I/O | Разбор статьи «Memory-Mapped I/O: Гениальный обман процессора»: адрес 0xFF как дверь в реальный мир. | Прочитать статью про memory-mapped I/O. | → |
| 39 | 47 | 45 | Материализация: от Verilog к плате | Разбор статьи «Ershov Board — ТЗ»: синтез в луты и триггеры, маршруты, прошивка Tang Nano 9K. | — | → |
Часть 1 · Базовые схемы · уровни 1–16 · ≈ 330 мин
Да будет свет!
Задание: Соедините источник сигнала (Вход) с приёмником (Выход).
Отрицание
Задание: Соберите инвертор (NOT) из элемента NAND. Если на входе 1, на выходе 0.
Идеальная пара
Задание: Соберите логическое И (AND).
Хотя бы один
Задание: Соберите логическое ИЛИ (OR).
Строгий выбор
Задание: Соберите исключающее ИЛИ (XOR).
Полусумматор
Задание: Соберите полусумматор (Half Adder).
Сумматор
Задание: Соберите полный сумматор (Full Adder): 3 входа, 2 выхода.
8-битный Сумматор
Задание: Соберите 8-битный сумматор ADDER8, используя FullAdder и шины.
Перекрёсток
Задание: Соберите мультиплексор (MUX): выбирает один из двух входных битов.
Замыкание
Задание: Соберите SR-защёлку из NOR. Состояние сохраняется при S=0,R=0.
Умный запоминатель
Задание: Соберите D-триггер (DFF). Данные запоминаются по фронту Clock.
Осязаемая память
Задание: Соберите 8-битный регистр из DFF. Подключите его выход к LED8.
Выбор операции
Задание: Постройте селектор операций. BusMUX выбирает результат: ADD, AND или OR на основе OpSelect.
Сердце математики
Задание: Соберите 8-битное АЛУ (ADD, AND, OR, XOR, NOT, SHL, SHR). Подсказка: декодер->операции->MUX.
Пульс системы
Задание: Изучите концепцию тактирования. Нажимайте кнопку ManualClock и наблюдайте за счётчиком на LED8.
Счётчик команд
Задание: Соберите счётчик команд (PC) из Register и ADDER8. Каждый такт увеличивает адрес на 1.
Часть 2 · Продвинутая архитектура · уровни 17–29 · ≈ 415 мин
Анатомия дешифратора
Задание: Соберите логику распознавания 3 опкодов (ADD, STA, JMP) для дешифратора. На выходах LED-индикаторы покажут, какая линия активна.
ФИНАЛ: Компьютер Ершова
Задание: Соберите 8-битный компьютер! Harvard arch: ROM(инструкции) + RAM(данные) + PC + Register + ALU + Decoder + Clock.
Шаг вперёд (PC+2)
Задание: Подключите BusConstant(2) к входу Inc счётчика команд, чтобы PC шагал на +2 вместо +1.
Двойное чтение
Задание: Добавьте вторую ROM для чтения операнда длиной 2 байта. PC шагает на +2.
Указатели
Задание: Добавьте Index Register (IX) для косвенной адресации. Реализуйте LDX, LDAX, STAX, INX в декодере.
Конфликт на шине
Задание: Исправьте конфликт на шине данных: RAM и Gamepad одновременно выдают данные. Добавьте AddrDecoder и BusAND для гейтирования RAM.
Геймпад
Задание: Напишите программу, которая читает геймпад (порт 254) и сохраняет значение в RAM[0].
Ручной пиксель
Задание: Подключите 4 BusConstant к MatrixDisplay и зажгите пиксель в (0,0).
Проверка на минус
Задание: Изучите условный переход JN (Jump if Negative). Запустите тестовую программу и убедитесь, что переход работает.
Бросок кубика
Задание: Подключите LFSR (генератор случайных чисел) к шине данных через второй BusOR.
Hello, Ports!
Задание: Измените константы в программе так, чтобы пиксель зажёгся в координатах X=4, Y=12.
Движущаяся точка
Задание: Напишите программу, которая двигает точку по экрану с помощью геймпада.
ФИНАЛ: Змейка
Задание: Напишите полную игру «Змейка» на ассемблере!
Часть 3 · Verilog · уровни 30–43 · ≈ 360 мин
Hello, Wire!
Задание: Код — это не алгоритм, а чертёж схемы. Вызовите базовый вентиль И, чтобы проложить первые провода в кремнии. Напишите: and gate1(out, a, b);
Строгий выбор в коде (XOR)
Задание: Соберите вентиль XOR, используя только and, or и not. Встроенный xor отключён. Главное правило: строки кода здесь работают одновременно, как соединённые проводники, а не последовательно.
Управление потоком (MUX)
Задание: Спроектируйте мультиплексор 2→1. Если sel=0, out=a; если sel=1, out=b.
Первое вычисление (HalfAdder)
Задание: Спроектируйте полусумматор. sum = a XOR b, carry = a AND b.
Иерархия модулей (FullAdder)
Задание: Спроектируйте полный сумматор. sum = a XOR b XOR c_in, c_out = (a AND b) OR (a AND c_in) OR (b AND c_in). Можно использовать HalfAdder из предыдущего уровня.
Переход к шинам данных (Adder8)
Задание: Спроектируйте 8-битный сумматор. Используйте 8 полных сумматоров (FullAdder) с цепочкой переноса.
ALU
Задание: Соберите 8-битное АЛУ. op_code=0: сложение (Adder8), op_code=1: побитовое И. Используйте модули Adder8 и Mux из предыдущих уровней.
Память и Время
Задание: Спроектируйте 8-битный регистр из D-триггеров с помощью generate-for. module Reg8(input wire [7:0] in, input wire clk, output wire [7:0] out);
Шаг за шагом
Задание: Спроектируйте 8-битный счётчик: регистр + сумматор в обратной связи. Константа 8'b00000001 = +1.
Оперативная память
Задание: Обвяжите встроенный RAM256 для записи и чтения данных по адресам. Порты RAM256: (clk, we, addr, data, q).
Сердце процессора
Задание: Спроектируйте тракт данных: Counter → ROM → ALU → Register. ROM выдаёт числа: 0→5, 1→7, 2→3, 3→10, 4→2. ALU складывает.
Анатомия системы
Задание: Соберите верхнеуровневый модуль CPU. Инстанцируйте Reg8 и FullAdder из соседних файлов (register.v, full_adder.v) и соедините их.
Рентген для кремния
Задание: Исследуйте иерархию через RTL Viewer (рентген-аппарат для чипов), найдите неверный вентиль на нижнем уровне и ответьте на вопрос.
Остановка времени
Задание: Найдите и исправьте ошибку в FullAdder. Тест падает — откройте осциллограмму (waveform) и найдите неверный провод переноса.
Часть 4 · Проектирование компьютера · уровни 44–47 · ≈ 135 мин
Мозг процессора
Задание: Реализуйте дешифратор инструкций. На вход — 4-битный opcode, на выход — управляющие сигналы (RegWrite, MemWrite, ALUSel, Branch). Используйте вентили AND/OR/NOT.
Своя инструкция
Задание: Реализуйте 8-битный вычислитель (ALU). Поддержите три операции: ADD (sel=0), AND (sel=1), OR (sel=2). Используйте Adder8 для сложения, вентили для AND/OR, и декодер sel с MUX для выбора результата. Применяйте generate-for.
Окно в реальный мир
Задание: Реализуйте контроллер ввода-вывода. При записи по адресу 0xFF зажигайте светодиоды (led_out), при чтении 0xFE выдавайте состояние переключателей (switches_in).
Материализация
Задание: Напишите top.v, инстанцируйте CPU и выведите порты. Нажмите "Создать компьютер" для экспорта проекта на Tang Nano 9K.
Читайте также
Часть 1 · Базовые схемы
- Введение в схемотехнику
- Как устроен компьютер
- Как работает процессор
- Логические вентили И, ИЛИ, НЕ
- Законы де Моргана: Как собрать схему из того, что есть
- Исключающее ИЛИ (XOR)
- От таблицы истинности к схеме: СДНФ и СКНФ
- Минимизация логики: карты Карно
- Анатомия сумматора
- Информационные магистрали (Шины)
- Мультиплексор: электронный стрелочник
- АЛУ: Сердце математики
- Магия обратной связи
- Тактовый генератор и D-триггер
- Регистры: первый байт памяти
- Счётчик команд (Program Counter)
Часть 2 · Продвинутая архитектура
- Гарвардская архитектура: Разделяй и властвуй
- Дешифратор инструкций: Переводчик процессора
- Конфликты на шине и адресное пространство
- Memory-Mapped I/O: Гениальный обман процессора
- Флаги состояния: Как процессор понимает мир
- Ассемблер: самый честный язык программирования
- Указатели и индексные регистры (IX)
- Ветвления и циклы (JZ, JN, JMP)
Презентация проекта для школы → · Методическое руководство →