Программа курса

47 уровней от первого провода до FPGA: для каждого — задание, сложность, типичное время и измеримый результат обучения.

1–16 ≈ 330 мин · ≈ 5,5 ч

Часть 1 · Базовые схемы

От первого провода и NAND до счётчика команд: вентили, сумматоры, мультиплексор, SR-защёлка, D-триггер, регистр, АЛУ, тактовый генератор.

17–29 ≈ 415 мин · ≈ 6,9 ч

Часть 2 · Продвинутая архитектура

Дешифратор команд и финальный Harvard-процессор с ассемблером, затем периферия: переменный шаг PC, двойное чтение ROM, указатели IX, шины и порты ввода-вывода, флаги, «Змейка».

30–43 ≈ 360 мин · ≈ 6 ч

Часть 3 · Verilog

Язык описания аппаратуры: примитивы, иерархия модулей, шины, АЛУ, RAM, тракт данных, многофайловые проекты, RTL Viewer и временные диаграммы.

44–47 ≈ 135 мин · ≈ 2,3 ч

Часть 4 · Проектирование компьютера

Блок управления, собственная система команд (ISA), Memory-Mapped I/O и экспорт на реальную FPGA Tang Nano 9K.

47 ≈ 1240 мин

Итого: ≈ 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 мин

1

Да будет свет!

Задание: Соедините источник сигнала (Вход) с приёмником (Выход).

●○○ ≈ 5 мин
После уровня: объяснить, что такое сигнал 0/1, входной/выходной пин и провод, и соединить источник с приёмником
2

Отрицание

Задание: Соберите инвертор (NOT) из элемента NAND. Если на входе 1, на выходе 0.

●○○ ≈ 10 мин
После уровня: объяснить, почему NAND с объединёнными входами превращается в NOT (функциональная полнота)
3

Идеальная пара

Задание: Соберите логическое И (AND).

●○○ ≈ 10 мин
После уровня: собрать AND из NAND + NOT и объяснить композицию операций
4

Хотя бы один

Задание: Соберите логическое ИЛИ (OR).

●○○ ≈ 15 мин
После уровня: собрать OR по закону де Моргана и объяснить формулу NOT(NOT A AND NOT B)
5

Строгий выбор

Задание: Соберите исключающее ИЛИ (XOR).

●○○ ≈ 15 мин
После уровня: собрать XOR из базовых вентилей и объяснить его как «контролируемый инвертор»
6

Полусумматор

Задание: Соберите полусумматор (Half Adder).

●●○ ≈ 15 мин
После уровня: объяснить, как сложение двух битов даёт два выхода (Sum, Carry), и собрать полусумматор
7

Сумматор

Задание: Соберите полный сумматор (Full Adder): 3 входа, 2 выхода.

●●○ ≈ 20 мин
После уровня: объяснить перенос между разрядами и собрать полный сумматор
8

8-битный Сумматор

Задание: Соберите 8-битный сумматор ADDER8, используя FullAdder и шины.

●●○ ≈ 25 мин
После уровня: объяснить, что такое шина и байт, и собрать 8-битный сумматор как цепочку переносов
9

Перекрёсток

Задание: Соберите мультиплексор (MUX): выбирает один из двух входных битов.

●●○ ≈ 20 мин
После уровня: объяснить работу мультиплексора как «цифрового переключателя» и его формулу выбора
10

Замыкание

Задание: Соберите SR-защёлку из NOR. Состояние сохраняется при S=0,R=0.

●●○ ≈ 25 мин
После уровня: объяснить, что такое обратная связь и как два NOR образуют SR-защёлку (первую память)
11

Умный запоминатель

Задание: Соберите D-триггер (DFF). Данные запоминаются по фронту Clock.

●●○ ≈ 30 мин
После уровня: объяснить роль фронта тактового сигнала и работу D-триггера master-slave
12

Осязаемая память

Задание: Соберите 8-битный регистр из DFF. Подключите его выход к LED8.

●●● ≈ 30 мин
После уровня: объяснить, как из 8 триггеров собирается байтовый регистр (параллелизм ячеек)
13

Выбор операции

Задание: Постройте селектор операций. BusMUX выбирает результат: ADD, AND или OR на основе OpSelect.

●●● ≈ 30 мин
После уровня: объяснить, как каскад мультиплексоров маршрутизирует результат нужной операции
14

Сердце математики

Задание: Соберите 8-битное АЛУ (ADD, AND, OR, XOR, NOT, SHL, SHR). Подсказка: декодер->операции->MUX.

●●● ≈ 40 мин
После уровня: объяснить архитектуру АЛУ (декодер → операции → MUX) и назначение флага Zero
15

Пульс системы

Задание: Изучите концепцию тактирования. Нажимайте кнопку ManualClock и наблюдайте за счётчиком на LED8.

●●● ≈ 10 мин
После уровня: объяснить, как такт двигает данные через регистры, и протактировать счётчик вручную
16

Счётчик команд

Задание: Соберите счётчик команд (PC) из Register и ADDER8. Каждый такт увеличивает адрес на 1.

●●● ≈ 30 мин
После уровня: собрать счётчик команд и объяснить цикл регистр → АЛУ → регистр

Часть 2 · Продвинутая архитектура · уровни 17–29 · ≈ 415 мин

17

Анатомия дешифратора

Задание: Соберите логику распознавания 3 опкодов (ADD, STA, JMP) для дешифратора. На выходах LED-индикаторы покажут, какая линия активна.

●●● ≈ 30 мин
После уровня: объяснить, как опкод распознаётся цепочками AND (дешифратор)
18

ФИНАЛ: Компьютер Ершова

Задание: Соберите 8-битный компьютер! Harvard arch: ROM(инструкции) + RAM(данные) + PC + Register + ALU + Decoder + Clock.

●●● ≈ 60 мин
После уровня: объяснить цикл выполнения инструкции и Harvard-архитектуру (ROM + RAM)
19

Шаг вперёд (PC+2)

Задание: Подключите BusConstant(2) к входу Inc счётчика команд, чтобы PC шагал на +2 вместо +1.

●●○ ≈ 15 мин
После уровня: объяснить, зачем счётчику команд переменный шаг (word-формат инструкций)
20

Двойное чтение

Задание: Добавьте вторую ROM для чтения операнда длиной 2 байта. PC шагает на +2.

●●○ ≈ 20 мин
После уровня: объяснить, как один PC адресует два банка ROM (двойное чтение)
21

Указатели

Задание: Добавьте Index Register (IX) для косвенной адресации. Реализуйте LDX, LDAX, STAX, INX в декодере.

●●● ≈ 25 мин
После уровня: объяснить указатели и косвенную адресацию на уровне регистра IX
22

Конфликт на шине

Задание: Исправьте конфликт на шине данных: RAM и Gamepad одновременно выдают данные. Добавьте AddrDecoder и BusAND для гейтирования RAM.

●●● ≈ 30 мин
После уровня: объяснить конфликт на шине и как дешифратор адреса разделяет устройства (гейтирование)
23

Геймпад

Задание: Напишите программу, которая читает геймпад (порт 254) и сохраняет значение в RAM[0].

●●● ≈ 30 мин
После уровня: написать программу чтения порта ввода и объяснить разницу LDA N и ADD N
24

Ручной пиксель

Задание: Подключите 4 BusConstant к MatrixDisplay и зажгите пиксель в (0,0).

●●○ ≈ 25 мин
После уровня: объяснить протокол memory-mapped портов дисплея (X, Y, пиксель) и зажечь пиксель
25

Проверка на минус

Задание: Изучите условный переход JN (Jump if Negative). Запустите тестовую программу и убедитесь, что переход работает.

●●● ≈ 30 мин
После уровня: объяснить флаги состояния (доп. код) и написать программу с условным переходом JN
26

Бросок кубика

Задание: Подключите LFSR (генератор случайных чисел) к шине данных через второй BusOR.

●●○ ≈ 20 мин
После уровня: объяснить, как LFSR генерирует псевдослучайные числа и как третий источник попадает на шину
27

Hello, Ports!

Задание: Измените константы в программе так, чтобы пиксель зажёгся в координатах X=4, Y=12.

●●○ ≈ 25 мин
После уровня: читать и править готовую ассемблерную программу под новое условие
28

Движущаяся точка

Задание: Напишите программу, которая двигает точку по экрану с помощью геймпада.

●●● ≈ 45 мин
После уровня: написать полную программу с переменными в RAM, вводом, ветвлением и циклом
29

ФИНАЛ: Змейка

Задание: Напишите полную игру «Змейка» на ассемблере!

●●● ≈ 60 мин
После уровня: спроектировать игру «Змейка» на ассемблере: состояние, ввод, отрисовка

Часть 3 · Verilog · уровни 30–43 · ≈ 360 мин

30

Hello, Wire!

Задание: Код — это не алгоритм, а чертёж схемы. Вызовите базовый вентиль И, чтобы проложить первые провода в кремнии. Напишите: and gate1(out, a, b);

●○○ ≈ 10 мин
После уровня: объяснить, что Verilog описывает схему, а не алгоритм, и инстанцировать вентиль
31

Строгий выбор в коде (XOR)

Задание: Соберите вентиль XOR, используя только and, or и not. Встроенный xor отключён. Главное правило: строки кода здесь работают одновременно, как соединённые проводники, а не последовательно.

●○○ ≈ 15 мин
После уровня: объяснить параллельность операторов Verilog и собрать XOR из and/or/not без примитива xor
32

Управление потоком (MUX)

Задание: Спроектируйте мультиплексор 2→1. Если sel=0, out=a; если sel=1, out=b.

●○○ ≈ 15 мин
После уровня: перенести схемную задачу (MUX) в структурный Verilog
33

Первое вычисление (HalfAdder)

Задание: Спроектируйте полусумматор. sum = a XOR b, carry = a AND b.

●○○ ≈ 15 мин
После уровня: собрать полусумматор на Verilog (XOR + AND)
34

Иерархия модулей (FullAdder)

Задание: Спроектируйте полный сумматор. sum = a XOR b XOR c_in, c_out = (a AND b) OR (a AND c_in) OR (b AND c_in). Можно использовать HalfAdder из предыдущего уровня.

●●○ ≈ 20 мин
После уровня: объяснить иерархию модулей и переиспользовать собственный HalfAdder
35

Переход к шинам данных (Adder8)

Задание: Спроектируйте 8-битный сумматор. Используйте 8 полных сумматоров (FullAdder) с цепочкой переноса.

●●● ≈ 30 мин
После уровня: собрать 8-битный сумматор инстанцированием 8 FullAdder
36

ALU

Задание: Соберите 8-битное АЛУ. op_code=0: сложение (Adder8), op_code=1: побитовое И. Используйте модули Adder8 и Mux из предыдущих уровней.

●●● ≈ 40 мин
После уровня: объяснить соответствие структуры кода архитектуре (8×and, 8×Mux)
37

Память и Время

Задание: Спроектируйте 8-битный регистр из D-триггеров с помощью generate-for. module Reg8(input wire [7:0] in, input wire clk, output wire [7:0] out);

●●○ ≈ 30 мин
После уровня: объяснить последовательную логику в Verilog (dff, clockPort) и generate-for
38

Шаг за шагом

Задание: Спроектируйте 8-битный счётчик: регистр + сумматор в обратной связи. Константа 8'b00000001 = +1.

●●○ ≈ 25 мин
После уровня: собрать счётчик с обратной связью, разорванной D-триггерами; использовать константы 8'b
39

Оперативная память

Задание: Обвяжите встроенный RAM256 для записи и чтения данных по адресам. Порты RAM256: (clk, we, addr, data, q).

●●● ≈ 30 мин
После уровня: обвязать встроенный RAM256 и объяснить абстракцию black-box
40

Сердце процессора

Задание: Спроектируйте тракт данных: Counter → ROM → ALU → Register. ROM выдаёт числа: 0→5, 1→7, 2→3, 3→10, 4→2. ALU складывает.

●●● ≈ 40 мин
После уровня: собрать datapath (Counter → ROM → ALU → Register) и объяснить тракт данных
41

Анатомия системы

Задание: Соберите верхнеуровневый модуль CPU. Инстанцируйте Reg8 и FullAdder из соседних файлов (register.v, full_adder.v) и соедините их.

●●● ≈ 35 мин
После уровня: объяснить многофайловый проект (VFS) и роли read-only файлов-библиотек
42

Рентген для кремния

Задание: Исследуйте иерархию через RTL Viewer (рентген-аппарат для чипов), найдите неверный вентиль на нижнем уровне и ответьте на вопрос.

●●○ ≈ 20 мин
После уровня: отлаживать иерархию через RTL Viewer drill-down и найти неверно подключённый примитив
43

Остановка времени

Задание: Найдите и исправьте ошибку в FullAdder. Тест падает — откройте осциллограмму (waveform) и найдите неверный провод переноса.

●●● ≈ 35 мин
После уровня: читать временную диаграмму и по ней найти и исправить ошибку в схеме

Часть 4 · Проектирование компьютера · уровни 44–47 · ≈ 135 мин

44

Мозг процессора

Задание: Реализуйте дешифратор инструкций. На вход — 4-битный opcode, на выход — управляющие сигналы (RegWrite, MemWrite, ALUSel, Branch). Используйте вентили AND/OR/NOT.

●●○ ≈ 25 мин
После уровня: спроектировать блок управления: дешифратор опкода → управляющие сигналы
45

Своя инструкция

Задание: Реализуйте 8-битный вычислитель (ALU). Поддержите три операции: ADD (sel=0), AND (sel=1), OR (sel=2). Используйте Adder8 для сложения, вентили для AND/OR, и декодер sel с MUX для выбора результата. Применяйте generate-for.

●●● ≈ 35 мин
После уровня: спроектировать селектор операций ALU: декодер 2-битного кода и MUX выбирают одну из трёх операций
46

Окно в реальный мир

Задание: Реализуйте контроллер ввода-вывода. При записи по адресу 0xFF зажигайте светодиоды (led_out), при чтении 0xFE выдавайте состояние переключателей (switches_in).

●●● ≈ 30 мин
После уровня: объяснить memory-mapped I/O и реализовать LED/переключатели с write-enable регистром
47

Материализация

Задание: Напишите top.v, инстанцируйте CPU и выведите порты. Нажмите "Создать компьютер" для экспорта проекта на Tang Nano 9K.

●●● ≈ 45 мин
После уровня: инстанцировать полный компьютер и экспортировать его на реальную FPGA (ZIP, pin-mapping)

Читайте также

Презентация проекта для школы → · Методическое руководство →