Практическое применение сервера с FPGA

В данной статье будет рассказано о попытке ускорить операции над разреженными булевыми матрицами, реализованные на OpenCL, с помощью замены целевой платформы GPGPU на FPGA.
Эта задача возникла при работе над библиотекой примитивов линейной алгебры, необходимых для решения некоторых задач анализа графов. Данные, структурированные в виде графов, играют огромную роль в современной жизни и встречаются в таких областях, как социальные сети, транспортные и коммуникационные сети, являются основой для набирающих популярность графовых баз данных.
Объем таких данных неуклонно растет и потому для получения хорошей производительности в задачах анализа графов все острее встает вопрос о разработке параллельных алгоритмов, что оказывается нетривиальной задачей из-за нерегулярности данных.
Одним из подходов к решению такой проблемы является использование линейной алгебры: граф естественным образом представим в виде матрицы (например, матрицы смежности), а задача выражается через операции над матрицами и векторами. Например, построение транзитивного замыкания и поиск кратчайших путей могут быть выражены через произведение и поэлементную сумму матриц смежности в различных полукольцах (булевом и min-plus соответственно).
Данную идею развивает стандарт GraphBLAS, описывающий набор примитивов и операций линейной алгебры, необходимый для реализации различных алгоритмов анализа графов. Этот стандарт определяет операции над произвольными моноидами и полукольцами и его реализация на массово-параллельных платформах является нетривиальной инженерной задачей. Поэтому в данной работе мы сконцентрировались на важном частном случае, на булевой линейной алгебре.
Важным аспектом прикладных задач является то, что реальные графы сильно разрежены: в случае представления их в виде матрицы смежности большинство ячеек окажутся пустыми. Это выдвигает дополнительные требования к реализации операций, так как матрицы должны храниться в специализированных форматах для экономии памяти.
Одной из естественных платформ для реализации операций разреженной линейной алгебры является GPGPU, что подтверждается, например, такими библиотеками, как cuSparse, clSparse и др. Однако, данные библиотеки реализуют операции над такими типами данных, как float или double, что является избыточным при работе с булевыми матрицами. Более того, ряд операций, необходимых при анализе графов (например, произведение Кронекера) в них не представлен. Потому нами была реализована библиотека разреженной булевой линейной алгебры. Языком разработки был выбран OpenCL C для того, чтобы обеспечить максимальную переносимость решения.
Выбор стандарта OpenCL позволил нам рассматривать в качестве целевой платформы не только CPU и GPGPU, но и FPGA, благодаря наличию таких решений, как «Intel FPGA SDK for OpenCL» или SDAccel Environment от Xilinx. Создание программы для FPGA – это прежде всего разработка архитектуры, на которой программа работает наиболее эффективно, а подобные инструменты позволяют использовать FPGA как еще одно устройство для исполнения OpenCL-кода, снимая с разработчика задачу создания архитектуры.
И хотя производители инструментов часто описывают процесс разработки как «написал код, отладил на GPU, запустил на FPGA», вопрос об эффективности результирующего решения без адаптации кода под специфику FPGA в ряде случаев остается открытым.
Наш случай один из таких. Таким образом, нам было необходимо выяснить, можно ли с помощью использования FPGA в качестве целевой платформы повысить производительность библиотеки операций разреженной линейной алгебры. При этом необходимо максимально переиспользовать уже существующий OpenCL-код, эффективно работающий на GPGPU.
Что такое FPGA
Ядром FPGA как устройства является перепрограммируемая логическая матрица (ПЛИС, программируемая логическая интегральная схема), что позволяет изменять логику работы устройства (чипа) и предоставляет разработчику (и пользователю) «мягкий» (изменяемый) чип. Этим ПЛИС принципиально отличаются от «жестких» систем, таких как, например, центральный процессор или графический сопроцессор, низкоуровневая логика работы которых (архитектура) задана единожды при производстве и не может быть изменена в процессе использования.
Схема матрицы представлена на рисунке ниже. Матрица состоит из набора программируемых логических ячеек, поведение которых, как правило, задается таблицами истинности, и программируемых коммутаторов, соединяющих эти ячейки, что позволяет управляемо собирать более сложные функции из простых.

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

Общая схема FPGA-ускорителя.
Custom Core — ядра сконфигурированные для решения конкретной задачи
Изначально для программирования логической матрицы использовались низкоуровневые языки типа VHDL и Verilog, которые предназначались прежде всего для описания архитектуры устройства и логики его работы, для чего и используются по сей день. Однако, когда речь идет об использовании FPGA как ускорителя, возникает потребность в том, чтобы описывать прикладную задачу, для чего указанные языки оказываются слишком низкоуровневыми.
Дабы устранить данную проблему, в настоящее время активно развиваются инструменты, позволяющие использовать OpenCL C для программирования FPGA. Несмотря на то, что предлагаемый язык С-подобен и в известном смысле является низкоуровневым, это существенно упрощает разработку, так как позволяет программировать в более привычных для прикладного разработчика терминах.
Конечно, за повышение уровня абстракции приходится платить, в частности, уменьшением уровня контроля и, возможно, уменьшением производительности решения. Однако, история развития языков программирования показывает, что качественная инструментальная поддержка процесса разработки, хорошие компиляторы, и плюсы высокого уровня абстракции в некоторых сферах позволяют нивелировать незначительные потери в производительности.
В нашем случае для эксперимента использовался набор инструментов Intel FPGA SDK for OpenCL, и плата от Euler Project с установленным чипом Arria 10. А цель как раз и заключалась в том, чтобы выяснить, даст ли использование данного стека технологий возможность получить высокопроизводительное и переносимое решение для разреженной линейной алгебры.
Разреженная линейная алгебра
Как было сказано, одной из особенностей разрабатываемой библиотеки является работа с разреженными структурами данных. В частности, для матриц был выбран формат DCSR — модификация классического CSR (Compressed Sparse Row), предназначенная для сильно разреженных матриц.
В качестве основных операций были выбраны поэлементное сложение двух матриц и классическое умножение, как операции, наиболее часто используемые в прикладных алгоритмах, и наиболее нетривиальные с точки зрения получения высокопроизводительных реализаций (особенно это касается умножения).
Для умножения разреженных матриц на GPGPU разработано множествоалгоритмов и лидирующими по производительности на сегодняшний день являются алгоритмы В. Лю (основанный на слиянии) и Ю. Нагасака (использующий хэш-таблицы). Оба этих алгоритма были реализованы на OpenCL и в результате экспериментов было выяснено, что алгоритм Ю. Нагасака на GPGPU работает быстрее, чем алгоритм В. Лю на интересных для нас данных. В дальнейшем необходимо было оценить их производительность при использовании FPGA в качестве целевой платформы.
Для сложения матриц используется перевод в координатный формат, в котором сложение сводится к объединению двух упорядоченных массивов. Возможности по ускорению этой операции с использованием FPGA также было решено оценить в рамках эксперимента.
Особенности реализации
Хотя мы говорим о том, чтобы использовать для разработки под FPGA уже привычный и знакомый стандарт OpenCL и соответствующий язык программирования, есть ряд особенностей, которые необходимо учитывать при запуске уже имеющегося кода, отлаженного на GPU, на FPGA.
Первая особенность связана с необходимостью статической компиляции для FPGA. Стандарт OpenCL подразумевает распространение программ в виде исходных кодов и компиляцию драйвером конкретного устройства при обращении, что реализовано для большинства GPGPU и чем активно пользуются разработчики, формируя код ядер и компилируя их по ходу выполнения основной программы (хоста). Однако, чтобы запустить код на FPGA, необходима предварительная компиляция, что может потребовать изменений как в кода хоста, так и в кода ядер.
Для компиляции ядер используется компилятор aoc, который в связке с «Intel® Quartus® Prime» создает бинарный файл с описанием архитектуры логической матрицы. Необходимо иметь ввиду, что данный этап очень ресурсозатратный: процесс компиляции небольшого ядра для поэлементного сложения двух векторов может занимать около 40 минут, более сложные ядра, вроде тех, которые возникли в нашей задачи, компилировались порядка 4–6 часов.
Следующий важный момент заключается в том, что результат компиляции не просто «выполняется» FPGA, а фактически перепрограммирует ее. При этом один файл описывает одну конфигурацию. А это означает, во-первых, что загрузка бинарного файла на FPGA занимает существенное время (около секунды в нашем случае), что, например, делает нерациональным использование нескольких файлов для одной матричной операции. Во-вторых, единовременно на FPGA может быть загружен один такой файл. Что приводит к желанию компилировать как можно больше ядер в один бинарный файл.
Однако, чем больше ядер обрабатываются за один вызов компилятора, тем сложнее ему распределить ресурсы FPGA для их выполнения этих ядер. Более того, ресурсы FPGA ограничены, что также ограничивает количество ядер, которые могут компилироваться, а значит и выполняться, одновременно.
Так, например, умножение с хэш-таблицами (алгоритм Нагасака) содержит 16 различных ядер, но и такое количество не удалось скомпилировать на устройстве из-за недостатка ресурсов. Типичное предупреждение в таком случае — предупреждения о превышении допустимых ресурсов памяти:
>aoc: Warning RAM Utilization is at 345%!
Большое количество ядер в умножении связано с группировкой рядов матрицы по ожидаемым вычислительным затратам. Мы сокращали количество групп, пока процесс компиляции не завершился успешно. Сложение требует значительно меньшего числа ядер, и его удалось запустить без существенных изменений.
Эксперименты
Для экспериментов были выбраны квадратные матрицы из SuiteSparse Matrix Collection различного размера и различной степени заполненности. Характеристики матриц приведены в таблице 2 (Nnz — Number of Non Zeroes, количество ненулевых элементов). Умножение тестировалось на возведении матрицы в квадрат, а сложение на вычислении суммы матрицы со своим квадратом, где квадрат заранее предпросчитан.
Для возможности оценить эффект от использования FPGA, эксперименты были проведены как на FPGA (Intel® Arria® 10), так и на GPGPU (AMD Radeon Vega Frontier Edition). Детальные характеристики оборудования, на котором производились измерения, представлены в таблице 1.
| Вендор | AMD | Intel |
|---|---|---|
| Имя | Radeon Vega Frontier Edition | Arria® 10 |
| Глобальная память, Gb | 15,98 | 8 |
| Локальная память, Kb | 64 | 16 |
| Макс. размер блока | 256 | 2147483647 |
| Частота, MHz | 1600 | 1000 |
| Число АЛУ | 4096 | 427200 |
Таблица 1. Характеристика оборудования, использованного для замеров производительности
Необходимо отметить, что указанная для FPGA частота — это максимальная частота тактового генератора. Реальная частота зависит от выполняемого кода и в нашем случае, по информации, полученной от компилятора (статистика Kernel clock), для сложения и умножения составляет порядка 240 MHz.
Отметим, что при экспериментах измерялось время работы «клиентской» функции, то есть время необходимое на передачу данных на FPGA и обратно включается в замеры. Аналогично и для GPU. Результаты экспериментов показаны в таблице 2. Время измерялось в миллисекундах. Прочерк означает, что не удалось дождаться завершения вычислений за разумное время.
| Сложение (мс) | Умножение (мс) | ||||||
|---|---|---|---|---|---|---|---|
| № | Число строк, млн | Nnz(M), млн | Nnz(M + M2), млн | GPGPU | FPGA | GPGPU | FPGA |
| 1 | 0,06 | 0,24 | 0,92 | 1,71 ± 0,30 | 86,51 | 2,78 ± 1,46 | 5590,79 |
| 2 | 0,11 | 0,24 | 0,39 | 1,32 ± 0,12 | 58,54 | 2,43 ± 0,25 | 9824,65 |
| 3 | 0,40 | 3,20 | 14,97 | 11,43 ± 3,18 | 1572,83 | 38,60 ± 3,92 | 40527,5 |
| 4 | 0,74 | 5,16 | 26,40 | 17,19 ± 4,59 | 2714,14 | 55,65 ± 6,07 | 67595,9 |
| 5 | 0,92 | 5,11 | 30,81 | 19,34 ± 4,68 | 3077,81 | 85,97 ± 8,78 | 77601,9 |
| 6 | 1,09 | 3,08 | 9,93 | 7,92 ± 2,58 | 944677 | 19,75 ± 1,27 | 96978,8 |
| 7 | 1,39 | 3,84 | 12,26 | 9,01 ± 2,68 | 1167,12 | 23,29 ± 1,68 | 122992 |
| 8 | 1,44 | 3,10 | 8,41 | 6,78 ± 2,59 | 771219 | 23,08 ± 1,84 | 126465 |
| 9 | 1,97 | 5,53 | 17,74 | 11,89 ± 3,23 | 1686,66 | 29,35 ± 1,65 | 175612 |
| 10 | 2,22 | 4,88 | 13,63 | 9,27 ± 2,81 | 1248,45 | 29,66 ± 0,85 | — |
Таблица 2. Сравнение производительности сложения и умножения матриц на GPGPU AMD Radeon Vega Frontier Edition и FPGA Intel® Arria® 10
Как видно из результатов экспериментов, код, ориентированный на особенности GPU, оказался неэффективен на устройстве с совершенно другой архитектурой. Здесь, правда, нужно учесть, что при работе с разреженными матрицами и на видеокартах не происходит полной утилизации мощности устройства.
Результаты, которых удалось добиться сообществу к настоящему моменту — это итог многих лет развития алгоритмов для работы с разреженными матрицами и экспериментов с распределением нагрузки, способами обработки строк.
Чтобы выявить причину столь существенного замедления, были отдельно проанализированы все этапы алгоритмов. Одним из самых слабых мест оказалась префиксная сумма, которая используется как в сложении, так и в умножении. Например, на массиве размером 10^7 элементов данная операция занимает в среднем 253 мс, тогда как даже центральный процессор может выполнить данную операцию за 79 мс (при неоптимизированной реализации).
К сожалению, нам не удалось найти реализацию префиксной суммы для FPGA, которая была бы сравнима с GPU по производительности, и, судя по возникающим в сообществе вопросам, эта проблема все еще остается открытой.
Выводы
Проведенный эксперимент показал, что создание переносимой библиотеки для разреженной линейной алгебры на OpenCL C хотя и возможно, но в текущих реалиях использование FPGA как целевой платформы не дает выигрыша в производительности. При этом, необходимо обратить внимание на следующие важные моменты.
Во-первых, эффективная реализация операций разреженной линейной алгебры — область, в которой до сих пор ведутся работы даже для таких более привычных платформ, как многоядерные CPU и GPGPU. Создание подобных решений для FPGA — область, в которой ведуться активные исследования («The algorithms for FPGA implementation of sparse matrices multiplication», «SpArch: Efficient Architecture for Sparse Matrix Multiplication»), и на текущий момент с использованием более низкоуровневых средств.
Во-вторых, проведенный эксперимент показал зрелость стека технологий, применяемого для разработки под FPGA с использованием OpenCL C: реализованные в ходе эксперимента современные алгоритмы сложения и умножение разреженных матриц весьма сложны и достаточно объемны на фоне, например, реализации сверточных фильтров.
Отдельно необходимо отметить, что, хотя мы и говорим об использовании стандарта OpenCL, в действительности, для повышения эффективности разрабатываемых решений, для FPGA, как Intel, так и Xilinx предоставляют специфичные расширения языка. Вместе с этим, существуют и специфичные техники оптимизации кода, уместные для FPGA, но вряд ли применимые, например, для GPGPU.
Таким образом, технология уже достаточно зрелая, чтобы использовать ее для решения реальных задач. Необходимо только аккуратно проанализировать особенности предметной области и конкретной решаемой задачи. Так, существует ряд вычислительных задач, которые одинаково хороши как для видеокарт, так и для FPGA. Например, обработка изображений и видео. И вот для таких задач переносимые решения, утилизирующие как FPGA, так и GPGPU, уже могут быть разработаны в единой среде с использованием OpenCL C.
FPGA. Разбираемся, как устроены программируемые логические схемы и чем они хороши

Представь, что процессор вместо того, чтобы выполнять набор инструкций, будет перестраиваться под каждую программу и превращать алгоритм непосредственно в «железо». Именно так и работают FPGA! В этой статье я расскажу, как такое возможно, и познакомлю тебя с разными способами проектирования FPGA.
Может быть, ты умеешь взламывать устройства на другом конце света или кодить крутые веб-приложения, но понимаешь ли ты, как работает твой компьютер? И речь не о том, что делает операционка, как функционирует garbage collector в Java или как устроен компилятор C++. Я говорю о самом низком, аппаратном уровне, ниже ассемблера: как работает железо.
Что происходит в микросхеме сетевой карты, когда приходит пакет Ethernet? Как этот пакет передается дальше в оперативную память компьютера через шину PCI Express? Как работают самые быстрые системы распознавания изображений на аппаратном уровне?
Для ответа на эти вопросы надо немного разбираться в цифровой логике работы микросхем ASIC, но начинать с них очень сложно и дорого, и вместо этого лучше начать с FPGA.
![]()
INFO
FPGA расшифровывается как field-programmable gate array, по-русски — программируемые пользователем вентильные матрицы, ППВМ. В более общем случае они называются ПЛИС — программируемые логические интегральные схемы.
С помощью FPGA можно в буквальном смысле проектировать цифровые микросхемы, сидя у себя дома с доступной отладочной платой на столе и софтом разработчика за пару килобаксов. Впрочем, есть и бесплатные варианты. Заметь: именно проектировать, а не программировать, потому что на выходе получается физическая цифровая схема, выполняющая определенный алгоритм на аппаратном уровне, а не программа для процессора.
Работает это примерно так. Есть готовая печатная плата с набором интерфейсов, которые подключены к установленной на плате микросхеме FPGA, вроде крутой платы для дата-центра или отладочной платы для обучения.
Пока мы не сконфигурируем FPGA, внутри микросхемы просто нет логики для обработки данных с интерфейсов, и потому работать ничего, очевидно, не будет. Но в результате проектирования будет создана прошивка, которая после загрузки в FPGA создаст нужную нам цифровую схему. Например, так можно создать контроллер 100G Ethernet, который будет принимать и обрабатывать сетевые пакеты.
Важная особенность FPGA — возможность реконфигурации. Сегодня нам нужен контроллер 100G Ethernet, а завтра эта же плата может быть использована для реализации независимых четырех интерфейсов 25G Ethernet.
Существуют два крупных производителя FPGA-чипов: Xilinx и Intel, которые контролируют 58 и 42% рынка соответственно. Основатели Xilinx изобрели первый чип FPGA в далеком 1985 году. Intel пришла на рынок недавно — в 2015 году, поглотив компанию Altera, которая была основана в то же время, что и Xilinx. Технологии Xilinx и Altera во многом схожи, как и среды разработки. Чаще я работал с продуктами компании Xilinx, поэтому не удивляйся ее постоянному упоминанию.
FPGA широко применяются в разных устройствах: потребительской электронике, оборудовании телекома, платах-ускорителях для применения в дата-центрах, различной робототехнике, а также при прототипировании микросхем ASIC. Пару примеров я разберу чуть ниже.
Также рассмотрим технологию, которая обеспечивает аппаратную реконфигурацию, познакомимся с процессом проектирования и разберем простой пример реализации аппаратного счетчика на языке Verilog. Если у тебя есть любая отладочная плата FPGA, ты сможешь повторить это самостоятельно. Если платы нет, то все равно сможешь познакомиться с Verilog, смоделировав работу схемы на своем компе.
Принцип работы
Микросхема FPGA — это та же заказная микросхема ASIC, состоящая из таких же транзисторов, из которых собираются триггеры, регистры, мультиплексоры и другие логические элементы для обычных схем. Изменить порядок соединения этих транзисторов, конечно, нельзя. Но архитектурно микросхема построена таким хитрым образом, что можно изменять коммутацию сигналов между более крупными блоками: их называют CLB — программируемые логические блоки.
Также можно изменять логическую функцию, которую выполняет CLB. Достигается это за счет того, что вся микросхема пронизана ячейками конфигурационной памяти Static RAM. Каждый бит этой памяти либо управляет каким-то ключом коммутации сигналов, либо является частью таблицы истинности логической функции, которую реализует CLB.
Так как конфигурационная память построена по технологии Static RAM, то, во-первых, при включении питания FPGA микросхему обязательно надо сконфигурировать, а во-вторых, микросхему можно реконфигурировать практически бесконечное количество раз.


Другие статьи в выпуске:
Xakep #236. FPGA
- Содержание выпуска
- Подписка на «Хакер» -60%
Блоки CLB находятся в коммутационной матрице, которая задает соединения входов и выходов блоков CLB.

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

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

Интересно посмотреть на принцип реализации 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 позволяет реализовывать аппаратные схемы для высокоскоростной и параллельной обработки данных с возможностью изменить алгоритм.

Давай подумаем, чем принципиально отличаются 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.

Если производитель видеосенсора не предоставляет Interface IP для нашей микросхемы FPGA, то нам придется писать его самостоятельно на языке RTL, считая такты, биты и байты в соответствии со спецификацией протокола передачи данных. Блоки Preprocess, DDR Controller и HDMI IP мы, скорее всего, возьмем готовые и просто соединим их интерфейсы. А блок HLS, который выполняет поиск и обработку поступающих данных, мы можем написать на C++ и транслировать при помощи Vivado HLS.
Скорее всего, нам еще потребуется какая-то готовая библиотека детектора и классификатора дорожных знаков, адаптированная для использования в FPGA. В этом примере я, конечно, привожу сильно упрощенную блок-схему дизайна, но логику работы она отражает корректно.
Рассмотрим путь проектирования от написания кода RTL до получения конфигурационного файла для загрузки в 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.
Что такое 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 предлагает максимальную гибкость, а со временем благодаря совершенствованию техпроцесса вырастет и производительность плат.
FPGA: Field-Programmable Gate Array
This article introduces the Field-Programmable Gate Array (FPGA), and products of Xilinx and Altera.
What’s FPGA?
A Field-Programmable Gate Array (FPGA) is an integrated circuit designed to be confidgured by a customer or a designer after manufacturing – hence field-programmable. The FPGA configuration is generally specified using a Hardware Description Language (HDL), similar to that used for an Application-Specific Integrated Circuit (ASIC). (Circuit diagrams were previously used to specify the configuration, as they were for ASICs, but this is increasingly rare.)
FPGAs contain an array of programmable logic blocks, and a hierarchy of reconfigurable interconnects that allow the logic blocks to be wired together, like many logic gates that can be inter-wired in different configurations. Logic blocks can be configured to perform complex combinational functions, or merely simple logic gates like AND and XOR. In most FPGAs, logic blocks also include memory elements, which may be simple flip-flops or more complete blocks of memory.
FPGAs are programmable semiconductor devices that are based around a matrix of Configurable Logic Blocks (CLBs) connected through programmable interconnects. FPGAs can be programmed to the desired application or functionality requirements. – Xilinx
Composition of FPGA
- CLB (Configurable Logic Block) CLB contains clusters of LUTs, Registers, Arithmetic and other circuitry.
- LUT (Look-UP Table) LUT is a hardware implementation of a truth table.
Types of FPGA
- One-Time Programmable (OTP) FPGAs
- SRAM-based FPGAs, which can be reprogrammed as the design evolves
Hard Core & Soft Core
- Hard Core
- Speed up to 1GHz+
- Can achieve much faster processing speeds
- Fixed and cannot be modified (dedicated silicon area on FPGA)
- Examples: PowerPC used in Virtex-4/5, ARM Cortex-A9 dual-core MCU used in Zynq-7000 All Programmable SoC from Xilinx
- Simple microcontroller/ful-fledged microprocessor
- Less Speed around 250MHz & limited by the speed of the fabric
- Can be easily modified and tuned to specific requirements, more features, custom instructions, etc
- Example: LEON3, OpenRISC, MicroBlaze+PicoBlaze, Nios II
A soft-core processor is a microprocessor fully described in softare, usually in an HDL, which can be synthesized in Programmable hardware, such as FPGAs.
Hardware Description Language (HDL)
- Verilog HDL IEEE Std. 1364-1995
- VHDL IEEE Std. 1076-1993
Xilinx Products
Altera Products
Stratix series
The description of Stratix series FPGAs & SoCs can be found on here.
A Stratix FPGA can provide up to 80K logic elements (LEs) and 7.3 Mbits of on-chip RAM arranged in TriMatrix memory blocks, operating at up to 350 MHz. The Stratix FPGA supports external memory interfaces such as DDR SDRAM at 400 Mbps and QDRII SRAM at 800 Mbps. The Stratix FPGA also introduced the world’s first digital signal processing (DSP) block, containing four 18 x 18 multipliers, accumulators, and a summation unit.
Building on the Stratix FPGA high-performance architectural features, the Stratix GX FPGA is the first programmable logic device to incorporate high-speed serial transceivers operating at multi-gigabit speeds. Using a transceiver block supporting four full-duplex channels and clock data recovery (CDR) technology allows transmission of data in excess of 3.1875-Gbps per channel. This data rate supports many common high-speed communication protocols including SerialLite, Gigabit Ethernet, 10-Gigabit Ethernet/XAUI, SONET/SDH, Fibre Channel, the Serial RapidIO® standard, PCI Express, SFI-5, and SPI-5.
Family Year of introduction Process technology Stratix 2002 130 nm Stratix GX 2003 130 nm Stratix II 2004 90 nm Stratix II GX 2005 90 nm Stratix III 2006 65 nm Stratix IV 2008 40 nm Stratix V 2010 28 nm Stratix 10 2013 14 nm Tri-Gate Arria series
The description of Arria series FPGAs & SoCs can be found on here.
Altera’s Arria® family delivers optimal performance and power efficiency in the midrange. The Arria family has a rich feature set of memory, logic, and digital signal processing (DSP) blocks combined with the superior signal integrity of up to 28.05 Gbps transceivers that allow you to integrate more functions and maximize system bandwidth. Furthermore, the SoC variants in the Arria V and Arria 10 device families offer an ARM®-based hard processor system (HPS) for even higher integration and power savings.
Family Year of introduction Process technology Arria GX 2007 90 nm Arria II GX 2009 40 nm Arria II GZ 2010 40 nm Arria V GX, GT, SX 2011 28 nm Arria V GZ 2012 28 nm Arria 10 GX, GT, SX 2013 20 nm Cyclone Series
The description of Cyclone series FPGAs & SoCs can be found on here.
The Cyclone® FPGA series is built to meet your low-power, cost-sensitive design needs, enabling you to get to market faster. Each generation of Cyclone FPGAs solves your technical challenges of increased integration, increased performance, lower power, and faster time to market while meeting your cost-sensitive requirements.
Family Year of introduction Process technology Cyclone FPGA 2002 130 nm Cyclone II FPGA 2004 90 nm Cyclone III FPGA 2007 65 nm Cyclone IV FPGA 2009 60 nm Cyclone V FPGA 2011 28 nm MAX 10 Series
The description of MAX 10 series FPGAs can be found on here.
Altera’s new MAX 10 FPGAs revolutionize non-volatile integration by delivering advanced processing capabilities in a low-cost, instant-on, small form factor programmable logic device. By providing instant-on dual-configuration with analog-to-digital converters (ADCs), and full-featured FPGA capabilities, they are optimized for a wide range of high-volume, cost-sensitive applications, including industrial, automotive, and communications.
Design Software
Altera provides a complete suite of development tools for every stage of your design. Whether you are creating a complex FPGA design, writing software for an embedded processor, modeling a digital signal processing (DSP) algorithm, or focusing on system design, Altera has a tool that can help.
- Tools for FPGA Designers
- Quartus Prime Design Software
- ModelSim-Altera Software
- Altera SDK for OpenCL
- SoC Embedded Design Suite
- Nios II Embedded Design Suite
- Nios II Software Build Tools
- Nios II Software Build Tools for Eclipse
- Embedded Software
- Device Drivers for Altera® IP and HAL API
- DSP Builder
- JNEye Link Analysis Tool
Nios II Embedded Processor
Nios II Embedded Processor Core variants
- Nios II/f Fast Core
- Nios II/s Standard Core
- Nios II/e Economy Core
Overview of Nios II Embedded Processor

Nios II Embedded Design Suite


Nios II Software Build Tools


Embedded Development Flow

According to Nios II Hardware Development Tutorial, the Nios II development flow consists of three types of development:
- hardware design steps
- software design steps
- system design steps, which involves both hardware and software
For simpler Nios II systems, one person might perform all steps. For more complex systems, separate hardware and software designers might be responsible for different steps. System design steps involve both the hardware and software, and might require input from both sides. In the case of separate hardware and software teams, it is important to know exactly what files and information must be passed between teams at the points of intersection in the design flow.
References
- Altera Offical Site
- Altera Forum
- Altera Wiki
- Nios II Embedded Processor