Fpga. просто о сложном – философия написания конфигураций для плис

Содержание

Что такое ПЛИС простым языком для начинающих

С чем ассоциируется цифровая электроника? В первую очередь с логическими элементами И, ИЛИ, НЕ. Далее в память приходят сдвиговые регистры, дешифраторы, мультиплексоры и прочее. Однако, по мере роста сложности электронных устройств и тенденции к миниатюризации, создание приборов на базе интегральных микросхем (ИМС) из вышеперечисленных компонентов затруднилось, заказные ИМС нужной топологии и схемотехники оправдывали себя только при крупном тиражировании устройства, в остальных случаях – это было неоправданно дорого.

Выходом из сложившейся ситуации стало развитие программируемых интегральных логических схем (сокращенно – ПЛИС, зарубежная аббревиатура – programmable logic device, PLD). Что это такое и где используется мы расскажем в этой статье.

Отличия от микроконтроллеров

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

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

Кроме этого вы можете производить вычисления, сохранять данные в регистрах или ПЗУ, а также оперировать данными прошитыми в память микроконтроллера. На этом в сущности и заключается назначение и особенности работы с микроконтроллерами.

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

Обобщённо внутреннее устройство ПЛИС можно разделить на три основных группы:

1. Массив из логических элементов (макроячеек, логических блоков).

2. Блоки входа-выхода (IO).

3. Линии связи между ними и устройство, которое управляет этими связями.

Однако такое структурирование очень обобщено, немного подробнее мы рассмотрим этот вопрос ниже.

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

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

Выбор микроконтроллеров происходит на основе множества критериев, таких как:

Быстродействие и тактовая частота;

Объем ПЗУ и ОЗУ;

Количество входов и выходов.

Другие функциональные особенности и периферии, типа поддержки линий связи и протоколов (I2C, one-wire, PWM-сигнал и прочее).

При выборе ПЛИС основным критерием является количество программируемых блоков – их должно хватить для реализации задачи.

В зависимости от конкретного ПЛИС количество блоков может изменяться в широких пределах, соответственно изменяется и стоимость.

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

Виды

Актуальными на сегодняшний день являются два основных вида ПЛИС:

1. CPLD (Complex Programmable Logic Device – Программируемая Логическая Интегральная Микросхема, собственно это и есть ПЛИС в её классическом понимании). В ней обычно есть встроенная энергонезависимая памятью, в которую загружается прошивка.

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

2. FPGA (Field-Programmable Gate Array – Программируемая Пользователем Вентильная Матрица, однако её часто относят к ПЛИС) – более развитые и сложные устройства по сравнению с CPLD, строятся на логических блоках с гибкой коммутаций и содержат большее число элементов (десятки или сотни тысяч штук).

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

Интересно:

Хотя фактически наличие энергонезависимой памяти не делает программируемую логику CPLD. Это частично заблуждение. Главным отличием CPLD от FPGA является внутренняя структура.

Подробнее внутреннее устройство CPLD изображено на рисунке ниже.

А примерная схема её макроячейки выглядит таким образом:

Макроячейка состоит из программируемых мультиплексоров, триггеров (одного или нескольких) и формирует группу выходных сигналов ФБ в нескольких их вариантах.

Ниже приведен еще один пример – блок-схема CPLD микросхемы семейства MAX II фирмы Altera.

И структурный план микросхем этого же семейства.

Промежуточные шины макроячейкам назначаются с помощью такого узла, как распределитель, на англ. он звучит как Logic Allocator, что изображено на схеме ниже, на ней же изображена матрица переключений (Global Routing Pool), а у выходных макроячейки (macrocells) имеют по две обратных связи.

Внешние выводы микросхемы соединяются с выходами макроячеек через еще один блок (матрицу) – ORP (Output Routing Pool), обратите внимание, что через неё же происходит соединение ВХОДНОЙ логики с GRP, что изображено на иллюстрации ниже.

В некоторых CPLD есть т.н. прямые входы (Direct Input) – они соединены со входами ячеек напрямую, что уменьшает задержки.

У FPGA структура имеет вид:

L – логический конфигурируемый блок;

S (substitution block) – блок подстановок, он получает на ход определенное число бит, преобразует, по определенному алгоритму, а на выходе выдаёт другое число бит. Другими словами – дешифратор, шифратор и коммутатор.

C (connection block) – блок соединений.

Программирование

HDL (Hardware Description Language, рус. Язык описания аппаратуры) – так называется язык с помощью которого программируются ПЛИС. Популярными и универсальными являются Verilog HDL и VHDL. Существуют и другие языки, например, присущие конкретным производителям, как AHDL для изделий компании ALTERA.

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

Примеры популярных производителей и серий

На момент написания статьи наиболее известными являются изделия двух производителей.

Altera (основана в 1983 году);

Xilinx (Основана в 1984 году).

У Altera есть несколько основных серий программируемой логики:

FPGA. Просто о сложном – Философия написания конфигураций для ПЛИС

В предыдущей статье цикла “FPGA. Просто о сложном” было рассмотрено внутреннее устройство FPGA, в этой статье пойдет речь о том, как пишется конфигурация для этих БИС.

Дело в том, что все статьи для новичков, которые мне попадались, были типа “помигать светодиодиком” либо на ALTERA, либо на Xilinx и не раскрывали философии параллельности вычислений. Да, Вы все правильно поняли, в ПЛИС все вычисления выполняются параллельно В этой статье я постараюсь рассказать о том, как пишется конфигурация для ПЛИС без привязки к какому либо производителю. Все примеры будут представлены на VHDL. Бытует мнение, что Verilog более понятен, но если честно, это только “дело религии” на каком языке писать, в любом случае, все сказанное будет справедливо и для Verilog. После прочтения этой статьи, Вы будете иметь представление как писать под ПЛИС любой фирмы в любом IDE на любом языке.

Для начала давайте разберемся зачем нужно делать конфигурацию на VHDL или Verilog, ведь в интернете полно примеров с редакторами, в которых нужно просто соединять элементы “И”, “И-НЕ”, и т.д., чтобы получить требуемую схему. Например как на рисунке ниже:

Может показаться, что это удобно, ведь все наглядно и привычно, но только как будет выглядеть схема если Вам вдруг понадобится добавить в проект хотя бы одно fifo? А если в проекте нужно реализовать БПФ (быстрое преобразование Фурье)? Такая схема разрастется до эпических масштабов так что учите язык, не издевайтесь над собой. На предприятиях специализирующихся на разработке под ПЛИС подобная реализация конфигураций уже лет 30 как не делается, все пишется с помощью VHDL или Verilog, потому что это быстрее и понятнее. Раз мы выяснили, что единственный путь для создания крупных проектов это языки VHDL или Verilog, то приступим к рассмотрению приемов программирования, но перед этим учтем несколько нюансов:

1) Все проекты состоят из модулей написанных на языке описания, которые обладают портами для связи с другими модулями.

2) Любые операции могут быть синхронными (производятся только по сигналу тактирования), либо асинхронными (не зависят от сигнала тактирования и производятся в любой момент времени).

Ниже на картинке представлен пример асинхронных вычислений, давайте его разберем: на вход clk подается тактовый сигнал. Тактовый сигнал нужен для синхронизации других сигналов по времени и его источником обычно выступает кварцевый генератор, конкретно в этом примере он нужен только для наглядности и нигде не используется. На входную 8-битную шину data подаются 8-битные слова x”01″, x”02″, x”03″, x”04″, источником данных на этой шине может служить любой другой модуль в этой же ПЛИС или же, если привязать эту шину к реальным портам, любой другой источник из внешнего мира . Сигналы sum1 и sum2 по-сути являются 8-битными регистрами, куда мы помещаем значение суммы между приходящим по шине data словом и некоторым прибавляемым значением. Сигнал sum3 является результатом суммирования sum1 и sum2. Вычисления sum1, sum2, и sum3 выполняются асинхронно, это значит, что вычисления происходят мгновенно с изменением сигнала data и никак не синхронизируются по тактовому сигналу.

(Примечание: b”1000_000″ это бинарная запись шестнадцатиричного числа x”80″, а b”0000_0001 это x”01″)

Теперь давайте посмотрим на осциллограмму ниже. Вы можете убедиться, что операции вычисления sum1 и sum2 и sum3 выполнялись параллельно и асинхронно, т.е. над одним и тем же значением сигнала data одновременно проводились две разные операции sum1 и sum2, и в этот же момент времени производилась операция суммирования между sum1 и sum2. Также на осциллограмме ниже видно, что за один такт пришло два слова (асинхронность обведена фиолетовым), но это никак не повлияло ни на время вычислений, ни на их результат.

Теперь слегка изменим программу: добавим синхронизацию вычисления sum3 по фронту тактового сигнала clk и получим пример синхронных вычислений.

Если раньше значение sum3 вычислялось одновременно с sum1 и sum2, то теперь, как видно из осциллограммы ниже, значение sum3 вычисляется только с наступлением фронта тактового сигнала, т.е. на следующий такт. Такие задержки в такт нужно учитывать при написании синхронных процессов. Кроме того, на осциллограмме видно, что в момент, когда за один такт на шину data пришло два слова, вычисления произошли лишь над вторым словом, так-как оно было последним установившимся значением перед фронтом тактового сигнала.

Читайте также:  Воспроизведение звука на pic

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

Логично спросить, мол, зачем вообще нужна синхронизация, если все можно делать асинхронно и выигрывать в скорости? Ответ прост: чтобы иметь возможность проводить определенные вычисления в определенный момент времени. Например стоит задача принять пакет из 100 8-битных слов и в 99 слово записать какое-то свое значение, чтобы отправить его дальше. Зная, что за один такт нам может придти только одно слово, не трудно завести счетчик и посчитать до 99.

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

Автор старался излагать максимально доступно, спасибо что дочитали до конца.

ПЛИС. Заметки начинающего.

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

Назначение

Чем же ПЛИС отличается от микроконтроллеров? ПЛИС позволяет реализовать свой собственный контроллер. Если в микроконтроллере все внутренние соединения транзисторов жестко заданы производителем, то в ПЛИС все связи задаются прошивкой. Переконфигурировав внутренние блоки нужным образом, можно получить микросхему, выполняющую на аппаратному уровне нужные нам действия. Можно сконфигурировать так, что получится микроконтроллер. А можно сделать просто таймер, мигающий на выходе светодиодом. Главное чтобы для реализуемой задачи хватило программируемых блоков, число которых может меняться в большом диапазоне, в зависимости от производителя и модели ПЛИС. С точки зрения программиста микроконтроллер — как человек. Может выполнять только одну задачу одновременно. Может переключаться между разными задачами, ставить будильник, чтобы выполнить что-то по расписанию. Зато может производить сложные действия и пользоваться разными инструментами (периферией микроконтроллера). ПЛИС же скорее как стадо муравьёв. Каждый из них примитивен, зато их можно группировать для выполнения задачи. Например, если мы сделаем так, что 10 муравьёв срезают колосок пшеницы и выковыривают из него зёрна за одну минуту, то имея достаточное количество муравьёв (объём ПЛИС), можно легко убрать целое поле пшеницы за ту же минуту 🙂 Или к примеру, помигать светодиодом на микроконтроллере легко. Включил, подождал, выключил, подождал, вернулся в начало. А теперь попробуем добавить второй светодиод, который должен мигать с другой частотой, да ещё не кратной первой. Задача резко усложняется. На ПЛИС же, сделав блок мигания светодиодом, достаточно просто скопировать его, только поменять частоту и ножку со светодиодом. И два этих блока будут работать параллельно, никак друг другу не мешая, не снижая производительности. Таким образом на ПЛИС можно реализовывать устройства, которые сложно сделать на МК.

Архитектура

ПЛИС могут быть построены на основе разных базовых блоков. Поэтому разные ПЛИС не всегда можно сравнить по «объёму». Такими блоками бывают макроячейки и логические блоки. Макроячейки (macrocells) представляет собой небольшую схему из некоторого количества вентилей. Как я понял, схема макроячеек может может отличаться у разных производителей. Логические блоки (logical cells, logical elements, LE) обычно состоят из таблицы поиска на 4 входа и триггера, но бывают и с 6 входами, для увеличения производительности. В зависимости от задачи, необходимое количество макроячеек и логических блоков может меняться, поэтому какой-либо «курс» между ними вывести нельзя, но для очень примерной прикидки Альтера предлагает использовать цифру 1.3 LE на макроячейку. Вообще, блоки довольно эффективны, несколько десятков вполне хватит на задачи малой сложности. На 700 блоках можно реализовать полноценный микроконтроллер, а на 3000 это уже будет микроконтроллер с такими «взрослыми» фичами типа конвейера инструкций, динамическим предсказания ветвлений, кэшем, блоком управления памятью и производительностью в пару сотен DMIPS! Таким готовым виртуальным микроконтроллером является Nios II фирмы Altera. (Вспоминается древний боян, при загрузке компа появляется надпись: CPU not found. Please insert disk with software emulation).

Есть разные типы ПЛИС. Наиболее актуальные из них CPLD и FPGA.
CPLD, собственно и есть ПЛИС (Complex Programmable Logic Device, Программируемая Логическая Интегральная Схема). Содержат встроенную энергонезависимую память, которая хранит прошивку при отключении питания. Строятся традиционно на матрице макроячеек, хотя сейчас всё популярнее основанные на логических блоках. Обычно имеют сравнительно небольшое число элементов (сотни или тысячи). Они дешевле, проще в применении, требуют минимальной обвязки, быстро запускаются. Могут использоваться там, где не требуется сложная логика работы, но не хватает скорости или ног у обычного микроконтроллера. Например, для обработки сигналов, к примеру, как контроллер USB, VGA или PCI-шины.
FPGA (Field-Programmable Gate Array, Программируемая Пользователем Вентильная Матрица, ППВМ) — дальнейшее развитие ПЛИС. Построены на логических блоках с гибкой коммутацией. Могут иметь большое число элементов (десятки и сотни тысяч). Как правило требуют внешнюю энергонезависимую память для хранения прошивки, с которой «загружается» при включении питания. Часто содержат, помимо логики, отдельные блоки, например, для умножения. FPGA дороже, сложнее, зато на них можно реализовать, например, полноценный процессор или сложную обработку сигналов. Можно проверить сложную микросхему, прежде чем начать производить её в кремнии.

Линейки

Наиболее известные производители ПЛИС — Altera и Xilinx.
У Altera наиболее интересными для начинающего линейка CPLD Max и линейка малобюджетных FPGA Cyclone. FPGA среднего уровня Arria и хай-энд Stratix оставим на потом.
Max выпускается в нескольких модификациях.
7000S, 1995 года выпуска, уже не актуальна, разве что интересна 5 вольтовым I/O.
3000A, 2002 года, 300 нм технология, содержат от 32 до 512 макроячеек. Низкая цена для больших партий.
Max II, 2004 года, 180 нм, построена на логических блоках, как FPGA, 240-2210 блоков, до 304 MHz. В TQFP с шагом 0.5 мм от 100 ножек. Есть вариант Max IIZ 2007 года с пониженным потреблением и частотами до 152 MHz.
Max V, 2010 года, 180 нм, 40-2210 блоков, до 152 или 304 MHz, в зависимости от кол-ва блоков.
Cyclone выпускаются в пяти поколениях, I — V. Первое поколение было выпущено ещё в 2002 году, по 130 нм технологии. Последнее, пятое, совсем свежее, 2011 года, 28 нм технология. Соответственно отличаются потреблением и, наверное, быстродействием. Но все пять поколений остаются актуальными по сей день и на сайте отмечены рекомендуемыми для новых разработок.
Xilinx из CPLD предлагает серии XC9500XL и CoolRunner™-II.
XC9500XL построена на макроячейках, 36-288 штук, до 178 MHz или 208 MHz (288 макроячеек). Интересна наличием легкопаяемых моделей со всего 44 ножками и шагом 0.8. Также есть 64- и 100-пиновые с шагом 0.5, вполне приемлемо, как у STM8/32. Ещё есть модели в PLCC корпусах, их можно ставить в специальный кредл.
CoolRunner-II — оптимизированы для низкого потребления, сохраняя производительность и простоту использования. Рассчитаны на питание 1.8 вольт, ввод/вывод от 1.5 до 3.3 В. 180 нм технология, 32-512 макроячеек, 179-323 MHz (меньше ячеек — больше частота). Также встречаются в паяемых корпусах, как и 9500.
Из FPGA Xilinx предлагает серии Spartan-6, Artix-7, Kintex-7, Virtex-6 и 7. Virtex-7 — монстр с 2 миллионами логических блоков и до 1200 пинов.
Spartan-6 — FPGA, 3840-147443 блоков, причем блоки имеют 6 (а не 4, как обычно) входов. Может содержать встроенный контроллер DDR/2/3 памяти, PCI-express шины, гигабитного ethernet, SerialATA и прочие вкусности.
Atmel предлагает серию CPLD ATF15xx, которая позиционируется как замена Xilinx’ам (ATF15xxBE) или Altera 7000 и 3000 (ATF15xxAS/ASL/ASV/ASVL).

Чипы и отладочные платы

Посмотрим, что у нас есть из чипов интересного. Под интересным я подразумеваю доступное в России по приемлемой цене, паяемое ЛУТом и не слишком сложное в плане требуемой обвязки.

EPM240T100С5. Младший представитель Altera’вского семейства Max II. Буквы EPM собственно и означают семейство. 240 — количество логических блоков (LE). Бывают 240/570/1270/2210. После цифр могут затесаться буквы G или Z, означающие малопотребляющие, 1.8 В версии. Если их нет, то это обычный, 2.5-3.3 В версии. T100 означает TQFP-100 корпус, шаг ножек 0.5 мм. Кроме TQFP-100, есть ещё 144 пиновый вариант, для чипов с количеством блоков 570 или 1270. Буква C/I/A означает температурный диапазон, C — самый обычный, 0-85 градусов. А вот последняя цифра весьма важна. Она определяет класс скорости. От 3, самый быстрый, до 8, самый тормозной. Классы 3-5 относятся к обычным версиям, 6-8 — к малопотребляющим. Класс скорости определяет тайминги и частоты счётчиков. Скажем, 16-битный счетчик может работать на 304 MHz на 3 классе и только на 201 MHz на 5. В конце может быть буква N, означающая всего лишь отсутствие свинца.
Что нам может дать этот чип. Питание от 2.5 до 4.6 вольт (максимум, 3.0-3.6 рекомендуемое). До 304 MHz частоты. 8192 бит памяти. 80 пинов I/O, 25 мА максимальный ток, входное напряжение на пин от -0.7 В до VCC+0.7 В, подключаемый пуллап резистор, подключаемый триггер Шмитта на входе. Из обвязки требуются только конденсаторы по питанию и кварц. Прошивается через JTAG. 240 логических блоков хватит для чего-то не очень сложного, вполне достаточно для начала. И, главное, цена. В Терре можно купить по 100 рублей.
Из отладочных плат можно найти много всего на Ebay по поиску «EPM240 CPLD». Цены от 12 долларов за платы без периферии, на которых просто все ножки выведены на штыри. Интересна платка Марсоход от ребят из Таганрога. На ней есть кнопочки и светодиодики, т.е. сразу есть чем помигать. Часть ножек объединена в группы по 10 штук, получаются моторные пины, которые могут управлять нагрузкой до 250 мА. А самое ценное в этой отладке — большое число интересных примеров на сайте. От разнообразных ползающих, кормящих кошку и красящих яйца роботов до VGA и TFT видеокарт.
XC9536XL-VQ44 и XC9572XL-VQ44. Представитель семейства XC9500XL от Xilinx. 36 и 72 в названии — количество макроячеек. VQ44 означает корпус VQFP-44 (это как TQFP-44, только тоньше по высоте) с шагом 0.8 мм. VQ64 и TQ100 уже идут с шагом 0.5 мм. В маркировке, перед обозначением корпуса, идёт обозначение скорости, pin-to-pin delay в наносекундах, 5/7/10. Между буквами и цифрами обозначения корпуса может быть добавлена буква G, это всего лишь бессвинцовость. В конце буква C или I обозначают температурный диапазон. Питание до 4 вольт (3.0 — 3.6 В рекомендуемые). Частота 100-178 MHz, зависит от класса скорости. 34 пина I/O, 20 мА максимальный ток, вход толерантен к 5 вольтам. Из обвязки требуется только питание и тактовый генератор. Прошивается через JTAG. Цена 70-150 рублей.
Отладки также легко найти на Ebay.

Читайте также:  Технология струйного заряда аккумулятора

FPGA. Разбираемся, как устроены программируемые логические схемы и чем они хороши

Содержание статьи

Может быть, ты умеешь взламывать устройства на другом конце света или кодить крутые веб-приложения, но понимаешь ли ты, как работает твой компьютер? И речь не о том, что делает операционка, как функционирует garbage collector в Java или как устроен компилятор C++. Я говорю о самом низком, аппаратном уровне, ниже ассемблера: как работает железо.

Что происходит в микросхеме сетевой карты, когда приходит пакет Ethernet? Как этот пакет передается дальше в оперативную память компьютера через шину PCI Express? Как работают самые быстрые системы распознавания изображений на аппаратном уровне?

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

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 микросхему обязательно надо сконфигурировать, а во-вторых, микросхему можно реконфигурировать практически бесконечное количество раз.

Очень упрощенная 2D-структура микросхемы без конфигурационной памяти

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

Схема коммутационной матрицы

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

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

Принцип реализации LUT

Интересно посмотреть на принцип реализации 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, можно получать весьма эффективные схемы обработки данных.

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

Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», увеличит личную накопительную скидку и позволит накапливать профессиональный рейтинг Xakep Score! Подробнее

Технология FPGA для тысячи применений

Трудно представить другую технологию, которая настолько разносторонняя как FPGA.
FPGA — Field-Programmable Gate Array, то есть программируемая логическая матрица (ПЛМ), программируемая логическая интегральная схема (ПЛИС). Это технология, при которой создается микросхема с набором логических элементов, триггеров, иногда оперативной памяти и программируемых электрических связей между ними. При этом программирование FPGA оказывается похоже на разработку электрической схемы, а не программы. Пользуюсь данной технологией давно и попробую описать самые полезные с моей точки зрения применения по мере их усложнения.

1. Помощь при разводке плат

Многие наверняка сталкивались, что центральный процессор, память, другие многоногие микросхемы создавали люди, редко задумывающиеся о том, как они будут соединяться на печатной плате. Протянуть шину разрядностью 32 или 64 бита — задача не решаемая без многослойной платы. Но стоит поставить между микросхемами FPGA как разводка становится на несколько порядков проще:

2. Согласование уровней сигналов

Часть микросхем имеет интерфейс 1.2В, другая 1.5, 1.8, 2.5, 3.3В, и все эти микросхемы можно подключить к одной FPGA и обеспечить двусторонний обмен за счет того, что любая FPGA имеет несколько банков ввода-вывода, каждый из которых может иметь свое опорное напряжение сигналов. Например, так:

3. Обеспечение надежности устройства

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

4. Автоматы состояний или аппаратное программирование

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

5. Создание процессора внутри FPGA

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

Недостатком такого процессора является отсутствие готовых компиляторов и отладчиков.

6. Использование готовых библиотек процессоров для FPGA

Библиотеки готовых процессоров есть у любого производителя FPGA (от 8086 до ARM), позволяют быстро создать процессор с определенным набором периферии и вставить его в проект FPGA. К процессору прилагается компилятор и отладчик. Быстро, удобно, но избыточно и потому ограничено по быстродействию. Пример структуры готовой библиотеки процессора:

7. Объединять процессор и периферию в одной микросхеме — SoC (System-On-Chip)

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

Видно, что FPGA и HPS (Host Processor System, процессор) находятся внутри одной микросхемы и окружены программируемыми ножками ввода-вывода. Действительно это многофункциональная система на кристалле.

8. Модные приложения типа crypto mining

Вспоминая, что FPGA — это набор логических ячеек и триггеров, работающих параллельно, на FPGA можно проводить много параллельных операций, что отличает от процессора, параллельность которого ограничена количеством ядер и потоков. Поэтому можно использовать FPGA как сопроцессор к центральному процессору, вынося на FPGA все самые требовательные к вычислительной мощности операции. Например, центральный процессор занимается логической обработкой задачи, а FPGA параллельно вычисляет контрольные суммы, хэши, ищет совпадения, перебирает варианты и так далее. Быстродействие FPGA ограничено только количеством параллельных блоков и временем выполнения одной операции. Отладив таким образом вычисления можно заказать ASIC, то есть заказную микросхему, выполняющую те же функции, но дешевле (при массовом производстве) и с меньшим энергопотреблением. И данная идея оказалась настолько перспективной и удобной, что гиганты разработки FPGA начали создавать специальное ПО, позволяющее интерактивно переносить части вычислений из программы на C/C++ в FPGA и контролировать быстродействие (HLS, High-Level Synthesis). Есть готовые платы с быстрыми интерфейсами для этого и средства отладки. Очень интересная и перспективная тема для использования.

9. Реализация нейронных сетей на FPGA

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

Читайте также:  Универсальный выпрямитель для зарядки аккумуляторов с электронным регулированием

Поэтому перенеся нейронную сеть на FPGA удается на много порядков ускорить работу нейронной сети, остается обеспечить высокоскоростной интерфейс для загрузки исходных данных и получения результата. В качестве примера — реализация системы распознавания лиц на процессоре i7/9Gen распознает до 20 лиц за секунду с одной видеокамеры HD, реализация на FPGA — порядка 1000 лиц с нескольких камер. Структура используемой глубокой нейронной сети:

Записки программиста

Учимся программировать под FPGA на SystemVerilog

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

Примечание: Насколько я смог выяснить, в русском языке на сегодняшний день термины ПЛИС и FPGA (Field-Programmable Gate Array, Программируемая Пользователем Вентильная Матрица), принято считать взаимозаменяемыми, что будет использовано далее по тексту. Однако стоит знать о существовании и альтернативной точки зрения, согласно которой FPGA (ППВМ) является одной из разновидностей ПЛИС (PLD, Programmable Logic Device).

Основные сведения об FPGA

Для программирования FPGA используются языки описания аппаратуры (HDL, Hardware Description Language). Среди них наибольшей популярностью пользуются Verilog (и его диалекты, в частности SystemVerilog), а также VHDL. Языки во многом похожи, но имеют разный синтаксис и различаются в некоторых деталях. Если Verilog — это такой C мира описания аппаратуры, то VHDL — соответственно, Pascal. Насколько мне известно, VHDL несколько менее популярен, в частности, из-за его многословности по сравнению с Verilog. Из преимуществ VHDL (или недостатков, кому как) можно назвать строгую статическую типизацию. Verilog же иногда допускает неявное приведение типов. Если продолжать аналогию с C и Pascal, языки различаются не настолько сильно, чтобы не выучить их оба.

На данный момент лидирующими производителями FPGA являются компании Altera (сейчас принадлежит Intel) и Xilinx. По информации из разных источников, вместе они контролируют не менее 80% рынка. Из других игроков стоит отметить Actel (куплена Microsemi), Lattice Semiconductor, Quicklogic и SiliconBlue. С железом от Xilinx можно работать только из среды разработки от Xilinx (называется Vivado), а среда разработки от Altra (называетя Quartus) понимает только железо от Altera. То есть, полный вендор лок, и выбирая конкретную FPGA для своего проекта, вы автоматически выбираете и инструменты разработки соответствующего производителя, их техническую поддержку, документацию, условия лицензирования софта, политику касаемо прекращения поддержки железа, и так далее.

FPGA часто используются в задачах, где некие вычисления хочется существенно ускорить, реализовав их прямо в железе. Например, FPGA нашли широкое применение в области обработки сигналов, скажем, в осциллографах, анализаторах спектра, логических анализаторах, генераторах сигналов, Software Defined Radio и даже некоторых мониторах. В частности, в LimeSDR используется Altera Cyclone IV, а в осциллографе Rigol DS1054Z стоит Xilinx Spartan-6, а также ProASIC 3 от компании Actel. Еще из применений, о которых я слышал, могу назвать компьютерное зрение, распознавание речи и биоинформатику. Есть и другие проекты, в частности по разработке веб-серверов и СУБД, работающих на FPGA [PDF]. Но, насколько мне известно, это направление все еще остается сильно экспериментальным.

Xilinx или Altera?

Как говорится, лучший Linux тот, который использует ваш знакомый гуру по Linux.

Мой знакомый гуру по FPGA в лице Дмитрия Олексюка посоветовал начать с девборды Arty Artix-7 от компании Digilent. Используемой в ней FPGA является Artix-7 от Xilinx. Сам Digilent не производит доставку в Россию, но устройство доступно и на AliExpress, хотя и с заметной наценкой (официальная цена составляет 99$). Также его продают на eBay. Это довольно мощная плата, которая, тем не менее, стоит вполне адекватных денег.

Fun fact! Если вам просто хочется попрограммировать на Verilog или VHDL, строго говоря, покупать какую-либо плату с FPGA не требуется. Первое время можно ограничиться симулятором, работа с которым будет рассмотрена далее.

Из интересных особенностей платы можно назвать расположение гнезд совместимым с Arduino-шилдами способом. Также в комплекте с платой идет вкладыш, по которому можно получить лицензию на Vivado, открывающую все его возможности. Лицензия действует один год с момента активации, а также привязана к одному компьютеру по типу ОС и MAC-адресу.

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

Установка Vivado

Среда разработки Vivado доступна для скачивания на сайте Xilinx. Будьте морально готовы к тому, что перед скачиванием вам придется пройти регистрацию и заполнить довольно подробную форму о себе. Скачиваем архив под названием «Vivado HLx 2017.2: All OS installer Single-File Download». Не перепутайте случайно с каким-нибудь «Vivado Lab Solutions», это совершенно не то, что нужно. Архив весит более 20 Гб, поэтому запасаемся терпением.

Распаковываем архив, запускаем инсталлятор. Ставим Vivado HL System Edition. Полная его версия займет на диске 47 Гб. Лично я снял галочку напротив Software Development Kit и оставил поддержку только 7 Series устройств, что уменьшило размер до 12 Гб. Забегая немного вперед отмечу, что такой конфигурации оказалось вполне достаточно.

Перед запуском Vivado нужно добавить в него поддержку Arty Artix-7, так как из коробки он ничего об этой плате не знает. Делается это как-то так:

/ opt / xilinx / Vivado / 2017.2 / data / boards / board_files
wget https: // github.com / Digilent / vivado-boards / archive / master.zip
unzip master.zip
mv vivado-boards-master / new / board_files /* . /
rm -r vivado-boards-master
rm master.zip

Также скачиваем отсюда и сохраняем куда-нибудь файл Arty_Master.xdc. Он понадобится нам далее. Файл содержит описание находящихся на плате светодиодов, переключателей и так далее. Без него поморгать светодиодами на Verilog будет непросто.

Первый проект на SystemVerilog

В Vivado говорим File → New Project… В качестве типа проекта выбираем RTL Project, ставим галочку Do not specify sources at this time. В диалоге выбора типа платы находим в списке Arty.

Первым делом добавляем к проекту скачанный ранее XDC файл. Копируем его в каталог с проектом. Затем говорим File → Add Sources… → Add or create constraints → Add Files, находим копию файла, жмем Finish. В дереве файлов проекта (Sources) в группе Constraints появится файл Arty_Master.xdc, или как вы там назвали копию. Открываем его и раскомментируем все строчки в группах Clock signal, Switches и LEDs.

Далее говорим File → Add Sources… → Add or create design sources → Create File. В типе файла выбираем SystemVerilog, в имени файла вводим что-нибудь вроде hello. Говорим Finish. Далее появится диалог Define Module, который предложит накликать интерфейс модуля. Диалог довольно бесполезный, потому что то же самое удобнее сделать прямо в коде, так что жмем Cancel.

В дереве исходников находим новый файл hello.sv, он будет в группе Design Sources. Открываем и пишем следующий код:

`timescale 1ns / 1ps

module hello (
input logic CLK100MHZ ,
input logic [ 3 : 0 ] sw ,
output logic [ 3 : 0 ] led
) ;

always @ ( posedge CLK100MHZ )
begin
if ( sw [ 0 ] == 0 )
begin
led 4’b0001 ;
end
else
begin
led 4’b0000 ;
end
end

Если все было сделано правильно, на этом этапе Vivado у вас будет выглядеть как-то так (кликабельно, PNG, 71 Кб):

Компиляция программы осуществляется в два этапа — синтез (synthesis) и имплементация (implementation). На этапе синтеза программа транслируется в абстрактную цепь из логических вентилей и прочих элементов. На этапе имплементации принимается решение о том, как прошить эту цепь в конкретную железку.

Запустим синтез, сказав Flow → Run Synthesis, или просто нажав F11. В правом верхнем углу вы увидите индикацию того, что процесс идет. Он может занимать довольно много времени, в зависимости от вашего компьютера и сложности программы. На моем ноутбуке синтез приведенной выше программы выполнился где-то секунд за 10. Если теперь сказать Flow → Open Synthesized Design, то можно увидеть красивую картинку вроде такой:

Настало время прошить нашу плату. Говорим Flow → Run Imlementation, затем Flow → Generate Bitstream. Подключаем плату к компьютеру по USB, в Vivado говорим Flow → Open Hardware Manager → Open target → Auto Connect → Program device. Потребуется указать путь к bit-файлу. У меня он был следующим:

Говорим Program. Теперь на плате горит светодиод LD4, если переключатель SW0 опущен (см приведенную выше фотографию платы). Если же переключатель поднят, светодиод не горит. Простенько, конечно, но это же «hello, world», чего вы ожидали? 🙂

Симуляция

Симуляция — это виртуальное выполнение кода на Verilog или VHDL прямо на вашем компьютере, безо всяких там ПЛИС’ов. Это одновременно и отладочный инструмент, и своего рода фреймворк для покрытия кода тестами.

При знакомстве с симуляцией первое, что я обнаружил, было то, что она у меня не работает. В логах было просто:

Google по этой ошибке находил только всякую ерунду в стиле «попробуйте отключить антивирус». В итоге решить проблему помогло добавление флага -v 2 в скрипт

/opt/xilinx/Vivado/2017.2/bin/xelab. С его помощью я выяснил, что Clang, бинарник которого Vivado таскает за собой, падает со следующей ошибкой:

А эта ошибка и ее решение уже описаны на Arch Wiki. Лично я просто скопировал уже существующий файл из каталога Vivado_HLS:

… после чего все заработало. Итак, а теперь, собственно, пример симуляции.

По аналогии с тем, как ранее мы создавали hello.sv, создаем новый файл hello_sim.sv в группе Simulation Sources. В файле пишем следующий код:

`timescale 1ns / 1ps

module hello_sim ( ) ;
logic clck_t ;
logic [ 3 : 0 ] sw_t ;
logic [ 3 : 0 ] led_t ;

hello hello_t ( clck_t , sw_t , led_t ) ;

initial begin
clck_t 0 ;
sw_t 4’b0000 ; # 1 ; clck_t 1 ; # 1 ; clck_t 0 ; # 1 ;
assert ( led_t === 4’b0001 ) ;

sw_t 4’b0001 ; # 1 ; clck_t 1 ; # 1 ; clck_t 0 ; # 1 ;
assert ( led_t === 4’b0000 ) ;
end

В дереве исходников делаем правый клик по файлу, выбираем Source Node Properties. В секции Used In снимаем галочки Synthesis и Implementation. Мы же не хотим, чтобы какие-то там тесты засоряли нашу далеко не резиновую FPGA?

Теперь говорим Flow → Run Simulation → Run Behavioral Simulation. В итоге вы увидите что-то примерно такого плана:

Можно видеть, что когда sw[0] равен нулю, led[0] равен единице, и наоборот. При этом все изменения происходят по фронту тактового сигнала. Похоже, что программа работает корректно. Ну и на ассертах ничего не свалилось, что как бы намекает.

Заключение

Архив с описанным выше проектом можно скачать здесь. В качестве дополнительных источников информации я бы рекомендовал следующие:

  • Если вас интересуют подробности по железу, обратите внимание на даташит Artix-7 [PDF], reference manual к Arty Artix-7 [PDF], а также схему платы [PDF];
  • Книга Цифровая схемотехника и архитектура компьютера (Digital Design and Computer Architecture) — прекрасная книга, в которой, помимо прочего, подробно объясняются языки SystemVerilog и VHDL, а также внутреннее устройство FPGA;
  • OpenCores.org — каталог всевозможных открытых проектов под FPGA. Для скачивания исходного кода требуется регистрация. Активация аккаунта производится модераторами вручную, поэтому может занимать несколько дней;

А пишите ли вы под FPGA? Если да, то на каком языке и какого производителя предпочитаете?

Рейтинг
( Пока оценок нет )
Загрузка ...
Adblock
detector