Плис с чего начать
Перейти к содержимому

Плис с чего начать

  • автор:

Как начать работать с программируемыми логическими интегральными схемами (ПЛИС)

Написать эту статью заставили меня товарищи, которые очень хорошо (гораздо лучше меня) разбираются в контроллерах и применяют их везде, где ни попадя. Тем не менее, есть огромная куча приложений, когда применение ПЛИС не только оправдано, но и приводит к значительному упрощению системы и улучшению ее параметров. Сразу оговорюсь: в этой и, возможно, последующих статьях я рассматриваю ПЛИС только фирмы Xilinx не потому, что они мне заплатили, и даже не потому, что они лучше всех, просто исторически сложилось, что работаю я практически только с ними.

Итак, начнем с небольшого количества теории. ПЛИС делятся на две основных группы: CPLD (Complex Programmed Logic Device) и FPGA (Field Programmed Gate Array). CPLD — это обычно ПЛИС класса «эконом», т.е. имеют невысокую цену и довольно скудное количество ресурсов, особенно это заметно на триггерах. FPGA обычно подороже, содержат побольше ресурсов (простой логики — триггеров. ) и, самое важное, в последнее время дополнительные «непростые» блоки, как, например, умножители, блоковую память, интерфейсные причиндалы (Ethernet, PCI-express. ) и даже процессорные ядра PowerPC. Отдельно можно упомянуть серию Zinq от Xilinx — туда вообще ядра ARM запихали. Главным же отличием FPGA от CPLD является потребность в загрузке конфигурации при включении питания и, соответственно, внешней ПЗУ с конфигурацией. Даже семейство SPARTAN-3AN имеет на борту встроенную ПЗУ-шку, из которой и грузится.

Теперь самое главное: чем ПЛИС отличается от контроллера и когда их применять. Тут всё довольно просто: ПЛИС (берем те, что без наворотов) — это, по сути, мешок логики на одном кристалле, которую можно произвольно соединять: те самые триггеры, AND, OR и тому подобные примитивы, как, например, в серии К155 или 74НС. Контроллер же — это готовый процессор (пусть со скудным количеством команд), встроенная память, шины данных и команд, периферия и т.д. В общем-то говоря, из большой ПЛИС можно сделать маленький контроллер, но эта затея, по крайней мере, глупая. Итак, контроллер заточен под выполнение длинных цепочек команд, их циклического повторения, переключения с одной цепочки на другую и т.д., а ПЛИС заточена под выполнение простых логических операций и, что немаловажно, большого количества сразу (и даже на разных тактовых частотах).

ПЛИС Xilinx XC95288XL в корпусе TQ144

Перейдем от теории к практике. Для начала нам хватит какой-нибудь микросхемы CPLD. Ресурсов мало, но для освоения самое оно. Я возьму XC95288XL в корпусе TQ144 (опять же просто оказалась в наличии), вообще рекомендую взять что-нибудь посвежее, например, из серии CoolRunner 2. Чтобы получить готовое изделие (пусть даже минимально мигающее светодиодом), нам необходимо: спаять аппаратную часть (тут, я надеюсь, проблем не возникнет, а нюансы я упомяну), «написать» прошивку (в нашем случае, скорее, нарисовать) и зашить прошивку в микросхему. В общем, нам понадобятся софт, генерящий прошивку, и программатор. Софт (Xilinx ISE Webpack) качаем с официального сайта (правда, попросят зарегистрироваться), лицензия Webpack — свободная. Программатор можно сделать по схеме на рис.1 (под LPT-порт) или приобрести заводской USB-шный (в китайских интернет-магазинах встречал по цене порядка 50$, но сам не покупал). Более подробно.

Рис. 1
(рисунок кликабелен для увеличения, откроется в новом окне)

После того, как мы припаяли ПЛИС на макетную плату, спаяли или купили программатор, скачали и установили пакет ISE Webpack (у меня версия 13.2), запускаем Project Navigator и создаем новый проект. Чтобы создать проект, выбираем File -> New Project, указываем имя проекта и куда его сохранить, также указываем тип исходника TOP-LEVEL (рис.2). Дело в том, что для ПЛИС не обязательно рисовать схему из триггеров и их соединений, можно, например, писать на языках высокого уровня (VHDL, Verilog) и совсем не обязательно в пределах одного проекта использовать что-то одно. Мы же пока используем только Schematic на всех уровнях.

Рис. 2
(рисунок кликабелен для увеличения, откроется в новом окне)

В следующем окошке (рис. 3) выбираем нашу микросхему (остальное поначалу не трогаем); в окне, появившемся после нажатия на кнопку «Next», любуемся на параметры созданного проекта, жмем «Финиш» — и готово: проект создан.

Теперь надо, собственно, нарисовать схему: правым кликом на окошко с проектом и new sourсe (рис 4.), нарекаем этот исходник именем (это имя нашей схемы, их в проекте может быть много), выбираем опять-таки Schematic, жмем «Next», любуемся на параметры вновь создаваемого файла, жмем «Финиш» и получаем чистую схему.

Рис. 4
(рисунок кликабелен для увеличения, откроется в новом окне)

Начинается самое интересное: на панельке слева (не с самого краю) жмем кнопочку «add symbol» (рис. 5).

Рис. 5
(рисунок кликабелен для увеличения, откроется в новом окне)

И получаем еще левее список символов текущей библиотеки. Как добавлять, создавать, править библиотеки, разберемся потом (по мере необходимости). Сейчас нам важно выбрать необходимый символ. Так в верхнем окошке мы видим некий классификатор — фильтр, которым пользоваться не обязательно (ну зачем же пролистывать всякие триггеры и логические элементы, когда нам нужен счетчик).

Для примера рассмотрим следующую задачу: нужно максимально точно определить время задержки между передними фронтами 2-х импульсов, появляющихся на разных проводах, и слить это значение в контроллер по интерфейсу SPI. Всякое сходство задачи с темой «Повышение рабочей частоты МК» на одном из робототехнических форумов умышленное. Итак, на входе устройства 2 провода для импульсов и 3 провода для SPI контроллера. Добавляем еще вход тактирования (пока мы не знаем на какой частоте, можем только предположить, что не менее 70 МГц). Начинаем рисовать прошивку: нам нужны триггеры-защелки, которые будут «ловить» импульсы, счетчик времени, регистр сдвига (создавать их не надо, они есть библиотечные). Что такое триггеры и счетчики, описывать не буду, надеюсь, читатели «в теме» и проблем не возникнет, в противном случае придется писать еще несколько статей. Получили вот такую схему (рис. 6), как вы видите, необязательно тянуть провод от выхода символа до входа, достаточно просто обозвать цепь. Для обозначения внешних входов и выходов используем кнопку «Add I/O Marker».

Рис. 6
(рисунок кликабелен для увеличения, откроется в новом окне)

Когда схема готова, переходим на вкладку Design, и даблкликаем на Implement Design — начинаются всякие процессы (для начала не важно какие именно — главное, что всё вместе — это процесс перегонки исходника в прошивку). Когда всё отработает, смотрим на эрроры с варнингами: всё, что важно, исправляем, остальное оставляем. Например, не нужны нам выходы СЕО и ТС счетчика и остальные 15 бит параллельного выхода регистра сдвига тоже не нужны, а варнингами ругается. Если ругается эррорами на то, что мы так и хотим, значит, мы хотим чего-то не того. Если нас (и синтезатор) всё устраивает — любуемся дальше на репорты: сколько каких ресурсов израсходовано, какие тактовые частоты доступны. Если опять всё хорошо, то самое время просимулировать схему и убедиться, что она, собственно, работает согласно поставленной задаче. Симуляцию после проверки таймингов я предлагаю проводить по причине того, что иногда для получения нужной тактовой частоты приходится всю схему перетрясти, что, естественно, может сказаться на результате.

Итак, симуляция: на вкладке Design (в левой панельке) выбираем simulation (рис. 7).

Рис. 7
(рисунок кликабелен для увеличения, откроется в новом окне)

Внизу, в процессах, вместо процессов синтеза и разводки появился процесс Simulate Behavioral Model, даблкликаем на него — запускается симулятор, в котором мы видим наши сигналы (не только входные-выходные, но и промежуточные) (рис 8).

Рис. 8
(рисунок кликабелен для увеличения, откроется в новом окне)

Наводим на кнопочки курсор мышки, читаем комментарии к кнопочкам. Устанавливаем время шага симуляции (рис. 9) и начальные значения входных сигналов, сразу же настраиваем тактовые сигналы (не будем же мы каждые 5 нс симулировать и клок переключать).

Рис. 9
(рисунок кликабелен для увеличения, откроется в новом окне)

Шагая по времени путем манипуляций с входами и (при необходимости) с шагом симуляции, получаем временную диаграмму (рис. 10).

Рис. 10
(рисунок кликабелен для увеличения, откроется в новом окне)

Убеждаемся, что всё работает так, как задумано (или отлаживаем схему дальше), и переходим к следующему шагу — распределению выходов и входов по ножкам микросхемы. Для этого добавляем еще один файл-исходник (рис. 11), а именно Implementation Constraints File.

Рис. 11
(рисунок кликабелен для увеличения, откроется в новом окне)

Прописываем «распиновку микросхемы» (рис. 12), здесь же прописываем требования к тактовым частотам. И вот мы дошли до нюанса, связанного с тактовыми сигналами. Дело в том, что сигналы тактирования должны приходить на так называемые глобальные линии — линии, которые проходят через всю микросхему, остальные линии имеют локальный характер и от блока к блоку проходят через коммутационную логику. У микросхемы XC95288XL в корпусе TQ144 таких линий 3, и подключаются они к ногам 30, 32, 38. Остальные сигналы можно подключить к любым ножкам ввода-вывода (I/O).

Рис. 12
(рисунок кликабелен для увеличения, откроется в новом окне)

Снова даблкликаем Implement Design, ждем, читаем замечания на тему варнингов с эррорами и переходим на отчеты по распиновке (рис. 13) и таймингам (рис. 14); убеждаемся в том, что всё нас устраивает, и имеем счастье в виде файла %project_name%.jed.

Рис. 13
(рисунок кликабелен для увеличения, откроется в новом окне)

Рис. 14
(рисунок кликабелен для увеличения, откроется в новом окне)

Файл прошивки готов. Допустим, устройство тоже. Подключаем к ЭВМ JTAG кабель и даблкликаем на Configure Target Device. Запустится утилитка прошивки (Impact.exe), собственно, при изготовлении нескольких устройств для прошивки серии можно ограничиться запуском только ее одной. Создаём новый проект (это проект для программки-прошивалки), разрешаем ей автоматически найти программатор и подключенную микросхему, показываем файл прошивки и жмем Program. Ждем несколько десятков секунд, видим надпись о том, что всё хорошо, — устройство готово.

Исходники:
cpld_start.zip — исходные файлы проекта

Изучение FPGA Altera

Изучение FPGA Altera

Современные ПЛИС – программируемые логические микросхемы, выполняемые по технологии от 10 нм и содержащие большое количество логических элементов. Элементы могут выполнять простые логические операции «И», «ИЛИ» и др. или реализовывать функции умножителей, сумматоров, мультиплексоров и более сложных устройств.

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

По этим причинам ПЛИС нашли широкое применение в радиоэлектронной аппаратуре, устройствах высокоскоростной параллельной обработки сигналов, микропроцессорной технике.

С чего начать?

К большому сожалению, литературы на русском языке, описывающей принципы функционирова ния, программирования FPGA практически нет. Нет и чёткого понимания, даже у специалистов, когда применять ПЛИС, а когда программируемый микроконтроллер в повседневных задачах (не связанных с управлением космическими аппаратами или опасным промышленным производством).

Начать нужно с главного вопроса – какие задачи вы планируете решать с использованием FPGA?
Если вы разрабатываете шину передачи данных для своего устройства или конструируете плату обработки сигналов с разложением в ряд Фурье, то ПЛИС — это то, что необходимо. Прекрасным решением является и построение отказоустойчивых систем с быстрым временем реакции на основе ПЛИС в системах автоматики.
Это лишь некоторые примеры, позволяющие оценить мощь и гибкость FPGA. Поэтому главными критериями при выборе определим быстродействие и оригинальную архитектуру, ради которых стоит пойти на дополнительные трудозатраты.

Приняв по тем или иным причинам твёрдое решение освоить ПЛИС, встают следующие вопросы – с чего начать и насколько это затратно?
По поводу денежных затрат – микросхемы начального уровня, средства программирования и отладки ненамного дороже микроконтроллеров. Освоение сред разработки и языков программирования нисколько не сложнее тех же МК. Всё вышесказанное относится к продукции компании Altera, которую и рассмотрим более детально.

Средства разработки и отладки

Возникает справедливый вопрос: а как же проектировать и отлаживать такой «зоопарк» различных серий и их версий? Altera позаботилась об этом, создав единую среду проектирования и отладки Quartus.

quartus_splash - Что такое ПЛИС и чего начать изучение FPGA Altera.png

  • Возможность создания проекта на языках VHDL, Verilog или в графическом редакторе.
  • Ведение всей фоновой работы по созданию конфигурационного файла ПЛИС, включая разводку в кристалле.
  • Загрузка конфигурационного файла в ПЛИС и внутрисхемная отладка.

Начало работы с FPGA Altera

  1. Определите необходимое количество входов/выходов
  2. Уровень напряжения
  3. Перечень логических операций
  4. Допустимую задержку прохождения сигнала от входа на выход
  5. Другие параметры, критичные при выполнении задачи.

Документацией на ПЛИС - Изучение FPGA Altera.jpg

3. Скачать по этой ссылке и установить среду разработки Quartus.
Для продуктов Quartus Prime Lite Edition, Quartus II Web Edition, ModelSlim-Intel FPGA Starter Edition лицензия не требуется . Бесплатной версии вполне хватит для ознакомления со средой. Изучить среду разработки, пользуясь встроенной справкой и документацией на сайте Altera.

Quartus Prime Lite Edition - Изучение FPGA Altera.jpg

4. Приобрести ПЛИС Altera и программатор с параллельным или usb-портом.

5. Разработать и отладить проект своего устройства на ПЛИС.
Собрать электрическую схему, загрузить проект в микросхему, проверить полученный результат. При необходимости внести изменения в проект, воспользоваться возможностями внутрисхемной отладки.

Выполненные проекты - Электроника-РА_имп_1200х400.jpg

Заявка на поставку импортных ПЛИС Altera

Мы специализируется на поставках импортных микросхем для производства приборов связи и навигационного оборудования для авиа- и судостроения . Получить подробную информацию о поставляемых брендах и условиях сотрудничества можно тут: https://import.el-ra.ru

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

Если вы заинтересованы в работы с нами, то заполните форму по ссылке: www. el-ra.ru/zayavka

Звоните: +7(495) 374-61-00
Пишите: sales@el-ra.ru

Оформите заявку на сайте, мы свяжемся с вами в ближайшее время и ответим на все интересующие вопросы.

Плис с чего начать

Для дельта-сигма достаточно и одного бита. Здесь даже лишнего с запасом. А 10кГц и вправду мало. Подробнее.

Плата MCY112

Артём2 13.02.2024 16:39

> Двухканальный аудио выход для Дельта Сигма ЦАП (8бит); Что подразумевается под «8бит»? Для вывода PCM . Подробнее.

Плата Марсоход3GW (Gowin)

Alex63 02.02.2024 11:50

Здравствуйте! очень хочется такую плату с возможностью припайки добавочной микросхемы памяти IS62C1024AL . Подробнее.

Белая медведица на льдине.

VladimirRunner 01.02.2024 17:46

Привет! Нашел ваши статьи хотел узнать можно ли к вам обратиться помочь запрограммирова ть адресные ргб . Подробнее.

FPGA для начинающих

fpga

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

Для начала необходимо немного разбираться в цифровой логике работы микросхем ASIC, но начинать с них очень сложно и дорого, и вместо этого лучше начать с FPGA.

Что такое FPGA?

FPGA расшифровывается как field-programmable gate array (программируемые пользователем вентильные матрицы, ППВМ). В более общем случае они называются ПЛИС — программируемые логические интегральные схемы.

С помощью FPGA можно в прямом смысле этого слова, проектировать цифровые микросхемы, сидя у себя дома с доступной отладочной платой на столе и ПО разработчика за несколько тысяч зеленых рублей. Но, есть и бесплатные варианты. Заметьте: именно проектировать, а не программировать, потому что на выходе мы получим физическую цифровую схему, выполняющую определенный алгоритм на аппаратном уровне, а не прогу для проца.

Работает это следующим образом. Есть готовая печатная плата с набором интерфейсов, которые подключены к установленной на плате микросхеме FPGA, что-то типа такой крутой платы для дата-центра или этой отладочной платы для обучения.

Пока мы не настроим FPGA, внутри микросхемы просто нет логики для обработки данных с интерфейсов, и посему работать конечно же ничего не будет. Но в результате проектирования будет создана прошивка, которая после загрузки в FPGA создаст необходимую нам цифровую схему. Таким образом можно создать контроллер 100G Ethernet, который будет получать и обрабатывать сетевые пакеты.

Важная особенность FPGA — возможность перенастройки. Допустим сейчас нам нужен контроллер 100G Ethernet, а через неделю эта же плата может использоваться для реализации независимых четырех интерфейсов 25G Ethernet.

На рынке работают два лидера в производителя FPGA-чипов: всеми известный Intel и Xilinx. Они контролируют 58 и 42% рынка. Первый свой чип FPGA основатели Xilinx изобрели в далеком 1985 году. Intel пришла на рынок совсем недавно — в 2015 году, поглотив компанию Altera, которая была основана в то же время, что и Xilinx. Технологии Altera и Xilinx во многом схожи, как и среды разработки. Чаще я работал с продуктами компании Xilinx, поэтому не удивляйтесь ее постоянному упоминанию в статье.

FPGA широко распространены в разных сферах: потребительской электронике, оборудовании телекома, платах-ускорителях для применения в дата-центрах, робототехнике, прототипировании микросхем ASIC. Пару примеров я разберу чуть ниже.

Также рассмотрим технологию, которая обеспечивает аппаратную реконфигурацию, познакомимся с процессом проектирования и разберем простой пример реализации аппаратного счетчика на языке Verilog. Если у вас есть любая отладочная плата FPGA, вы сможете повторить это самостоятельно. Если платы нет, то все равно сможете познакомиться с Verilog, смоделировав работу схемы на своем компе.

Принцип работы FPGA

Микросхема FPGA — это та же заказная микросхема ASIC, состоящая из таких же транзисторов, из которых собираются триггеры, регистры, мультиплексоры и другие логические элементы для обычных схем. Изменить порядок соединения этих транзисторов, конечно, нельзя. Но архитектурно микросхема построена таким хитрым образом, что можно изменять коммутацию сигналов между более крупными блоками: их называют CLB — программируемые логические блоки.

Также можно изменять логическую функцию, которую выполняет CLB. Достигается это за счет того, что вся микросхема пронизана ячейками конфигурационной памяти Static RAM. Каждый бит этой памяти либо управляет каким-то ключом коммутации сигналов, либо является частью таблицы истинности логической функции, которую реализует CLB.

Так как конфигурационная память построена по технологии Static RAM, то, во-первых, при включении питания FPGA микросхему обязательно надо сконфигурировать, а во-вторых, микросхему можно реконфигурировать практически бесконечное количество раз.

fpga плата

Блоки CLB находятся в коммутационной матрице, которая задает соединения входов и выходов блоков CLB.

плата fpga

На каждом пересечении проводников находится шесть переключающих ключей, управляемых своими ячейками конфигурационной памяти. Открывая одни и закрывая другие, можно обеспечить разную коммутацию сигналов между CLB.

fpga это

CLB очень упрощенно состоит из блока, задающего булеву функцию от нескольких аргументов (она называется таблицей соответствия — Look Up Table, LUT) и триггера (flip-flop, FF). В современных FPGA LUT имеет шесть входов, но на рисунке для простоты показаны три. Выход LUT подается на выход CLB либо асинхронно (напрямую), либо синхронно (через триггер FF, работающий на системной тактовой частоте).

fpga что это

Интересно посмотреть на принцип реализации LUT. Пусть у нас есть некоторая булева функция y = ( a & b ) | ~ c . Ее схемотехническое представление и таблица истинности показаны на рисунке. У функции три аргумента, поэтому она принимает 2^3 = 8 значений. Каждое из них соответствует своей комбинации входных сигналов. Эти значения вычисляются программой для разработки прошивки ПЛИС и записываются в специальные ячейки конфигурационной памяти.

Значение каждой из ячеек подается на свой вход выходного мультиплексора LUT, а входные аргументы булевой функции используются для выбора того или иного значения функции. CLB — важнейший аппаратный ресурс FPGA. Количество CLB в современных кристаллах FPGA может быть разным и зависит от типа и емкости кристалла. У Xilinx есть кристаллы с количеством CLB в пределах примерно от четырех тысяч до трех миллионов.

Помимо CLB, внутри FPGA есть еще ряд важных аппаратных ресурсов. Например, аппаратные блоки умножения с накоплением или блоки DSP. Каждый из них может делать операции умножения и сложения 18-битных чисел каждый такт. В топовых кристаллах количество блоков DSP может превышать 6000.

Другой ресурс — это блоки внутренней памяти (Block RAM, BRAM). Каждый блок может хранить 2 Кбайт. Полная емкость такой памяти в зависимости от кристалла может достигать от 20 Кбайт до 20 Мбайт. Как и CLB, BRAM и DSP-блоки связаны коммутационной матрицей и пронизывают весь кристалл. Связывая блоки CLB, DSP и BRAM, можно получать весьма эффективные схемы обработки данных.

Преимущества FPGA

Первый чип FPGA, созданный Xilinx в 1985 году, содержал всего 64 CLB. В то время интеграция транзисторов на микросхемах была намного ниже, чем сейчас, и в цифровых устройствах часто использовались микросхемы «рассыпной логики». Были отдельно микросхемы регистров, счетчиков, мультиплексоров, умножителей. Под конкретное устройство создавалась своя печатная плата, на которой устанавливались эти микросхемы низкой интеграции.

Использование FPGA позволило отказаться от такого подхода. Даже FPGA на 64 CLB значительно экономит место на печатной плате, а доступность реконфигурации добавила возможность обновлять функциональность устройств уже после изготовления во время эксплуатации, как говорят «in the field» (отсюда и название — field-programmable gate array).

За счет того, что внутри FPGA можно создать любую аппаратную цифровую схему (главное, чтобы хватило ресурсов), одно из важных применений ПЛИС — это прототипирование микросхем ASIC.

Разработка ASIC очень сложна и затратна, цена ошибки очень высока, и вопрос тестирования логики критичен. Поэтому одним из этапов разработки еще до начала работы над физической топологией схемы стало ее прототипирование на одном или нескольких кристаллах FPGA.

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

Однако, на мой взгляд, существуют более интересные применения ПЛИС. Гибкая структура FPGA позволяет реализовывать аппаратные схемы для высокоскоростной и параллельной обработки данных с возможностью изменить алгоритм.

fpga что это такое

Давайте подумаем, чем принципиально отличаются CPU, GPU, FPGA и ASIC. CPU универсален, на нем можно запустить любой алгоритм, он наиболее гибок, и использовать его легче всего благодаря огромному количеству языков программирования и сред разработки.

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

На другой стороне находится ASIC. На этой платформе требуемый алгоритм реализуется аппаратно за счет прямого соединения транзисторов, все операции связаны только с выполнением алгоритма и нет никакой возможности изменить его. Отсюда максимальная производительность и наименьшее энергопотребление платформы. А вот перепрограммировать ASIC невозможно.

Справа от CPU находится GPU. Изначально эти микросхемы были разработаны для обработки графики, но сейчас используются и для майнинга вычислений общего назначения. Они состоят из тысяч небольших вычислительных ядер и выполняют параллельные операции над массивом данных.

Если алгоритм можно распараллелить, то на GPU получится добиться значительного ускорения по сравнению с CPU. С другой стороны, последовательные алгоритмы будут реализовываться хуже, поэтому платформа оказывается менее гибкой, чем CPU. Также для разработки под GPU надо иметь специальные навыки, знать OpenCL или CUDA.

Наконец, FPGA. Эта платформа сочетает эффективность ASIC с возможностью менять программу. ПЛИС не универсальны, но существует класс алгоритмов и задач, которые на них будут показывать лучшую производительность, чем на CPU и даже GPU. Сложность разработки под FPGA выше, однако новые средства разработки делают этот разрыв меньше.

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

Использование FPGA позволяет решать эту задачу мгновенно: байты пакета еще только начали поступать в микросхему из сетевого интерфейса, а его заголовок уже анализируется. Использование процессоров тут может существенно замедлить скорость обработки сетевого трафика. Ясно, что для маршрутизаторов можно сделать заказную микросхему ASIC, которая будет работать наиболее эффективно, но что, если правила обработки пакетов должны меняться? Достичь требуемой гибкости в сочетании с высокой производительностью поможет только FPGA.

Таким образом, FPGA используются там, где нужна высокая производительность обработки данных, наименьшее время реакции, а также низкое энергопотребление.

FPGA in the cloud

В облачных вычислениях FPGA применяются для быстрого счета, ускорения сетевого трафика и осуществления доступа к массивам данных. Сюда же можно отнести использование FPGA для высокочастотной торговли на биржах. В серверы вставляются платы FPGA с PCI Express и оптическим сетевым интерфейсом производства Intel (Altera) или Xilinx.

На FPGA отлично ложатся криптографические алгоритмы, сравнение последовательностей ДНК и научные задачи вроде молекулярной динамики. В Microsoft давно используют FPGA для ускорения поискового сервиса Bing, а также для организации Software Defined Networking внутри облака Azure.

Бум машинного обучения тоже не обошел стороной FPGA. Компании Xilinx и Intel предлагают средства на основе FPGA для работы с глубокими нейросетями. Они позволяют получать прошивки FPGA, которые реализуют ту или иную сеть напрямую из фреймворков вроде Caffe и TensorFlow.

Причем это все можно попробовать, не выходя из дома и используя облачные сервисы. Например, в Amazon можно арендовать виртуальную машину с доступом к плате FPGA и любым средствам разработки, в том числе и machine learning.

FPGA on the edge

Что еще интересное делают на FPGA? Да чего только не делают! Робототехника, беспилотные автомобили, дроны, научные приборы, медицинская техника, пользовательские мобильные устройства, умные камеры видеонаблюдения и так далее.

Традиционно FPGA применялись для цифровой обработки одномерных сигналов (и конкурировали с процессорами DSP) в устройствах радиолокации, приемопередатчиках радиосигналов. С ростом интеграции микросхем и увеличением производительности платформы FPGA стали все больше применяться для высокопроизводительных вычислений, например для обработки двумерных сигналов «на краю облака» (edge computing).

Эту концепцию легче всего понять на примере видеокамеры для анализа автомобильного трафика с функцией распознавания номеров машин. Можно взять камеру с возможностью передачи видео через Ethernet и обрабатывать поток на удаленном сервере. С ростом числа камер будет расти и нагрузка на сеть, что может привести к сбоям системы.

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

Что до робототехники и дронов, то в этой сфере как раз особенно важно выполнять два условия — высокая производительность и низкое энергопотребление. Платформа FPGA подходит как нельзя лучше и может использоваться, в частности, для создания полетных контроллеров для беспилотников. Уже сейчас делают БПЛА, которые могут принимать решения на лету.

Разработка проекта на FPGA

Существуют разные уровни проектирования: низкий, блочный и высокий. Низкий уровень предполагает использование языков типа Verilog или VHDL, на которых вы управляете разработкой на уровне регистровых передач (RTL — register transfer level). В этом случае вы формируете регистры, как в процессоре, и определяете логические функции, изменяющие данные между ними.

Схемы FPGA всегда работают на определенных тактовых частотах (обычно 100–300 МГц), и на уровне RTL вы определяете поведение схемы с точностью до такта системной частоты. Эта кропотливая работа приводит к созданию максимально эффективных схем с точки зрения производительности, потребления ресурсов кристалла FPGA и энергопотребления. Но тут требуются серьезные скиллы в схемотехнике, да и с ними процесс небыстрый.

На блочном уровне вы занимаетесь в основном соединением уже готовых крупных блоков, которые выполняют определенные функции, для получения нужной вам функциональности системы на кристалле (system-on-chip).

На высоком уровне проектирования вы уже не будете контролировать данные на каждом такте, вместо этого сконцентрируешься на алгоритме. Существуют компиляторы или трансляторы с языков C и C++ на уровень RTL, например Vivado HLS. Он довольно умный и позволяет транслировать на аппаратный уровень широкий класс алгоритмов.

Главное преимущество такого подхода перед языками RTL — ускорение разработки и особенно тестирования алгоритма: код на C++ можно запустить и верифицировать на компьютере, и это будет намного быстрее, чем тестировать изменения алгоритма на уровне RTL. За удобство, конечно, придется заплатить — схема может получиться не такой быстрой и займет больше аппаратных ресурсов.

Часто мы готовы платить эту цену: если грамотно использовать транслятор, то эффективность не сильно пострадает, а ресурсов в современных FPGA достаточно. В нашем мире с критичным показателем time to market это оказывается оправданным.

Часто в одном дизайне нужно совместить все три стиля разработки. Допустим, нам нужно сделать устройство, которое мы могли бы встроить в робота и наделить его способностью распознавать объекты в видеопотоке — например, дорожные знаки. Возьмем микросхему видеосенсора и подключим ее напрямую к FPGA. Для отладки можем использовать монитор HDMI, тоже подключенный к FPGA.

Кадры с камеры будут передаваться в FPGA по интерфейсу, который заведомо определен производителем сенсора (USB тут не катит), обрабатываться и выводиться на монитор. Для обработки кадров понадобится фреймбуфер, который обычно находится во внешней памяти DDR, установленной на печатной плате рядом с микросхемой FPGA.

fpga применение

Если производитель видеосенсора не предоставляет Interface IP для нашей микросхемы FPGA, то нам придется писать его самостоятельно на языке RTL, считая такты, биты и байты в соответствии со спецификацией протокола передачи данных. Блоки Preprocess, DDR Controller и HDMI IP мы, скорее всего, возьмем готовые и просто соединим их интерфейсы. А блок HLS, который выполняет поиск и обработку поступающих данных, мы можем написать на C++ и транслировать при помощи Vivado HLS.

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

Рассмотрим путь проектирования от написания кода RTL до получения конфигурационного файла для загрузки в FPGA.

fpga для начинающих чайников

Итак, вы пишете код RTL, который реализует нужную вам схему. Прежде чем его проверять на реальном железе, надо убедиться, что он верный и корректно решает требуемую задачу. Для этого используется RTL-моделирование в симуляторе на компьютере.

Вы берете свою схему, представленную пока только в коде RTL, и помещаете ее на виртуальный стенд, где подаете последовательности цифровых сигналов на входы схемы, регистрируете выходные диаграммы, зависимости от времени выходных сигналов и сравниваете с ожидаемыми результатами. Обычно вы находите ошибки и возвращаетесь к написанию RTL.

Далее логически верифицированный код подается на вход программе-синтезатору. Она преобразует текстовое описание схемы в связанный список цифровых элементов из библиотеки, доступной для данного кристалла FPGA. В этом списке будут отображены такие элементы, как LUT, триггеры, и связи между ними. На этой стадии элементы пока никак не привязаны к конкретным аппаратным ресурсам. Чтобы это сделать, требуется наложить на схему ограничения (Constraints) — в частности, указать, с какими физическими контактами ввода-вывода микросхемы FPGA связаны логические входы и выходы вашей схемы.

В этих ограничениях также требуется указать, на каких тактовых частотах должна работать схема. Выход синтезатора и файл ограничений отдаются процессору Implementation, который, помимо прочего, занимается размещением и трассировкой (Place and Route).

Процесс Place каждый пока еще обезличенный элемент из netlist привязывает к конкретному элементу внутри микросхемы FPGA. Далее начинает работу процесс Route, который пытается найти оптимальное соединение этих элементов для соответствующей конфигурации коммутационной матрицы ПЛИС.

Place и Route действуют, исходя из ограничений, наложенных нами на схему: контактами ввода-вывода и тактовой частотой. Период тактовой частоты очень сильно влияет на Implementation: он не должен быть меньше, чем временная задержка на логических элементах в критической цепи между двумя последовательными триггерами.

Часто сразу удовлетворить это требование не удается, и тогда надо вернуться на начальный этап и изменить код RTL: например, попытаться сократить логику в критической цепи. После успешного завершения Implementation нам известно, какие элементы где находятся и как они связаны.

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

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

Существуют и высокоуровневые средства разработки (HLS, High-level synthesis), и даже готовые фреймворки для создания нейросетей в ПЛИС. Эти средства на выходе генерят код RTL на языках VHDL или Verilog, который дальше спускается по цепочке Synthesis → Implementation → Bitstream generation. Ими вполне можно пользоваться, но, чтобы использовать их эффективно, надо иметь хотя бы минимальное представление о языках уровня RTL.

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *