Verilog для начинающих: первый модуль за 15 минут
Verilog — язык, на котором инженеры описывают цифровые схемы: от простого вентиля до целого процессора. Если вы собрали схемы в визуальном симуляторе, Verilog станет следующим шагом — вы научитесь описывать те же схемы текстом. И никакой установки не нужно: всё работает в браузере на уровне 30 симулятора «Компьютер Ершова».
Чем Verilog отличается от обычного языка программирования
Программа на Python или C++ выполняется процессором последовательно, команда за командой. Verilog-модуль описывает схему, в которой все элементы работают одновременно. Поэтому в Verilog нет привычных циклов и «переменных» в смысле языка программирования — вместо этого провода и логические элементы.
Самое важное отличие: написанный на Verilog модуль можно синтезировать в настоящий чип или прошить в FPGA. Код превращается в железо. Почему Verilog — это не программирование, объясняет статья «Кремний вместо кода».
Первый модуль: провод
Модуль — это «кирпичик» схемы со входами и выходами. Самый простой модуль просто соединяет вход с выходом — это провод:
module wire_gate(
input a,
output y
);
assign y = a;
endmodule
Разберём по строкам: module wire_gate(...) объявляет модуль с именем wire_gate; input a — входной сигнал; output y — выходной; assign y = a — выход всегда равен входу; endmodule закрывает модуль.
Именно это — первый уровень Verilog-части курса: уровень 30 «Hello, Wire!». В редакторе справа уже открыт заготовленный модуль — осталось понять, что и как исправить, и нажать Play.
Вентиль NOT за 30 секунд
Инверсия сигнала описывается одной строкой:
module not_gate(
input a,
output y
);
assign y = ~a;
endmodule
Символ ~ — это отрицание. Если на входе 0, на выходе 1, и наоборот.
Мультиплексор: когда сигналов несколько
Мультиплексор выбирает один из входов по сигналу sel. На Verilog его можно описать через тернарный оператор:
module mux2(
input a, b,
input sel,
output reg y
);
always @(*) begin
if (sel) y = b;
else y = a;
end
endmodule
Блок always @(*) означает «пересчитывать при любом изменении входов», а if (sel) ... else ... выбирает, какой вход передать на выход. Именно так работает уровень 31 «Управление потоком». Подробнее о мультиплексоре без if/else — в статье «Как железо принимает решения».
Сумматор: учим кремний складывать
Арифметика в Verilog выглядит удивительно просто — символом «+»:
module adder8(
input [7:0] a, b,
output [8:0] sum
);
assign sum = a + b;
endmodule
Обозначение [7:0] говорит, что сигнал — это шина из 8 бит, а [8:0] — 9 бит (с учётом переноса). Строка assign sum = a + b синтезируется в настоящую цепочку сумматоров — именно так схема «учится» считать. За этим скрывается целая механика — см. статью «Учим кремний математике».
Иерархия: модули внутри модулей
Большие схемы собираются из маленьких. Модуль сумматора можно использовать внутри другого модуля — это называется иерархией:
module full_adder_8(
input [7:0] a, b,
input cin,
output [7:0] sum,
output cout
);
wire [8:0] t;
adder8 u_adder(.a(a), .b(b), .sum(t));
assign sum = t[7:0];
assign cout = t[8];
endmodule
Строка adder8 u_adder(...) создаёт экземпляр модуля adder8 и соединяет его порты. Из таких «матрёшек» строится процессор. Об иерархии — статья «Иерархия: как не утонуть в проводах».
Шины и память
Реальные схемы работают с байтами, а не одиночными битами. Шины [7:0] переносят 8 бит сразу — и это уже следующий шаг после одиночных проводов: уровень 34 «Переход к шинам данных». А встроенные модули RAM256 и ROM позволяют добавить процессору память: уровень 39 «Оперативная память». Всё о шинах — в статье «Шины данных: от отдельных битов к байтам».
Как тренироваться бесплатно
В симуляторе «Компьютер Ершова» Verilog-часть начинается с уровня 30 и занимает 14 уровней (30–43). Встроенный редактор подсвечивает синтаксис, парсер находит ошибки, а симулятор прогоняет схему по тестовым векторам. RTL Viewer показывает, как ваш код превращается в схему, а временные диаграммы — как меняются сигналы по тактам.
После 43-го уровня начинается самое интересное: на уровнях 44–47 вы спроектируете собственный процессор на Verilog, а на финальном уровне экспортируете проект в ZIP и прошьёте его в реальную FPGA-плату Tang Nano 9K. Всё о пути «от кода к кремнию» собрано в хабе Verilog и FPGA.
FAQ
Нужно ли знать программирование для Verilog?
Полезно, но не обязательно. Главное — понимать логику схем: вентили, шины, тактовые сигналы. Именно это даёт визуальная часть курса (уровни 1–29).
Что нужно установить?
Ничего. Уровни 30–47 работают прямо в браузере: редактор, симулятор и RTL Viewer встроены в страницу.
Можно ли прошить проект на реальную плату?
Да. На финальном уровне проект экспортируется в ZIP-архив, который открывается в среде Gowin для платы Tang Nano 9K. Это дешёвая и доступная FPGA-плата для обучения.