От Цифровой Логики к Процессору через ПЛИС
Программа годового курса для школьников физматшкол
Юрий Панчул, 2026-08-22

Этот текст предназначен для работы с преподавателями. При использовании в своих материалах или на вебсайтах просьба ссылаться “Программа разработана вместе с Юрием Панчулом (с использованием материалов от Юрия Панчула) / Yuri Panchul / verilog-meetup.com”. В свою очередь я готов ставить ссылки на всех преподавателей, адаптирующих данную программу, в своих материалах, блогах и публикациях.

Зачем нужен этот курс

В картине мира, представляемой школьным образованием, существует “слепое пятно” в области принципов проектирования цифровой электроники, между физикой и программированием. Курсы роботики и ардуино это слепое пятно не закрывают, так как сводятся к программированию готовых чипов и их интеграции с сенсорами и актуаторами, то бишь проектированию систем.

Существующие упражнения с дискретными элементами и микросхемами малой степени интеграции (7400 и CMOS 4000) представляют собой косметическую переработку курсов 1970-х годов и оторваны от реальной работы проектировщика микросхем в современной электронной компании. Удалить эти упражнения нельзя, посколько никто с 1968 года не придумал лучшего способа демонстрации работы D-триггера, чем макетная плата с микросхемой CMOS 4013. А с D-триггерами даже современный разработчик имеет дело каждый день, перескочить через это знание нельзя, и в упражнениях на программирование Ардуино/Распберри Пай D-триггеры не возникают.

При этом простая переработка упражнений с микросхемами малой степени интеграции слепое пятно не закрывает, так как сложность схем, которые на них можно спроектировать - ограничена. Например, на таких микросхемах непрактично проектировать даже простой процессор, хотя некоторые школьники это сделали - см. напр. заметку Small-Scale Integration Stepping Stones.

Слепое пятно можно закрыть с помощью введения элементов языков описания аппаратуры (ЯОА) SystemVerilog и доступные для школьного экспериментирования микросхемы ПЛИС/FPGA (Программируемые Логические Интегральные Схемы - Field Programmable Gate Arrays) - матрицы реконфигурируемых логических элементов. В них можно строить работающие цифровые схемы просто меняя содержимое памяти конфигурации. В базовом ПЛИС нет своего процессорного ядра, в отличии от микроконтроллера AVR на плате Ардуино, в котором есть ядро, фиксированное на фабрике. Но из ячеек внутри ПЛИС можно построить собственный процессор, в том числе и вариацию вышеупомянутого AVR в Ардуино.

Более того, сейчас стали доступны сервисы типа TinyTapeout, которые позволяют даже школьникам и студентам за доступную сумму (от $50 на схему + $300 плата) производить собственные чипы ASIC (Application Specific Integrated Circuit) на фабрике; мы делаем это в рамках предложенного курса.

После выполнения упражнений курса, картина мира у школьников становится цельной, без разрыва между физикой и программированием. Это способствует созданию среды для появления большого количества молодых инженеров, которые понимают и программную, и цифровую аппаратную стороны современных микросхем для широкого спектра приложений: смартфонов, интернета вещей, аппаратных ускорителей ML, самоуправляемых автомобилей итд.

Введение ЯОА и ПЛИС в школьную программу также хорошо привязывается к курсу математики и физики физматшкол - булевская алгебра, арифметические схемы, конечные автоматы.

Заметим, что ЯОА и ПЛИС, несмотря на поверхностное сходство с программированием, используют другие базовые концепции:

  • Программирование: последовательное исполнение, ветви выбора, циклы, переменные, выражения, массивы (c моделью плоской адресуемой памяти), функции (на основе использования стека), рекурсия.

  • Проектирование цифровой логики: комбинационный логический элемент; построение из этих элементов облаков комбинационной логики, включающей примитивы выбора с помощью мультиплексоров, а также блоки для реализации арифметических выражений; концепция тактового сигнала для синхронизации вычислений и повторения, концепция D-триггера для хранения текущего состояния между тактами; конечный автомат; параллельность операций, иерархия модулей, концепция конвейера (не только для процессора, но и для арифметических блоков).Внедрение элементов ЯОА и ПЛИС в школьную программу поможет обогатить и обновить ее для 21 века, как внедрение элементов программирования помогло улучшить школьную программу в 1980-х годах.

Если у вас при прочтении возник один из следующих вопросов:

  1. “FPGA - это Ардуино?”

  2. “FPGA - это Распберри Пай?”

  3. “Разве микросхемы малой степени интеграции не устарели и не были заменены Ардуино?”

  4. Школьников лучше вводить с МикроПитона!

  5. А давайте сначала научим школьников STM32!

то у меня есть специальный ответ с картинками на одном листке бумаги, правда на английском: Одна страничка для ответа на вопросы про FPGA и рассыпуху на городских ярмарках.

Секции программы

  1. Цифровая логика на микросхемах малой степени интеграции.

  2. Язык описания аппаратуры SystemVerilog и реализация схем на ПЛИС/FPGA.

  3. Архитектура процессора и язык ассемблера RISC-V на симуляторе системы команд.

  4. Микроархитектура процессорных ядер и реализация процессора на ПЛИС/FPGA.

  5. Интеграция процессора в систему: ввод-вывод от сенсоров и параллелизм через прерывания.

  6. Изготавливаем микросхему ASIC на фабрике через сервис TinyTapeout.

  7. [Возможный исследовательский проект: создание библиотеки для открытого средства проектирования Yosys для синтеза схем малой степени интеграции из кода на верилоге.]

Мы сознательно пропускаем весь транзисторный уровень, потому что взрослый проектировщик на уровне регистровых передач (*) в электронной компании в реальной жизни его не видит. Транзисторный уровень скрыт внутри ячеек ASIC library, которая используется для синтеза схем программами типа Synopsys Fusion, Cadence Genus/Innovus и Yosys OSS CAD Suite. Проектировщик видит физические эффекты косвенно, через отчеты о площади получившихся схем, критических временных путях между D-триггерами (static timing analysis), статическом и динамическом энергопотреблении. Энергопотребление анализируется тулами типа Synopsys PrimeTime PX и Cadence Joule и мы не ставим целью объяснить его школьникам, разве что в порядке 20-минутной научпопной лекции в конце курса.

(*) RTL Designer. RTL = Register Transfer Level. Уровень абстракции при котором схема рассматривается в виде комбинационных облаков (графов из логических элементов без циклов) между элементами состояния (D-триггерами которые образуют регистры - не путать с видимыми программисту регистрами в ассемблере). Комбинационные облака вычисляют состояние D-триггеров для следующего такта на основе состояния в предыдущем такте.

За счет пропуска транзисторного уровня мы высвобождаем время курса для микроархитектурных конструкций, архитектуры процессора, работе с SystemVerilog и синтезу с FPGA и ASIC.

Секция 1. Цифровая логика на микросхемах малой степени интеграции.

Занятие 1.1. Булевская алгебра на логических элементах.

Устройство беспаечной макетной платы, подключение к ней стабильного питания 5V через переходник от USB (альтернатива: переходник выдающий 5V на выходе с батарейкой 9V на входе), работа на ней толерантного к 5V светодиода (с ограничением тока) и гребенки из 8 подобных светодиодов, работа на ней кнопок со встроенными подтягивающими резисторами, чтобы учащиеся не вставляли дополнительных резисторов вообще (за исключением семисегментных индикаторов в следущих занятиях) и схемы были бы минималистическими.

После освоения питания, переходников, LED (индивидуальных и гребенок с общим катодом) и кнопок каждый ученик получает микросхему CMOS 4070, 2-входовый XOR и демонстрирует ее функциональность.

После этого половина учеников получает 4081, 2-входовый AND, а другая половина 4071, 2-входовый OR. Также все получают инверторы 4069. Задача - продемонстрировать два случая правил де Моргана:

~ (A & B) == ~ A | ~ B ~ (A | B) == ~ A & ~ B

Эти правила пригодятся в последующих занятиях когда ученик будет строить конечные автоматы для распознавания последовательностей нажатий ("кодовый замок") и подобные схемы.

После этого каждый ученик получает индивидуальную микросхему из следующего списка и даташит на нее, демонстрирует и документирует ее функциональность: описание словами что она делает (для NOR: “выдает 1 только если все входы нули и 0 в противном случае”) и таблицу истинности.

  • 4073 Triple 3-input AND

  • 4082 Dual 4-input AND

  • 4011 Quad 2-input NAND

  • 4012 Dual 4-input NAND

  • 4023 Triple 3-input NAND

  • 4068 8-input AND/NAND

  • 4001 Quad 2-input NOR

  • 4002 Dual 4-input NOR

  • 4025 Triple 3-input NOR

  • 4078 8-input NOR

  • 4072 Dual 4-input OR

  • 4075 Triple 3-input OR

  • 4077 Quad 3-input XNOR

Если на третью часть времени не хватит, ученики могут делать это как домашнее задание.

Более детальные инструкции по этому заданию приведены в заметке: Из обучения школьников цифре на макетке нужно выкинуть все резисторы и вставить микросхемы с FIFO

Обратите внимание, что в схемах на фотографиях ниже нет резисторов, так как мы:

  1. Используем специальные 5V-толерантные светодиоды с ограничением тока.

  2. Используем кнопки с встроенными подтягивающими резисторами.

  3. Используем блок питания который выдает стабильные 5 вольт.

Для питания есть пять работающих альтернатив:

  1. USB-DC переходник, который выдает 9 вольт, которые блок питания понижает до 5V. На блоке питания переключатель должен стоять на 5V (не 3.3V). Если использовать переходник USB-DC, который выдает 5 вольт, то схема будет работать плохо (как минимум тусклые светодиоды), так как блок питания снизит напряжение до 3.5V, даже если поставить переключатель на 5V (а не 3.3V).

  2. Использование батарейки на 9V с DC переходником и установкой на блоке питания 5V (не 3.3V). При этом блок питания тоже выдаст стабильные 5V.

  3. Прямое подключение USB к USB, мини-USB или микро-USB на блоке питания.

  4. Переходник без понижения напряжения, с использованием переходника USB-DC, который выдает 5 вольт.

  5. 5V с пина на плате Ардуино, которая используется чисто как источник питания.

Все ссылки на компоненты

В варианте на этой фотографии мы используем USB-DC переходник, который выдает 9 вольт, которые блок питания понижает до 5V. Мост на блоке питания стоит так чтобы выдавалось 5V а не 3.3V:

А вот на этой фотографии мы используем переходник без понижения напряжения, с использованием переходника USB-DC, который выдает 5 вольт. Здесь мы перенесли схему с беспаечной макетной платы на плату с пайкой:

Некоторые джентлемены пошли в ChatGPT и оно им сказало что якобы при светодиоде всегда нужно ставить резистор. Сайт магазина говорит иное: "No need to use current limiting resister. Hook up directly to +5V or +12V."

Занятие 1.2. Двоичные числа, сумматор и декодер для семисегментного индикатора.

В этом занятии мы не ставим целью показать как работает сумматор внутри, это будет сделано в другом занятии. Мы просто хотим, чтобы ученики поупражнялись с двоичными числами, сумматором как черным ящиком и научились выводить результаты вычислений в десятичном и шестнадцатеричном виде.

Все ученики получают микросхемы комбинационного 4-битного сумматора 4008. Каждый собирает схему сложения с вводом слагаемых через кнопки (или просто втыкая провода в VCC +5V и GND) и выводом на светодиодную гребенку суммы и переноса.

Вторая часть урока - исследование семисегментного индикатора с общим катодом и подсоединение его к выходу от сумматора через BCD-декодер/драйвер семисегментного индикатора 4511.

Сначала ученики подсоединяют семисегментный индикатор к земле/GND через сопротивление 560 Ом и 1/2 ватта (у него оптимальная толщина ножек для втыкания в макетную плату). Затем они исследуют загорание каждого сегмента, втыкая соотвествующий вход в VCC +5V.

После этого ученики соединяют выход от сумматора к входам 4511 и выходы из 4511 через сопротивления 560 Ом и 1/2 ватта - к входам 4511. Перенос выводится точку в индикаторе.

Если доступен чип DM9368 (декодер в шестнадцатеричные числа), его лучше использовать чем 4511 (который декодирует только а 0-9).

Если времени на вторую часть не хватит, это упражнение можно дать как домашнее задание.

Сумматор на микросхеме 4008 построенный 11-летним Матвеем под руководством отца. Схема перенесена из беспаечной макетной платы на плату с пайкой, Матвей хорошо умеет паять:

Занятие 1.3. Тактовый сигнал, D-триггер и его применение для последовательностных схем.

Каждый ученик получает микросхему 4013 и уже собранный генератор тактового сигнала на основе микросхемы 555, настроенный на частоту около 0.5 герц (период тактового сигнала около 2 секунд). Он исследует как информация запоминается во внутренее состояние D-триггера во время положительного фронта тактового сигнала. Ученик видит, что изменения входа внутри такта игнорируются.

Мы сознательно пропускаем сборку генератора на 555, а также SR-защелку, D-защелку, JK-триггер и T-триггер, поскольку из всех этих компонент взрослый проектировщик на уровне регистровых передач в электронной компании в реальной жизни видит только D-триггер и иногда D-защелку. D-защелка нужна для экономии динамического энергопотребления в medium grain clock gaters, реже в latch arrays, а также в схемах с time borrowing - все это неактуально в курсах для школьников. Мы используем только D-триггер как черный ящик чтобы высвободить время курса для актуального материала - микроархитектурных конструкций.

Далее половине учеников выдается микросхема счетчика 4029, а другой половине микросхема сдвигового регистра 4015 работающего в режиме SiPo – serial input / parallel output - ввод бита с кнопки, вывод всего состояния на гребенку из светодиодов. Ученики делают демонстрации этих схем.

Заметка с некоторыми примерами счетчиков:

Школьники рассказывают на видео чему они научились за три сеанса работы с микросхемами малой степени интеграции

На фотографии две схемы, со сдвиговыми регистрами и со счетчиками, собранные школьниками Тимофеем и Нилом. Обратите внимание что гребенки светодиодов не используют резисторы, но вот для семисегментных индикаторов резисторы на 560 ом 1/2 ватта ставить приходится. Почему 1/2 ватта? Такие удобнее всего вставлять в дыру в макетной плате - оптимальная толщина ножек.

Занятие 1.4. Комбинационный сумматор внутри и побитовый последовательностный сумматор.

Сначала ученики строят однобитный полусумматор с переносом, используя XOR и AND.

Затем можно разделить учащихся на три группы:

1). Первая группа строит полные сумматоры однобитовых чисел с carry_in и carry_out, из логических элементов.

2). Вторая группа строит каскад из двух четырехбитных сумматоров 4008 для демонстрации сложения восьмибитных чисел.

3). Третья группа готовит демонстрацию готового побитового последовательностного сумматора, микросхемы 4032. Для этого на два входа 4032 идут выходы из двух сериализаторов, сдвиговых регистров 4014 (PiSo – parallel input / serial output). А на выходе из 4032 стоит десериализатор - уже исследованный сдвиговый регистр 4015 (SiPo – serial input / parallel output). Все три сдвиговых регистра работают от одного и того же тактового сигнала. Из такой схемы наглядно видно как слагаемые при нажатии кнопки load (загрузка аргументов) превращаются в потоки бит, затем эти потоки пропускаются через 4032 и выходной потом бит с суммой десериализируется.

Разбор задания для группы (3) в заметке:

Как обучить школьников работать в группах проектирования с помощью многоплатных проектов.

В конечном итоге можно заменить 4032 из задания для группы (3) на комбинацию полного сумматора из задания для группы (1) и D-триггера для хранения переноса (микросхема 4013). Это продемонстрирует что происходит внутри 4032.

Занятие 1.5. Использование очереди FIFO для сложения аргументов, приходящих в разных тактах.

Взрослый проектировщик микросхем использует очереди FIFO (First In First Out) каждый день, это важная микроархитектурная конструкция. Оказывается она существует в виде микросхемы CMOS 40105, поэтому грех ею не воспользоваться, хотя детально устройство FIFO будет разбираться только в секции по языку описания аппаратуры SystemVerilog.

Функционально FIFO - это просто двумерный массив из D-триггеров с двумя указателями (тоже регистров из D-триггеров), которые также называют адресами и иногда индексами. write/put_pointer и read/get_pointer. Работает это так (gif отсюда):

В предлагаемом упражнении ученик должен объединить три FIFO-буфера 40105 с сумматором 4008. Такая конструкция позволяет:

  1. Складывать числа, которые пришли в разных тактах. По английски это называется aligning the pipeline.

  2. Задерживать выдачу результата, если принимающий блок к приему не готов. То есть осуществлять контроль потока данных - data flow control with backpressure.

Важное но: схема c 40105 еще до конца не опробована, но мы опробуем ее за неделю или две. Насколько понятно из даташита , push или pop делается импульсом, и чтобы все синхронизировать с другими компонентами, нужно сделать shift_in = clock & push. Такое использование тактового сигнала было бы нарушением методологии во "взрослом" проектировании на SystemVerilog, но в данном случае мы будем рассматривать это как допустимое исключение.

Вообще мне неизвестен туториал по микросхемам малой степени интеграции, который использовал очереди FIFO. На них, точнее на их применении, сыпятся даже выпускники ведущих американских университетов на собеседовании на работу, хотя идея довольно проста, ее можно объяснить и продвинутому школьнику. См. заметки:

FIFO для самых маленьких (вместе с вопросами на интервью).

Третий вопрос на интервью в электронные компании.

Занятие 1.6. Часто используемые блоки.

Вероятно каждый ученик должен сам или в паре собрать две важные схемы:

  1. Демонстрацию работы одного из мультиплексоров: 4051, 4052, 4053, 4019.

  2. Демонстрация приоритетного шифратора 4532 (8 в 3). Стоит использовать 4511 для отображения выходного сигнала в десятичном виде.

Другие задания такого рода можно распределить на всю группу в формате индивидуальных проектов. В конце занятия каждый ученик может показать другим свой результат. Список:

  1. Демонстрация реконфигурируемого логического элемента 4048.

  2. Демонстрация 4-разрядного комбинационного компаратора 4063.

  3. Демонстрация дешифратора 4028. Он будет использоваться в проектах для замены мультиплексора комбинацией дешифратора и селектора на элементах И и ИЛИ.

  4. Демонстрация десятичного счетчика 4017 с дешифрированными выходами.

  5. Демонстрация работы регистрового файла 4x4 40108. Это редкая микросхема.

  6. Демонстрация 4-разрядного АЛУ 40181. Это редкая микросхема.

  7. Замените мультиплексор 4051 эквивалентной схемой на базе дешифратора 4028 и селектора, построенного на элементах AND и OR.

  8. Замените мультиплексор 4051 эквивалентной схемой на базе дешифратора 4028 и селектора, использующего элемент 4086 (AND-OR-NOT) и инвертор 4069.

  9. Замените мультиплексор 4052 эквивалентной схемой на базе дешифратора 4555 и селектора, построенного на элементах AND и OR.

  10. Замените мультиплексор 4052 эквивалентной схемой на базе дешифратора 4555 и селектора, использующего элемент 4086 (AND-OR-NOT) и инвертор 4069.

  11. Продемонстрируйте работу селектора данных 4019, выполняющего объединение двух битовых векторов по маске. Сравните это решение с эквивалентной реализацией на базовых логических элементах.

  12. Счетчик Джонсона на базе сдвигового регистра 4015 и инвертора 4069.

  13. Более сложный проект: round-robin арбитр на два запроса и два гранта. Арбитры часто используют во "взрослом" проектировании, например когда два вычислительных блока разделяют ресурсы, например общую память. Написать такой арбитр на верилоге - это хороший начальный вопрос для собеседования студента в электронную компанию. При этом такой арбитр можно построить всего на 4 микросхемах малой степени интеграции: AND, NAND, OR и D-триггере 4013. Про это я напишу отдельный пост.

Пример использования микросхемы АЛУ 40181, построенный школьницей Светланой Масягиной. В зависимости от кнопки посередине, блок делает или сложение или вычитание 4-х битных агрументов введенных желтыми и красными кнопками и выводит результат на гребенку из светодиодов выше.

Вышеуказанные блоки можно комбинировать, например вот проект Майи Григорьевой, в котором компаратор на основе 4063 сравнивает числа из двух потоков: от обычного счетчика и от счетчика Джонcона и выводит на LED “меньше”, “больше” или “равно”.

Для таких проектов удобно использовать три LED в виде “светофора”. При покупке важно не спутать такой светофор на 5V со светофором на 1V:

Некоторые из этих проектов вы можете увидеть в заметках:

Основатель движения мейкеров Дейл Догерти расспросил Майю и Свету об их проектах на нашем кружке электроники

Школьницы ваяют цифру на макетке ничуть не хуже школьников

Занятие 1.7. Конечные автоматы для распознавания последовательностей. “Кодовый замок”.

Создание такого автомата на микросхемах малой степени интеграции (а также на верилоге) описано в заметке:

Можно ли тренировать разработчиков микросхем на 3 нанометра упражнениями с 130 нм? А упражнениями с 20000 нм?

Формулировка задачи есть в учебнике Харрис & Харрис:

Приведенный в заметке автомат является простейшим - распознается последовательность “01”. Для распознавания более сложных последовательностей нужно больше и логических элементов, и D-триггеров. Имеет смысл дать ученикам кучу разных логических элементов (см. список в Занятии 1.1.) и микросхемы с бОльшим количеством D-триггеров, например 4-битный 4076 с общим сбросом или 6-битный 40174, тоже с общим сбросом.

Конечные автоматы можно использовать не только для распознавания последовательностей. Например ученик может построить побитовый последовательностный компаратор в виде конечного автомата на базовых логических элементах и ​​D-триггерах. Такой автомат можно сравнить его с комбинационным компаратором, выполненным на микросхеме 4063.

Заметим что комбинационный компаратор на одной микросхеме 4063 может сравнивать только 4-битные числа, а последовательностный компаратор - числа неграниченной разрядности, которые можно подавать как с младших разрядов (один вариант задачи), так и со старших разрядов (другой вариант задачи). Также несколько 4063 можно поставить каскадом (третий вариант задачи) или даже сделать конечный автомат принимающий числа неограниченной разрядности по четыре бита за такт (четвертый вариант задачи). То есть тут можно придумать много вариаций.

Также стоит отметить специальный случай конечного автомата, в котором N состояний меняются каждый такт по простому циклу 0 => 1 => 2 => … => N-1 => 0. Им является например простой светофор, который дает красный цвет 4 такта, желтый цвет 2 такта и зеленый цвет 4 такта. Такой конечный автомат можно построить с помощью десятичного счетчика 4017 с дешифрированными выходами и логических элементов OR: красный = S0 | S1 | S2 | S3; желтый = S4 | S5 ; зеленый = S6 | S7 | S8 | S9. Подобный дизайн сделали школьник Тимофей и Нил, см. с 44 секунды:

После микросхем малой степени интеграции можно приступить к другим секциям, которые я опишу более кратко:

Секция 2. Язык описания аппаратуры SystemVerilog и реализация схем на ПЛИС/FPGA.

Репозиторий примеров для FPGA который сделали мы с сотоварищами поддерживает 45 плат. Он называется Basics-Graphics-Music или сокращенно BGM.

С течением времени BGM включил в себя и упражнения с процессорными ядрами RISC-V, и упражнения на микроархитектурные конструкции, конвейеры и очереди FIFO.

У нашего репозитория три преимущества между примерами от других авторов:

  1. Примеры в директории labs изолируют пользователя не только от платы (45 плат), но и от тулчейна. Один и тот же скрипт в VS Code запускает, в зависимости от номера платы, синтез с помощью Xilinx Vivado, Altera Quartus, GoWin EDA или OSS CAD Suite.

  2. Пользователи рано начинают делать более интересные примеры с графикой на экране (поддерживается HDMI, VGA, LCD и LED матрицы) и обработкой звука: распознаванием нот и мелодий через микрофон и генерацией через ЦАП и усилитель.

  3. У нас есть вводные элементы в микроархитектуру, конвейерную обработку данных, очереди FIFO и контроль потока данных, вплоть до credit-based flow control. Все это является привязкой к нуждам работе в электронных компаниях и к вопросам на собеседованиях.

Недорогой комплект из частей с Ali Express, который мы часто используем, выглядит вот так:

Больше деталей в более старой заметке (но в ней несколько другие соединения проводов).

Достоинства набора на основе микросхем GoWin, а не Xilinx, Altera или Lattice:

  1. Скорость синтеза - на порядок быстрее чем в Xilinx Vivado, то есть школьникам не нужно ждать результатов минутами.

  2. Более низкая цена чем у всех конкурентов. Если школьник сожжет плату за $30 - это не так трагично, как плату за $300.

  3. Софтвер для синтеза работает на всех платформах: Windows, Linux, Mac, причем и с коммерческим софтом (бесплатная образовательная версия Gowin EDA) и с открытым софтом (Yosys-based OSS CAD Suite).

Набор на 10 студентов. На одного студента получается около $60, около 5 тыс. рублей.

Здесь школьникам стоит пройти через серию упражнений в репозитории basics-graphics-music. Как выполняются эти упражнения вы можете увидеть из видеозаписи моей лекции, которую я провел на митапе в Батуми, Грузии этим летом:

Эти упражнения делятся на несколько групп:

  1. Упрощенные (без параметризации пользовательского модуля) вводные упражнения специально для набора с платой Tang Nano 9K, LCD экраном и модулем на основе чипа TM1638 выше. Они включают в себя:

    1. 1_gates_and_muxes - логические элементы и мультиплексоры на языке описания аппаратуры SystemVerilog.

    2. 2_rectangles_and_circles - использование комбинационной логики для рисования фигур на графическом экране. LCD контроллер, используемый как черный ящик, дает пользователю координаты текущего пиксела X и Y, для которого пользователь задает цвет, на основе этих координат. Например красный прямоугольник определется кодом:

      always_comb if (x > 100 & x < 300 & y > 50 & y < 100) red = 31; else red = 0;

    3. 3_d_flip_flop - иллюстрация работы D-триггера с тактовым сигналом 1 герц (1 такт в секунду).

    4. 4_binary_counter - счетчик.

    5. 5_shift_register - сдвиговый регистр.

    6. 6_moving_rectangle - движение фигур по экрану используя добавление значения счетчика к координате из примера 1.2.

    7. 7_game_example - графическая игра с движущимися фигурами и конечным автоматом.

    8. 8_ultrasonic_distance - интеграция датчика расстояния, которое меряется с помощью ультразвука.

    9. 9_rotary_encoder - интеграция поворотного энкодера, другое полезное упражнение на интеграцию устройств через GPIO (ножки для общего ввода-вывода).

    10. 10_movable_graphics_using_counters - более детальное объяснение как использовать счетчики для создания двигающихся изображений.

  2. Главный набор примеров:

    1. 1_basics - базовые упражнения аналогичные упрощенным, но с поддержкой 45 плат, если у преподавателя другие FPGA платы чем вышеуказанный комплект.

    2. 2_graphics - графика на экране (HDMI, VGA, LCD, LED матрицы), от статичных фигур до игры.

    3. 3_music - распознавание нот и мелодий с микрофона, генерация звука с помощью ЦАП и усилителя. Подробнее про работу со звуком см. заметку Проектировщики RISC-V из Yadro покажут школьникам как проектировать процессоры.

    4. 4_microarchitecture - как я написал выше, вводные элементы в микроархитектуру, конвейерную обработку данных, очереди FIFO и контроль потока данных, вплоть до credit-based flow control. Все это является привязкой к нуждам работе в электронных компаниях и к вопросам на собеседованиях.

    5. 5_cpu - работа с процессорными ядрами - см. Секция 3 и Секция 4.

Секция 3. Архитектура процессора и язык ассемблера RISC-V на симуляторе системы команд.

В этой секции ученик изучает концепцию архитектуры - вида процессора с точки зрения программиста на языке ассемблера. Эта тематика слабо связана с предыдущими секциями и вообще может изучатся как отдельный курс, но она необходима для следующей секции, по микроархитектуре процессорных ядер.

Хотя слова "архитектура" и "микроархитектура" звучат похоже, но между ними не больше общего чем между "культурой" и "физкультурой". Архитектура: система команд процессору и видимые программисту на ассемблере процессорные регистры. Это интерфейс процессорного железа к работающим на процессоре программам: гипервайзеру, операционной система, драйверам и пользовательским программам.

В отличие от этого микроархитектура - это аппаратное устройство процессора, его стадии конвейера, структура арифметических блоков итд. Цель микроархитектора - создать для программиста иллюзию последовательного выполнения инструкций процессора на уровне абстракции архитектуры. В самом процессоре, особенно суперскалярном, могут одновременно выполняться десятки инструкций на разных стадиях обработки.

Да, но вернемся к архитектуре. Для ее изучения необходимо сделать два вида упражнений:

  1. Писание программ на ассемблере и выполнение их в симуляторе на уровне архитектуры системы команд - Instruction Set Simulator (ISS). В качестве простейшего ISS мы выбрали RARS. В нем по сути три кнопки: F3 - скомпилировать, F5 - выполнить, F7 - выполнить один шаг.

  2. Кроме этого ученикам нужно примерно изучить, как различные конструкции языков программирования, в частности Си, отображаются на последовательность инструкций ассемблера. В частности условное выполнение (if), циклы while и for, работа с переменными (на регистрах, в стеке и в памяти) и массивами, возможно вызовы функций. Все это можно сделать с помощью компилятора GCC из пакета xPACK. Особенно углубляться в ABI (Application Binary Interface) не стоит, мы все-таки говорим о школьниках.

Вот как выглядят скриншоты симулятора RARS:

Почему именно RISC-V? Это текущий образовательный страндарт в мировых вузах. На RISC-V легко строятся собственные CPU на верилоге, в том числе конвейерные. Архитектура ARM имеет ограничения для создания собственных процессоров (архитектурная лицензия), а архитектура x86/64 имеет слишком много косяков начиная с сегментных регистров 1978 года, неудобна для конвейеризации итд итп. Другие варианты (MOS 6502, Z80, PDP-11) - это не для образования будущих разработчиков, а для ретрокомпьютерного хобби у пенсионеров.

Секция 4. Микроархитектура процессорных ядер и реализация процессора на ПЛИС/FPGA.

В качестве первого процессорного ядра на верилоге мы рекомендуем schoolRISC - процессор размером 300 строк кода на верилоге, который поддерживает дюжину инструкций из подмножества RISC-V. Этого набора достаточно для выполнения совсем простых пограммок типа чисел Фибоначчи. schoolRISC написал для наших семинаров Станислав Жельнио, ныне разработчик процессоров в компании Ядро.

В репозитории BGM schoolRISCV находится в директории labs/5_cpu/5_1_schoolriscv, где он интегрирован со скриптами BGM для поддержки 45 плат. Исходная версия находится в гитхаб-аккаунте Станислава, вместе с слайдами и документацией. В частности, инструкции, как добавить в процессор новую инструкцию - это упражнение мы рекомендуем для школьников.

В планах на этот году - сделать еще более простую версию schoolRISCV с помощью удаления модульной иерархии. Возможно плоский дизайн будет еще проще читать.

Также в BGM есть комбинация schoolRISC с кэшем инструкций, это можно показать тем ученикам, которые зададут вопрос, что такое кэш.

Про симуляцию и синтез schoolRISCV для FPGA и ASIC я написал в заметке

Bootstrapping Azerbaijan as a new center of ASIC design + Verilog Meetup #6 in Silicon Valley

GIF от Станислава с микроархитектурными диаграммами и визуализацией работы schoolRISCV:

Секция 5. Интеграция процессора в систему: ввод-вывод от сенсоров и параллелизм через прерывания.

Хотя предельно минималистичный schoolRISCV удобен для введения понятия что такое процессор, но для полной картины стоит рассмотреть и реальные процессорные ядра, более близкие к тем, которые стоят в AVR в Ардуино, STM32, ESP32 или скажем в российских микроконтроллерах MIK32 "Амур" от НИИМА "Прогресс" / зеленоградского "Микрона" и более мощных от воронежского НИИЭТ.

Репозиторий BGM поддерживает (в разных стадиях готовности) три реальных ядра с архитектурой RISC-V:

  1. PicoRV32 - популярное простое ядро, но к сожалению с нестандартной реализацией прерываний и не конвейерное, с многотактовой реализацией выполнения инструкций.

  2. YRV - ядро от Монте Делримпла, Monte J. Dalrymple. Монте начинал свою карьеру в компании Zilog еще в 1977 году (та самая что сделала Z80 в Спектрум и Yamaha MSX). Затем Монте сделал собственную маленькую компанию и спроектировал десятки специализированных процессоров, в том числе Y180-S на борту космического аппарата Juno который до сих пор летает по орбите вокруг Юпитера. Сейчас Монте - пенсионер в городе Ливермор, мы встречались с ним на ланч и он даже выступил в 2021 году через Zoom на российкой Школе Синтеза Цифровых Схем, см. заметку:

    Проектировщик процессоров Zilog расскажет про Z80 в космосе и про свое новое RISC-V ядро

    Хотя RISC-V ядро YRV написано в стиле Verilog-95, а мы учим студентов SystemVerilog, и у него не самая высокая производительность на бенчмарках, мы выбрали поддерживать ядро от Монте по трем причинам:

    1. Старый конь борозды не испортит. Так как Монте занимался микроконтроллерами 50 лет, практически все время их существования, у него огромный опыт в том что практично, а что нет.

    2. YRV RISC-V ядро от Монте задокументировано в книжке Inside an Open-Source Processor, PDF от которой можно нагуглить и скачать.

    3. Кроме этого у Монте, в отличие от PicoRV32, грамотно реализованный конвейер и стандартные прерывания, по The RISC-V Instruction Set Manual, Volume II. Privileged Architecture. Другие ядра можно сравнивать с ядром Монте на предмет корректности, хотя нужно понимать ограничения YRV (обратная сторона практичности), например в нем только Machine (Kernel) mode и нет User mode и Supervisor mode.

  3. Хорошо сбалансированное для учебных целей ядро APS от МИЭТ.

Для этих ядер мы реализовываем несколько примеров, в которые входит:

  1. Интеграция ядер с устройствами ввода-вывода через отображение регистров устройств на адреса памяти, Memory-Mapped Input/Output (MMIO). Например школьники могут в качестве упражнения добавить в учебный микроконтроллер работу с датчиком освещения и разобрать все аппаратные и программные аспекты такой интеграции.

  2. Иллюстрацию паралеллизма через прерывания в операционных системах. Мы сделали пример минималистического переключения контекста задач в обработчике прерывания по таймеру, под названием Femto Threads. Это своего рода "ядро операционной системы на 400 строк кода на ассемблере". Оно позволяет писать следующие программы на Си и запускать их на синтезированных процессорных ядрах, наблюдая работу обработчика прерывания и переключение контекстов на плате.

#include "memory_mapped_registers.h"
#include "bgm_femto_threads.h"

int counter_1 = 1;

// Эти три функции выполняются параллельно,
// с переключением контекста в обработчике прерывания по таймеру.
// При этом при выходе каждая функция циклится на свое начало.
// Переключение контекста состоит из записи в памяти
// текущих архитектурных регистров одного потока/треда
// и восстановления другого.
//
// Данный пример демонстрирует одно из важных использований прерываний
// в процессорах.

void thread_1 ()
{
    MMIO_LED = 1;
    counter_1 ++;
}

int counter_2 = 2;

void thread_2 ()
{
    MMIO_LED = 2;
    counter_2 ++;
}

void thread_3 ()
{
    MMIO_LED = 3;
}

void main ()
{
    define_thread (thread_1);
    define_thread (thread_2);
    define_thread (thread_3);

    start_running_threads ();

    for (;;);
}

Секция 6. Изготавливаем микросхему ASIC на фабрике через сервис TinyTapeout.

Как мы все знаем, изготавливать коммерческие микросхемы на фабрике стоит дорого. Просто запуск производства (без учета проектирования) современной микросхемы для смартфона на 2 нанометра стоит десятки миллионов долларов. С использованием более консервативных техпроцессов (28 нм) цены снижаются до миллиона и ниже, но все равно остаются вне финансовых возможностей школьника, кроме случая если его папа олигарх (последнюю оговорку я ввел после лекции перед школьниками в Томске в 2017 году).

При этом на фабриках существуют избыточные мощности, которые используют для запусков так называемых MPW (Multi-Project Wafer) shuttle run. Простыми словами, фабрика собирает проекты от нескольких исследователей и производит для них на одной пластине несколько чипов с ценами типа $15 тысяч долларов за чип с техпроцессом 130 нанометров. Это конечно не самый последний техпроцесс, но он достаточен например для выпуска микроконтроллеров для "умного земледелия", где чипы вставляются в датчики влажности и удобренности разбросанные по полю, или скажем вешаются в устройствах на шеях пасущихся коров.

Но эта опция, как вы понимаете, тоже слишком дорогая для школьника. К счастью, есть еще более дешевая опция под названием TinyTapeout. При этом один чип за $15 тысяч разбивается на зоны для 100-200 человек. Каждый из них покупает от одного до нескольких квадратиков (tiles) за ~$50 на квадратик, который вмещает примерно 1000 стандартных ячеек. У такого чипа можно активировать схему любого из заказчиков, просто подавая условно говоря номер схемы на ножки. Еще за ~$300 можно заказать плату с таким чипом.

В результате всего за 565 евро можно получить плату с чипом ASIC который произведен на фабрике и включает отобранные проекты 5 учеников класса.

При этом мы с сотоварищами сделали и описали маршрут, как перенести на Tiny Tapeout схемы, спроектированные на FPGA в рамках репозитория BGM (Basics-Graphics-Music). См. заметку

Moving your design from FPGA to ASIC using Verilog Meetup variant of the Tiny Tapeout template

Тут может возникнуть вопрос "А какой собственно говоря в этом смысл помимо удовлетворения тщеславия "Я произвел собственный чип на фабрике и теперь равен Интелу и НВидии"?". В таком проекте есть смысл, так как это самый доступный способ познакомится с инструментарием для ASIC, который отличается от FPGA. Коммерческий инструментарий, Synopsys Fusion и Cadence Genus / Innovus - стоит электронным компаниям миллионы долларов в подписках, а также требует специального соглашения для использования в университетах. В отличие от этого, используемый в Tiny Tapeout пакет LibreLane бесплатный, но при этом его многие аспекты очень похожи на то что видит на рабочем месте инженер в Apple или Samsung. См. например отчет о критических путях внутри такта (static timing analysis):

Или как используются стандартные ячейки в ASIC Standard Cell Library:

Да и визуализация конечного GDSII файла который идет на фабрику выглядит просто красиво:

Это отличное завершение годового курса для школьников физматшкол и других продвинутых групп.

Секция 7. Возможный исследовательский проект: создание библиотеки в рамках открытого средства проектирования Yosys для синтеза кода на верилоге в схему из микросхем малой степени интеграции.

Может быть полезно для построения конечных атоматов в Секции 1.

Справочные материалы

  1. Getting Started with Verilog, FPGA, ASIC Design and Verification

  2. Цифровая схемотехника и архитектура компьютера: RISC-V Авторы: Харрис Д., Харрис С.

  3. Слайды и другое дополнительные материалы к Харрис & Харрис

  4. Бесплатный PDF к более старому издательству Харрис & Харрис на русском языке. Первые 5 глав очень близки к последнему изданию, далее используется менее актуальная сейчас архитектура MIPS, а не RISC-V.

  5. Цифровой синтез: RISC-V. Под редакцией: Романов А. Ю.

  6. Логическое проектирование и верификация систем на SystemVerilog Автор: Томас Д.

  7. Заметка: An improved way of teaching school kids digital electronics using venerable small-scale integration ICs

  8. Заметка: A prequel to FPGA and ASIC design using small-scale integration chips

  9. Рекомендации по пайке гребенок для плат Tang Nano 9K, микрофонов и ЦАП+усилителя для звукового вывода: An update on soldering recommendations, with a video

Комментарии (2)


  1. tklim
    22.08.2026 14:49

    В очередной раз читаю и удивляюсь.
    Автор же наверняка сам начинал с детекторного приемника т.д.
    Знаю много людей, которые давно умеют программировать на высокоуровненых ЯП, но для мих даже микроконтроллер и даже понятие GPIO - уже тяжело.

    У меня в дестве была подшивка ЮТ для умелых рук, там предалагали делать логические элементы на дискретных компонентах, вроде все понятно было. Потом на них небольшая автоматика.

    Скрытый текст

    Но после этого я увидел спектрумы - огромная пропасть.

    Даже сейчас со знанием от аналоговой схемотехники до ЯП ВУ - ПЛИС и Верилог остаются "слепым пятном".

    Основня причина, я не знаю как мне это пригодится.

    Ну и самое главное - рынок труда. Сколько в мире нужно FPGA разработчиков, а сколько условных data-analyst with python knowledge?


    1. YuriPanchul Автор
      22.08.2026 14:49

      Времена сейчас такие. В каждой Герани и каждом Цирконе - ПЛИС Zynq. А потом это можно перенести на айфоны: