ПЛИС: что это такое, виды и первый проект в Quartus

Чем программируемая логика отличается от микроконтроллера, какие бывают ПЛИС и как выглядит простейший проект на Verilog для микросхемы Altera MAX II.
Микросхема, которую достраивает разработчик
ПЛИС расшифровывается как программируемая логическая интегральная схема. Сама по себе она не является ни контроллером, ни специализированной логической микросхемой, но может стать и тем, и другим. Внутри находится большое количество простых логических элементов, а связи между ними задаются уже после изготовления кристалла — с помощью специального софта и программатора. В итоге микросхема получает ту конфигурацию и то назначение, которые нужны разработчику, в пределах своих аппаратных возможностей. Поэтому вместо слова «программирование» применительно к ПЛИС официально используют термин «синтез»: в микросхеме нет ни последовательности команд, ни данных, только архитектура связей.

Чем ПЛИС отличается от микроконтроллера
Контроллер обрабатывает данные последовательно, такт за тактом, поэтому его быстродействие определяется тактовой частотой, разрядностью, объёмом памяти и похожими параметрами. ПЛИС настраивается под задачу аппаратно. Многим схемам тактирование не требуется вовсе, и тогда скорость ограничена только прохождением сигнала через проводники и логические элементы.
Вторая особенность — настоящая параллельность. На одном кристалле можно разместить несколько схем, которые никак не связаны друг с другом: например, два инвертора с отдельными входами и выходами в одном корпусе.

Области, где ПЛИС оправданна:
- контроллер не справляется по скорости или ему не хватает выводов;
- нужной готовой микросхемы не существует либо она значительно дороже — партию от одной штуки до сотни-другой быстрее и дешевле сделать на ПЛИС;
- проектирование и тестирование новых микросхем, контроллеров и процессоров: при достаточном числе элементов на ПЛИС собирают даже полноценный процессор.
Стоимость ПЛИС начального уровня при этом сопоставима со стоимостью микроконтроллеров.
CPLD и FPGA
Основных разновидностей две. CPLD (Complex Programmable Logic Device) — классический вариант: однородная матрица из одинаковых логических блоков, которых насчитываются сотни и тысячи. Обычно в такой микросхеме есть небольшая встроенная энергонезависимая память для прошивки и данных. CPLD выбирают, когда для относительно простой задачи нужны высокая скорость и много входов-выходов; стоят они сравнительно недорого.
FPGA (Field-Programmable Gate Array) устроена сложнее. Элементов в ней больше, могут присутствовать готовые блоки для типовых операций — мультиплексоры, обработка протоколов, аудио, видео. Прошивка, как правило, лежит во внешней энергонезависимой памяти. FPGA дороже, зато позволяет строить более сложные устройства.
Чаще всего встречаются микросхемы двух производителей: Altera, вошедшей в состав Intel, и Xilinx, принадлежащей AMD. У каждого несколько серий, а в серии — несколько моделей. У любителей более распространена Altera.
Quartus Prime Lite, программатор и язык
У обоих производителей свои среды разработки — похожие, но не совместимые. У Altera среда называется Quartus; бесплатной версии Quartus Prime Lite хватает для подавляющего большинства любительских и полупрофессиональных проектов.
При установке выбирают тип микросхемы, язык описания и имеющийся программатор. Отладчики и эмуляторы можно добавить дополнительно, но на первых порах без них обходятся. Тип микросхемы указан на её корпусе. В рассматриваемом примере это EPM240T100 серии MAX II: 240 блоков логических массивов, корпус на сто выводов.

Прошивка заливается через JTAG-программатор USB Blaster, который нередко идёт в комплекте с платой.

В качестве языка взят Verilog: он сравнительно прост и лучше документирован, в том числе на русском. Для начала рекомендуют книгу В. В. Соловьева «Основы языка проектирования цифровой аппаратуры Verilog».
Пример: два светодиода и независимый инвертор
Описание на Verilog состоит из модулей со своими входами и выходами. В примере их два. Главный, blink, запускается при подаче питания. Он считает такты кварцевого генератора платы в 27-разрядном регистре и, досчитав до 50 000 000, обнуляет счётчик и переключает выходы. При кварце на 50 МГц это ровно одна секунда, так что два светодиода мигают в противофазе. Блок подсчёта срабатывает по фронту тактового сигнала: always @(posedge clk). Второй модуль, inv, вызывается из первого, но структурно с ним не связан: это вход и выход, соединённые через элемент «НЕ» строкой assign aout = ~ain.
Затем абстрактные входы и выходы привязывают к реальным ножкам во вкладке Pin Planner. Тактовый генератор на этой плате жёстко соединён с выводом 64, поэтому clk назначается только туда. Остальные сигналы можно развести почти на любые свободные ножки; в проекте заняты 94, 95, 96, 99 и 100.
После компиляции, которая здесь и называется синтезом, полезно открыть RTL Viewer. Инструмент превращает текст в графическую схему: видно инвертор с одним входом и одним выходом и отдельно «мигалку» с одним входом, двумя выходами и небольшим количеством логики между ними. Примерно так структура и ляжет на кристалл. Прошивку записывают инструментом Programmer.
Что показывает осциллограф
На выводах 99 и 100 наблюдаются сигналы в противофазе с периодом смены ровно в одну секунду. Если соединить ножку 99 со входом инвертора на ножке 95, то на выходе 96 сигнал совпадёт с тем, что есть на ножке 100: дважды инвертированный сигнал возвращается к исходному виду. Две независимые схемы работают на одном кристалле одновременно — для микроконтроллера такой режим недостижим.