В этой статье подробно разберем, что такое FPGA-майнинг, какие устройства существуют на рынке, также расскажем кейсы и приведем сравнения с другими способами майнинга и ответим на вопрос, возможно ли сделать майнер своими руками.
FPGA расшифровывается как Field Programmable Gate Array, что по-русски переводится как «программируемая пользователем вентильная матрица», сокращается до ППВМ. Она является разновидностью ПЛИС — программируемой логической интегральной системы.
Микросхема представляет собой полупроводники. Используется в тех случаях, когда устройство предназначено для выполнения логических операций, типа and, or, nand и другие.
Технические основы можно найти в книге от Интел «FPGA для чайников» авторства Andrew MooreТо есть, это микросхема с повторяющимися логическими блоками, соединенными в цепь. Их можно сконфигурировать по собственному усмотрению с учетом задач.
FPGA mining распространился одно время, так как задача майнинга как раз совершать однотипные операции. Это был первый шаг перед АСИКами.
Но при майнинге температура устройства слишком поднималась, охлаждение и обеспечение электричеством выходили затратными, снижая рентабельность от fpga-майнера.
Проблему решали производители устройств, повышая эргономичность, стабильность работы и температуры.
ПЛИС даже в режиме цепи действуют как один майнер (порт UART). Когда плата подключается к ПК, распознается как устройство ttyUSB или COM под Windows.
Нормальная частота ошибок составляет менее 0,1%, если уровень ошибок увеличивается, это означает, что что-то пошло не так.
Для FPGA необходим дополнительный вентилятор. Измерение температуры позволяет cgminer отключать ПЛИС, если он становится слишком разогретым.
Это устройство до сих пор можно считать топовым по производительности. Выпускалось наряду с Spartan (один из первых).
В конце 2011–начале 2012 года такие инновационные компании, как Butterfly Labs, ZTEX начали предлагать майнинговые устройства на базе FPGA. Большинство из них были основаны на FPGA Xilinx Spartan6-150 (200 to 220 MH/s) стоимостью 100 долларов, в устройствах BFL использовалась Altera (830 MH/s), что компания получила по сниженной цене.
Но цена на майнер все равно была высокой, по 600 долларов за микросхему.
В середине 2012 года BFL начал поставлять так называемое мини-устройство miniRig на 25,2 GH/s, состоящее из корпуса и вентиляторов, внутри несколько плат (как правило 17-18) на общую хэш-скорость в 25,2 ГГц/с. ПЛИС Altera в miniRig были еще более дорогими, вся конструкция стоила 15 тысяч долларов. Затем компания плавно перешла на ASIC.
Майнер, который использует совместимую плату FPGA, может работать и в пуле, и в одиночку.
Первый проект с открытым исходным кодом FPGA Bitcoin mine был выпущен 20 мая 2011 года для Altera и Xilinx FPGA. Чтобы скомпилировать код, нужны хотя бы базовые технические знания.
Люди использовали чипы для майнинга BTC, LTC, DOGE и других монет. Все разработки FPGA чаще всего были SHA256 или Scrypt. Силами сообщества была создана схема для майнинга X11. АСИКи начали вытеснять эти майнеры.
Первое, что можно отметить, — это то, что разработать FPGA намного проще. В отличие от ПЛИС, дизайн ASIC начинается с совершенно пустой таблицы. Не значит, что каждый настроит микросхему для майнинга дома. Но при наличии базы и прочтении опыта других (об этом ниже), задача теоретически выполнима.
На FPGA вы начинаете с большого массива логических блоков, PLL, встроенных ОЗУ, буферов ввода-вывода, (де) сериализаторов, сетей распределения электроэнергии и т. д., разработка ASIC самостоятельно начинается еще с более низкого уровня. Это означает, что компоненты должны быть приобретены либо изготовлены как часть библиотеки, либо индивидуально разработаны для ASIC.
Следующей большой разницей является цикл разработки. Простые ПЛИС могут быть построены в течение дня или пары недель для умеренно сложного проекта. Это именно цикл: разработка -> выпуск -> тест -> фикс -> разработка…
Один цикл производства ASIC может занять несколько недель (месяцев), после чего вам необходимо интегрировать и протестировать его. После тестов баги не фиксятся, это слишком дорого.
Технология ASIC обеспечивает более высокую скорость и более низкое энергопотребление в сравнении с FPGA. Различия в скорости между двумя методами легко достигают 10 раз или более.
Графические процессоры значительно более мощные, чем CPU’s, как по мощности, так и по хешированию/ватту, но из-за присущей FGPA параллельности может быть примерно в 15 раз эффективнее.
В целом, вывод по FPDA такой, что они потребляют меньше электроэнергии, могут быть перенастроены и спроектированы самостоятельно, если вы разбираетесь в микроэлектронике. Но у них:
Несмотря на более высокую цену, АСИК будет выгоднее. Но для устойчивых к такой разработке монет, можно попробовать FPGA-майнер.
Под Ethereum некоторые пытались писать майнер самостоятельно. Целый алгоритм таков:
FPGA оборудованием занимаются:
Можно почитать эту тему (на английском), где энтузиаст собрал ферму из нескольких установок с доходом $ 160- $ 456 в день. Его ROI составляет 70-200 дней в зависимости от алгоритма.
Вся установка оснащена одним источником Rosewill Hercules 1600W, каждая карта сжигает 100-160 Вт. Любая приличная материнская плата для майнинга будет работать, загрузка на процессор очень низкая. Любая установка GPU может быть быстро переделана в FPGA.
Также ПЛИС использовали для высокочастотного трейдинга: статья на Хабре.
На англоязычном биткоинтоке аноним предлагал по цене в $7500 написать рабочий FPGA-майнер для CryptoNightv7.
План проекта таков:
Также известно, что Baikal miner для Criptonight — это FPGA, что является их ключевым преимуществом после выпуска Bitmain Antminer X3. Если монета изменяет свой алгоритм хеширования, оборудование можно перенастроить.
Мы не можем рекомендовать конкретные сайты, потому что отношение к возможности майнить по алгоритму cryptonight на fpga спорно.
Также программы для майнинга и другие готовые решения обычно или платны, или забирают себе комиссию с намайненного в размере 3-5%.
crypto-fox.ru
FPGA (Field Programmable Gate Array) — программируемая шлюзовая матрица. По своей сути FPGA является массивом взаимосвязанных цифровых подсхем, которыми реализуются общие функции. Также система видится инструментом, наделённым очень высоким уровнем гибкости. Однако чтобы реализовать полностью гибкость матрицы, потребуются исключить массу нюансов. Поэтому рассмотрим концепцию FPGA, попутно узнаем, что такое логические шлюзы, определим, как программировать FPGA. Наконец, найдём отличия конструкции матрицы от конструкции микропроцессора.
Содержимое публикации
Микроконтроллеры выступают доминирующим компонентом современного электронного конструирования. Микроконтроллеры относительно недорогие и универсальные электронные модули.
Это мощные инструменты, благодаря которым успешно решаются различные задачи проектирования. Тем не менее, микроконтроллеры построены на основе процессоров, а процессоры характерны некоторыми фундаментальными ограничениями.
Как же достичь превосходства FPGA над традиционным микроконтроллером? Конечно же, посредством программного обеспечения и аппаратных средств.
Процессор решает задачи, выполняя инструкции последовательно. Таким образом, операции процессора по существу ограничены.
Требуемая функциональность должна быть адаптирована к доступным инструкциям, и в большинстве случаев невозможно одновременно выполнить несколько задач обработки.
Структура микроконтроллера: 1 – процессор; 2 – контроль прерываний; 3 – генератор импульсов; 4 – ROM; 5 – управление шиной; 6 – RAM; 7 – порты ввода/вывода; 8 – счётчики; 9 – последовательный портНабор инструкций рассчитан на высокую универсальность, и в настоящее время инструкции могут выполняться на чрезвычайно высоких частотах; однако эти характеристики не устраняют недостатки программного подхода к цифровому конструированию.
Альтернативой является аппаратный подход. Было бы чрезвычайно удобно, если бы каждая новая конструкция выстраивалась вокруг цифровой ИС, которая реализует точную функциональность, востребованную системой.
Тогда нет необходимости писать программное обеспечение:
Эта методология нецелесообразна вне описания, поскольку она предполагает разработку ASIC (специализированной интегральной схемы) для каждой платы. Однако есть возможность аппроксимировать эту методологию через FPGA.
FPGA – это, по сути, массив логических вентилей. Этот массив может быть запрограммирован пользователем для конкретного устройства. Рассмотрим подробнее такую возможность.
Логические шлюзы (AND, OR, XOR и т. д.) являются основными строительными блоками цифровой схемы. Поэтому неудивительно, когда цифровое устройство, которое необходимо конфигурировать (запрограммировать пользователем), состоит из множества шлюзов, связанных методом настройки.
Однако FPGA не является обширной коллекцией отдельных булевских шлюзов. Это был бы субоптимальный способ обеспечения функциональности настраиваемой логикой. Тот же принцип проявляется, к примеру, в области дискретных цифровых интегральных схем (ИС).
В принципе, можно приобрести интегральные схемы, которые состоят из И-шлюзов, ИЛИ-шлюзов и т. д. Между тем вряд ли рационально создавать сдвиговый регистр из отдельных шлюзов. Куда рациональнее и практичнее использовать ИС регистра сдвига.
Таким образом, FPGA видится намного более выразительным инструментом, чем просто массив шлюзов. Это массив тщательно разработанных и взаимосвязанных цифровых подсхем, которые эффективно реализуют общие функции.
Отмечено, что FPGA обеспечивает очень высокий уровень гибкости. Эту гибкость обеспечивают цифровые подсхемы, именуемые конфигурируемыми логическими блоками (CLB). Такими блоками образуется ядро программируемых логических возможностей FPGA.
Структура программируемой шлюзовой матрицы: CLB – настраиваемый логический блок; SB – переключающий бокс; CB – соединительный бокс; I/O – блок ввода/вывода; H – горизонтальный канал маршрутизации; V – вертикальный канал маршрутизации; C – «W» трекТехнически CLB взаимодействуют друг с другом и с внешней схемой. Для этих целей FPGA использует матрицу программируемых соединений и блоков ввода/вывода (I/O).
Программа FPGA хранится внутри ячеек SRAM, которые влияют на функциональность CLB и управляют коммутаторами, устанавливающими пути подключения.
Подробное объяснение внутренней структуры и работы CLB потребует отдельной публикации (или даже нескольких публикаций). Общая идея заключается в том, что CLB включают в себя:
Все эти включения позволяют CLB выполнять логические операции, операции хранения данных и арифметические операции.
Блок ввода-вывода состоит из различных компонентов, которые облегчают на электронной плате связь между CLB и другими компонентами. К ним относятся:
Каким же образом превратить массив CLB в цифровую схему, которая делает именно то, чего желает пользователь? На первый взгляд это действие кажется довольно сложной задачей.
Действительно, реализация FPGA обычно считается сложнее, чем программирование микроконтроллера. Однако разработка FPGA не требует глубоких знаний функциональности CLB или кропотливой компоновки внутренних взаимосвязей.
Это аналогично тому, когда разработка микроконтроллеров не требует глубокого знания инструкций на языке ассемблера процессора или внутренних сигналов управления.
На самом деле несколько неверно представлять FPGA как отдельный компонент. Система FPGA всегда поддерживается программным обеспечением разработки.
Такое ПО выполняет сложный процесс преобразования аппаратного конструирования в биты программирования. Этими битами определяется поведение взаимосвязей и CLB.
Существуют средства, которые позволяют пользователю «описывать» аппаратное обеспечение. Эти средства называются языками описания аппаратных средств (HDL). Среди наиболее распространенных языков следует отметить «сладкую парочку»: —
Несмотря на очевидное сходство между кодеком HDL и кодом, написанным на языке программирования высокого уровня, эти два средства принципиально отличаются друг от друга.
Пример программирования шлюзовой матрицы с помощью VHDL кода, благодаря чему достигаются все необходимые операции, на которые рассчитывает конечный пользовательПрограммный код определяет последовательность операций, тогда как HDL-код больше похож на схему, которой используется текст с целью представления компонентов и создания взаимосвязей.
Современные FPGA — это сложные, высокопроизводительные устройства. На первый взгляд это пугающе сложные системы для тех пользователей, кто привык работать с микроконтроллерами.
Микроконтроллеры видятся проще для сбора данных, управления ASIC и выполнения математических операций. Однако на практике легко обнаруживается, что для некоторых конкретных применений улучшенная производительность и универсальность достигаются именно разработкой на FPGA.
При помощи информации: Allaboutcircuits
zetsila.ru
Работая над очередным игровым (обучающим) проектом ПЛИС для платы Марсоход2 я столкнулся с тем, что мне явно не хватает места в кристалле. Кажется и проект не очень сложный, но моя реализация такова, что требует много логики. В принципе, это ерунда, дело-то житейское. Ну, если очень будет нужно, то можно выбрать ПЛИС с большей емкостью. Собственно мой проект — это игра «Жизнь», но реализованная в ПЛИС на языке Verilog HDL.
Про логику игры, рассказывать не буду, про нее и так написано уже достаточно.
Идея проекта вот такая: каждая клетка в игровом поле представляет собой самостоятельный вычислитель. В каждом вычислителе есть своя логическая функция и свой регистр, который хранит текущее состояние клетки (живая/не живая). Все пространство для жизни клеток — это двумерный массив вычислителей, вычислители образуют целую сеть. Все вычислители работают синхронно, так как на все регистры подается единая тактовая частота. Рисунок вверху должен прояснить схему проекта.
Так вот. На моей плате стоит ПЛИС Cyclone III EP3C10E144C8 компании Альтера. 10тыс логических элементов. Сперва я думал, что смогу сделать двумерный массив клеток 128×64=8192 клетки. Не помещается. 64×64=4096 — то же не помещается в кристалл. Как же так. Я сумел вместить в ПЛИС только 32×16=512 клеток. Пичалька…
Размышления приводят меня к мысли, что возможно, в будущем, технология ПЛИС перерастет в нечто большее, чем программируемая логика. Вот об этом своем видении я хотел бы рассказать. Искушенному читателю сразу скажу, что многое далее написанное есть просто плод воображения и может быть даже бред.
Однако..
В настоящее время технология ПЛИС используется довольно узким кругом специалистов. В основном FPGA используются для прототипирования микросхем и для мелкосерийных изделий, когда изготовление микросхем ASIC экономически нецелесообразно. Специалистов по FPGA, я думаю, не очень много. Технология довольно сложная и требует многих специфических знаний. С другой стороны, для организации высокоскоростных и параллельных вычислений ПЛИС — это пожалуй самая подходящая технология.
Мы знаем, например, что компания Альтера предлагает и продвигает технологию OpenCL
Просто говоря — это такой C-подобный язык для описания параллельных вычислений в FPGA акселераторе. Кстати, Nvidia и ее видеокарты так же поддерживают параллельные вычисления c OpenCL.
Таким образом, видно, что Альтера явно задумываются о том, как донести «обычные» C-подобные параллельные вычисления FPGA в народ. Посмотрим, что там с ценами на платы для параллельных вычислений с FPGA? Плата Terasic DE5-Net.
25 пользователям нравится цена 8 тыс баксов (шучу).
Есть и другие попытки привезти FPGA в народ — Altera выпустила совместно с Intel микросхему серии E6x5C, где в едином корпусе соединен процессор Atom и ПЛИС Arria II. Хорошая попытка, но технология так кажется и не смогла найти массового потребителя.
Видимо существующие кристаллы ПЛИС плохо вписываются в современную парадигму программирования.
А какая у нас сейчас современная парадигма «нормального» программирования?
Мне кажется, что как-то так:
Понятно, что чем больше памяти и чем больше ядер процессора, тем быстрее работают все процессы в системе.
Память и ядра процессора — это ресурсы компьютера, вычислителя, которые операционная система распределяет между процессами.
Теперь представим себе, что в будущем мы получим компьютеры, где на ряду с памятью и ядрами процессора будут иметься в наличии еще блоки логики «как-бы-плис». Этот ресурс «как-бы-плис» по своим свойствам находится где-то между процессором и памятью. С одной стороны «как-бы-плис» = это вычислитель, то есть ближе к процессору, но с другой стороны это и память, ибо в регистрах плис хранится довольно много информации. Состояние вычислителя «как-бы-плис» уже довольно трудно будет сохранить в структуре task_struct при переключении контекста задачи. Но, наверное, можно попытаться вытеснить состояние блоков логики в swap файл, как виртуальную память. И временно ОС может подгрузить другие блоки логики для активного потока…
Кстати, и Altera и Xilinx уже довольно давно имеют FPGA с возможностью частичной перезагрузки отдельных участков, блоков логики (Partial Reconfiguration) — то есть в принципе они как-то идут в эту сторону…
Программист может выделить для процесса столько «как-бы-плис», сколько нужно. Буквально функцией lalloc (logic alloc) по аналогии с malloc (memory alloc). Потом из файла считать туда «прошивку ПЛИС» и она будет жить и работать. Мы, программисты, по большому счету не должны думать есть эта память/логика «как-бы-плис» у системы или ее нет. А не наше это дело. Да, иногда может быть очень медленно при ограниченных ресурсах, но разве мы не знаем как «лагают» видеоигры на слабых видеокартах? Пользователи знают, что за сильное железо придется платить, но хорошо бы, чтоб даже минимальная система уже имела в базовом варианте логические блоки «как-бы-плис» для использования в программах.
На самом деле, конечно, я представляю себе, что такая технология вряд ли скоро появится, слишком все это сложно и не реализуемо. По крайней мере существующие микросхемы ПЛИС мало подходят для этих целей хотя бы потому, что для конфигурирования ПЛИС используются медленные последовательные интерфейсы типа JTAG. Но может быть, когда-то кто-то из нас сделает это?
ЗЫ: кстати, а вот и моя игра жизнь в ПЛИС, такая маленькая, 32×16… ну нет у меня виртуальной памяти «как-бы-плис», чтобы сделать поле игры шире и выше…
ЗЫ2: все исходники и подробное описание проекта игры Жизнь можно взять здесь.
habr.com
Анатолий Сергиенко
Программируемые логические интегральные схемы (ПЛИС) появились полтора десятилетия назад как альтернатива программируемым логическим матрицам (ПЛМ). От последних ПЛИС отличаются как по архитектуре, так и по технологии изготовления.
ПЛМ представляет собой матрицу многовходовых (несколько десятков входов) логических элементов с триггерами, в которых перемычками программируются конституенты единиц дизъюнктивных нормальных форм функций этих элементов. Вначале перемычки выполнялись в виде пережигаемых тонких проводничков. Теперь перемычки выполняются в виде МОП-транзистора с плавающим затвором, как в электрически перепрограммируемом ПЗУ, т.е. ПЛМ изготовляются по технологии флэш-памяти. Большие ПЛМ (CPLD) отличаются только тем, что несколько ПЛМ собраны на одном кристалле и объединены программируемым полем связей.
ПЛИС представляет собой матрицу маловходовых (от двух до пяти входов) логических элементов, триггеров, отрезков линий связи, соединяемых перемычками из полевых транзисторов. Судя по английскому названию — Field Programmable Gate Array (FPGA) — ПЛИС программируются изменением уровня электрического поля (field) в затворах этих транзисторов. В отличие, например, от LPGA — Laser Programmable Gate Array. Затворы всех «программирующих» полевых транзисторов подключены к выходам триггеров одного длинного сдвигового регистра, который заполняется при программировании ПЛИС. Некоторые из участков этого регистра могут также выполнять роль ячеек ПЗУ.
Прошивка обычно хранится в ПЗУ, стоящем рядом с ПЛИС и после включения питания или по сигналу сброса она автоматически переписывается в программирующий сдвиговый регистр ПЛИС. Этот процесс называется конфигурированием ПЛИС. Так как основу ПЛИС составляют триггеры, хранящие прошивку, то ПЛИС изготавливаются по технологии микросхем статического ОЗУ.
По сравнению с CPLD, ПЛИС выигрывают
Как правило, ПЛИС имеют на два — три порядка большую емкость в числе эквивалентных логических вентилей, чем CPLD и также как статическое ОЗУ, почти не потребляют энергии при отсутствии переключений. Кроме того, у ПЛИС на порядок выше надежность (ниже интенсивность отказов), чем у CPLD.
К недостаткам относят необходимость внешнего ПЗУ прошивки, генератора синхросерии. Но 8-выводовое ПЗУ занимает на плате значительно меньше места, чем сама ПЛИС с многими сотнями выводов. То же касается генератора синхросерии.
Много сомнений у пользователей возникает с защитой проекта от копирования. Действительно, прошивка ПЛИС хранится во внешнем ПЗУ, содержимое которого просто копируется. Но изменить или расшифровать прошивку, например, для скрытия авторства или восстановления схемы, практически невозможно, так как семантика битов в файле прошивки — секрет фирмы, а неосторожное изменение ее может вывести ПЛИС из строя. Если требуется защита, то загрузку программы выполняют с помощью внешней CPLD, автомат в которой обеспечивает защиту проекта. В ПЛИС новых поколений предусматривается шифрование прошивки, например, с помощью встроенного шифрователя DES с обеспечением сохранения ключа с помощью батарейки.
Фирма Xilinx принадлежит к числу родоначальников ПЛИС и самых крупных их производителей. Ниже рассматривается краткое описание архитектурных особенностей ПЛИС серии Virtex выпускаемой этой фирмой. Эти особенности наследуются в новых сериях ПЛИС, а также в серии Spartan, микросхемы которой призваны заменить заказные СБИС в мало- и среднесерийном производстве изделий электроники. Кроме того, принципы функционирования структурных элементов ПЛИС этой серии узнаваемы в архитектурах ПЛИС других фирм-производителей, таких как, Altera, Actel, Atmel.
На площади кристалла ПЛИС размещены матрица конфигурируемых логических блоков (КЛБ или CLB), матрица отрезков линий межсоединений, покрытых матрицами из полевых транзисторов — перемычек. По краям кристалла размешены блоки настраиваемых ОЗУ — BlockRAM. По периметру кристалла размещены блоки ввода-вывода сигналов (IOBs), а также периферийный канал линий межсоединений, называемый Versaring, предназначеный для соединения КЛБ с произвольным IOB линией связи с малой задержкой.
Роль основного логического элемента в ПЛИС играет логическая таблица (ЛТ) или look-up table (LUT), представляющая собой однобитное ОЗУ на 16 ячеек. В ЛТ по адресу G3,G2,G1,G0 записана единица, если код адреса представляет собой конституенту единицы заданной четырехвходовой логической функции. Например, если по адресу 1,1,1,1 записана единица, а по остальным адресам — ноль, то ЛТ реализует четырехвходовую функцию И. На рис. показан пример кодирования функции Исключающее ИЛИ на четыре входа.
Триггеры ЛТ входят в состав программирующего сдвигового регистра и их начальное состояние заполняется в период конфигурирования ПЛИС.
В ПЛИС используются программируемые D-триггеры. При конфигурировании можно задать такие режимы работы триггера, как триггер с начальным сбросом (R) или начальной установкой (S), с записью по фронту или спаду синхросерии, с разрешением или без разрешения записи.
После окончания конфигурирования ПЛИС выдает сигнал общего сброса GSR, который устанавливает все триггеры в 0 или 1.
В базовой серии ПЛИС XC4000 фирмы Xilinx основной единицей оборудования считается КЛБ, состоящий из двух триггеров и двух ЛТ. В новых сериях ПЛИС количество триггеров и ЛТ увеличилось вдвое и вчетверо. Чтобы оставить для всех серий одну и ту же единицу оборудования, условились называть КЛБ из двух триггеров и двух ЛТ эквивалентным КЛБ (ЭКЛБ) или CLB slice. Таким образом, КЛБ серии Virtex состоит из двух ЭКЛБ, а серии VirtexII — из четырех ЭКЛБ .
В ЭКЛБ две ЛТ и два триггера соединены вместе через схему ускоренного переноса и два однобитных полусумматора. Эти схемы позволяют эффективно реализовать многоразрядные параллельные сумматоры, а на их основе — всевозможные счетчики и АЛУ.
Для минимизации оборудования и ускорения вычисления операции умножения используется дополнительная схема поразрядного произведения.
Следует добавить, что в новой серии VirtexII аппаратно реализованы умножители 18 на 18 разрядов.
Большую долю оборудования в ВС занимают мультиплексоры. С помощью ЛТ можно реализовать двухвходовый мультиплексор. Для эффективной реализации 4-х и более — входовых мультиплексоров в КЛБ имеются схемы мультиплексоров F5 и F6, которые играют роль верхних уровней древовидного мультиплексора. Также они используются для построения функции 5-входовой (F5) и 6-входовой (F6) логики.
Применение шин с тремя состояниями — типичное схемное решение вычислительных устройств, реализованных на плате. Благодаря такому решению, легко достигается многомодульность и наращиваемость системы, низкие аппаратурные затраты и малые задержки в системе межсоединений. Внутри заказных СБИС редко применяются шины с тремя состояниями из-за технологических трудностей их безотказной реализации, а также увеличенной задержки на их переключение.
Несмотря на это, в ПЛИС фирмы Xilinx всё-таки широко применяются шины с тремя состояниями, хотя это существенно повышает их себестоимость. Зато, во-первых, проще выполнить переход от проекта схемы на плате к проекту системы на кристалле. Во-вторых, ВУ с общими шинами, к которым подключено несколько десятков модулей, имеет аппаратные затраты в несколько раз меньше, чем такое же ВУ, в котором шины заменены на эквивалентную схему из системы мультиплексоров. В-третьих, с помощью общих шин можно эффективно реализовать встроенное распределенное ОЗУ, о котором пойдет речь ниже.
Для реализации общей шины каждый КЛБ имеет два буфера с тремя состояниями BUFT , которые через транзисторы-перемычки могут подключаться к общим шинам, проходящим вдоль всего кристалла. В обычных шинах третье состояние характеризуется уровнем, находящимся между уровнями логической 1 и логического 0. Но если такую шину реализовать внутри микросхемы, то в случае, когда все тристабильные буферы будут в третьем (закрытом) состоянии, их выходные транзисторы будут полуоткрытыми и могут выйти из строя. Для исключения такого электрического режима в ПЛИС общая шина нагружена на концах специальной триггерной схемой — Weak Keeper , которая выводит уровень шины или к уровню H, или к уровню L (слабые 1 или 0), если все буферы закрыты.
Неправильное функционирование общей шины, когда несколько источников с разными уровнями подключаются к шине, может вывести ПЛИС из строя. САПР ПЛИС тщательно проверяет, чтобы спроектированная общая шина функционировала правильно. Поэтому не рекомендуется ручное редактирование файла прошивки, так как случайная ошибка в коде может привести к неправильной работе общей шины и порче ПЛИС.
Для реализации в ПЛИС модулей ОЗУ предусмотрено две возможности. Первую возможность предоставляет каждая ЛТ, которая может быть сконфигурирована как 16-битовое синхронное ОЗУ. Две соседних ЛТ могут быть сконфигурированы как 16-битовое двухпортовое ОЗУ с записью и чтением по одному адресу и чтением по другому адресу, как показано на рис. При этом для реализации синхронного режима записи входной бит данного, сигнал записи и адрес запоминаются в триггерах — защелках, а для чтения по второму адресу из блока второй ЛТ используется только мультиплексор чтения.
Для наращивания емкости памяти выходы нескольких КЛБ с модулями ОЗУ через тристабильные буферы подключаются к общим шинам. При этом требуется дополнительное оборудование только для построения схемы дешифрации адреса, которая выдает сигналы выборки той или иной ЛТ для записи, а также того или другого тристабильного буфера для чтения. Такое ОЗУ распределено по площади кристалла и поэтому названо Distributed RAM.
Если ЛТ запрограммировать как примитив SRL16, то из ее триггеров будет реализован 16-разрядный сдвиговый регистр с однобитовым входом и программируемым номером выходного разряда, т.е. память FIFO регулируемой длины.
Вторую возможность предоставляют отдельные блоки памяти BlockRAM. В ПЛИС серии Virtex они могут быть сконфигурированы как ОЗУ объемом 256 16-разрядных слов, 512 8-разрядных слов, и т.д. Эта память может быть запрограммирована как однопортовая или как полностью двухпортовая память. Начальное состояние этой памяти задается при ее конфигурировании, поэтому она может быть использована также как ПЗУ.
ПЛИС находят широкое применение благодаря тому, что их можно включать в большинство проектов вычислительных устройств и ими можно заменять большое количество старых микросхем. Предпосылкой этому служит большое число блоков ввода-вывода сигналов IOB, настраиваемых под различные стандарты электрического соединения входов микросхем. На рис. показана структура одного IOB.
Сигнальный вывод ПЛИС получил название PAD. С помощью настройки к нему можно подключать внутренний нагрузочный резистор PULLUP или резистор PULLDOWN, соединенные с шиной питания или шиной земли, соответственно. Эти резисторы обеспечивают режим выхода с открытым коллектором (стоком) для систем с различными уровнями логики. Входной сигнал с PAD поступает на компаратор IBUF, порог срабатывания которого программируется под уровни ТТЛ, КМОП, шины PCI и многие другие, а также может регулироваться установкой подаваемого снаружи напряжения. Для обеспечения временного сдвига сигнала относительно фронта синхросерии, обеспечивающего надежный прием сигнала во внутренние триггеры, в цепь входного сигнала может включаться специальная схема задержки.
Выходной сигнал в IOB формируется в тристабильном буфере OBUFT, причем его уровень максимального тока программируется ступенями и может достигать 20 мА. Для обеспечения быстродействующего ввода-вывода передаваемые и принимаемые биты данных, а также сигнал управления тристабильным буфером могут запоминаться в триггерах.
В новых сериях ПЛИС предусмотрена настройка входного и выходного импеданса PADа, а также бифазное функционирование пар PADов для достижения помехоустойчивой высокоскоростной передачи данных.
При диагностике и отладке, в одном из режимов конфигурирования ПЛИС может быть переключена в режим пограничного сканирования (Boundary Scan). В этом режиме все IOB соединяются в цепочку одного длинного регистра сдвига. Путем стандартного внешнего управления этим регистром сдвига через интерфейс JTAG можно считывать состояния выводов, подавать тестовые сигналы, конфигурировать ПЛИС.
В период конфигурирования ПЛИС для того, чтобы подключаемые к ней устройства не функционировали неопределенным образом, выходы IOB отключаются и на них обычно выставляется уровень H слабой единицы (Weak Keeper).
Одним из принципов разработки проектов для ПЛИС является принцип однотактной синхронизации, согласно которому все триггеры в блоке срабатывают одновременно по одному сигналу синхросерии. Для его реализации в ПЛИС синхросигналы распространяются по быстродействующей древоообразной сети, которая обеспечивает почти одновременный приход фронта синхроимпульса на синхровходы всех триггеров.
Для надежного функционирования ПЛИС синхросигнал должен подаваться через вывод GCLKPAD и попадать в сеть синхросерии через буфер GCLKBUF. В ПЛИС предусмотрено 4 вывода GCLKPAD, размещенных на противоположных сторонах ее корпуса. Синхросигнал может вырабатываться и внутри ПЛИС, но в этом случае его следует завести в сеть синхросерии через глобальный буфер BUFG.
С помощью спроектированного синхронного автомата, сконфигурированного в ПЛИС, можно изменять частоту и фазу синхросерии. Но в этом случае ее временные параметры будут недостаточно стабильными и поэтому такой подход обычно не применяется. Для надежного регулирования частоты синхросерии в ПЛИС включают делители частоты синхросерии с автоподстройкой — блоки CLKDLL. На рис. показана типичная схема его включения. Блок CLKDLL обеспечивает умножение частоты синхросерии в 2 раза, сдвиг ее фазы на 90, 180 и 270 градусов, деление на 1.5, 2, 2.5, 3, 4.5, 8 и 16.
Для конфигурирования ПЛИС в ней предусмотрены входы задания режима M2, M1, M0, вывод синхросерии программирования CCLK, вход последовательности конфигурации PROGRAM, выход флага окончания конфигурирования DONE и выводы порта JTAG. В зависимости от установленного режима можно загружать прошивку ПЛИС через однобитовый вход PROGRAM, порт JTAG или 8-разрядную шину D c использованием для управления выводов WRITE и BUSY.
Конфигурирование через однобитовый вход длится до нескольких десятков секунд. Это стандартный способ конфигурирования и для него не требуется дополнительного оборудования, кроме ПЗУ прошивки с однобитовым выходом.
Для реализации конфигурирования через шину D необходимо дополнительное внешнее устройство (автомат или микроконтроллер), управляющее записью и выдающее последовательность адресов чтения на входы байтового ПЗУ. Зато оно происходит значительно быстрее — практически с максимальным темпом чтения из ПЗУ.
Разработка систем на кристалле (СНК) — это устойчивая современная тенденция. И программирование ПЛИС для СНК — один из главных этапов такой разработки. Выпуск ПЛИС новых поколений, например, Xilinx VirtexPro, направлен на поддержку развития СНК. Разработка СНК без применения языка VHDL или Verilog практически невозможна.
kanyevsky.kpi.ua
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.
Возможно, программное обеспечение, компиляторы для ПЛИС – это важнейшая составляющая интеллектуальной собственности компаний производителей ПЛИС.
На страницах нашего сайта https://marsohod.org мы уделяем внимание прежде всего проектированию систем на базе ПЛИС компании Альтера и пользуемся средой разработки Altera Quartus II.
marsohod.org
Многие из вас наверное видели, что Amazon запускает инстансы EC2 с FPGA на борту. Я сразу признаюсь, что я никогда не пользовался облаками Amazon: я использую только Azure, и то только потому что мне некоторый объем вычислительным мощностей дают бесплатно как MVP (которым я являюсь уже ажъ 8 лет!), а до этого у меня просто стоял свой собственный сервер в универе, про который мало кто знал пока через одно веб-приложение (MindTouch Core, если кому интересно) на сервере кто-то установил спамбота, и понеслась.
Короче, я не юзаю Амазон облако, да и в последнее время стараюсь поменьше заказывать с Амазона: сейчас ведь там продают очень многие ритейлеры, у которых есть свои сайты, соответственно я скорее куплю за ту же стоимость у них, чтобы им перепало побольше, а Амазону — нуль. Думаю причины сего поведения с моей стороны вы итак прекрасно понимаете — Амазон прекрасен для покупателя (хотя скорость доставки в Англии упала до неприличия), но вот к программистам они, судя по “среднему по больнице”, относятся как к шлаку. И да, понятно что есть продуктовые команды в которых все нормально, но судя по тому что пишут на Reddit, общее положение все же весьма бредовое. Если вы там работаете, можете меня поправить и рассказать как все шикарно.
Ах, да, тьфу ты, я на самом деле немного некорректно тут написал. Основная проблема моя с Амазоном не в этом, а в том что они не берут PayPal. Это как бы критично т.к. на мелкие покупки я трачу только свой disposable income, а он у меня весь на PayPal.
Че-то я отъехал от темы. Вроде пост был про FPGA.
У нас есть много разных плохо коммутируемых парадигм разработки – например процедурная, объектно-ориентированная, функциональная. А есть парадигма, которую можно называть “потоковой”, а по-английски она называется словом dataflow.
Идея dataflow тривиальна как в танке: представьте, что входные данные в системе проходят через некий map-reduce, т.е. обработку потока этих данных с некоторыми критериями выборки. Например на вход могут прийти три числа и нужна их сумма, то есть
int sum(int a, int b, int c) { return a + b + c; }
Возникает вопрос: сколько времени занимает код выше? Если мыслить о том что написано выше в терминах C++, C#, Java или аналогичных языков, то код — то есть набор инструкций — будет транслирован в несколько вызовов add
, и соответствено займет ненулевое время на выполнение.
Сколько займет тот же самый алгоритм на FPGA? Ну, если утрировать до боли, но он займет нуль времени. Сигналы a
, b
и c
будут поданы на соответствующие схемы, который в момент на выходе выдадут результат. Никаких “инструкций” не произойдет.
Понимание того, что программрование FPGA — это конфигурирование интегральной микросхемы (я тут возможно путаю терминологию, поправьте если что), а не описание набора инструкций — это ключ к пониманию того, что собственно можно выудить из технологии FPGA и к каким она задачам применима. Сейчас мы как бы понимаем, что когда по проводам идут данные с бешеной скоростью (например, интернет на 10G), обычный CPU — даже самый навороченный Xeon — не сможет эти данные переварить содержательно, разбирая, например, коммуникационный протокол по которому идут биржевые данные. Но это только часть задачи.
Современный процессор, безусловно, поддерживает некоторый уровень параллелизма: у нас есть “многоядерность”, у нас есть т.к. hyper-threading, ну и конечно у нас есть SIMD, который помошает делать больше вычислений за счет больших регистров. Но, так или иначе, этот паралеллизм заранее лимитирован процессором: мы знаем, например, что на Xeon Phi (60 ядер по 4 аппаратных потока каждое) не имеет особого смысла запускать более 240 потоков и, более того, на обычных CPU мы не контролируем, какая задача ложится на какой поток: это обычно делает операционная система (в случае с Xeon Phi там используется свой собственный Linux).
Ситуация с FPGA несколько другая: там за один такт можно делать совершенно несвязанные операции, и количество таких операций лимитировано только количеством логических элементов на кристалле. Иначе говоря, FPGA способствуют такому масштабу параллелизма, о котором с обычными CPU остается только мечтать.
Это не значит, что FPGA дает самый лучший performance. У нас есть очень мощные модели параллелизма (например SIMT на GPU) с которыми FPGA не может бодаться в плане обработки больших объемов данных. Но и цель у FPGA немножко не такая: ведь на GPU каждый поток должен делать одно и то же (иначе теряется вся эффективность), а FPGA может на разных своих участках делать абсолютно разные вещи. Синхронизация между этими участками — это достаточно сложная задача, конечно, но with great power… ну вы поняли.
Да, еще один аспект, который нужно упомянуть — это тактовая частота. На CPU тактовая частота одна, и все задачи синхронизуются на нее. На FPGA вы можете использовать разные генераторы (по английски clock), т.е. сигналы разной частоты для разных задач. Тактовая частота FPGA в целом существенно уступает CPU, но сравнивать их напрямую не особенно интересно, т.к. они служат разным целям.
Я не буду скрывать, что и на обычных Intel’евских CPU происходит много всякой магии вроде branch prediction. По сути, современный ассемблерный код, который выдает вам С++ компилятор с включенными оптимизациями, читать достаточно сложно про причине того, что количество “магии”, которое обычно вкладывается в погони за перформансом, огромно. Ассемблер можно читать разве что в идеальном мире, без оптимизаций.
Pipelining объяснить просто. Возьмем следующий код:
void mad(int* a, int* b, int* c, int* result size_t count) { for (size_t i = 0; i < count; ++i) result[i] = a[i]*b[i] + c[i]; }
Вы наверное думаете что каждая итерация цикла for
должна закончиться прежде, чем начнется новая. В контексте С++ вы правы, а в контексте FPGA — нет!
Представьте операцию a*b+c
как микросхему, работающую под определенной тактовой частотой: на первый шаг, вы подаеет значения a
и b
и получаете их произведение. Потом надо бы прибавить c
, а что в это время делает та часть которая умонжает. Думаете она простаивает и ждет пока завершится вычисление? А вот и нет! Эта часть схемы может брать и считать следующее произведение, т.е. a*b
для следующей пары чисел a
и b
.
Вот это и называется pipelining: возможность сразу пропускать целый поток значений, не дожидаясь завершения всего вычисления. И, как вы надеюсь уже догадались, это приводить к существенному ускорению, т.к. является de facto еще одним уровнем аппаратного параллелизма.
SoC расшифровывется как System-on-a-Chip, и в контекте она подразумевает некую аггломерацию FPGA с обычными процессорами вроде ARMов. При этом эти процессоры не просто “сосуществуют на плате”, а ARM встроен прямо в FPGA.
А вот это уже интересно, т.к. на ARM мы просто ставим свою собственную ось (вопрос про то, можно ли туда поставить Windows остается открытым, т.к. MS как-то протормаживают в этом плане), и тем самым получаем на одном кристалле, по сути, полноценно-работающий компьютер — нужно только добавить оперативки и периферию (например PCIe, Ethernet, …) по вкусу. Собственно это должно объяснять почему это “system on a chip” — на одном кристалле все, что нужно чтобы выполнять какую-то экспертную задачу.
Покупка Intel’ем компании Altera, второго по размеру производителя FPGA, намекает на симметричное развитие Xeon’ов: идея в том чтобы воткнуть в процессор какой-нть FPGA и дать разработчикам программировать его и осуществлять взаимодействие между CPU и FPGA вместо того чтобы ходить по PCIe шине, как предлагает Amazon.
Кстати, покупка Altera может выйти сильным боком Российским производителям (в т.ч. ВПК и тем кто под санкциям). Причина проста — сейчас, Altera и в частности ее дистрибьютор Terasic — это коррумпированая Тайваньская лавочка, которая вышлет что угодно и куда угодно, в то время как лидер рынка, Xilinx, каждую закупку пропускает через DoD на предмет санкций, dual use и так далее. Если Intel начнет себя вести так же, настанут очень веселые времена. Или вы думаете что в РФ у кого-то есть производственные мощности для импотрозамещения? Ну-ну.
HLS (high-level synthesis) — это не что иное, как кодогенерация VHDL/Verilog из более популярных языков вроде С++ и SystemC. Последний — этот тот же С++, как мне видится, только с некоторым набором конструктов для системного мира (например fixed-point types).
HLS подходов очень много, и объединяет их то, что все они генерируют очень сложную к прочтению и пониманию кашу, которую уже некомфортно читать. Помимо этого, наивно полагать что вы можете взять уже существующий С++ и просто нажать кнопочку “сделать мне хорошо” — вы не можете так просто поменять процедурную парадигму на поточную. Возможность писать что-то новое на С++ дает, разве что, варианты портирования этого “что-то” на x86 и иже с ним, но опять же, непонятно что это дает — разве что тестировать это можно быстрее, да и в Cling-е гонять.
Лично я склонен думать, что у HLS будущее, и что HDL’и должны отмереть за их чрезмерной низкоуровневостью. Но пока что, они — лучший способ описать, что и как должно произходить в системе. ■
nesteruk.wordpress.com
Привет. Волею удачного стечения обстоятельств в Июле мне пришлось столкнуться с ПЛИСами (FPGA). И теперь я хочу описать что это такое в кратце, так как теперь появилось свободное время пригодное для написания заметок.
Замечание: Дело в том, что ПЛИС — это более общее понятие чем FPGA, но в дальнейшем я буду их отождествлять.
FPGA (field programmable gate arrays) — программируемый в поле массив логических вентелей, или ПЛИС (программируемые логические интегральные схемы). Это цифровые интегральные схемы, которые представляют собой набор программируемых логических блоков и программируемых соединений между этими блоками.
—
Хочу отметить, что смысл выражения «программируемый в поле» а в оригинале «field programmable» означает оперативно программируемый. Иногда по ошибки некоторые это как «программируемые полем» но это не верно. Конечно э\м поле здесь участвует, но к нему данное выражение отношения не имеет. Термин «в поле» часто используют в замен «оперативный» чтобы подчеркнуть протекания процесса во время непосредственного иcполнения основных функций.
—
Итак, отвлечение на термин «в поле» закончено в связи с возникающими порой ошибочными трактовками, и переходим собственно к делу.
Зачем нужны ПЛИСы? Дело в том что в большинстве своём цифровая электроника выражена в ASIC — заказных микросхемах, которые очень дороги в единичном производстве. То есть, представим что вы разработчик, и хотите сделать свою цифровую ,и не только, микросхему, дома это сделать под стать к нынешним 14нм (тут меня можно покритиковать но это сейчас не важно) технологиям очень трудно (практически невозможно), и поэтому приходиться описать схему устройства и отослать его на завод производитель, который по заказу выпустит вашу микросхему, причём это очень дорогая услуга, и почти вся стоимость идёт в «шаблоносоздающие» работы. Такие работы очень выгодны при массовом производстве, при большом количестве микросхем, и разница между одной и 10 000 микросхем в цене незначительна. А представьте, что делать если вдруг произошла ошибка — производить новую партию? Дорого. Да и различные лабораторные исследования дороги. А как же эксперименты, единичная продукция, да и просто производство в малых масштабах? Тут на выручку как раз и приходят ПЛИС. Эти микросхемы (упс, точнее интегральные схемы) имеют массив вентилей, которые между собой большое количество связей на любой вкус, и вот вы собираете из этих вентелей что вам надо и связываете их как вам надо, и получаете свою собственную интегральную схему!! Класс… Тут конечно есть свои нюансы, но они больше исторические.
Конечно производство миллиона ASIC может и дешевле чем миллион ПЛИС, но производство одной ASIC намного дороже чем покупка одной ПЛИС. Да и ПЛИС можно переконфгурировать, если конечно там используется технология позволяющая это делать, современные FPGA все это позволяют.
Книга Клайва Максвилда «Проектирование на ПЛИС. Архитектура, средства и методы. Курс молодого бойца» Прекрасно рассказывает об исторических событиях связанных с ПЛИС, а также говорит о их архитектуре и внутреннем устройстве. Для понимания «Как же работают ПЛИСы?» я очень рекомендую эту книгу, хотябы первые 4 главы.
На ПЛИСах можно реализовать многое, хоть свой микропроцессор. Но всё же они имеют свои недостатки относительно заказных интегральных схем.
Ещё, хочу сказать, что FPGA идеальны для параллельной обработки данных, т.е. в нём можно реализовать параллельную обработку данных. «Типо» аппаратное шифрование для вашего устройство или для использования в качестве процессора для цифровой обработки сигналов. Тем более обычно выгодно взаимодействие вида: Микроконтроллер (МК) + ПЛИС, или ЦП (центральный процессор) + ПЛИС. Для реализации МК + ПЛИС часто ядра МК встраиваются в ПЛИС, так как вследствие аппаратной оптимизации на кристалле расположения вентилей аппаратные ядра МК намного быстрее чем созданные программно из вентилей ПЛИСа — программных ядер. Ещё в ПЛИСах часто есть ускорители вида: сумматоры, диспетчеры тактовых импульсов, умножители, встроенное ОЗУ, различные интерфейсы ввода вывода, часто используют гигабитный интерфейс.
О… а как обрабатывать данные гигабитного интерфейса, ведь для этого нужно как минимум использовать 1ГГц в качестве тактовой частоты, а в ПЛИС это тяжеловато. Тут на выручку приходит расспараллеливание — мы обрабатываем входные данные гигабитного интерфейса на 100 параллельных блока, а тут уже достаточно иметь тактовые частоты 1ГГц/100 , а это по 10Мгц, что очень даже возможно. Но последнее — это к примеру.
—
Итак, с ПЛИСами познакомились, теперь пару слов о проектировании.
Процесс проектирования выглядит примерно так: изначально используя специальные языки описания интегральных схем, создаётся собственно это описание схемы. После чего производится моделирование и отладка на ЭВМ. После чего происходит синтез для конкретного устройства файла конфигурации ПЛИС, и временной анализ, после чего либо по временному анализу выполняется оптимизация, либо сразу непосредственное конфигурирование ПЛИС.
Дело ещё в том, что современные FPGA энергозависимы. Их конфигурация хранится в энергозависимой памяти — сепециальных регистрах. При отключении питания конфигурация теряется, поэтому на плате с ПЛИСом часто имеется специальная flesh память или конигурирующее устройство, в котором хранится конфинурационный файл.
Проектирование на ПЛИС — очень сложная задача, и она наверное на половину только «программирование». Сам процесс мышения тут привязан к железу, поэтому нужно заботиться о многих вещах. Я в кратце в дальнейшем расскажу о некоторых нюансах. Немного упомяну о VHDL и о моём опыте использования этого языка описания интегральных схем. А также, если получится, раскажу об особенностях проектирования на ПЛИС.
В общем, дальнейшие мои заметки можно не читать, а сразу прочесть книгу: Сергиенко А. М. «VHDL для проектирования вычислительных устройств». Там подробно описаны особенности проектирования на ПЛИСах,рассмотрены методы оптимизации, а также приведено в качестве примера создания собственного учебного RISC микропроцессора.
Август 2012, виноград, тень, поле и жара. А тут ещё в придачу эти FPGA.
Доброго вам дня))).
—
PS. А помните, тут говорилось о создании микросхем дома? С ПЛИС,в цифровойэлектронике это бесмысслено.
sib.ktu10.com