1. Программирование на Си и С++. Усиленно изучать оба понимая что даже чистый си понадобится и очень часто, Вы же FPGA будете использовать не спроста — а значит шевелить огромными данными а их ввод-вывод надо организовать и нередко надо делать драйвера самому на люниксе например, а для этого они оба и понадобятся.
Из конкретики пример:
Ардуино на СТМ32 или голый СТМ32 (а лучше в начале ардуино стм32 а потом голый — идеально)
подключить тяжолые вещи, например: дисплей камеру память, понять ботлнеки, сделать что то годное на этом — поиск лиц например. (работать с живым видео полезно и очень интересно, даже наткнувшись на баги можно получить интересные результаты и их развить и понять причину бага, и самое главное видно сразу результат и он классный)
понять что МК вообще не годны к такому и потехоньку начать переписывать алгоритм поиска лиц на верилог
осилить Icarus Verilog или другой тулчейм симуляции
довести симуляцию до идеала — т.е. bit perfect когда результат симуляции побитово равен исходнику для СТМ32
купить ФПГА отладку или заказать свою ФПГА плату например минимум циклон 3-5 или спартан 6
замучаться с интерфейсами и изучить времянки и time constrains и иже с ними
довести до ума и до реалтайма этот проэкт с поиском лиц
примерно так
toster.ru
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
Первое знакомство с ПЛИС Xilinx.
Итак, начну свое повествование о программируемой логике фирмы Xilinx, в котором постараюсь помочь начинающим с освоением этих замечательных микросхем. Начнем с самого главного — что эти микросхемы из себя представляют, и с чем их едят. Ну-с, приступим! Эта контора (Xilinx, разумеется) выпускает несколько семейств микросхем программируемой логики, предназначенных для различных целей и отличающихся между собой ценой и объемом (эквивалентным количеством логических вентилей). Микросхемы разделяются между собой на три основных группы: CPLD (CMOS Programmed Logic Device), FPGA (Field Programmed Gate Array) и конфигурационные ПЗУ для FPGA, разделенные между собой на три семейства — XC17xx, XC18xx и Platform Flash. Рассмотрим подробней что из себя представляют все эти группы и какие микросхемы в них входят.
Начнем с CPLD. Эти микросхемы отличаются наиболее простой структурой и значительными ограничениями при проектировании устройств на них, но у них есть и одно достоинство — им не нужно конфигурационное ПЗУ (что это такое — будет рассказано чуть позже). К ограничением относятся «жадность» на триггеры и недостаточная гибкость. Однако CPLD легки в освоении и, поэтому, идеально подходят для начала работы с ПЛИС вообще.
С FPGA дело обстоит несколько иначе — эти микросхемы гораздо сложнее устроены (некоторые даже содержат в себе по несколько процессорных ядер PowerPC), требуют наличия конфигурационного ПЗУ (это объясняется тем, что сами микросхемы построены по технологии Static RAM, то есть при каждом включении их нужно «загружать»), однако они способны вместить в себя гораздо более сложные и большие проекты, нежели CPLD и достаточно гибки для проектировщика (в частности снимается ограничение по количеству триггеров).
Конфигурационные ПЗУ предназначены для загрузки статической памяти FPGA. Семейство XC17xx — самое старое, представляет собой однократно программируемые микросхемы. XC18xx — EEPROM, а значит, их можно перепрограммировать многократно. Platform Flash — новое семейство конфигурационных микросхем, выполненных по технологии Flash ROM.
Архитектуру упомянутых выше микросхем мы не будем рассматривать в этой статье, потому что каждое семейство ПЛИС отличается собственной архитектурой и на это тему написано достаточно много книг, да и в даташите на любое семейство микросхем эта архитектура хорошо «разжевана». А говорить мы здесь будем непосредственно о том, как начать работать с этими замечательными микросхемами.
Итак, начнем! Для начала нам понадобится собрать программатор и установить необходимое ПО на свой компьютер. Вот схема программатора:
Как видите — все просто и никаких мудреностей ненужно. Такой программатор позволяет работать с многими типам ПЛИС и конфигурационных ПЗУ Xilinx. Теперь о софте — основной продукт для разработке устройств на ПЛИС Xilinx — это Xilinx ISE. ISE существует в нескольких вариантах, однако доступней всех — дистрибутив ISE Webpack, который можно скачать отсюда, правда для этого придется зарегистрироваться. Денег никто просить не будет, поэтому все останутся довольны и никто не будет обманут. Итак, программатор собран, ISE установлен — можно начинать!
С чего же мы начнем? Чтобы начать проектировать на ПЛИС нам нужно определиться с микросхемой, на которой мы будем проектировать. Возьмем XC95144 — это КМОП ПЛИС, с архитектурой CPLD, с 5-и вольтовым вводом-выводом, содержащая 144 макроячейки. Макроячейка — это основной кирпичик CPLD. Каждая макроячейка содержит запоминающий элемент, который может быть запрограммирован как D-триггер или как тактируемый триггер-защелка, а может быть и не использован вовсе. Отсюда и такое ограничение по триггерам (144 макроячейки=144 триггера). Микросхема XC95144 поддерживает внутрисистемное программирование — то есть ее можно перепрограммировать сколько угодно (в пределах ее ресурса, конечно!) раз, прямо на плате, на которой она используется. Еще одно важное замечание — XC95144 производится в нескольких корпусах — TQFP-100, PQFP-100 и PQFP-160, которые отличаются распиновкой и количеством выводов, доступных для программирования пользователем. Мы будем рассматривать вариант микросхемы в корпусе PQFP-160. Вот так она выглядит:
Ну что, страшно? Да ничего страшного — бывают корпуса и пострашнее!
Ну а теперь, непосредственно приступим к делу! Запускаем ISE с помощью ярлыка на рабочем столе, который был создан инсталлятором. Открывается пустое окно с двумя боковыми панелями, рядом кнопок наверху и менюшкой. Зачем это все нужно — разберемся позже — сейчас нам нужно создать проект.
Выбираем в меню File->New Project, вводим имя проекта, путь, где наш проект будет располагаться и выбираем Top->Level Source Type->Schematic. Это означает, что основной модуль нашего проекта (в иерархической системе) будет введен в виде схемы.
Щелкаем Next — перед нами появляется окно с кучей параметров нашего проекта. Поле Product Category нас сейчас мало волнует (честно говоря, вообще не пойму, как оно отражается на проекте). Family — это семейство ПЛИС, с которым мы будем работать — выбираем 9500 CPLDs. Device — непосредственно микросхема, под которую будет создаваться проект — тут выбираем угадайте что? Правильно — XC95144! Package — тип корпуса у нашей микросхемы — выбираем PQ160. Speed — скоростной параметр микросхемы (на фотке микросхемы выше обозначен как 15С в самом низу. А вообще этот параметр обозначает минимальную задержку распространения сигнала в ПЛИС «контакт-контакт» в наносекундах. То есть в указанной микросхеме такая задержка равна 15нс — таким образом можно рассчитать максимальную тактовую частоту — около 66МГц. Остальные параметры касаются синтеза (процесса перегонки нашего проекта в вид, в котором он будет расположен на кристалле) и симуляции проекта. Выбираем XST в качестве Synthesis Tool, симулятор ISE Simulator (что характерно) и Preferred Language — VHDL. VHDL — потому что этот язык гораздо «ближе» к Xilinx, нежели Verilog.
Когда мы все заполнили — самое время нажать Next и добавить «головной» файл проекта в появившемся диалоге выбираем тип Schematic и вводим имя файла, пускай это будет main.sch. Далее нажимаем еще несколько раз Next, Finish и проект создан.
Что мы видим: пустое поле, где мы будем вводить схему, две панели с вкладками и окошко с консолью снизу. Сейчас нас интересует панель, на которой присутствуют четыре вкладки — Sources, Shapshots, Libraries и Symbols. Зайдем на вкладку Symbols — остальные нас пока не интересуют. Перед нами два списка — Categories и Symbols. Догадаться не сложно — в первой у нас находится список категорий символов (арифметика, буферы и т.п.) а во второй — сами символы. При выбранной категории All Symbols — в нижнем списке отображаются все символы, которые мы можем использовать в нашем проекте. Для разных семейств ПЛИС эти списки могут отличаться.
Попробуем построить какую-нибудь схему, например счетчик, считающий до 10. Для этого выберем категорию Counter, а в ней элемент — cb4ce. Выделив этот компонент мы можем «бросить» на схему сколь угодно таких счетчиков — прекратить это можно нажатием на правую кнопку мыши (появится контекстное меню) или выбором инструмента «стрелочка» на панели вверху. Итак, кидаем на схему один такой счетчик.
Для начала разберемся с назначением его выводов:
CE — вход разрешения счета, можно повесить на него какую-нибудь логику, а можно просто подтянуть на «плюс питания» с помощью компонента Vcc из категории General, что мы и сделаем.
С — собственно счетный вход нашего счетчика, сюда будем подавать тактовый сигнал.
CLR — асинхронный сброс счетчика, счетчик находится в состоянии сброса всегда, когда на этом входе присутствует логическая «1».
Q0..Q3 — выходы счетчика, как несложно догадаться.
CEO — выход разрешения счета, его значение соответствует значению, поданному на вход CE — предназначен для каскадирования счетчиков
TC — окончание счета — при переполнении счетчика на этом выходе появляется лог. «1».
Отлично, счетчик у нас есть, но он будет считать не до 10, как нам нужно а от 0 до 15 — значит нам понадобится цепь сброса. Спроектировать ее можно так: поставить логику на выход счетчика, которая будет отлавливать число «11» на его выходе и сразу при его появлении сбрасывать счетчик. Для этих целей нам хорошо подойдет компонент and4b3 — (b3 здесь означает, что 2 входа вентиля «И» в данном случае инверсные). Но мы пойдем иным путем, и вот почему. Допустим, счетчик у нас должен считать не до 10, а, скажем до 1234, а это 11 разрядов — придется городить логику, что не есть хорошо, когда все можно сделать просто и красиво. Воспользуемся компаратором. Выбираем категорию Comparator и компонент comp4. Компаратор работает просто — при равенстве чисел, поданных на входы A[1..4] и B[1..4] он выдает логическую единицу на своем единственном выходе EQ. Подсоединим входы «А» нашего компаратора к выходам счетчика, а выход компаратора соединим с входом асинхронного сброса счетчика. Для этого на панели сверху выберем инструмент Add Wire, нажав на кнопку, на которой нарисован карандаш рисующий провод. Итак, счетчик с компаратором у нас соединены, осталось подать число «11» на вход компаратора обозначенный как «В». Можно просто подтянуть на питание и землю (c помощью компонентов vcc и gnd) входы компаратора, а можно сделать тоже самое с помощью компонента Constant из категории General. Бросим этот компонент на нашу схему. По умолчанию в него записана константа FFFF, но нам нужно записать туда число «В» в шестнадцатеричной системе счисления равное 11. Для этого два раза щелкнем мышкой на этом компоненте, чтобы отредактировать его свойства. В открывшемся окне нас интересует свойство Cvalue — туда запишем «В», причем безо всяких нулей и нажмем «ОК». После нажатия «ОК» мы видим на схеме, что значение константы равно «В», то есть 11 в десятеричной системе. И тут мы сталкиваемся с одной трудностью: входов у компаратора четыре, а выход у константы всего один! Как быть? Дело в том, что выход компонента Constant представляет собой шину, этим-то мы и воспользуемся! Выберем уже знакомый инструмент Add Wire с помощью кнопки с карандашом и «соединим» нашу константу с пустым местом на схеме — просто немного «протянем от нее провод» и закрепим его двойным щелчком рядом с компонентом. Это и будет наша шина. Чтобы можно было работать с этой шиной — ей нужно присвоить имя. Выбираем инструмент Add Net Name, кнопкой, на которой нарисован провод с буквами «ABC» и на панели, на которой всего две вкладки (на скриншотах — слева) выбираем вкладку Options, где в поле Name вводим: «count_max(3:0)»
После ввода имени шины курсор стал выглядеть как крестик с надписью «count_max(3:0)» — подведем курсор к красному квадратику с края «провода» у компонента с константой и щелкнем. Таким образом мы только что присвоили имя шине, которая подключена у нас к компоненту constant. Теперь можно с помощью этой шины подключить константу ко входу «В» компаратора. Для этого уже знакомым образом соединим входы «В» компаратора с пустым местом на схеме. И с помощью инструмента присвоения имени цепи подключим компаратор к константе таким образом:
Итак, перед нами почти завершенная схема — теперь осталось создать порты для связи с внешним миром. В этом нам поможет инструмент Add I/O Marker. Выглядит он вот так: . Просто выбираем этот инструмент, щелкаем по квадратику радом с выводом «С» нашего счетчика и тут же вход счетчика становится портом. Осталось его только переименовать в нечто удобочитаемое, скажем в «CLK». Для этого два раза щелкнем мышкой на маркер и в окне свойств введем имя «CLK». Теперь осталось сделать тоже самое с выходами счетчика. Так как они уже заняты компаратором — придется их «вытягивать» наружу, чтобы можно было подключить к ним маркеры. Протянем четыре «провода» от выходов счетчика в свободное место на схеме, прямо из середины, вот так:
Теперь можно подключить к ним маркеры и присвоить им имена, допустим такие Q0, Q1, Q2 и Q3. Когда все сделано правильно — схема должна выглядеть вот так:
Теперь проект можно сохранять и компилировать. Сохраним проект тривиальным образом, нажав кнопку с дискеткой на панели. Теперь его надо откомпилировать. Для этого на панели с четырьмя вкладками выберем Sources, а на той панели, которая с двумя вкладками выберем Processes. Под «процессами» тут подразумевается набор действий, который мы можем сделать с выбранным исходником. Для этого выбираем наш «головной» файл main.sch. Смотрим, что мы можем с ним сделать. На этом этапе нас интересует процесс Implement Design — это собственно компиляция проекта. Раскроем дерево.
Перед нами четыре этапа компиляции проекта — Synthesize — это собственно синтез проекта, разложение того, что мы только что нарисовали на элементарные части, входящие в макроячейку. Translate — перевод всего этого на язык описания аппаратуры (кстати, на нем тоже можно прекрасно проектировать, но это я оставлю для самостоятельного изучения, ибо VHDL не уместить даже в десятке подобных статей). Fit — это оптимизация нашего проекта под выбранную ПЛИСину и, наконец, Generate Programming File — это и есть генерация кода, который будет записан в ПЛИС. Щелкнем два раза по «корню» дерева — Implement Design. Начался процесс компиляции проекта — спокойно дождемся когда он закончится. Зайдем на вкладку Warnings на панели с логом компиляции внизу. Там нам сообщают, что мы не подключили выходы счетчика CEO и TC, которые нам собственно не нужны, и что также, не подключен вход счетчика CE (разрешение счета) и поэтому он установлен в «0». Это говорит о том, что счетчик работать не будет — исправим эту ошибку, подтянув этот вход к питанию, с помощью компонента Vcc.
Сохраним и заново перекомпилируем проект. Как мы видим предупреждение о неподключенном входе разрешения счета исчезло — можно продолжать. Чтобы проверить работоспособность нашего проекта — его нужно просимулировать, чем мы сейчас и займемся. В левой панели сверху мы видим список, в котором сейчас выбрано Synthesis/Implementation. Для симуляции проекта нам нужно выбрать пункт Behavioral Simulation в котором щелкнув правой кнопкой мыши по списку исходников создать новый файл в проекте. Для симуляции нам нужно задать входные параметры — это мы и сделаем с помощью добавления в проект файла типа Test Bench Waveform, который назовем counter_test.tbw.
Нам предложат выбрать элемент проекта, который мы хотим просимулировать — так как у нас в проекте всего один файл — выбираем его. Появляется окно, в котором надо указать параметры симуляции проекта.
Оставим там все как есть и нажмем Finish. Файл с данными для симуляции создан, однако на экране мы видим всего четыре тактовых импульса, чего явно недостаточно для полноценной проверки работоспособности нашего счетчика. Увеличим виртуальное время симуляции проекта щелкнув правой кнопкой на нашей свежесозданной временной диаграмме и выбрав пункт Set end of test bench. Пускай это будет 10000 nS — этого времени нам будет достаточно, чтобы увидеть как наш счетчик досчитает до 10 и сбросится. Сохраним наш файл с временной диаграммой и посмотрим, что можно с ним сделать во вкладке Processes (как это сделать, надеюсь, запомнили?) Помимо предложений создать новый исходник и просмотреть то, что мы только что натворили в виде VHDL нам предлагают просимулировать наш проект, что мы сейчас и сделаем. Раскрываем «дерево» Xilinx ISE Simulator и запускаем процесс Simulate Behavioral Model. Итак, в панели с логом побежали сообщения, комп задумался и выдал нам временную диаграмму симуляции нашего проекта. И о чудо! Счетчик действительно считает до 10-и!
Ну что же, проект создан, проверен на работоспособность — неплохо бы его и в ПЛИСину зашить? Ну тогда приступим к подготовительным мероприятиям. Задумайся, читатель — у нашей микросхемы XC95144 аж целых 160 ног, а в нашем проекте использованы только 5, к каким же ногам подключать осциллограф и куда подавать тактовые импульсы? В этом нам поможет утилита PACE, которую можно найти в меню Пуск->Программы->Xilinx ISE 9.2i->Accessories. Запустим эту программу. Перед нами открылось пустое окно — нужно создать новый файл распиновки. Выбираем в меню пункт File->New и перед нами появляется окно для создания нового файла. В поле New Constrains (UCF) file укажем путь, где будет располагаться наш файл с распиновкой. Самым правильным будет создать его в директории проекта и назвать так же, как головной модуль проекта. В поле Input Design File необходимо указать файл с данными о компиляции проекта (с расширением .ngd) и в третьем поле, с помощью кнопки Select Part выбрать семейство (9500 CPLDs), микросхему (XC95144), корпус (PQ160) и скоростную способность (-15) микросхемы. Завершающим этапом создания нового файла будет нажатие кнопки ОК. Итак, перед нами окно в котором мы видим схематическое изображение корпуса ПЛИСины, и список сигналов нашего проекта (на нижней панели слева). Как мы видим, на схематичном изображении корпуса микросхемы выводы помечены разными цветами. Выводы помеченные красным, светло-зеленым и фиолетовым это питание ядра, земля и питание выходных буферов соответственно. Желтые выводы — это выводы JTAG, предназначенные для программирования микросхемы — именно их нужно подключать к программатору. Еще видны выводы, обведенные красным, черным и синим цветами — это GSR (Global Set/Reset), который можно использовать для установки или сброса всех триггеров в проекте (для этого достаточно их назначить), GTS (Global Tri-State) — для перевода всех буферов ПЛИС в «третье» состояние и GCK (Global Clock) — для подачи тактового сигнала. Пусть наш тактовый сигнал будет подключен к GCK1 (33-я нога ПЛИС), остальные сигналы нашего проекта можно расположить произвольно. Однако для определенности пусть они будут подключены к выводам 11,12,13 и 14 по возрастанию. Если все сделано правильно — должно получиться вот так:
Теперь нужно сохранить наш файл и вернуться в ISE, чтобы добавить его в проект. Только чтобы его добавить нужно вернуться в список исходников Synthesis/Implementation. После добавления файла с распиновкой можно закрыть PACE и перекомпилировать проект. Для верности — можно заглянуть в раздел Pin List отчета, который создается после каждой перекомпиляции проекта.
На этом этапе проект готов — можно делать макетную плату с ПЛИСиной и тактовым генератором и проверять проект на «живом железе», но это я, пожалуй, оставлю для самостоятельной работы. Скажу лишь то, что для программирования ПЛИС предназначена утилита iMPACT, запустить которую можно прямо из ISE. Много материалов по программированию доступно на сайте Xilinx, поэтому повторяться не буду.
Вопросы, как обычно, складываем тут.
Как вам эта статья? | Заработало ли это устройство у вас? |
www.radiokot.ru
ПЛИС (FPGA) расшифровывается как «Field Programmable Gate Array» и представляет собой огромный массив вентилей, которые могут быть запрограммированы и перестроены в любое время и в любом месте. Многие пользователи до сих пор не понимают, что такое ПЛИС. «Огромный набор ворот» — упрощенное описание модели. Некоторые FPGA имеют встроенные жесткие блоки: контроллеры памяти, высокоскоростные коммуникационные интерфейсы и конечные точки PCIe. Внутри FPGA много вентилей, которые можно свободно соединить вместе. Принцип работы более или менее похож на подключение отдельных микросхем логических элементов. FPGA выпускаются ведущими компаниями мира Xilinx, Altera, и Microsemi.
Индустрия ПЛИС выросла из программируемой постоянной памяти PROM и логических устройств PLD. В 1970 г. Philips изобрел программируемую в полевых условиях матрицу. В конструкции такой ПЛИС, что состояла из двух планов, достигалась специфическая реализация логических схем: программируемая проводная «И» либо «ИЛИ». Это давало ей возможность реализации функции в виде Sum of Products.
Altera была создана в 1983 году, а уже в 1984 году выпустила первое в отрасли перепрограммируемое логическое устройство — EP300 с кварцевым окном в упаковке, что позволило использовать ультрафиолетовую лампу на матрице для удаления EPROM метки.
Чтобы преодолеть трудности стоимости и скорости, была разработана программируемая логика массива, в которую входил только один программируемый «И», вводимый в фиксированные «ИЛИ» ворота. PAL и PLA вместе с другими вариантами группируются как простые программируемые логические устройства SPLD. Такие ПЛИС, что интегрированы в один чип с предоставленными межсоединениями для программного соединения блоков, использовались для удовлетворения растущих технологических требований. Они названы комплексными PLD и разработаны Altera.
Транзисторы — другой класс электронных устройств, программируемых на основе масок массивов затворов. Они состоят из транзисторных массивов, которые могут быть подключены с помощью пользовательских проводов. Они уступили место логическим блокам, и теперь пользователь может выполнять настройку на месте, а не в производственной лаборатории.
Идея разработки первой коммерчески жизнеспособной ПЛИС принадлежит соучредителям Xilinx Россу Фримену и Бернарду Вондершмитту. XC2064 был изобретен в 1985 году и состоял из 64 настраиваемых логических блоков с 3-мя справочными таблицами. Он дает современное понимание, что такое ПЛИС. Это было в конце 1980 года, когда предложенный Стивом Кассельман эксперимент по созданию компьютера с 6000000 перепрограммированных ворот нашел спонсоров в отделе надводных боевых действий ВМС США, а затем получил патент в 1992 году.
К концу 1990 года появилась большая конкуренция в производстве ПЛИС, тогда доля рынка Xilinx начала снижаться. Такие игроки, как Actel, Altera, Lattice, QuickLogic, Cypress, Lucent и SiliconBlue, заняли свою нишу на мировом рынке FPGA наряду с Xilinx. В 1997 году Адриану Томпсону удалось объединить программирование ПЛИСов и технологию генетического алгоритма с FPGA, начав новую эпоху Evolvable.
Сегодня ПЛИС стали достаточно доступными, в связи с чем продолжают завоевывать популярность на потребительских рынках. Они состоят из набора логических ячеек, называемых таблицами поиска LUT, окруженных межкомпонентной сетью, обеспечивающей гибкую систему, которая может реализовать практически любой цифровой алгоритм.
Программирование ПЛИС для начинающих — это процесс изучения, планирования, проектирования и реализации решения на FPGA. Количество и тип планировки варьируются от программы к программе. Создание документа с требованиями и создание документа с дизайном, с объяснением, как будет реализовано предлагаемое решение, может быть очень полезным для решения потенциальных проблем.
Время, затраченное на создание качественного проектного документа, сэкономит его в будущем на рефакторинге, отладке и исправлении ошибок. Реализация решения с помощью программирования ПЛИС включает в себя создание проекта с использованием одного из методов введения проекта. Среди них схемы или код HDL, например, Verilog или VHDL. FPGA могут запрограммировать выходной файл на физическое устройство FPGA с использованием инструментов программирования ПЛИС Altera. Введение дизайна с применением схем больше не используется в промышленности. Синтез и программирования почти полностью позаботились об инструментах вендора, таких как инструменты конфигурации ISE и Vivado и Numato Lab.
RTL обозначает уровень передачи регистра. Разработчик также может столкнуться с терминами Register Transfer Logic или Register Transfer Language, все они означают одно и то же в контексте проектирования оборудования. RTL — это абстракция более высокого уровня для цифрового аппаратного дизайна, которая находится где-то между строго поведенческим моделированием на одном конце и чисто структурным на уровне шлюза — на другом.
Моделирование гейтов означает описание аппаратных средств с использованием базовых вентилей, что является достаточно утомительным. RTL можно рассматривать как аналог термина «псевдокод», используемого в основах программирования ПЛИС. Можно описать аппаратный дизайн как последовательность шагов или потока данных от одного набора регистров к следующему в каждом тактовом цикле.
RTL также называют дизайном «потока данных». Как только проект RTL готов, его легче превратить в реальный код HDL, используя такие языки, как Verilog, VHDL, SystemVerilog или любой другой язык описания оборудования.
ПЛИС — это гораздо больше, чем просто множество ворот. Хотя можно строить логические схемы любой сложности, организуя и соединяя логические элементы. Это способ выразить логику в простом формате, который в конечном итоге можно превратить в массив элементов. Два популярных метода сделать это: введение схемы и языка описания оборудования HDL. До того, как он стал широко используемым, инженеры проектировали все с помощью схем. Они были очень простыми для небольших проектов, но болезненно неуправляемыми — для крупных. Стоит только представить себе, как инженеры Intel рисуют схемы для Pentium, у которого миллионы шлюзов! Это неприемлемо сложно.
Verilog — это язык описания аппаратных средств HDL, который можно использовать для цифровых схем в текстовом виде. Изучение Verilog не так сложно, если у пользователя есть опыт программирования. VHDL является еще одним популярным HDL, широко используемым в отрасли. Verilog и VHDL имеют более или менее одинаковое признание на рынке, но пользователи обычно выбирают Verilog, поскольку он прост в изучении и имеет синтаксическое сходство с языком Си.
ПЛИС можно считать строительными блоками, которые позволяют осуществить нужную настройку оборудования. Это особая форма PLD с более высокой плотностью и расширенными возможностями функционала за более короткий промежуток времени с использованием CAD. ПЛИС доступны в различных вариантах на основе используемой технологии программирования.
Они могут быть запрограммированы с использованием:
ПЛИС на основе технологии SRAM, которая предлагает неограниченное перепрограммирование и очень быструю реконфигурацию или частичную реконфигурацию во время самой работы с небольшим количеством дополнительных схем. Большинство таких компаний, как Altera, Actel, Atmel и Xilinx, производят эти устройства.
Независимо от различных производителей и несколько разных архитектур и наборов функций, большинство FPGA имеет общий подход. Основными компонентными блоками любой FPGA являются гибкий программируемый «логический блок» (CLB), окруженный программируемыми «блоками ввода / вывода» с иерархией каналов маршрутизации, соединяющих различные блоки на плате.
Кроме того, они могут состоять из DLL-библиотек для распределения и управления часами и памяти RAM выделенного блока с основным строительным блоком логической ячейкой. Последняя состоит из генератора входных функций, логики переноса и элементов хранения. Генераторы реализуются в виде справочных таблиц и зависят от введения. Например, Xilinx Spartan II имеет 4 входных LUT с обеспечением каждого 16X1 битным синхронным ОЗУ с использованием мультиплексоров как регистров сдвига для захвата данных в пакетном режиме. Элементы хранения являются чувствительными к краям триггеров или к уровню задвижек.
Фрагмент программирования ПЛИСов:
Базовый блок ввода / вывода показан ниже.
Буфера во входных и выходных путях направляют сигналы во внутреннюю логику и итоговые площадки непосредственно или через триггер. Они настраиваются на соответствие различным поддерживаемым стандартам сигнализации, которые могут быть определены пользователем и установлены извне.
На любой сборочной линии медленный сегмент определяет общую производительность. Алгоритмы маршрутизации используются для разработки наиболее эффективных путей обеспечения оптимальной производительности. Маршрутизация осуществляется на разных уровнях, таких, как локальный, маршрутизация общего назначения между различными CLB, маршрутизация ввода-вывода между блоками и CLB, выделенная маршрутизация для определенных сигнальных классов с целью максимизации производительности и Global Routing для распределения тактовых и других сигналов с очень большим разветвлением. Семейства FPGA также имеют большие блочные структуры RAM для дополнения распределенных LUT RAM, размер которых варьируется для различных устройств FPGA.
Проектирование FPGA предполагает в основном тот же подход, что и любая система VLSI, основными этапами которой является проектирование, моделирование поведение, синтез, моделирование после синтеза, трансляция, отображение и маршрутизация, а также последующий анализ, такой как моделирование синхронизации и статический анализ синхронизации. На компьютере дизайн выглядит упорядоченным и уложенным плиткой, однако фактически имеется несовершенное размещение и маршрутизация, что приводит к снижению производительности.
Чтобы повысить производительность FPGA, всегда можно использовать больше транзисторов. Служебная площадь высокая. Установка большего количества транзисторов означает, что возможны масштабные конструкции. Утечка является серьезной проблемой для ПЛИС и в то же время представляет интерес. Использование асинхронной архитектуры FPGA показывает лучшие результаты в сочетании с технологией конвейерной обработки, которая уменьшает глобальные входы и улучшает пропускную способность.
Безопасность системы всегда была главной проблемой, так как код должен раскрываться каждый раз, когда загружался в ПЛИС. Такая гибкость делает FPGA потенциальной угрозой вредоносных модификаций при изготовлении, поэтому шифровании битовых потоков вовремя пришло ему на помощь.
Часто неопытные дизайнеры и пользователи сталкиваются с дилеммой, насколько мощная ПЛИС подходит для их разработок. Производители часто указывают метрики, например, «количество ворот». Например, программирование ПЛИС Xilinx использует 3 метрики для измерения объема FPGA, максимальных логических элементов, максимальных битов памяти и типового диапазона шлюзов. Пока они являются согласованными, миграция между моделями несколько упрощается, но она редко предлагает точное сравнение у различных поставщиков через разнообразие в архитектурах и из-за различий в производительности.
Наилучшим показателем является сравнение типа и количества предоставленных логических ресурсов. В дополнение к этому, разработчик должен полностью осознать, что именно нужно от устройства, поскольку производители могут похвастаться возможностями, которые будут иметь наименьшее значение для работы. Например, Stratix II EP2S180 от Altera имеет около 1,86,576 LUT с 4 входами, а Xilinx Virtex-4 XC4VLX200 содержит соответственно 1,78,176. Однако, если для проектирования нужна только 177 тыс. LUT, это будет достаточно.
Если ОЗУ — это желательная метрика для дизайнера, то ни 6 Мбит Xilinx XC4VLX200, ни 9 Мбит Altera EP2S180 не будут предпочтительнее по сравнению с менее рекламируемой, более старой моделью XC4VFX140 с 9,9 Мбит.
Программирование ПЛИС Altera для начинающих стартует с выбора языка. Опция C, C ++ или System C позволяет использовать возможности крупнейших устройств и, в то же время, достижения сходства реалистической графики разработки. Возможность использования на базе C для проектирования FPGA обеспечивается HLS (синтез высокого уровня), который уже много лет находится на грани прорыва с таким инструментом, как Handle-C. В последнее время это стало реальностью благодаря тому, что крупные поставщики Altera и Xilinx предлагают HLS в своих наборах инструментов Spectra-Q и Vivado HLx соответственно.
Доступен ряд других реализаций программирования ПЛИС Altera для начинающих на основе C, таких как OpenCL, который предназначен для разработчиков программного обеспечения, желающих повышения производительности с помощью FPGA без глубокой понимание дизайна FPGA.
Как и в случае с HDL, HLS имеет ограничения при использовании подходов программирования ПЛИС на C также, как и с традиционными HDL, разработчикам приходится работать с подмножеством языка. Например, сложно синтезировать и реализовать системные вызовы, так как нужно убедиться, что все ограничено и имеет фиксированный размер. В HLS приятно то, что можно разрабатывать свои алгоритмы с плавающей запятой и имеется инструмент HLS преобразования плавающей запятой в фиксированную.
Программировать ПЛИС с ПО Xilinx совсем не сложно. Получить его можно, покупая продукты Xilinx, бесплатно или по цене, ориентированной на конкретные модели. Можно получить доступ к видео на профильном сайте, который наглядно показывает процедуру использования. Из всех компаний, которые можно выбрать при поиске программируемых вентильных массивов, Xilinx безусловно лучший из всех. Они являются создателями этого продукта, и в течение многих лет вносили в него улучшения. Фирменное ПО стало более мощным, чем когда-либо прежде.
Обучение программированию ПЛИС можно проводить онлайн, поскольку платформа хорошо представлена в интернете. При настройке ПЛИС первым шагом является проектирование схемы, для которой необходимо знание цифровой электроники. В отличие от программирования, гораздо сложнее начать нарезку кода, если архитектура программы не ясна. Как только станет ясно, что нужно реализовать, приступают к описанию схемы, используя один из языков: Verilog или VHDL.
Факт, который свидетельствует об изменении парадигмы, состоит в том, что они не называются языками программирования ПЛИС, а являются языками описания. Из-за сложности тестирования цифровых схем обычно на этом этапе используются банки тестов, моделирующих поведение оборудования. Этот тип инструментов позволяет видеть состояние сигнала в любой момент и проверять, есть ли переходы с желаемыми результатами.
Третий этап известен как синтез схемы является одним из ключевым. Он выбирает используемые элементы и их взаимосвязь в соответствии с файлами описания. Для этого этапа требуются инструменты, которые в большинстве ситуаций облегчают и автоматизируют задачи.
Intel Quartus Prime Software Suite Lite Edition — программное обеспечение для проектирования ПЛИС. Оно идеально подходит для начинающих, так как его можно скачать бесплатно, а файл лицензии не требуется. Можно загрузить программное обеспечение на сайте производителя. Файлы имеют большой размер (несколько гигабайт), их загрузка и установка может занять много времени. Чтобы минимизировать время и необходимое дисковое пространство, рекомендуется загружать только те элементы, которые необходимы для пользовательских задач. При запросе, файлах для загрузки, снимают флажок «Select All» и выбирают только Quartus Prime и поддержку Cyclone V устройства.
Алгоритм создания проекта:
Если процесс завершается успешно, рядом с анализом и синтезом отображается зеленая галочка. Если ошибка, проверяют синтаксис и убеждаются, что он точно соответствует блоку кода, указанному выше.
Все опытные программисты знают, что сложные программы, даже подпрограммы, не работают правильно с первого раза. Способности к абстракции у человека, основанные на опыте, позволяют ему находить решения, не беспокоясь о мельчайших деталях. Но суровая правда заключается в том, что физическая система, в которую встраиваются программы, требует, чтобы каждая мелочь была учтена, прежде чем все заработает.
С улучшением программных инструментов для разработки ПЛИС в основном от традиционных поставщиков, а также независимых поставщиков инструментов: Synplicity, FPGA — становится день ото дня все более популярной. Теперь ПЛИС начали включать специализированное аппаратное обеспечение необходимых клиенту функций, снижая издержки производителей. Таким образом, в будущем может появиться конкуренция между жесткими и дешевыми системами с гибкими ядрами. Ожидается, что в ближайшей будущем расходы будут снижаться еще больше, поскольку популярность FPGA вырастет в разы.
Производители начали экспериментировать с таким понятием, как встраивание ПЛИС в интегральные микросхемы для создания гибридного устройства. Основное внимание по-прежнему уделяется маршрутизации межсоединений, а в архитектурах CLB наблюдаются меньшие изменения. Поскольку ПЛИС продолжают включать процессоры, новое поколение потребует не только знаний аппаратного обеспечения цифрового дизайна, но и опыта разработчиков в процессе однократного программирования ПЛИС. В целом, ожидается, что FPGA отнимет долю рынка в устройствах ASIC и станет доминирующей технологией, охватывающей множество приложений из различных областей.
Источник
ruud.ru
Для воплощения в жизнь первых двух шагов подойдет связка ISE (он же Project Navigator) + ISim (симуляция) + Impact ( прошивка FPGA).
Иногда ну просто очень хочется чего-нибудь приятного… Пожалуйста, вспомним о SoC (System-on-Chip) — системе на кристалле. В нашем случае, это процессор, шина, память и куча всякой периферии. Можно попытаться сделать самому подобную систем (см. шаг 2), можно прикрутить найденные IP Cores на просторах интернета. Но зачем же изобретать велосипед? Умными ребятами из конторы Xilinx уже придуманы софт-процессоры PicoBlaze и MicroBlaze. Первый — это восьмиразрядный процессор, который морально устарел, уже давно не внедряется в SoC и имеет открытый исходный код. Второй же, MicroBlaze, имеет неплохие перспективы: 32 разряда, RISC-архитектура и т.д, и т.п.
В качестве памяти может быть использована как внешняя память, подключаемая к FPGA, так и внутренняя, реализованная непосредственно внутри FPGA. Как правило, вторая часто применяется для кеширования инструкций и данных, находящихся в первой. Помимо того, довольно широко используются системы, содержащие более одного процессора и использующие для межпроцессорного взаимодействия специальные модули коммуникации.
Существует гигантская куча всевозможной периферии, которую можно задействовать в огромных количествах — все ограничено лишь ресурсами FPGA. Кроме того, на шину обмена с периферией PLB можно добавить и «самопальные» модули, но только при условии их корректной работы.
На данном этапе важнейшим инструментом является Xilinx Project Stuido (XPS) из состава Emedded Development Kit (EDK), по большому счету именно она на выходе позволяет получить готовый файл аппаратной конфигурации FPGA с размещенной на ней SoC.
habr.com
Итак, это интересно, но подумаем о целесообразности. Как выбрать задачу, решение которой на ПЛИС будет оправдано? Во-первых, в некоторых случаях схемное решение оказывается изящнее и надежнее программного. К примеру программировал я сумо-бот на микроконтроллере, сделал ему простейший голос — на один из выводов вешается динамик, сигнал на нем меняется со звуковой частотой. Всё просто — цикл, внутри переключение и задержка. Но робот на время гудка останавливался. Чтобы работало одновременно, нужна многозадачность, надо писать диспетчер, с ростом сложности превращающийся в ОС реального времени. В решении на ПЛИС же, не приходится делить ресурс центрального вычислителя, подсистема управления динамиком отъест некоторый объём ПЛИС-ы и далее никому мешать не будет.
Во-вторых, специализированная схема может иметь много большую производительность, чем программное решение. Для попиксельной обработки видеопотока 1280х1024@60Гц в реальном времени понадобится обрабатывать 80млн. точек в секунду, тут даже на мощном процессоре много не успеешь, схемное решение даст возможности куда богаче (при определенных ограничениях на алгоритм, — обработка должна быть стереотипной, ветвления нежелательны).
ФАПЧ позволяет создавать несколько «клоковых доменов», например отделить вычислительный модуль от видеоадаптера, так чтобы у каждого была своя частота. К асинхронным схемам как я понял, схемотехники относятся примерно как программисты к самомодифицирующемуся коду.
Частота на которой сможет работать схема зависит, главным образом, от самой схемы, но и тип ПЛИС, её «класс скрости» играет роль. Смысл примерно такой — за один такт сигнал должен успеть пробежать по самому длинному пути вашей схемы и переключить целевой регистр. Когда я превышал частоту для описываемого решения, на экране появлялись характерные сопли.
Проект подготовлен для четырёх отладочных плат, Terasic DE0, Terasic DE2-115, Terasic DE0-nano с дисплеем LTM вместо VGA, а также Марсоход II. У Terasic-а отличное железо, с софтом не так радужно. Документация и примеры-образцы есть, но их не всегда достаточно. Например, уже научившись прошивать непосредственно ПЛИС, я убил день на то, чтобы загнать ту же прошивку в конфигурационную память(eeprom) (чтобы данная прошивка загружалась при включении платы). Еще проблема, что в России их трудно найти по разумной цене, а тайваньцы не отправляют обычной почтой. У Марсохода II функционал победнее, но гораздо лучше с описаниями и поддержкой, в статьях с их сайта я часто находил решение очередных своих трудностей. Моей первой отладочной платой был первый Марсоход, он слабее по возможностям но и проще в освоении выше названных, на попробовать самое то.
Итак, генерируем видео по функции. ibniz, а точнее его «линейное» подмножество будет служить спецификацией. Польза в том, что во-первых можно позаимствовать несколько готовых демо, а во-вторых, можно сравнить результат работы с референсной софтовой реализацией что весьма ценно, поскольку отладка схемы куда сложнее чем отладка программы.
Работа в основном разделилась на две части, — инфраструктуру, подготавливающую данные и выводящую результат на дисплей и на ядро, реализующее отдельные элементарные функции ibniz.
Основной компонент инфраструктуры — VGA адаптер. Обычный подход — использовать буфер(ы) фрейма, вовлекает в проект внешнюю память (внутренней мало). Это усложнило бы проект и лишило возможности использовать память для чего-нибудь еще. Поэтому ядро работает синхронно с VGA, цвет пикселя вычисляется и тот сразу рисуется.
Недостатки:
Ядру навязана частота VGA
Пока VGA отрабатывает «невидимые куски экрана» ядро простаивает.
Жёсткое реальное время, на каждый такт надо отдать очередной пиксел, сэкономить там, чтобы потом потратить здесь не получится.
Команды ibniz прямой записи в буфер фрейма нереализуемы, также как и операторы перехода.
Преимущества:
Простота реализации
Можно использовать ширину канала, которую память бы не потянула.
Память сохранена для чего-нибудь еще (разделение ресурса тут вряд-ли было бы возможно).
Низкая латентность, тут от неё толку мало, а вот с сигналом от камеры выходит красиво, но это уже другой проект.
Тру 60Hz видео радует глаз.
Ядро проекта составляют математические функции — sin, atan2, log, sqrt, а также деление; реализовал их сам, алгоритмами «цифра за цифрой» (CORDIC), благо был опыт программной реализации. Это итеративные алгоритмы, количество итераций пропорционально разрядности аргументов. Итерация у меня делается за такт, то есть от поступления аргументов на вход до выхода результата проходит количество тактов, равное разрядности чисел, для ibniz это 32. Как это примерить с необходимостью считать точку за такт? С помощью конвееризации, вычислительный блок состоит из 32-х (аппаратных) ступеней. Остаётся задержка, причём для последовательности блоков задержка накапливается. Бороться с ней несложно, но я для наглядности оставил, в результате изображение смещено вправо, а по левому краю видна артефактная полоса, ширина которой соответствует общей глубине конвеера конкретного примера.
О генеративном искусстве на Хабре уже писали например тут, далее мои 5коп. Когда начинаешь генерировать компьютером картинки, по началу стремишься к необычному,- парадоксальным формам, ярким до кислотности краскам. Однако, такие «произведения» быстро надоедают. Интересная вещь — чтобы увеличить разнообразие приходится накладывать ограничения. «Случайная» картинка выглядит плоской, но можно добавить ощущение объёма, натянув её на некую форму. В демо «Юпитер» промежуточная картинка-текстура накладывается на сферу. Для этого просто используется преобразование координат от декартовых к сферическим также, как описано в этой статье. Ощущение объёма усиливается за счёт освещения, а также движения, см. демо с четырьмя кругами-сферами.
«`s«s«sii`ki
`k.*«s«s`ks
«s`k`s`ks«s«s`ks«s`k`s`kr«s`k`sikk
`k«s`ksk
habr.com
Поле, засеянное Массивами Программируемых Калиток
ПЛИС — так ЭТО называется по-русски. Программируемая Логическая Интегральная Схема.
По-буржуйски это звучит несколько иначе — FPGA — Field of Programmable Gate Arrays.
Дословно это переводится как «Поле, засеянное массивами программируемых калиток.»
Если быть чуть серьезнее, можно назвать это «Матрица программируемых вентилей»
Что такое вентиль?
Совершенно верно, это в подвале такая хреновина на водопроводной трубе, которую если завинтишь,
то весь дом останется без воды. Короче говоря, это то, что может закрываться и открываться.
Так вот, пусть для вас это будет откровением, но каждая микросхема состоит из вентилей. Правда, они не совсем похожи на то, что у вас и у меня в подвале. Но делают они то же самое — открываются и закрываются.
Вентиль — это элементарная составляющая любой цифровой микросхемы.
Даже самый навороченный супермегапроцессор состоит из вентилей. Их в нем много, очень много, просто целое море. Естественно, что в каждой микросхеме вентили соединены определенным образом. Собственно, от того, как они соединены, и зависит функциональность микросхемы.
В обычных микросхемах схема соединения вентилей задается при изготовлении,
и в последствии ее изменить уже нельзя.
ПЛИС позволяет нам задавать эту схему самим, и изменять ее как нам заблагорассудится уже при
«жизни» микросхемы. Достаточно лишь нарисовать схему на компютере и при помощи программатора прошить ее в микросхему ПЛИС.
Это в-общем.
На самом деле, все гораздо сложнее 🙂 Смотрим на рисунок
Это есть одна макроячейка — Macrocell по-ихнему.
Каждая микросхема ПЛИС состоит из таких вот макроце… макроячеек.
Как видно из схемы макроячейки, она состоит из блока Look-Up Table (LUT) — «Просмотровой таблицы»,
а также, триггера с синхронными и асинхронными входами и некоторой логики по входам триггера.
Программируется, собственно, только LUT. Как видите, у нее 4 входа и один выход.
Этот выход может быть подан как непосредственно на выход макроячейки (Q0), так на синхронный вход данных триггера (D).
LUT — это ни что иное как ПЗУ на 16 1-битных ячеек. При подаче на входы LUT (D0…D3) некой комбинации цифровых сигналов, она воспринимает их как адрес и выдает на выход содержимое ячейки по этому адресу.
Вообще, любая схема из логических элементов, у которой 4 входа (или меньше) и один выход, может быть описана таблицей истинности в 16 строк. Например, возьмем вот такую несложную схему, и напишем для нее таблицу истинности:
Таблица истинности описывает логический уровень выхода схемы (Q) для всех возможных комбинаций сигналов на входах (D0…D3). Точно так же в LUT каждой комбинации входных сигналов (читай — каждому адресу ПЗУ) сопоставлен свой выходной сигнал. То есть, в LUT прошивается таблица истинности той схемы, которую мы хотим видеть на его месте. Вот так все просто!
Если схема содержит более 4 входов или более 1 выхода — используются LUT нескольких макроячеек.
clear=»all»>Но самое главное — это триггер. Ведь, как вы знаете (а может, еще не знаете), все регистры, счетчики и многие другие элементы цифровой техники состоят именно из триггеров. Так вот, количество макроячеек в микросхеме ПЛИС определяет количество триггеров. И наоборот :) Так что, выбирая микросхему для какого-либо проекта, надо предварительньно прикинуть, сколько триггеров будет в схеме, и брать с запасом…
На рисунке чуть ниже изображена структурная схема микросхем серии EPM7000 фирмы Altera Эта картинка дернута из даташита https://www.altera.com/literature/ds/m7000.pdf Она относится к микросхемам EPM7032, EPM7064, EPM7096. Дык вот, последние две цифры в названии обозначают именно количество макроячеек в микросхеме.
Как видно из схемы, макроячейки объединяются в «блоки логических массивов» (LAB — Logic Array Block).
Эти блоки соединяются между собой через «программируемый массив внутренних соединений» -
programmable interconnect array (PIA).
Кроме того, LAB»ы подключаются к выводам микросхемы через блоки управления ввода/вывода ( I/O Control Block).
При прошивке, в каждый из блоков «зашивается» своя информация:
— В Макроячейках программируются LUT»ы,
— в PIA зашивается информация о внутренних межблочных соединениях,
— в блоки управления ввода/вывода (I/O Control Block) зашивается информация о подключениях к ногам микросхемы.
По-серьезному, «прошивка» ПЛИС называется «загрузка конфигурации».
А как вы думаете, чем мы будем загружать конфигурацию???
Ну конечно же, старым добрым Байт Бластером! 🙂 Байт бластер — это штука универсальная :)
О том, как его сделать, подробнейшим образом я рассказывал вот здесь.
Настоятельно рекомендую изучить документ «ByteBlaster II Download Cable User Guide». В частности — 16 страничку, где дается распиновка разъема программирования.
Опять же, для ленивых, я любезно выдрал эту табличку и поместил сюда. В ней даны варианты подключения для трех режимов загрузки: AS, PS и JTAG. Мы будем пользоваться последним — JTAG.
На любой микросхеме ПЛИС, программируемой по JTAG, есть выводы с названиями:
TCK — тактовый сигнал
TDO — данные из микросхемы
TMS — сигнал управления
TDI — данные в микросхему.
Выводы Vcc и GND — это питание, «плюс» и «минус» соответственно. Они тоже есть на каждой микросхеме.
Для следующей статьи я бы порекомендовал заготовить вагон свободного времени и 44 метра входящего трафика. Будем изучать программу MAX+Plus II. А пока — все!
—Поехали дальше—>>
Как вам эта статья? | Заработало ли это устройство у вас? |
www.radiokot.ru