Skip to content

ПЛИС III: процессор на ПЛИС + UART-загрузчик

Паспорт модуля

ПараметрЗначение
Аудитория🔴; пройдены М12–М16
Аутентичная задачаисполнить на ПЛИС те же .hex-файлы из ассемблера М14 без изменений — кросс-совместимость как приёмочный критерий; получить платформу для видео (М18) и Тетриса (М19)
Объём6 занятий × 90 мин
ОборудованиеTang Primer 25K, USB-UART (на доке), тулчейн М15, ассемблер и тест-программы М14
Ограничениякак в М15; тактирование ядра CPU — с запасом (например, деление системного клока), тайминг-отчёт обязателен
Аутентичная задача. После модуля обучающиеся смогут: залить Фибоначчи по UART и показать, что ПЛИС-машина и макетка исполняют одну программу, — а затем честно измерить, во сколько раз кристалл быстрее макетки, и объяснить почему.

Цели

Обучающиеся …Блум—АндерсонМиллерПроверка
1переводят микрокод М12 в управляющий автомат (FSM) на Verilogсоздаватьделаетвсе команды проходят тест-набор М14 в симуляции
2реализуют память программы/данных на блочной BRAMприменятьпоказывает какчтение/запись в тестбенче
3реализуют UART-приёмник и протокол загрузкисоздаватьделаетзагрузка .hex с ПК, эхо-верификация
4проводят системную кросс-проверку с макеткой и измеряют ускорениеанализировать/оцениватьделаетпротокол сравнения + расчёт

Ядро модуля

Скелет машины (управление — прямое продолжение таблицы М12; каждый бит слова управления стал полем структуры):

// Состояния = такты микрокода: FETCH0, FETCH1, затем по опкоду
always @(posedge clk) begin
    case (state)
      F0: begin mar <= pc;                     state <= F1; end
      F1: begin ir  <= ram_q; pc <= pc + 1'b1; state <= DEC; end
      DEC: case (ir)
        LDA: begin mar <= pc;                  state <= LDA1; end
        ADD: begin mar <= pc;                  state <= ADD1; end
        JC : begin if (cf) pc <= operand; else pc <= pc + 1'b1; state <= F0; end
        HLT: state <= HALT;
        // ...остальное достраивают обучающиеся по своей таблице М11
      endcase
      // ...
    endcase
end

UART RX (8N1): счётчик с выборкой в середине бита; скорость — по константе от системного клока; протокол загрузчика курса нарочно примитивен: 0x7E, длина, байты, XOR-сумма — обучающиеся сами обнаруживают, зачем нужна контрольная сумма, когда «длинная программа иногда бьётся» (запланированный конфликт; обсудить, что дальше по этой дороге — CRC).

Три реализации — один контракт. Приёмочный тест модуля: пять .hex-файлов (М14) исполняются байт-в-байт одинаково на (1) эмуляторе Python, (2) макетке, (3) ПЛИС. ISA — это контракт, реализация — деталь. Это самая взрослая инженерная мысль курса, и она рождается из собственных артефактов обучающегося, а не из лекции.

Оценивание

Кумулятивная точка линии В: демонстрация кросс-совместимости (5 программ × 3 платформы), измерение времени 10 000 итераций цикла на макетке (сек) и на ПЛИС (мкс), расчёт и объяснение коэффициента (частота + такты на команду); дебаг-кейс: одна команда ISA в FSM намеренно испорчена — найти по расхождению с эмулятором (инструменты М14 становятся эталоном — инверсия ролей, отрефлексировать).

Типичные ошибки: чтение BRAM с регистровым выходом «опаздывает на такт» против ожиданий из микрокода — самая частая и самая поучительная ошибка модуля (такт ожидания в FSM); асинхронный UART-байт без синхронизатора (М5/М15 — правило нарушают именно здесь, под давлением сложности); тайминг-отчёт игнорирован — «иногда неправильно считает на полной частоте»: вероятностные сбои уже встречались в М5, теперь понятно, откуда они в больших системах.

Уровни

Глоссарий