Первый взгляд микроконтроллерного энтузиаста на программируемую логику

Добавлено 26 сентября 2018 в 13:52

Программируемые логические интегральные схемы FPGA (field programmable gate array) традиционно находятся в мире профессионального развития высокого класса. До недавнего времени FPGA оставались почти исключительно на этой арене из-за высокой начальной стоимости покупки, расходов на инструменты разработки и тайн, окружающих представление о них. К счастью, в последние годы многое изменилось.

Платы FPGA теперь в пределах досягаемости

В настоящее время существует довольно много недорогих и простых в использовании отладочных плат FPGA, а базовые инструменты часто можно скачать бесплатно. Некоторые из этих плат были отмечены в предыдущей статье «Лучшие отладочные платы FPGA для начинающих разработчиков».

Отладочная FPGA плата Papilio DUO
Отладочная FPGA плата Papilio DUO

Однако, даже если FPGA становятся более доступными и более удобными в использовании, чем в прошлые годы, вы всё равно может спросить «зачем»? Микроконтроллеры недостаточно быстры и универсальны? Может, да, а может, и нет.

FPGA – это, по сути, настраиваемая микросхема специального назначения (ASIC, application-specific integrated circuit), которую можно запрограммировать и перепрограммировать по мере необходимости. У FPGA с максимальной емкостью есть миллионы логических блоков. Большинство из FPGA микросхем чисто цифровые. Некоторые из них являются однокристальными системами (SoC), с процессорами ARM и аналоговыми периферийными устройствами в одном корпусе.

Было бы сложно выбрать одну «лучшую вещь», которую могут выполнять FPGA. Они невероятно универсальные устройства, но если бы мне пришлось ответить одним словом, это было бы «параллельность», так как они могут выполнять более одного дела одновременно.

FPGA не ограничены одним путем выполнения

В микроконтроллере (MCU) или центральном процессоре (CPU) всё должно последовательно проходить через ядро процессора. Вы можете получить некоторый уровень параллелизма с многоядерными процессорами, но все они всё еще используют одну и ту же шину памяти.

FPGA не является микроконтроллером и не имеет встроенного микроконтроллера. Однако вы можете создать свои собственные микроконтроллеры в массиве логических блоков. Фактически, вы можете настроить множество микроконтроллеров в массиве логических блоков, создав собственный многоядерный процессор. Более частое использование заключается в том, чтобы FPGA выполняла тяжелую вычислительную работу, в то время как подключенный микроконтроллер обрабатывает ввод/вывод не реального времени, пользовательский интерфейс и другие, более приземленные задачи.

Чтобы лучше понять возможности параллелизма FPGA, представьте себе CPU или MCU, как устройство, управляемое стопкой карточек 3x5 дюймов. На каждой карточке есть записанные на ней инструкция или слово данных. Вы можете дублировать любую из карточек так часто, как захотите, и можете прыгать по своей стопке, как сочтете нужным.

Для обработки стека команд каждая карта должна проходить через единственный слот, одна карта после другой. Этот слот представляет собой путь через арифметическое логическое устройство (АЛУ, ALU) микроконтроллера. Если вы используете одноядерный процессор, у вас есть только один блок ALU.

С каждым тактовым циклом одна карточка проходит через ALU. Если вы хотите выполнить функцию (набор из карточек) 5 раз, вам всё равно придется проводить эту группу карточек через слот 5 раз, каждую карточку отдельно. Внезапно 30-строчная функция становится во время работы 150-ью тактовыми циклами.

Связанные группы логических ячеек

FPGA, наоборот, больше похожа на большой пакет основных логических чипов (также называемых «логическими ячейками»). Вы можете высыпать их на свой стол и организовать и сгруппировать их по своему усмотрению. Итак, (и это ключевой атрибут FPGA) если вы хотите выполнить функцию 5 раз, вы можете создать 5 дискретных копий этой группы логических блоков.

Если ваша функция занимает 30 блоков, для построения схемы вам понадобится в общей сложности 150 блоков. Но, поскольку вы создали связанную логическую схему, данные представленные на входе схемы распространяются на выход схемы без управления тактовым сигналом. Кроме того, поскольку у вас есть пять схем, одному набору данных не нужно ждать предыдущего. Вся работа в этом наборе происходит за один тактовый цикл!

Сравнение повторного использования кода на FPGA и микроконтроллерах
Сравнение повторного использования кода на FPGA и микроконтроллерах

Думайте о коде FPGA как о плане, а не об инструкциях

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

В FPGA код является скорее планом, который используется при включении питания. Вместо инструкции времени выполнения код FPGA используется для подключения и настройки всех тех логических блоков, которые вы высыпали на стол. Он, по сути, создает специализированный чип. После включения и настройки микросхемы код больше не требуется (до следующего включения).

Ниже показан код микроконтроллера (в верхней части) и код FPGA (в нижней части).

Примеры кода для микроконтроллера и FPGA
Примеры кода для микроконтроллера и FPGA

«Массив логических блоков» в FPGA представляет собой большой массив таблиц поиска (LUT, lookup table). LUT – это особый тип регистра, иногда называемый ОЗУ, который настроен для имитации логического элемента. Когда FPGA настроена, каждый используемый LUT имитирует какой-либо логический элемент. По сути, большой блок регистров превращается в группу логических блоков.

Путем настройки параллельных схем в FPGA ничего повторно не используется (если вы сами не решитесь на повторное использование), и ничто не должно проходить через узкое место ALU.

Например, рассмотрите возможность слияния датчиков реального времени в роботе с 20 различными датчиками, каждый из которых общается по I2C.

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

С FPGA вы можете настроить 20 независимых интерфейсов I2C. Все 20 будут работать точно в одно и то же время. За одно действие ваш робот на основе FPGA прочитает все 20 датчиков одновременно. Данные могут быть введены в комбинаторную логику, которую вы создадите, и представлены микроконтроллеру в качестве результатов виртуального анализа реального времени.

Несколько недостатков

У FPGA есть несколько недостатков. Одним из самых больших является тот факт, что FPGA являются непостоянными. Каждый раз, когда вы отключаете питание, она теряет свою конфигурацию. Конфигурация должна быть заново загружена при следующем включении питания. Таким образом, устройства на базе FPGA нуждаются во встроенной флэш-памяти или другой энергонезависимой памяти для хранения кода конфигурации. Это делает FPGA более сложными в проектировании и сборке и приводит к более медленному времени запуска. Вы не можете иметь мгновенно включающееся FPGA устройство на одной микросхеме.

Если вы собираетесь посмотреть на FPGA, то должны иметь в виду несколько вещей:

  • В мире микроконтроллеров вы пишете программу, а затем загружаете ее во встроенную флэш-память. В мире FPGA это не называется «программой», это «конфигурация».
  • В вашей системе разработки для микроконтроллеров вы можете называть скомпилированный код «hex файл» или «прошивка». Для FPGA вы обычно ссылаетесь на него как «битовый поток» («bitstream») или «файл конфигурации».
  • Проекты FPGA обычно создаются с использованием одного из двух языков: Verilog или VHDL. Как правило, языки FPGA называются HDL, или языками описания аппаратного обеспечения.
  • В некотором смысле, HDL выглядят как обычные языки программирования, но это не так. Verilog, в частности, выглядит очень похоже на C. Не позволяйте этому одурачить вас, думая, что вы программируете микроконтроллер.

FPGA – это не единственная программируемая логика. CPLD (complex programmable logic device, сложное программируемое логическое устройство) аналогичны FPGA и не-непостоянны, но немного менее гибки. Программируемые логические блоки также начинают появляться в микроконтроллерах, таких как некоторые члены серии Microchip PIC. Компания Silego также имеет семейство настраиваемых программируемых логических устройств смешанных сигналов в своей линейке GPAK. Ни одно из этих устройств не достигает такого количества блоков, как в высокопроизводительных FPGA, но их стоит иметь в виду для более простых приложений.

Заключение

Для меня самое большое изменение в представлении о FPGA было то, что FPGA настраивается во время включения, а не во время выполнения. Если вы вызываете функцию (также называемую модулем HDL), вы не просто повторно используете блок кода при запуске программы. Для FPGA, когда чип включается и загружается битовый поток, вы создаете отдельные логические схемы. При программировании это выглядит как программное обеспечение, но это не так. Это аппаратное обеспечение.

После небольшой работы FPGA могут открыть вам новые миры. Это микросхемы, мощные, но не слишком трудные для изучения и увлекательно отличающиеся от микроконтроллеров, с которыми большинство из нас знаком


На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.


Сообщить об ошибке