- Особенности и назначение ПЛИС,
- Разновидности ПЛИС,
- Среда разработки,
- Пример работы,
- Вывод,
- FAQ.
Особенности и назначение ПЛИС
ПЛИС - программируемая логическая интегральная схема. Это не контроллер и не специализированная логическая микросхема, хотя может стать ими при правильной настройке и программировании. Вообще, использовать слово “программирование” при проектировании устройства на базе ПЛИС не совсем правильно. Применительно к ней официально используется более подходящий термин “синтез”. В память известного нам контроллера загружается программа, то есть набор последовательно выполняющихся команд, и нужные для работы данные, у ПЛИС нет ни того, ни другого. ПЛИС состоит из большого количества простых логических элементов, между которыми, как следует из названия, программным путем устанавливаются связи, то есть архитектура возникает не при изготовлении микросхемы на заводе, а позже программистом, при помощи специального софта и оборудования. Наверное и слово “программист” тут уместнее заменить на “конструктор”. В результате, при должном умении и прочих сопутствующих факторах, микросхема приобретает любую конфигурацию и назначение, в рамках своих аппаратных возможностей. В чем преимущество и недостаток такого подхода? Программировать микроконтроллеры интуитивно понятнее и относительно проще, внутри происходит работа кода, исполняющая электронная схема, как правило, находится снаружи и обеспечивает выполнение команд. По такой логике работы команды выполняются последовательно, данные берутся из памяти или из внешних источников и обрабатываются шаг за шагом, точнее такт за тактом. Очевидно, что скорость работы микроконтроллера зависит от его тактовой частоты, разрядности, объема памяти и тому подобных критериев. ПЛИС конфигурируется под задачу аппаратно, зачастую схемы не нуждаются в тактировании вообще, а значит их производительность ограничивается лишь скоростью движения электронов по проводникам и логическим элементам. Более того, в одной микросхеме можно создать несколько независимых логических схем, как на простом примере внизу. Два инвертора со своими вводами и выводами никак друг с другом не взаимодействуют, но оба работают в одном физическом корпусе. Ряд структурных элементов ПЛИС могут использовать тактирование от внешнего источника или внутреннего генератора для привязки к фактору времени или циклического внешнего воздействия. Например, счетчики, часы, мультиплексоры и так далее. Но и в этом случае скорость работы схемы будет гораздо выше, чем в любой программируемой логике. Скорость, близкая к максимально возможной при сохранении некоторой гибкости конструкции - вот основное преимущество ПЛИС перед контроллерами.ПЛИС часто используются в качестве самодельного заменителя интегральной схемы, если таковой не существует в природе или цена ее гораздо выше. В зависимости от количества элементов, из микросхемы ПЛИС можно сделать даже полноценный процессор, что часто используется разработчиками при проектировании и тестировании новых микросхем, контроллеров и процессоров.
Разновидности ПЛИС
На сегодня существует всего два основных вида ПЛИС: CPLD и FPGA.CPLD (Complex Programmable Logic Device) - классическая ПЛИС, структура которой строится на однородной матрице, состоящей из одинаковых логических блоков в количестве сотен и тысяч штук. CPLD обычно комплектуется небольшой встроенной энергонезависимой памятью для хранения прошивки и данных. Используется в устройствах, когда нужна высокая скорость и большое количество входов-выходов для выполнения относительно простых задач. К плюсам можно добавить сравнительно невысокую цену.
FPGA (Field-Programmable Gate Array) - более развитая и сложная ПЛИС. Содержит большее количество элементов, может включать в себя готовые блоки для выполнения стандартных операций, например, мультиплексоров, обработки протоколов коммутации, аудио, видео и так далее. Прошивка, как правило, хранится во внешней энергонезависимой памяти. Дороже предыдущего варианта, но предоставляет широкие возможности и позволяет создавать более сложные устройства.
Наиболее распространенными являются ПЛИС от двух производителей: Altera (теперь являющаяся частью Intel) и Xilinx (теперь принадлежащей AMD). У каждого производителя выпускается несколько серий микросхем, отличающихся размером, количеством выводов, дополнительным оснащением и прочими параметрами. Каждая серия содержит в себе несколько конкретных моделей. Altera более популярна у DIY-мастеров, так как довольно многочисленно представлена к продаже на популярном китайском ресурсе. Именно на одной из микросхем Altera мы попробуем что-нибудь сделать.
У Altera и Xilinx имеется похожие, но собственные среды разработки. Трудно сказать, какая из них лучше, обе достаточно сложные и непривычные для программистов контроллеров, и по обеим очень мало информации на русском языке. Более того, на сегодняшний день, в связи с известными событиями, скачивание того и другого для россиян временно закрыто. При желании, обойти запрет, конечно, можно, но некоторые трудности с освоением все равно останутся.
Среда разработки
Кратко ознакомимся с GUI от Altera, под названием Quartus. Точнее его бесплатной последней версии (не считая ограничений, упомянутых ранее) - Quartus Prime Lite. Его вполне хватит для 99% проектов любительского и полупрофессионального уровня, создающихся почти на любой ПЛИС производителя.При установке важно правильно выбрать тип микросхемы, с которой планируется работать, язык программирования, который вам ближе и аппаратный программатор, имеющийся в наличии. Можно доустановить дополнительные инструменты, например дебаггеры и эмуляторы, но можно обойтись и без них, особенно на начальном этапе.
Тип микросхемы написан прямо на чипе, в нашем случае это “EPM240T100” из серии MAX II, что говорит о том, что на борту имеется 240 блоков логических массивов. Этого более чем достаточно для ознакомительных целей и даже для вполне рабочих конструкций. Программатор под названием “USB Blaster” типа “JTAG” зачастую идет в комплекте. Выглядеть все это в настройках программатора будет как-то так. Язык выберем “Verilog”, он относительно новый, потому сравнительно простой и чуть более документированный. Про него издано довольно много литературы, в том числе на русском языке, например, существует неплохая и понятная для начинающих книга В.В. Соловьева “Основы языка проектирования цифровой аппаратуры Verilog”, которую мы рекомендуем для прочтения в первую очередь. Итак, плата готова, софт установлен и настроен, давайте сделаем и запустим на ПЛИС простейший пример, своего рода “Hello World!” для цифровой аппаратуры - мигание светодиодом.
Пример работы
Немного усложним задачу, сделаем два мигающих светодиода, работающих в противофазе. На этом не успокоимся и “нарисуем” рядом еще одну элементарную схему хотя бы из одного элемента, чтобы убедиться, что она может работать параллельно и независимо.Перед этой статьей, разумеется, не стоит задача научить читателя с нуля писать структуры на Verilog под Quartus, для этого потребовалось бы порядка миллиона подобных статей. Мы лишь немного разъясним основные понятия и инструменты этой системы проектирования ПЛИС.
“Программа”, она же - в конечном итоге - архитектура связей, состоит из так называемых “модулей”. У модуля есть привязка к входам и выходам, с которыми что-то происходит внутри модуля в процессе работы микросхемы. Часть структур статична, то есть представляет из себя логическую схему, не меняющуюся со временем. Другая часть гибкая, динамическая, позволяет производить изменения в ячейках памяти (“регистрах” - аналогах переменных), а так же что-то менять в структуре связей в зависимости от обстановки и обстоятельств, состояния упомянутых регистров и многого другого.
У нас два модуля, один главный (он будет запускаться микросхемой автоматически при подаче питания) и второй дополнительный, который вызывается из первого, но никак с ним не связан структурно. Первый модуль “гибкий”, он считает такты от встроенного в плату кварцевого генератора и инвертирует выходы в то время, когда этих тактов случится нужное количество. Так будет продолжаться вечно, даря нам два бесконечно мигающих светодиода. Второй модуль представляет собой вход и выход, соединенный через логический элемент “НЕ”, то есть сигнал на выходе будет противоположным входу. Вот и весь проект.
В текстовом виде “программа” достаточно компактна и выглядит так:
module blink(ao, led, ledin, clk, ai); // главный модуль, запускающийся автоматически, в скобках вводы и выводы input clk; // ввод, который программно привяжем к тактовому сигналу от кварца output led; // вывод на первый светодиод output ledin; // вывод на второй (инвертированный) светодиод input ai; // вход второго модуля output ao; // выход второго модуля reg [26:0] longcnt; // счетчик тактов размером 27 бит, что достаточно для максимального размера переменной reg led; reg ledin; inv my_inv (ao, ai); // запускаем второй модуль parameter delay_max = 50000000; // максимальное значение счетчика 50 млн тактов, что соответствует 1 сек при кварце 50 МГц always @(posedge clk) // цикл, тактующийся от фронта на ножке clk begin if (longcnt==delay_max) // если счетчик достиг максимального значения begin longcnt <= 0; // перезапускаем счетчик led <= ~led; // инвертируем сигнал ledin <= led; end else // иначе выводим на светодиоды однообразную картину согласно последней установке begin led <= led; ledin <= ~led; longcnt <= longcnt+1; // увеличиваем счетчик на единицу end end endmodule module inv (aout, ain); // параллельная схема просто инвертирует сигнал на выходе input ain; output aout; assign aout = ~ain; // выход привязываем ко входу через элемент "НЕ" endmodule
Мы видим два модуля, начинающихся с объявления module и заканчивающихся endmodule. Первый называется blink, созвучно его назначению, второй inv. Входы, выходы и регистры, с которыми будет работать программа, объявляются в первых строках модулей. Далее следует либо циклическая часть подсчета тактов с инвертированием сигналов, либо простейшая схема инвертора.Теперь остается привязать абстрактные вводы и выводы модулей к реальным пинам микросхемы. Делается это во вкладке “Pin Planner”, где выбранная микросхема изображена во всей красе со всеми своими ста ножками. Генератор тактов в нашем случае жестко подключен к пину 64, его мы без вариантов связываем с вводом clk, остальные же можно прикрепить почти к любым ножкам за исключением занятых. На схеме хорошо видно, куда можно, а куда нет. В нашем проекте мы используем пины 94, 95, 96, 99 и 100. В итоге получается примерно такая картина. Запускаем компиляцию, которая здесь гордо называется “синтез”, и спустя несколько секунд раздумий получаем результат. Если все правильно, то проект можно заливать в микросхему. Мы “написали схему” в текстовом виде, что, в общем-то правильно, однако в Quartus есть возможность рисовать схемы сразу в графическом виде, что удобно для небольших “статичных” схем и не очень для сложных и “динамических”. А вот что удобно во всех случаях, так это возможность преобразовать текстовую программу в графическую, чтобы наглядно оценить, что мы наделали и правильно ли. Запустим инструмент “RTL Viewer” и посмотрим, что же у нас получилось. Вроде бы все верно, сверху инвертор с одним входом и одним выходом, ниже “мигатор” с одним входом, двумя выходами и небольшой кучкой логики между ними. По сути примерно так и будет физически выглядеть структура в микросхеме.
Прошиваем подопытную ПЛИС при помощи инструмента “Programmer”, убеждаемся, что все прошло успешно. Подключив к пинам 99 и 100 светодиоды, или, для пущей наглядности, осциллограф, можем наблюдать картину правильных сигналов в противофазе. Голубой - 99, желтый - 100. Период смены сигнала ровно 1 сек, как и было задумано. Изображение снято в процессе обновления, поэтому в одном месте картина слегка нарушена.
Что до инвертора, то соединив ножку 99 с 95 (вход инвертора), на ножке 96 получим одинаковую картину с ножкой 100, что правильно, так как инвертированный сигнал, будучи инвертирован дважды, станет таким же, как был изначально. Для наглядности, чтобы сигналы не сливались, мы немного развели их нулевой уровень.
Таким образом мы заставили ПЛИС Altera выполнять нашу задумку аж по двум независимым схемам на одном кристалле, что для микроконтроллера задача вообще немыслимая.
Вывод
ПЛИС - очень важное и интересное техническое решение для создания электронных устройств. Коренным образом отличаясь по логике работы от контроллеров, ПЛИС имеет собственные неоспоримые преимущества: высочайшую скорость при минимальном энергопотреблении и реальную многопоточность. Для какой задачи стоит предпочесть ПЛИС контроллеру, вопрос непростой и неоднозначный, многие устройства можно создать и на той, и на другой базе, главное, чтобы это оправдывало стоимость оборудования и затраченных сил. Стоит ли вам углубляться в изучение проектирования микросхем ПЛИС, решаете только вы, но важно помнить простую идею: знания не бывают лишними, они обязательно где-нибудь и когда-нибудь пригодятся.FAQ
Чем отличаются семейства микросхем производителей Altera и Xilinx?Отличий много, в основном это количество программируемых логических ячеек, объема памяти, количества пинов, банков логических уровней, наличия готовых блоков, технологии производства и, как следствие, максимальной скорости работы, а также, разумеется, цены. Выбор зависит от поставленной задачи, для обработки видео больше подходит одно, для работы с памятью другое и так далее.
Для каких целей выгодно использовать ПЛИС?
Когда контроллер не справляется. Когда у контроллера катастрофически не хватает пинов. Когда нет готовой микросхемы в продаже, быстрее и дешевле сделать проект на ПЛИС от одной штуки до сотни-другой. К слову, стоимость ПЛИС начальных уровней сопоставима со стоимостью микроконтроллеров.
В чем же преимущество микроконтроллеров?
С ними привычнее и гораздо проще. Если сложность задачи немного выше, чем просто помигать светодиодами, решить ее программно значительно проще, чем аппаратно. Работа с объемными данными, периферийными устройствами, системами связи и коммуникации на порядки легче выполняется программированием контроллера. Существуют задачи и вовсе не предназначенные для ПЛИС (хотя, справедливости ради, можно сказать и обратное про МК).