Как работает FPGA?

Давайте начнём с самого начала. Что такое FPGA? FPGA расшифровывается как F ield P rogrammable G ate Array (программируемая пользователем вентильная матрица).
FPGA относятся к классу устройств программируемой логики, иногда называемых программируемым оборудованием. По сути, сама по себе FPGA ничего не делает, но может быть сконфигурирована так, чтобы превратиться практически в любую нужную цифровую цепь. Магия заключается в том, что физически при этом ничего не меняется. Достаточно просто загрузить конфигурацию в FPGA, и она начнёт вести себя так, как нужная вам цепь. Не нужны ни пайка, ни перемычки, ни возня с другими соединениями. FPGA можно переконфигурировать так, чтобы она вела себя, как другая цепь, и делать это множество раз. Конфигурация хранится в ОЗУ, то есть, по сути, устройство можно переконфигурировать бесконечно.
![]() |
![]() |
| На плате Alchitry Cu выделена FPGA Lattice iCE40 HX | На плате Alchitry Au выделена FPGA Xilinx Artix 7 |
Хотя мы говорили об использовании FPGA для создания цифровых цепей, обычно для разработки их архитектуры не рисуют схемы. Если бы нам пришлось чертить схему, то размер и сложность цепей, которые могут содержать FPGA, стали бы очень громоздкими. Вместо этого мы можем описать поведение нужной нам цепи, а инструменты используют это описание для создания цепи, соответствующей этому поведению.
В каком-то смысле это похоже на программирование, ведь мы просто вводим текст. Однако фундаментальная реализация существенно отличается, так как мы создаём оборудование.
Если создание оборудования при помощи текста кажется вам магией, не волнуйтесь. Концепция его работы на самом деле довольно проста, и в этом туториале мы подробно о ней расскажем.
▍ Рекомендуемое чтение
В этом туториале мы узнаем, что такое FPGA и как она работает. Будем предполагать, что вы разбираетесь в электричестве (напряжение, ток и так далее) и двоичных значениях. Всё остальное легко понять из основ. Статья задумывалась как обзор FPGA и её фундаментальной архитектуры, а не руководство по проектированию собственного устройства.
Если вы незнакомы со следующими концепциями, то прежде чем читать дальше, рекомендую изучить данные туториалы:
Напряжение, ток, сопротивление и закон Ома. Узнайте о законе Ома — одном из самых фундаментальных уравнений во всей электромеханике.
Что такое электричество?. Работу электричества мы можем наблюдать в своих компьютерах, осветительных приборах и молниях, но что же это такое? Это непростой вопрос, и данный туториал прольёт на него немного света!
Аналоговое и цифровое. В этом туториале излагается концепция аналоговых и цифровых сигналов, и их связь с электроникой.
Транзисторы. Краткое введение в биполярные транзисторы. Узнайте, как работают транзисторы и в каких цепях мы их используем.
Цифровые цепи и логические вентили
▍ Цифровые цепи
Недостаток FPGA заключается в том, что они могут создавать только цифровые цепи. В некоторых новых FPGA есть встроенные аналогово-цифровые преобразователи, но даже они сразу же преобразуют аналоговый входной сигнал в цифровой. Но что же такое цифровая цепь?
В электронике цифровыми называются цепи, абстрагирующие непрерывные значения напряжения в дискретные единицы и нули. Для высокоуровневой архитектуры истинные напряжения и пороговые значения не так важны, но внутри FPGA часто бывает так, что 0 В обозначается как 0, а 1,2 В — как 1. Если истинное напряжение, допустим, равно 0,8 В, это достаточно близко к 1,2 В, чтобы считаться 1, а всё остальное работает так же.
Цифровые цепи преобразуют напряжения в крайние значения, что делает их невероятно устойчивыми к шуму и другим воздействиям реального мира. Также концепция цифрового устройства позволяет нам моделировать в цепи сложное поведение без необходимости работы над низкоуровневой архитектурой. Мы можем работать в идеальном мире. Все тонкости спрятаны внутри архитектуры простых строительных блоков, которые мы будем использовать.
Такими строительными блоками являются логические вентили.
▍ Логические вентили
Существует несколько логических вентилей, самые распространённые из которых — это AND (И) , OR (ИЛИ) , XOR (исключающее ИЛИ) и NOT (НЕТ) . Каждый из них получает на входе цифровые сигналы, выполняет свою логическую функцию и подаёт на выход цифровое значение.
Вентиль AND получает два входных значения и выводит 1, только если первое и второе входные значения равны 1. Если хотя бы одно из входных значений равно 0, то на выходе будет 0. Символ вентиля AND выглядит так:

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

Вентиль XOR схож с вентилем OR, но подаёт на выход 1, только когда или первое, или второе входное значение равно 1, но не когда оба равны 1. Можно ещё сказать, что он выводит 1, когда входные значения различаются. X в XOR расшифровывается как exclusive («исключающее»). Вот символ вентиля:

Вентиль NOT — самый простой. У него только один вход и он просто выводит противоположное значение. То есть 1 превращается в 0, а 0 превращается в 1.

Существуют вариации этих базовых вентилей, называющиеся NAND, NOR и XNOR. Это просто версии стандартных вентилей, но с инвертированными выходами.
Вентиль AND, как и все другие логические вентили, можно изготовить из транзисторов. На изображении ниже показано, как можно реализовать вентиль AND. В этой схеме использованы МОП-транзисторы NMOS и PMOS. Такой тип архитектуры называется CMOS (complementary metal-oxide semiconductor, КМОП, комплементарная структура металл-оксид-полупроводник), она используется в большинстве современных цепей.

Обратите внимание, что показанная выше схема на самом деле является вентилем NAND, за которым идёт вентиль NOT. Так получилось потому, что КМОП-цепи инвертируют выходное значение.
Мультиплексоры
Теперь, когда у нас есть базовые строительные блоки, от транзисторов до логических вентилей, мы можем создать из них что-то более полезное. При помощи одних только логических вентилей можно описать любую цифровую цепь. Однако существует множество часто используемых и обозначаемых собственными символами высокоуровневых функций, например, в двоичной математике (сумматоры, умножители и так далее).
Мы рассмотрим один из фундаментальных строительных блоков FPGA — мультиплексор.
Мультиплексор выбирает единственное входное значение из множества на основании значения входа выбора. Вот его символ:

Символ / на линии sel обозначает, что он имеет ширину 6 битов.
Количество входов может варьироваться, но выход у мультиплексора всегда только один.
Способ кодирования входа выбора тоже варьируется. Обычно он представлен как двоичное число, но в более простых цепях используется унитарное кодирование. Унитарный код — это просто двоичное значение, в котором всегда ровно одна 1. Важно в нём положение этой 1.
Декодер получает двоичное значение и превращает его в унитарный сигнал. Кодировщик превращает унитарное значение в двоичное число. Их можно использовать для того, чтобы мультиплексор принимал двоичные значения.
Взгляните, как можно реализовать мультиплексор с унитарным кодированием всего из нескольких вентилей AND и OR.

Если мы присвоим sel значение 000010, то есть только sel[1] будет равно 1, то для каждого вентиля AND, за исключением того, который имеет вход b, одно из входных значений будет равно 0. Это значит, что каждый из них будет подавать на выход 0, вне зависимости от того, какие входные значения на a, c, d, e и f. Единственный имеющий значение вход — это b. Если b равен 1, то он подвергается AND с 1 и на выходе вентиля AND будет 1. Когда b равен 0, то он подвергается AND с 1 и на выходе вентиля AND будет 0.
Иными словами, на выходе вентиля AND просто будет b.

Результат вентилей AND, когда sel[1] присвоено значение 1
Вентиль OR на этой схеме показан с более чем двумя входами. Это можно реализовать, создав дерево из двух входных вентилей OR, в которых два входа подвергаются OR, после чего выходы тоже подвергаются OR, и так снова и снова, пока мы не получим один выход. Вентиль OR со множественными входами будет иметь на выходе 1, если хотя бы один из входов равен 1.
Однако в этой цепи каждый вход вентиля OR гарантировано будет иметь значение 0, за исключением входа от вентиля AND, выходом которого является b. Это значит, что вентиль OR будет выводить 1, когда b равен 1, и выводить 0, когда b равен 0.
Иными словами, выходом вентиля OR будет просто b.

Результатом вентиля OR будет b
Эту логику можно повторить для любого входа, если вход будет с унитарным кодированием, то вход, соответствующий заданной 1, будет передан на выход.
Можно представить большую матрицу мультиплексоров с программируемыми входными данными sel. Это позволит направлять сигналы так, как нужно в архитектуре. Именно так FPGA передают сигналы туда, где они должны быть; это называется general routing matrix (главной трассировочной матрицей).
Очевидно, подробности маршрутизации тысяч и тысяч сигналов становятся запутанными, но в конечном итоге всё это просто множество мультиплексоров, входы выбора которых подключены к программируемой памяти.
Таблицы поиска
Итак, научившись динамически маршрутизировать сигналы туда, где они должны быть, мы должны найти способ выполнения произвольной логики. Для этого мы снова используем мультиплексоры, а точнее, их потомков, называемых LUT, или look-up table (таблицами поиска).
Представьте, что у нас есть мультиплексор с четырьмя входами и 2-битным двоичным выбором (вместо унитарного). Вместо того, чтобы открывать основные входы миру, подключим их к некой программируемой памяти. Это значит, что мы сможем запрограммировать каждый вход на некое постоянное значение. Объединим всё это в один блок и получим две входные LUT.

Два входа в LUT — это входы выбора мультиплексора. Программируя входы мультиплексора любыми нужными нам значениями, мы можем использовать эту LUT для реализации ЛЮБОЙ двоичной функции «2-к-1».
Например, можно заставить его работать как простой вентиль AND, задав в памяти следующее содержимое.
| Адрес (In[1:0]) | Значение (Out) |
|---|---|
| 00 | 0 |
| 01 | 0 |
| 10 | 0 |
| 11 | 1 |
Это простой пример — обычно LUT больше, чем просто два входа; FPGA на Alchitry Au основана на LUT с пятью входами.
Xilinx объединяет LUT с пятью входами с ещё одним мультиплексором для создания или LUT с шестью входами, или LUT с пятью входами и двух независимых выходов.

Если вы хотите подробнее узнать о том, что такое LUT и как выглядят ресурсы в FPGA, то прочитайте этот документ Xilinx по Artix 7. Учтите, что этот документ очень труден для понимания. Стоит взглянуть на страницу 20. На ней показана упрощённая схема SLICEL. Слайсы находятся на один строительный блок выше LUT. Четыре прямоугольника слева — это LUT, похожие на показанные выше.
Для контекста: в FPGA на Alchitry Au содержится 20800 двойных LUT. Это большое число, но оно и близко несравнимо с самыми крупными FPGA, в которых на момент написания статьи содержится примерно в 260 раз больше таблиц. Как можно понять, даже маршрутизировать все эти сигналы невероятно сложно. К счастью для нас, чтобы работать с FPGA, всё это нам делать не нужно. Инструменты выполняют всю низкоуровневую маршрутизацию и программирование LUT. Нам просто достаточно описать нужные цепи.
Зачем использовать FPGA?
Надеюсь, этот туториал дал вам примерное понимание того, как работают FPGA, но зачем их вообще использовать?
Обычно такой вопрос возникает в контексте выбора между использованием процессора или создания собственной архитектуры на FPGA. Многие люди знают, как писать код, но гораздо меньшее количество понимает, как создавать архитектуры для FPGA. Писать код часто проще при создании сложных поведений и для существенного изменения способа реализации.
Однако FPGA могут быть гораздо более эффективными с точки зрения времени обработки, а также обеспечения хороших таймингов. Чтобы проиллюстрировать это, рассмотрим тривиальный пример со включением светодиода при нажатии на кнопку. Если написать код для этого на чём-то вроде Arduino, то процессор будет выполнять небольшой цикл кода, считывающий состояние контакта, а затем обновляющий состояние другого контакта на основании этого значения.
Если вы оптимизируете этот код, то сможете добиться скорости обновления в миллионы раз в секунду. Кажется, это замечательно, но давайте посмотрим, как это будет выглядеть в случае FPGA. Если мы просто подключаем кнопку к светодиоду при помощи FPGA, то мы просто связываем кнопку и светодиод. Значение от кнопки передаётся через какой-то входной буфер, подаётся через матрицу трассировки, а затем выводится через выходной буфер. Этот процесс непрерывно повторяется всё время. Единственная задержка возникает из-за задержек коммутации транзисторов в чипе, которые невероятно малы.
Давайте расширим нашу конструкцию и добавим в неё микрофон. Мы можем брать сэмплы с микрофона и выполнять их обработку, чтобы определять частоты перехваченного аудио. По собственному опыту знаю, что это довольно сложно делать на маленьком микроконтроллере в реальном времени с приличной частотой сэмплирования. Процессору необходимо жонглировать считыванием сэмплов с микрофона, сохранением их в некий буфер, выполнением математических действий и выводом значений, например, на дисплей из светодиодов. Каждый из этих этапов требует времени, а процессор может выполнять только по одному этапу за раз.
При использовании FPGA можно выделить небольшой фрагмент архитектуры для считывания сэмплов с микрофона. Затем можно передавать сэмплы в буфер, а при его заполнении отправлять их в цепь, которая будет выполнять вычисления. Далее эта цепь может передавать результаты другой цепи, которая будет отображать светодиодами.
Каждый из этих этапов будет работать совершенно независимо друг от другого, потому что они просто существуют в оборудовании. Это не строки кода, конкурирующие за процессорное время.
А теперь представьте, что нам всё ещё нужно, чтобы кнопка была привязана к светодиоду. Раньше мы получали потрясающее время ответа в миллионы доли секунды, которое теперь превратилось в ужасающую пятую часть секунды, потому что мы не можем выделить достаточно процессорного времени, чтобы считывать кнопку так часто. Однако в FPGA кнопка и светодиод просто соединены вместе и реагируют почти мгновенно, как и раньше.
Такая независимость делает FPGA потрясающим кандидатом для управления всем тем, что требует быстрых таймингов. Например, светодиод WS2812B (он же NeoPixel) требует точного тайминга потока импульсов, чтобы записывать в них данные. При использовании микроконтроллера обычно необходимо писать встроенный ассемблер только для того, чтобы тайминг импульсов был достаточно точным. Также нужно отключить прерывания, потому что любые простои будут мешать сигналу.
При работе с FPGA достаточно просто создать последовательность чётко контролируемых импульсов для управления этими светодиодами; при этом не нужно беспокоиться о том, что какой-то другой элемент архитектуры конфликтует с таймингом.
Когда стоит использовать FPGA
Учитывая все плюсы применения FPGA, можно задаться вопросом: «Почему бы их не использовать для всего?». Отличный вопрос!
В описании работы FPGA можно было заметить, что для динамической реализации даже простейшей цепи нужно множество всего дополнительного. И это имеет свою цену, как в долларах, так и в ресурсах на проектирование.
FPGA обычно дороги. Самые крупные легко могут стоить тысячи долларов за чип. Это связано с большим количеством микросхем для их производства, затратами на исследования и разработки для проектирования чипов и инструментов, а также с относительно небольшими тиражами по сравнению, например, с крошечными процессорами, которые используются в телефонах.
Ещё один аспект затрат — это энергопотребление. В LUT используется множество транзисторов по сравнению с количеством, необходимым для непосредственной реализации цепи. Всем этим транзисторам требуется питание. Из-за этого FPGA оказываются плохими кандидатами для работы в устройствах на аккумуляторах. Разумеется, можно спроектировать цепи так, чтобы они были экономичными, но даже когда абсолютно ничего не делает, FPGA на Alchitry Au потребляет чуть больше 100 мА. Если начать использовать чип, то запросто можно получить больше 1000 мА. Для сравнения: чип ATmega32U4, используемый в Arduino Leonardo, на полной мощности потребляет 27 мА при 5 В. Хотя нужно учесть, что Alchitry Au гораздо более функциональный.
Так зачем же вообще использовать FPGA? При создании собственной цифровой цепи у вас есть два основных варианта. Во-первых, её можно создать самостоятельно из дискретной логики. Для этого понадобится существенное количество времени, гораздо больше затрат, а если понадобится что-то поменять, то гибкость окажется гораздо ниже.
Вторая, более реалистичная альтернатива заключается в проектировании цепи непосредственно в кремнии. При этом вы создадите очень быструю и эффективную цепь, но ценой нулевой гибкости и кучи денежных затрат. Огромные предварительные затраты на собственные микросхемы связаны с инструментарием и подготовкой. Однако инкрементные затраты на чип будут меньше, чем за отдельные FPGA. Впрочем, если вы не изготавливаете десятки тысяч чипов, это всё равно будет более затратным. Но даже при больших партиях иногда не имеет смысла замыкать свою архитектуру в кремний. При использовании FPGA можно изменять её в любой момент и без дополнительных затрат.
Благодаря своей гибкости и низкой стоимости по сравнению с альтернативами, FPGA открывает возможности добавления собственных цифровых цепей практически в любую архитектуру. Но нужна ли вам собственная цепь на самом деле?
Важно помнить, что FPGA — это просто один из инструментов. Молоток отлично подходит для забивания гвоздей, но ужасно справляется со вкручиванием шурупов. И забивать гвоздь отвёрткой тоже будет очень неудобно.
Создание собственных цепей может быть сложной задачей, и иногда стоит задаться вопросом, нет ли решения получше. Существует множество очень функциональных процессоров с кучей периферии, способных справляться с большинством ваших задач. Выполнение некоторых задач, например, получение и отправка данных через WiFi, может быть пугающим процессом при работе с FPGA, но легко выполнимым с микроконтроллером за несколько долларов, например, с ESP8266.
Я часто сравниваю FPGA со сборочной линией. Каждый участок сборочной линии не зависит от другого и чрезвычайно эффективно выполняет свою цель. Однако первоначальная подготовка линии может быть сложной работой, а иногда при внесении серьёзных изменений проще начать всё с нуля.
С другой стороны, процессоры похожи на людей. Если дать человеку время и обучить его, то он может выполнить практически любую задачу. Человеку легко выполнять сложные последовательные работы.
Действительно ли вам нужно организовывать целый завод по производству сэндвичей, если вы хотите просто сделать сэндвич на обед?
FPGA потрясающи и часто становятся незаменимыми в подходящих для них задачах, но это всего лишь один из инструментов. Очень мощный и стоящий изучения, но всё-таки ещё один инструмент.
Ресурсы и дальнейшее изучение
Мы изложили основы работы FPGA и их составляющих. На веб-сайте Alchitry есть множество других отличных ресурсов, в том числе туториалы, проекты и форум Alchitry.
- Alchitry
- Туториалы
- Проекты
- Форум
Термин: FPGA
FPGA (Field-Programmable Gate Array ) — программируемая логическая интегральная схема (ПЛИС), конфигурация которой может быть загружена после включения питания. Большинство FPGA не имеют встроенной энергонезависимой памяти, поэтому повторное включение устройства требует повторной загрузки конфигурации FPGA (информация объёмом от сотен Кбайт и более).
Некоторые устройства, например E20-10 (ревизий A и B), требуют явной загрузки FPGA от компьютера (загрузка реализована в библиотечных функциях для этого изделия, которые используют программисты, и для пользователя ПО этот процесс незаметен). А в некоторых устройствах (E20-10 ревизии C, LTR25, LTR35) реализован автоматический процесс загрузки FPGA из flash-памяти этого устройства, при этом, прошивка во flash-памяти этих устройств может быть обновлена с помощью специальной утилиты (в рамках выпуска «ООО Л Кард» штатных обновлений прошивок).
Наличие в изделии FPGA означает феноменальную гибкость логики этого изделия (в большинстве случаев это заводская возможность коррекции логики работы устройства без проведения каких-либо электромонтажных операций, позволяющая учесть потребности потребителей). Ресурсы современных FPGA (даже младших в выбранном семействе) уже позволяют реализовывать сложнейшие алгоритмы, в том числе, алгоритмы ЦОС.
Возможность создавать на основе FPGA многоканальные системы параллельной обработки данных с гарантированной логической независимостью процессов обработки данных (в сочетании с высокой надёжностью самих FPGA) создаёт серьёзную альтернативу сигнальным процессорам (DSP) и ARM в высоконадёжных задачах управления и контроля. Вместе с тем, в мире явно ощущается и обратная тенденция – реализация средствами FPGA процессоров и контроллеров с масштабируемой архитектурой.
Для описания и верификации проектов на основе FPGA используют языки высокого уровня, такие как VHDL и Verilog. Возможна интеграция проектов на языках С, C++, System C (на других путях программирования FPGA остановимся ниже). Описание проектов на языке высокого уровня обеспечивает хорошую переносимость проекта между разными FPGA и между разными средами проектирования.
Отдельно остановимся на термине «версия прошивки» FPGA (или CPLD), который встречается в пользовательской документации на электронные приборы. Этот термин имеет исторические корни, поскольку первые программируемые логические устройства (PLD) начинались с технологии пережигаемых перемычек, и сами эти устройства обладали крайне низкими логически возможностями, по сравнению с современными программируемыми матрицами. И когда современные FPGA для специализированных задач уже перекрывают процессоры по быстродействию и функциональным возможностям, то возникает соблазн применить термин «версия ПО» к версии логической конфигурации, загружаемой в FPGA. Однако, по-прежнему, эту логическую конфигурацию следует называть «прошивкой», поскольку речь идёт о параллельной топологии логических взаимосвязей ячеек FPGA, которая скорее ближе к электрической схеме, чем к выполняемым инструкциям процессора, когда говорят о ПО. Уже вполне реальна реализация процессора в FPGA, и в этой ситуации оба термина «версия прошивки» FPGA и «версия ПО процессора в FPGA» вполне оправданы и применимы к разным частям FPGA в рамках одного изделия, поскольку обе эти версии могут обновляться независимо друг от друга.
Важно отметить, что в понятие «версия прошивки» FPGA входит не только вариант реализованной «логики», но и температурный диапазон FPGA, для которого была скомпилирована данная прошивка. Типично, прошивки «индустриальных» FPGA c температурным диапазоном -40. +85 °С и «коммерческих» (0. +85 °С) будут разными для одной и той же функциональной логики.
К программному или аппаратному обеспечению следует относить саму прошивку FPGA (или CPLD) и проект этой прошивки в какой-либо среде программирования?
Подобный вопрос может возникнуть, например, при согласовании технического задания. Рассматривая уровни программных и аппаратных средств обобщённой пользовательской системы, мы видим, что прошивки FPGA (или CPLD) фактически находятся между сущностями HARD и SOFT. Это означает (исходя из сказанного выше), что тот уровень прошивки, в котором реализована «жёсткая логика» с параллельной топологией взаимосвязей ячеек FPGA и учётом физических задержек распространения сигнала (наподобие электрической схемы), очевидно является аппаратным уровнем (HARD). А тот уровень прошивки, в котором рассматривается программа процессора, реализованного в FPGA, очевидно является программным уровнем системы. Подразумевается, что логика работы рассматриваемого процессора должна быть основана на последовательно исполняемом программном коде, который может быть изменён (перепрограммирован) без модификации физического уровня проекта.
В то же время, проекты FPGA или CPLD (в той или иной среде программирования), не входят в рассматриваемую обобщённую пользовательскую систему, а является технологическим средством проектирования (со своими программными и аппаратными уровнями).
Для специалистов перечислим ниже альтернативные 1) пути подготовки проектов FPGA:
- MyHDL — это предметно-ориентированный язык, основанный в виде модуля на языке Python.
- CHISEL (Constructing Hardware In a Scala Embedded language) — язык с открытым исходным кодом, разработанный в университете Беркли (Калифорния).
- JHDL (JAVA Hardware Description Language) — объектно-ориентированный язык с открытым исходным кодом.
- BSV (Bluespec SystemVerilog) — язык и среда разработки компании Bluespec Inc.
- Средства MATLAB генерации кода Verilog и VHDL.
- Программный пакет LabVIEW FPGA.
- System Verilog — стандартизованное расширение языка Verilog
- SPINAL HDL — альтернативный Verilog и VHDL язык высокого уровня
1) Под «альтернативными» подразумеваются среды проектирования, альтернативные традиционным. К традиционным можно отнести среды проектирования от производителей FPGA, CPLD или от фирм, специализирующихся на задачах верификации проектов.
По данной теме также читайте:
Перейти к другим терминам Cтатья создана: 09.07.2014 О разделе «Терминология» Последняя редакция: 12.02.2020 Пример использования термина
Термин используется при описании принципа действия различных модулей сбора данных, например, модулей производства OOO “Л Кард”.
АЦП: 16 бит; 16/32 каналов;
±0,2 В…10 В; 2 МГц
ЦАП: 16 бит; 2 канала; ±5 В; 1 МГц
Цифровые входы/выходы:
18/16 TTL 5 В
Интерфейс: PCI Express
Плата АЦП/ЦАП
16/32 каналов, 16 бит, 2 МГц, PCI ExpressL-502
АЦП: 16 бит; 16/32 каналов;
±0,2 В…10 В; 2 МГц
ЦАП: 16 бит; 2 канала; ±5 В; 1 МГц
Цифровые входы/выходы:
17/16, ТТЛ 5 В
Интерфейс: USB 2.0 (high-speed), Ethernet (100 Мбит)
Гальваническая развязка.
Модуль АЦП/ЦАП
16/32 каналов, 16 бит, 2 МГц, USB, EthernetE-502
Разрядность: 24 бита
Частота преобразования до 78 кГц на канал
Каналов: 8 для ICP-датчиков
Питание датчиков: источник тока 2,86 / 10 мА
Модуль АЦП для ICP датчиков
8 каналов, 24 бит, 78 кГцLTR25
Разрядность: 24 бит
Частота преобразования до 50 кГц
Каналов: 16
До 256 двухпроводных тензометрических каналов
в одном крейте
Модуль АЦП тензометрический
16 каналов, 24 бит, 50 кГцLTR216
Разрядность: 14 бит
Частота преобразования до 10 МГц
Каналов: 2
Диапазоны: ±0,5 В…±10 В
Модуль АЦП осциллографический
2 канала, 14 бит, 10 МГцАрхитектура ПЛИС (FPGA)

FPGA – это сокращение от английского словосочетания Field Programmable Gate Array.
ПЛИС – это сокращение от словосочетания «Программируемая Логическая Интегральная Схема». Слово ПЛИС встречается в русскоязычных документациях и описаниях вместо слова FPGA. Далее по тексту в основном будет использоваться этот термин — ПЛИС.
ПЛИС и FPGA – это аббревиатуры, обозначающие один и тот же класс электронных компонентов, микросхем. Это микросхемы, применяемые для создания собственной структуры цифровых интегральных схем.
Логика работы ПЛИС определяется не на фабрике изготовителем микросхемы, а путем дополнительного программирования (в полевых условиях, field-programmable) с помощью специальных средств: программаторов и программного обеспечения.
Микросхемы ПЛИС – это не микропроцессоры, в которых пользовательская программа выполняется последовательно, команда за командой. В ПЛИС реализуется именно электронная схема, состоящая из логики и триггеров.
Проект для ПЛИС может быть разработан, например, в виде принципиальной схемы. Еще существуют специальные языки описания аппаратуры типа Verilog или VHDL.
В любом случае, и графическое и текстовое описание проекта реализует цифровую электронную схему, которая в конечном счете будет «встроена» в ПЛИС.
Обычно, сама микросхема ПЛИС состоит из:
- конфигурируемых логических блоков, реализующих требуемую логическую функцию;
- программируемых электронных связей между конфигурируемыми логическими блоками;
- программируемых блоков ввода/вывода, обеспечивающих связь внешнего вывода микросхемы с внутренней логикой.
Строго говоря это не полный список. В современных ПЛИС часто бывают встроены дополнительно блоки памяти, блоки DSP или умножители, PLL и другие компоненты. Здесь, в этой статье я их рассматривать не буду.
Разработчик проекта для ПЛИС обычно абстрагируется от внутреннего устройства конкретной микросхемы. Он просто описывает желаемую логику работы «своей» будещей микросхемы в виде схемы или текста на Verilog/ VHDL. Компилятор, зная внутреннее устройство ПЛИС сам пытается разместить требуемую схему по имеющимся конфигурируемым логическим блокам и пытается соединить эти блоки с помощью имеющихся программируемых электронных связей. В общем случае размещение и трассировка связей между логическими блоками в ПЛИС остается за компилятором.
Классификация ПЛИС по типу хранения конфигурации.
SRAM-Based.
Это одна из самых распространенных разновидностей ПЛИС. Конфигурация ПЛИС хранится ячейках статической памяти, изготовленной по стандартной технологии CMOS.
Достоинство этой технологии – возможность многократного перепрограммирования ПЛИС. Недостатки – не самое высокое быстродействие, после включения питания прошивку нужно вновь загружать. Значит на плате должен еще стоять загрузчик, специальная микросхема FLASH или микроконтроллер – все это удорожает конечное изделие.Flash-based.
В таких микросхемах хранение конфигурации происходит во внутренней FLASH памяти или памяти типа EEPROM. Такие ПЛИС лучше тем, что при выключении питания прошивка не пропадает. После подачи питания микросхема опять готова к работе. Однако, у этого типа ПЛИС есть и свои недостатки. Реализация FLASH памяти внутри CMOS микросхемы – это не очень просто. Требуется совместить два разных техпроцесса для производства таких микросхем. Значит они получаются дороже. Кроме того, такие микросхемы, как правило, имеют ограниченное количество циклов перезаписи конфигурации.Antifuse.
Специальная технология по которой выполняются однократно программируемые ПЛИС. Программирование такой ПЛИС заключается в расплавлении в нужных местах чипа специальных перемычек для образования нужной схемы.
Недостаток – собственно программировать / прошивать чип можно только один раз. После этого исправить уже ничего нельзя. Сам процесс прошивки довольно не быстрый. Зато есть масса достоинств у таких ПЛИС: они довольно быстрые (могут работать на больших частотах), меньше подвержены сбоям при радиации – все из-за того, что конфигурация получается в виде перемычек, а не в виде дополнительной логики, как у SRAM-based.Конфигурируемые логические блоки.
В документации компании Альтера встречается выражение Logic Array Block (LAB) – массив логики. У компании Xilinx в микросхемах ПЛИС есть примерно такие же блоки — Configurable Logic Block (CLB). Конфигурируемый логический блок – это базовый элемент в ПЛИС, в нем может быть выполнена какая-то простая логическая функция или реализовано хранение результата вычисления в регистрах (триггерах).
Сложность и структура конфигурируемого логического блока (CLB) определяется производителем.
Теоретически, конфигурируемый логический блок может быть, например, очень простым, просто как отдельный транзистор. Или он может быть очень сложным, как целый процессор. Это крайние точки реализации.
В первом случае потребуется огромное число программируемых связей, чтобы потом из отдельных транзисторов собрать требуемую схему. Во втором случае связей может нужно и не так много, но теряется гибкость проектирования пользовательской схемы.
Именно поэтому конфигурируемый блок обычно представляет из себя что-то среднее: он обычно достаточно сложен, чтобы можно было бы зашить туда некоторую функцию, но и довольно мал, чтобы разместить множество таких блоков внутри ПЛИС и чтобы была возможность связать их в единую схему.
Таким образом, выбор структуры конфигурируемого логического блока производителем ПЛИС – это всегда поиск компромиса по площади кристалла, по быстродействию, энергопотреблению и так далее.
Конфигурируемый логический блок может состоять из одного или нескольких базовых логических элементов. В англоязычной литературе это Basic Logic Element (BLE) или просто Logic Element (LE). В ПЛИС обычно используются так называемые LUT-based базовые логические элементы. Что-то вроде этого:

Рис. 1. Пример традиционного базового логического элемента.
LUT – это Look-Up Table, таблица преобразования. Например, на Рис.1 показан четырехбитный LUT в составе базового логического блока. Здесь четырехбитному числу на входе логической функции ставится в соответствие однобитный результат. Красные квадратики на Рис. 1 обозначают программируемый элемент, регистр – это та память, где хранится прошивка для ПЛИС. Видно, что для конфигурации 4-х битного LUT требуется 16 конфигурационных регистра. Содержимое этих регистров определяют логическую функцию, реализованную внутри базового логического элемента.
Еще один конфигурационный регистр (на Рис. 1 это одиночный красный квадратик справа) определяет нужно ли на выход базового логического элемента выдавать прямо значение с LUT или нужно выдать зафиксированное в D-триггере значение с LUT. Фиксация и хранение данных в цифровых схемах нужна практически в любом проекте.
Примерно такой логический элемент использовался в моем экспериментальном проекте «ПЛИС внутри ПЛИС».
Рассматривая Рис. 1 как пример традиционного базового логического элемента понимаешь какая избыточность заложена внутрь современного кристалла ПЛИС (SRAM-based). Ведь в самом деле, конфигурационные регистры (красные квадратики) прямо не доступны для использования в цифровом проекте. Они только служат для формирования пользовательской функции. Для одного D-триггера в пользовательском проекте требуется более 16 (иногда много больше) триггеров для хранения конфигурации ПЛИС.
На самом деле базовый логический элемент в разных ПЛИС оказывается гораздо сложнее, чем показано на Рис. 1. Ниже есть некоторые примеры из документации на разные типы ПЛИС.

Рис. 2. Базовый логический элемент CPLD MAX II компании Альтера.
Здесь хорошо видны LUT и D-Триггер хранения результата. Ниже, на Рис. 3 представлен базовый элемент Cyclone III.

Рис. 3. Базовый логический элемент FPGA Cyclone III компании Альтера.
В микросхемах Альтеры в одном LAB может содержаться 10-16 LE.
В микросхемах компании Xilinx Virtex-6 базовый логический элемент – это так называемый Slice. В одном CLB всего два Slice. Зато один Slice – это довольно сложное устройство:

Рис. 4. Базовый элемент Xilinx Virtex-6 Slice.
В одном CLB Virtex-6 имеется 8 LUT и 16 D-Триггеров и еще кое-что плюс к этому. Вот так все сложно.
Другая крайность – микросхемы FPGA компании Microsemi (бывшая Actel).
Например, в микросхемах серии 40MX базовый логический элемент выглядит вот так:
Рис. 5. Logic Module of Microsemi 40MX serie.
Восемь входов и один выход.
Здесь нет ни Look-Up Table, ни даже D-Триггера. Триггера, как и остальная логика, формируются где нужно из вот таких крошечных кирпичиков – Logic Module.Почему у разных компаний получилась такая большая разница в реализации базового логического элемента? Видимо в микросхемах Microsemi связь между базовыми блоками обходится гораздо дешевле: серия 40MX является однократно программируемой. В ней межблочные связи «проплавляются» между соединяющими дорожками и позже не могут быть изменены. Нет никаких регистров для временного хранения прошивки. Здесь нет программируемых переключателей, мультиплексоров, как в FPGA других типов. Ну микросхемы компании Microsemi — это несколько особый случай. Это технология называется antifuse – для производства таких микросхем используется модифицированный техпроцесс CMOS с дополнительными слоями для организации межблочных связей.
Программируемые связи между логическими блоками.
Чтобы в ПЛИС заработала нужная нам цифровая схема мало того, что нужно сконфигурировать имеющиеся логические блоки особым образом, еще нужно создать, запрограммировать связи между логическими блоками.
Для этого в ПЛИС имеются специальные конфигурируемые коммутаторы.
В англоязычной документации встречаются следующие термины: FPGA Routing Architecture и Programmable Routing Interconnect. Это все об этом, о программируемых связях между логическими блоками.
Известно две основных методики построения ПЛИС по типу архитектуры связей: островная и иерархическая.

Рис. 6. Островная ПЛИС.
Островная ПЛИС называется так потому, что конфигурируемые блоки все равны между собой и находятся, как острова в океане, между узлами коммутации и линиями связи.
Здесь, на Рис. 6 обозначаются CB – Connection Box и SB – Switch Box. В сущности это программируемые мультиплексоры, подключающие тот или иной CLB к другому CLB через цепочки проводов в ПЛИС.
Это island-style FPGA или mesh-based FPGA. Типичный пример таких микросхем – это серии Altera Cyclone и Stratix.
Второй известный тип ПЛИС – это иерархические ПЛИС. Здесь идет расчет на то, что в схеме всегда есть участки которые взаимодействуют друг с другом более тесно, чем с отдаленными модулями проекта.

Рис. 7. Иерархическая ПЛИС.
Здесь близлежащие CLB соединить довольно просто, нужно не много коммутаторов и получающиеся связи работают быстро. Вот если нужен более крупный блок вычислителей, то сигнал должен выйти на более высокий уровень иерархии и потом зайти вглубь в соседнюю «комнату».
Нельзя сказать, что это существенно хуже, чем island-style. Просто каждый метод имеет свои плюсы и минусы.
Типичные представители иерархических ПЛИС – это микросхемы компании Альтера серии Flex10K, APEX.
Программное обеспечение для проектирования ПЛИС.
Программное обеспечение для проектирования ПЛИС, а именно компилятор (синтезатор логики и фиттер и ассемблер) – это, возможно, самая сложная часть всей ПЛИС технологии.
Компилятор должен проанализировать пользовательский проект (схемы и текстовые описания на Verilog HDL или VHDL ) и сгенерировать нетлист (netlist) – список всех элементов схемы и связи между ними. Netlist должен быть оптимизирован – логические функции нужно минимизировать, возможные дублированные регистры нужно удалить.
Затем компилятор должен вместить всю логику из netlist в имеющуюся архитектуру ПЛИС. Это делает фиттер (fitter). Он размещает логические элементы и выполняет трассировку связей между ними (процесс place and route). Сложность состоит в том, что один и тот же проект может быть размещен в ПЛИС разными способами и этих способов миллионы. Некоторое размещение и трассировка оказываются лучше, другие хуже. Главный критерий качества полученной системы – максимальная частота, на которой сможет работать проект при данном размещении элементов и при данной трассировке связей. Здесь оказывает влияние длина связей между логическими блоками и количество программируемых коммутаторов между ними.
Компилятор, зная архитектуру ПЛИС по результатам работы дополнительно выдает отчет о времени прохождении сигналов от регистра до регистра. Эта информация часто бывает полезной для разработчика высокопроизводительных систем. Разработчик для ПЛИС имеет возможность давать некоторые советы компилятору где, в каком месте кристалла лучше разместить тот или иной модуль проекта.
Выбирая для своего проекта, для своей платы конкретную микросхемы ПЛИС разработчик в некоторой мере попадает в зависимость от производителя этой ПЛИС, так как должен в работе пользоваться программным обеспечением от этого же производителя.
Программное обеспечение компании Альтера: Quartus II.
ПО Xilinx для проектирования для ПЛИС: ISE Suite, Vivaldo Design Suite.
ПО компании Microsemi: Libero IDE, Libero SoC.Возможно, программное обеспечение, компиляторы для ПЛИС – это важнейшая составляющая интеллектуальной собственности компаний производителей ПЛИС.
Что такое FPGA — об интегральных схемах простым языком

Микроконтроллеры и процессоры стали неотъемлемой частью технологического будущего. Немаловажную роль в этом будущем играет технология FPGA или так называемые программируемые интегральные схемы. Что это такое, как работает и где используется — рассказываем в деталях в нашем материале.
Программируемые логические интегральные схемы
Проектирование новых интегральных схем — сложный и многогранный процесс. Разработчикам необходимо продумать расположение огромного числа элементов: сдвиговые регистры, дешифраторы, мультиплексоры и прочее. Большинство интегральных схем (ИС), в том числе процессоры и микроконтроллеры, имеют предопределенную логику работы.
Проще говоря, в таких схемах после выпуска архитектура остается неизменной. Программисты в свою очередь получают набор определенных команд, с помощью которых и взаимодействуют с конкретной схемой.
Одна из главных проблем проектировщиков — это поиск компромисса между скоростью работы схемы и ее универсальностью. Например, привычные процессоры способны относительно быстро выполнять целый спектр задач — этого удалось добиться именно благодаря архитектуре. Однако для каких-то специфических задач уже используются специальные микросхемы — ASIC.
Самый яркий пример — майнинг. Процессор и видеокарта также способны вычислять хеш-суммы. Однако архитектура ASIC разработана специально с учетом этой задачи, благодаря чему эффективность существенно выше.

Главная проблема в том, что ASIC-схемы из-за специфики своей архитектуры абсолютно не подходят для других задач, а их разработка — достаточно дорогое удовольствие. Но что делать, если требуется создать и проверить работу какой-то специфической интегральной схемы, не пуская ее в крупносерийное производство? Выходом из этой ситуации стали программируемые интегральные схемы — ПЛИС.
Основным «кирпичиком» при построении любой интегральной схемы являются логические элементы (вентили) — «И», «ИЛИ», «НЕ». На их базе уже создаются триггеры, регистры и так далее.

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

Изначально такие связи выполнялись в виде пережигаемых тонких проводников. По мере совершенствования технологий стали использоваться МОП-транзисторы с плавающим затвором. Появилась возможность реконфигурировать внутреннюю структуру микросхемы.

Так появились различные подвиды ПЛИС. Например, в середине 80-х популярностью пользовались микросхемы PAL (программируемые матрицы логики). В схемах PAL элементы «И» — программируемые, а элементы «ИЛИ» — фиксированные. На базе таких блоков можно было создавать достаточно сложные заказные схемы с минимальными затратами. Однако PAL имели плавкие титано-вольфрамовые перемычки, поэтому не могли использоваться повторно.

В 1985 году появилось семейство микросхем GAL — Generic Array Logic. В отличие от предыдущих эти схемы можно было программировать многократно, повторно задавая связи между элементами. Группу из PROM, PAL, PLA, GAL принято обобщать термином SPLD — Simple Programmable Logic Device.
Однако большую часть рынка сегодня занимают CPLD (Complex Programmable Logic Device) и FPGA. В чем разница между этими двумя группами микросхем — это довольно обширный вопрос. Мы же подробнее расскажем именно про FPGA.

Что такое FPGA
Как мы выяснили, FPGA (Field-Programmable Gate Array) — это один из подвидов программируемых интегральных схем. Строятся такие микросхемы на логических блоках с гибкой коммутацией — причем число блоков может доходить до сотен тысяч штук. Прошивка с «картой» необходимых связей между логическими ячейками сохраняется в энергонезависимой памяти.
Условно FPGA состоят из трех основных элементов — конфигурируемые логические блоки (CLB), блок ввода-вывода (IOB) и межсоединения. Каждый CLB включает в себя таблицы поиска, триггеры, регистры, мультиплексоры и не только. Благодаря этому CLB могут выполнять логические и арифметические операции, а также использоваться для хранения данных.

Если смотреть структуру CLB подробнее, то здесь все зависит от каждой конкретной микросхемы. Чем дороже плата — тем обычно большие возможности предлагает каждый конкретный конфигурируемый логический блок.

Здесь мы можем увидеть:
- LUT — Look-Up Tables. Каждый такой блок способен реализовать любую логическую функцию используя в качестве данных операнды с входов.
- Специализированные управляемые пользователем мультиплексоры (MUX) для комбинационной логики.
- Блок арифметической логики, который позволяет делать суммирование и умножение операндов (зеленый блок).
- Несколько однобитных регистров для хранения информации (желтые блоки).
Таким образом, CLB — это своеобразный универсальный кирпичик, который способен выполнить практически любую операцию над данными. На FPGA плате таких — сотни и тысячи.
Представьте себе конструктор «Лего» с набором различных элементов — это и есть FPGA. Вы можете собрать сперва одну схему, например, условный игрушечный автомобиль, а затем разобрать ее и собрать совсем другую. Благодаря этому на FPGA можно создавать самые разнообразные устройства, при этом не изменяя аппаратную начинку. Возможности пользователей ограничены лишь числом блоков CLB и интерфейсами, которые имеются на плате.
С помощью FPGA фактически можно создавать цифровые схемы: хотите — сетевой контроллер на 100G Ethernet, а хотите — всего в пару нажатий можно реконфигурировать схему и сделать четыре контроллера 25G Ethernet. Более того, на базе FPGA можно создать даже собственный процессор.
К ведущим производителям FPGA микросхем относятся компании Lattice Semiconductor, Microsemi, Altera, Xilinx и некоторые другие. Прогнозируется, что к 2026 году мировой рынок FPGA достигнет 9,1 млрд долларов США по сравнению с 6,2 млрд в 2021 году. Такой рост во многом стал возможен благодаря активному расширению возможностей программируемых интегральных схем, которые уже используются в самых разнообразных областях.
Сфера применения FPGA
По своей универсальности FPGA проигрывают типичным процессорам и микроконтроллерам. Однако возможность буквально программировать архитектуру дает преимущества в специфических задачах, в том числе перед ASIC.
Применение
Центральный процессор
FPGA
Графический процессор
ASIC
Видео и обработка изображений
Обучение искусственного интеллекта
Управление промышленными двигателями
Управление встраиваемыми системами
Прототипирование, малый тираж
В первую очередь FPGA отлично проявляют себя при разработке, в частности, прототипировании различных микросхем ASIC. Как мы говорили ранее, создание ASIC — это крайне дорогостоящая задача, и перед выпуском платы в массы необходимо тщательно протестировать всю логику. Чтобы после нахождения недоработки каждый раз не выпускать новую плату, логику тестируют на нескольких кристаллах FPGA. При нахождении критической ошибки проектировщикам достаточно переработать архитектуру и выполнить реконфигурирование.
На структурах FPGA достаточно легко реализовать распараллеливание операций. В видеообработке это позволяет получить производительность на порядок выше, чем у программируемых DSP — цифровых процессоров обработки сигналов.
Например, возьмем задачу распознавания автомобильных номеров. Первый вариант — камера с возможностью передачи видео через Ethernet и обработкой потока на удаленном сервере. Однако при увеличении числа камер будет расти и нагрузка на сеть. А вот с энергоэффективной платой FPGA распознавание можно делать буквально в самой камере, а после — передавать на сервер лишь текстовые данные — полученные номера. При этом если формат автомобильных номеров изменится, вы быстро сможете реконфигурировать плату FPGA.

Параллелизм также отлично подходит для быстрой обработки больших объемов данных, что позволяет частично использовать FPGA в суперкомпьютерах или информационно-измерительных системах. Например — создание системы распознавания лиц на базе процессора Intel Core i7 девятого поколения распознает до 20 лиц в секунду только с одной камеры. Реализация этой же системы на FPGA позволяет распознавать до 1000 лиц, причем с нескольких камер.

Помимо этого, платы применяются в сфере коммуникаций — оборудование базовых станций GSM и так далее. Не менее интересен и тот факт, что львиная доля FPGA-ускорителей используется в военной сфере — схемы обеспечивают высокоскоростную обработку радиолокационных сигналов. Найти FPGA можно в беспилотных автомобилях, дронах, научных приборах, медицинской технике и не только.
Заключение
Программируемые интегральные схемы в лице FPGA стремительно набирают популярность. Такие платы способны эффективно выполнять узкоспециализированные задачи, с которыми не способны быстро справить процессоры или видеокарты. В то же время благодаря возможности реконфигурирования применение FPGA во многих сценариях намного выгоднее дорогостоящих ASIC.
FPGA предлагает максимальную гибкость, а со временем благодаря совершенствованию техпроцесса вырастет и производительность плат.

