Задачки на Verilog — новый раздел на сайте

4dbc31e5196c0ef8a8b834da07ca21b0.png

Программируемая Логика — увлекательный и своеобразный мир — к сожалению среди большинства из нас, знатоков Python, JS, Go, Java, C++ да и среди любителей Arduino и прочих микроконтроллеров она не так широко «распростирает свои руки».

Давно хотелось среди задачек и головоломок на «обычное» программирование внедрить на сайте и горстку упражнений из этой таинственной области. Мешало банальное отсутствие собственного опыта в ней (за исключением нескольких занятий по AHDL в далёкие вузовские годы).

Мотивация (или везение?) пришло с очередной новой работой — хотя она не связана с PLD/FPGA, но в моей текущей компании эти направления значительно развиты, есть и знатоки — которые подсказали кое-что по инструментам, по выбору языка -, а заодно показали и репозиторий с «домашками» от их собственного курса… Я засучил рукава, добавил компилятор в «песочницу» и вот уже первые несколько заданий ждут энтузиастов :) Также ждём знатоков которые захотят помочь с идеями новых задач и верификацией существующих. Итак, переходим к подробностям…

Подробности

Как можно понять из заголовка, в качестве языка «по совету коллег» выбран Verilog (точнее, конечно, SystemVerilog) — хотя с VHDL у них почти равное количество проектов на GitHub-е например, но кажется что Verilog чуточку ближе по синтаксису к привычным императивным языкам (хотя это довольно обманчиво). К тому же раз коллеги поделились материалами которые можно хотя бы частично использовать — да и самому поучиться!

Список задач будет здесь, по тегу «verilog» — и будет пополняться.

Кроме того видно что по тегу «logic» есть ещё пара более ранних задач, но использующих некий кастомный синтаксис для описания логических элементов и сигналов.

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

Как сказано, в «песочницу» добавлена возможность запускать код на Verilog — в виде компилятора/симулятора ICARUS Verilog (iverilog). По нему есть некоторые сомнения у коллег, но зато он же используется в онлайновой туле «EDAPlayground» которой тоже может быть удобно пользоваться — так что выбор обусловлен совместимостью.

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

Первые задачи

  1. Реализовать логическую функцию «импликации» — её описание дано, а код уместится легко в одно выражение.

  2. Воплотить функционал RS-триггера — ну это логично, от простой функции переходим к элементу с «состоянием».

  3. Мультиплексор 4-на-4 — в вышеупомянутом репозитории предложено аж 7 вариантов как это сделать — так что здесь можно с удобством проверить любой из этих вариантов который вы захотите воплотить.

  4. D-триггер — как эволюция RS-триггера, и как плавный переход к счетчику/делителю и сдвиговому регистру.

  5. Каждый Третий Бит — опять же по мотивам одного из заданий из репозитория — нужно сконструировать что-то вроде делителя на 3.

Сожаления

Нужно иметь в виду что у автора заданий (меня) уровень изначально также нулевой, так что я осваиваю всё вместе с вами. Безусловно это не гарантирует качества, но надо же с чего-то начать :)

Поэтому фидбэк от знатоков (кроме «всё завали, удали, не суйся») будет воспринят с благодарностью.

Отдельная проблема в том что поскольку сайт ориентирован на автоматическую проверку, не видно какой-то удобной возможности учить разным подходам к решению одной и той же проблемы. Например как упоминалось, в «Школе Цифрового Дизайна» мультиплексор предлагается сделать 7 разными способами -, но я-то на сайте не готов писать анализатор кода который будет докапываться, каким же способом человек решил задачу.

Аналогично — есть задание «сделать сумматор используя только логические операции» — это очень интересно и полезно -, но на текущий момент как предотвратить возможность сдачи решения в котором два числа сложены просто «плюсиком» — неясно (проверка на наличие символа плюс в коде вряд ли хорошая идея).

Благодарности

Я исключительно признателен коллегам, кто помог советами, чтобы начать двигаться по этому пути. Также как и коллеге этих коллег, Юрию — владельцу вышеупомянутого репозитория с любопытными упражнениями. Здесь не перечисляю т.к. не хочу покушаться на правила Хабра в отношении упоминания компаний -, но во введении к задачам на самом сайте, по-видимому, ничего не мешает выразить признательность более подробно — так я и поступил.

© Habrahabr.ru