ПЛИС I: Tang Primer 25K и первый Verilog
Паспорт модуля
| Параметр | Значение |
|---|---|
| Аудитория | 🔴 (🟡 — по готовности после М13); пройдены М5–М8 |
| Аутентичная задача | освоить цикл «код → симуляция → синтез → плата», чтобы в М16–М17 перенести на ПЛИС уже построенную машину |
| Объём | 4 занятия × 90 мин |
| Оборудование | Sipeed Tang Primer 25K (Gowin GW5A-25) с док-платой, Gowin EDA (или открытый тулчейн Yosys/Apicula — проверить поддержку GW5A на момент запуска), Icarus Verilog + GTKWave, кнопки/светодиоды дока |
| Ограничения | I/O ПЛИС — 3,3 В, к 5-В макетке не подключать напрямую; частоты и назначение выводов — строго по документации платы (constraints-файл комплекта) |
Аутентичная задача. После модуля обучающиеся смогут: описать, просимулировать и прошить в ПЛИС синхронную схему с кнопочным вводом — и объяснить, чем
always @(posedge clk) отличается от строки программы.Цели
| № | Обучающиеся … | Блум—Андерсон | Миллер | Проверка |
|---|---|---|---|---|
| 1 | различают комбинационное (assign, always @*) и последовательностное (posedge) описание | понимать | знает | квиз + разбор чужого кода |
| 2 | проходят полный маршрут: RTL → тестбенч → волны → синтез → плата | применять | показывает как | «дыхание» светодиода на плате |
| 3 | реализуют делитель частоты и счётчик с индикацией | применять | показывает как | секундный счётчик на светодиодах |
| 4 | вводят кнопку через двухтриггерный синхронизатор и антидребезг | применять | показывает как | счётчик нажатий: N нажатий = N приращений |
Путь и ядро
| № | Тема | Разминка | Ядро |
|---|---|---|---|
| 1 | Парадигма HDL | метастабильность (М5 — интервальный возврат!) | worked example blink; всё параллельно, порядок строк ≠ порядок событий |
| 2 | Симуляция прежде платы | 3 вопроса зан. 1 | тестбенч, $dumpfile, GTKWave; правило курса: на плату едет только просимулированное |
| 3 | Счётчик и делитель | код blink по памяти | 27-разрядный делитель от штатного генератора платы (частоту взять из документации дока и constraints комплекта) |
| 4 | Кнопки честно | 3 вопроса зан. 2–3 | синхронизатор 2FF + счётчик-антидребезг; сверка «N нажатий = N событий» — то же испытание, что у 555 в М6 |
Worked example (разбирается построчно):
module blink #(parameter DIV = 24) (
input wire clk, // генератор платы (см. constraints комплекта)
output wire led
);
reg [DIV:0] cnt = 0;
always @(posedge clk) cnt <= cnt + 1'b1;
assign led = cnt[DIV]; // старший бит = медленный меандр
endmodule// Синхронизатор + антидребезг — эталон комплекта для ЛЮБОГО асинхронного входа
module debounce (input wire clk, input wire btn_raw, output reg pressed);
reg s0, s1; reg [15:0] hold;
always @(posedge clk) begin
s0 <= btn_raw; s1 <= s0; // 2FF против метастабильности (М5!)
hold <= s1 ? hold + 1'b1 : 16'd0; // стабильность уровня
pressed <= &hold; // ~единицы мс при мегагерцах — рассчитать под свой клок
end
endmoduleГлавная смена парадигмы: Verilog-модуль — это чертёж схемы, все
always-блоки существуют одновременно, как корпуса на макетке. Обучающиеся, прошедшие линию А, принимают это быстрее «чистых программистов» — они уже думают проводами. Это измеримая гипотеза программы (см. «Данные»): сравнить время до рабочего счётчика у прошедших/не прошедших М5–М8.Типичные ошибки: блокирующие
= в тактируемом блоке — симуляция «работает», синтез живёт своей жизнью (правило: в posedge только <=); защёлки из неполных if в комбинационном always @* — читать предупреждения синтезатора как ошибки; кнопка без синхронизатора «иногда» добавляет 2 — вероятностная ошибка, которую не поймать перезапуском (мост к М5); constraints с чужим назначением выводов — риск конфликта уровней на доке.Уровни
Маршрут до платы, счётчик, честная кнопка.
ШИМ-«дыхание» светодиода; параметризованный делитель с assert-проверкой в тестбенче; чтение отчёта синтеза: сколько LUT/FF занял дизайн и почему.