ПЛИС — мои первые шаги
Недавно я все-таки сделал свой первый шаг к ПЛИС и призвал вас за собой. Мое фанатическое увлечение ПЛИС и идея о том, что ПЛИС является лучшей платформой для создания любых устройств приобрела религиозный характер. Моя секта ПЛИСоводов проповедует полный отказ от микроконтроллеров, а особо экстремистская ветвь проповедует отказ не только от софт процессоров, но и вообще от последовательных вычислений!
Как всегда, постижению истин помогло решение реальных задач. В сегодняшней проповеди я хотел бы рассказать об испытаниях, которые выпадают на долю молодого ПЛИСовода. Преодолевая испытания мы постигаем истину. Но остаются вопросы, на которые я не нашел ответов. Поэтому я бы очень хотел, чтобы братья-хабровчане — ПЛИСоводы с опытом, поучаствовали в обсуждении, протянули руку помощи своим младшим собратьям.
Эта статья для новичков. В ней я опишу типичные проблемы, вопросы, заблуждения, ошибки, которые могут появиться в самом начале обучения (потому что они появились у меня). Однако, контекст статьи ограничен тем, что разработка ведется на ПЛИС от Altera в среде Quartus на языке Verilog.
Трудно жить ничего не делая, но мы не боимся трудностей!
Одна из причин, по которой многие не начинают изучать Verilog вот прямо сейчас — это отсутствие реальной ПЛИС. Кто-то не может заказать, потому что дорого, а кто-то потому, что не знает, что именно взять (вопрос выбора рассмотрен в предыдущей статье). Кому-то ПЛИС пока еще едет по почте.
Но в своих разработках я пришел к тому, что наличие реальной ПЛИС мне требуется уже на финальном этапе разработки, когда нужно протестировать проект «в железе». Речь о том, что бóльшую часть времени я провожу в отладке своего кода с помощью симуляторов.
Поэтому мой совет: отсутствие ПЛИС — это не повод бездействовать. Пишите и отлаживайте модули для ПЛИС в симуляторах!
Симулятор для Verilog
Итак, чем же развлечь себя скучными длинными рабочими днями (если они таковыми являются)? Конечно же освоеним ПЛИС! Но как же затащить на работу целую среду разработки от Altera, если она весит 3 ежемесячных рабочих лимита интернета? Можно принести на флешке! Но если предметом изучения является Verilog, то можно ограничиться блокнотом, компилятором IcarusVerilog, а результат смотреть в GTK Wave.
Для начала работы в среде Windows, достаточно скачать по ссылке http://bleyer.org/icarus/ файл установки iverilog-20130827_setup.exe (development snapshot) [11.2MB]
Установка трудностей не вызывает. Теперь немного забежим вперед: создадим папку для проекта и в ней пару файлов с пока что не понятным содержимым:
В файле bench.v описан тестовый модуль testbench, в нем создан тестовый источник сигнала clk (меандр). Другие модули будут создаваться в отдельных файлах, либо логику можно протестировать сначала в этом модуле, а потом вынести в отдельный модуль. Потом в модуль testbench будут добавляться экземпляры этих модулей, где мы будем подавать на их входы тестовые сигналы и получать из них результаты. Из модулей мы можем строить иерархию, думаю это понятно всем.
После запуска этого файла мы увидим на экране текст, заданный в $display (это отладочный вывод), значение же сигналов и регистров схемы будут находиться в файле test.vcd. Кликаем по файлу и выбираем программу для просмотра — GTKWave (в моем случае D:\iverilog\gtkwave\bin\gtkwave.exe). Еще пару кликов и мы увидим наш clk.
Практически, каждый свой новый модуль я создаю в блокноте и отлаживаю IcarusVerilog. Следующим этапом после такой отладки идет проверка модулей в Quartus. Хотя в Quartus тоже есть свой симулятор, но я его использую реже. Причина в простоте обновления кода и просмотра результата в IcarusVerilog: сохранил изменения в файле, запустил BAT, нажал кнопку «обновить» в GTKWave — все! В ModelSim для этого требуется чуть больше движений, но он тоже не плох, особенно на данных сложных структур.
После симуляции наступает пора запуска Quartus. Но загружать прошивку в ПЛИС пока еще рано. Нужно убедиться, что божественная вычислительная машина правильно поняла, какую схему мы хотим получить, изложив свои мысли в виде Verilog’а.
Разница между симуляцией и работой в реальном железе
Первое время я, подобно слепому котенку, бился головой об косяки. Казалось бы правильный код, не работает совсем, либо работает не так, как предполагаешь. Либо вот только что работал, а теперь внезапно перестал!
Пытливый котенок, начинает искать взаимосвязь между своими действиями и результатом («голубиное суеверием»).
Самая большая драма
Ниже будет список странностей, но сначала самая большая драма, с которой я столкнулся: не все конструкции Verilog могут быть синтезированы в железе. Это связано с тем, что на Verilog описывается не только аппаратная логика, которая объединяется в модули и работает в железе. На том же Verilog описываются тестовые модули, которые объединяют тестируемые модули, подают на их входы тестовые сигналы и в целом существуют только для проверки на компьютере. Изменение значений сигналов во времени задается конструкциями, содержащим знак «#» в тексте Verilog. Такой знак означает задержку во времени. В примере выше именно так генерируется сигнал CLK. И я грешным делом думал, что таким же образом внутри настоящей ПЛИС можно генерировать, к примеру, последовательность бит для отправки сообщения по RS232. Ведь на вход ПЛИС подан сигнал от генератора 50 МГц! Может быть она как-то на него ориентируется. Как оказалось, я не единственный, кто надеялся на чудо: 1, 2, 3, 4, 5. Реальность как всегда оказывается более суровой: ПЛИС это набор логики и временная задержка в ней может появиться при использовании счетчика, значение которого увеличивается тактами от генератора до заданной величины, либо как-то иначе (но всегда аппаратно).
Список найденных странностей
Удивительные вещи, однако, прочтение книг [1,2] проливает свет на эту бесовщину. Более того, обретается благодать.
Если обозначить reg, то не факт, что он будет создан
Как я пришел к проблеме? Допустим есть один модуль, на вход которого я должен подавать значение (по типу параметра). В перспективе, этот параметр должен будет изменяться во времени в зависимости от каких-то внешних событий. Поэтому значение должно хранится в регистре (reg). Но реализация приема внешних событий пока не реализована, поэтому я регистр не меняю, а просто задаю ему изначальное значение, которое в дальнейшем не меняется.
Казалось бы в чем подвох? В императивных ЯП мы часто задаем переменные в качестве констант и потом ни разу их не меняем и все работает. Что же мы видим в железе?
Во-первых, мы не видим регистра. Во-вторых, на вход модуля подано 8’hFF вместо наших 8’d0240! И этого уже достаточно для того, чтобы схема заработала не так, как мы планировали. То, что регистра нет — это нормально. В Verilog можно описывать логику разными способами, в то же время, синтезатор всегда оптимизирует аппаратную реализацию. Даже если написать блок always и в нем работать с регистрами, но при этом выходное значение всегда будет определяться входными, то применение регистра тут окажется лишним и синтезатор его не поставит. И наоборот, если при каких то значениях входных данных выходное значение не меняется, то тут никак не обойтись без регистра-защелки и синтезатор его создаст. (Книга 1 стр. 88-89). Что из этого следует? Если мы начнем менять значение регистра, например, в зависимости от нажатии кнопок, то геристр уже будет создан и все будет работать так, как нужно. Если же окажется, что кнопки ничего не меняют, то синтезатор его опять же выкинет и опять все поломается. Что же делать с константой? Нужно подать ее напрямую на вход модуля:
Теперь на входе модуля мы имеем правильное значение:
Остается загадкой, почему при сокращении регистра, его значение в initial не подставляется на вход модуля.
Размерность wire лучше задавать самому.
При разработке в среде Quartus, допускается не задавать линии wire заранее. В этом случае они будут созданы автоматически, но об этом будет выдано предупреждение (warning). Проблема заключается в том, что разрядность wire будет 1-бит, а если порты будут иметь разрядность больше 1 бита, то значение не будет передано.
Результат:
Как видим, один бит подключен, а остальные 7 бит получаются не подключены (NC). Чтобы такой проблемы не было — нужно создать wire самостоятельно. Не зря компилятор IcarusVerilog выдает не warning, а ошибку, если wire не задан заранее.
Компьютер не будет лазать по модулям, смотреть, какая разрядность портов. К тому же, разрядность может оказаться разной, а на вход модуля или с выхода берутся не все биты, а какие-то определенные.
Нельзя использовать выход логической функции, в качестве тактового сигнала
Иногда в проекте требуется снизить тактовую частоту, либо ввести временную задержку в N тактов. Новичёк может применить счетчик и дополнительную схему определения достижения счетчиком определенного значения (схема сравнения). Однако, если напрямую использовать выход со схемы сравнения в качестве тактового, то могут возникнуть проблемы. Это связано с тем, что логической схеме требуется некоторое время для установки стабильного значения на выходе. Эта задержка смещает фронт сигнала, проходящего через разные части логической схемы относительно тактового, в итоге получаются гонки, метастабильность, асинхронщина. Даже довелось однажды услышать реплику об этом в качестве критики ПЛИС: «с ПЛИС постоянные проблемы — гонки сигналов».
то становится ясно, каким образом разрабатываются устройства на ПЛИС: вся задача делится на аппаратные блоки, а данные между ними движутся по конвеерам, синхронно защелкиваясь в регистрах по тактовому сигналу. Таким образом, зная общую тактовую частоту, синтезатор рассчитывает максимальную частоту работы всех комбинаторных схем, определяет, укладывается ли их скорость к период такта и делает вывод — будет или не будет работать схема в ПЛИС. Все это происходит на этапе синтеза. Если схемы укладываются в параметры, то можно прошивать ПЛИС.
Для полного понимания, стоит прочитать Altera handbook на предмет «clock domains», а так же разобраться с тем, как задавать параметры рассчета TimeQuest для проекта.
Таким образом, для разработчиков устройств на базе ПЛИС созданы все необходимые методологии, и если их придерживаться, то проблем не будет.
А что, если я хочу пойти против системы?
Порядок разработки и поведение синтезатора схем подводит нас к выводу о том, что же такое ПЛИС на аппаратном уровне. Это синхронные схемы. Поэтому, среди целей синтезатора — уложиться во временные интервалы. Для этого он, к примеру, упрощает логические выражения, выбрасывает из синтеза части схем, которые не используются другими схемами и не привязаны к физическим выводам ПЛИС. Асинхронные решения и аналоговые трюки не приветствуются, потому что их работа может быть непредсказуемой и зависеть от чего угодно (напряжение, температура, техпроцесс, партия, поколение ПЛИС), а поэтому не дает гарантированного, повторяемого, переносимого результата. А всем же нужен стабильный результат и общие подходы к проектированию!
Но что же делать, если вы не согласны с мнением синтезатора о том, что нужно выкидывать неизменяемые регистры, сокращать логические схемы? Как быть, если хотите делать схемы с асинхронной логикой? Нужна тонкая настройка? А может быть вы сами хотите собрать схему на низкоуровневых компонентах ПЛИС? Легко! Спасибо разработчикам Altera за такую возможность и подробную документацию!
Как это сделать? Можно попробовать графический редактор схем. Вы, возможно, слышали о том, что Quartus позволяет рисовать схемы? Можно самому выбрать стандартные блоки и соединить их. Но это не решение! Даже нарисованная схема будет оптимизирована синтезатором, если на это будет возможность.
В итоге мы приходим к старой истине: если ничего не помогает — прочитайте инструкцию. А именно «Altera Handbook» часть под названием «Quartus II Synthesis Options».
Начнем с того, что описывая архитектуру на Verilog определенным образом, можно получить определенный результат. Вот примеры кода для получения синхронного и асинхронного RS триггера:
В этом случае получится синхронный триггер.
Если не брать во внимание тактовый сигнал и переключаться в зависимости от любых изменений r и s, то в результате получится элемент с асинхронной установной значений — защелка (latch).
Но можно пойти еще дальше и самому создать защелку из примитива (примитивы доступны так же, как любой другой модуль Verilog):
В итоге, весь «обвес» на входе защелки, который синтезатор посчитал ненужным, исчезнет и мы получим именно то, что хотели:
Список существующих примитивов можно посмотреть на сайте Altera.
А теперь небольшой пример про асинхронность и сокращение. Задумал я, к примеру, сделать генератор по тому же принципу, как это было принято делать раньше, но только на ПЛИС:
Но для увеличения периода я возьму 4 элемента, но только один из них будет с инверсией:
Но получается сокращение (1 элемент, вместо четырех). Что логично. Но мы то задумывали линию задержки.
Но если поставить синтезатору условие, что линии a,b,c,d не сокращать, то получится то, что мы задумали. Для подсказки синтезатору применяются директивы. Один из способов указания — это текст в комментарии:
А вот и результат — цепочка из четырех элементов:
И это далеко не все! Оставлю на радость самостоятельного изучения: работу с case и директиву для реализации его в качестве RAM/ROM или логической схемой; работу со встроенными блоками памяти (RAM/ROM); выбор реализации умножения — аппаратным умножителем или логической схемой.
Выводы
Цитируя статью, хочу сказать, что «ПЛИС-ы / FPGA — не процессоры, «программируя» ПЛИС (заполняя конфигурационную память ПЛИС-а) вы создаете электронную схему (хардвер), в то время как при программировании процессора (фиксированного хардвера) вы подсовываете ему цепочку написанных в память последовательных инструкций программы (софтвер)».
Причем, как бы мне изначально не хотелось сильно не привязываться к конкретной железяке, но иногда, чтобы более эффективно и экономно использовать ресурсы, приходится работать на низком уровне. Часто этого можно избежать, если правильно разрабатывать синхронные схемы. Однако совсем забыть, что это железо — не получается.
Еще хочу сказать, что фанатизма и максимализма со временем поубавилось. Сначала я стремился все действия и рассчеты на ПЛИС выполнять за один такт, потому что ПЛИС это позволяет. Однако, это требуется далеко не всегда. Вычислительные ядра софт процессоров мне пока не довелось использовать, однако применение state machines для работы по определенному алгоритму — стало нормой. Вычисления не за 1 такт, временные задержки в несколько тактов из за применения конвееров — это норма.
Книги, которые мне очень помогли
1. В.В. Соловьев — Основы языка проектирования цифровой аппаратуры Verilog. 2014
2. Altera: Quartus II Handbook
3. Altera: Advanced Synthesis Cookbook
4. Altera: Designing with Low-Level Primitives
Что такое ПЛИС и для чего она используется?
ПЛИС обеспечивают преимущества для различных типов электронного оборудования. От авианавигации до медицинского ультразвукового исследования и поисковых машин люди полагаются на FPGA для разработки и использования технологий, которые они используют ежедневно.
В этой статье представлена информация о том, что такое ПЛИС и для чего она используется. Если вас интересуют эти темы, вам понравится эта статья.
Что такое ПЛИС?
FPGA – это аббревиатура от Field Programmable Gate Array . Это полупроводниковое устройство, основанное на матрице конфигурируемых логических блоков (CLB), благодаря чему большая часть электрических функций внутри устройства может быть изменена инженером-проектировщиком.
FPGA определяется набором взаимосвязанных цифровых подсхем, которые реализуют общие функции, а также предлагают высокий уровень гибкости. ПЛИС относятся к классу устройств, называемых программируемой логикой (или программируемым оборудованием). Сама по себе FPGA ничего не делает; скорее он сконфигурирован для работы с любой необходимой цифровой схемой. Итак, как это работает?
Как работает ПЛИС?
Понять, как работает FPGA, несложно. Он включает в себя загрузку конфигурации в FPGA, которая затем начинает вести себя как любая требуемая вам схема. Ни суеты, ни стресса. Его конфигурация на основе ОЗУ означает, что его можно реконфигурировать неограниченное количество раз.
Типы ПЛИС
Существует два основных способа классификации ПЛИС: по их внутреннему расположению блоков или по типу технологии программирования. Когда дело доходит до устройства, ПЛИС попадают в одну из трех категорий:
- Симметричные массивы: эта структура состоит из строк и столбцов связанных логических блоков, окруженных блоками ввода / вывода.
- Архитектура на основе строк: в этой схеме чередуются ряды логических блоков и программируемых ресурсов межсоединения с блоками ввода / вывода по краям.
- Иерархические PLD (программируемые логические устройства): они имеют более сложную структуру. Верхний уровень состоит из логических блоков и межсоединений. Логические блоки содержат логические модули, которые имеют комбинаторные и последовательные функциональные элементы.
Распространенное использование FGPA
Существует множество применений FPGA, которые охватывают широкий спектр областей. Варианты использования включают:
- Обработка видео и изображений.
- Военное применение.
- Программно-конфигурируемое радио.
- Медицинская визуализация.
- Проводная и беспроводная связь.
- Интеграция нескольких простых программируемых логических устройств.
- Распознавание голоса.
- Криптография.
- Цифровая обработка сигналов.
- Прототипирование ASIC.
- Контроллеры устройств.
- Системы эмуляции компьютерного оборудования.
- Биоинформатика.
- Высокопроизводительные вычисления.
- Авиакосмическая промышленность и оборона.
- Прототипирование ASIC.
- Автомобильная промышленность.
- Вещание бытовой электроники.
- Дата-центр медицинский.
- Научные и промышленные приборы.
Преимущества использования FPGA
FPGA предлагает множество преимуществ по сравнению с традиционными реализациями.
Преимущества | Подробности |
---|---|
Интеграция | Чем больше функций в современных ПЛИС (которые включают встроенные процессоры, входы / выходы приемопередатчиков со скоростью 28 Гбит / с или более, блоки ОЗУ, механизмы DSP), тем меньше устройств на печатной плате. Это увеличивает надежность за счет уменьшения количества отказов устройств. |
Гибкость | Функциональность FPGA может изменяться при каждом включении устройства. Это означает, что если инженер-конструктор хочет внести изменение, он может просто загрузить новый файл конфигурации в устройство и опробовать изменение. |
Ускорение | ПЛИС быстрее выводятся на рынок, потому что они продаются «с полки». Благодаря гибкости ПЛИС производители оригинального оборудования могут поставлять системы, как только будет доказано, что их конструкция работает и протестирована. |
Долгосрочная доступность | Использование FPGA дает вам независимость от производителей компонентов, потому что функциональность заключается не в самом модуле, а в его конфигурации. Это программирование может быть выполнено таким образом, что не требует каких-либо настроек на разных ПЛИС. |
Различия между FPGA и ASIC
ASIC (специализированные интегральные схемы) и FPGA имеют разные ценностные предложения. Что отличает FPGA от ASIC, так это тот факт, что FPGA можно перепрограммировать в соответствии с желаемым приложением или функциональными требованиями после производства, тогда как ASIC изготавливается на заказ для конкретных задач проектирования. Эти изменения при перепрограммировании могут происходить в процессе сборки печатной платы или даже после того, как оборудование было отгружено клиентам.
Хотя одноразовые программируемые (OTP) FPGA действительно существуют, доминирующие и наиболее распространенные типы основаны на оперативной памяти, что делает их перепрограммируемыми по мере развития дизайна.
Кроме того, FPGA продаются в готовом виде, в отличие от ASIC, для которых требуются производственные циклы, которые в конечном итоге занимают несколько месяцев.
Производительность и универсальность FPGA
FPGA предлагает превосходные уровни производительности и универсальности, что делает их идеальной технологией для людей и организаций, стремящихся оптимизировать микросхемы или внести изменения в микросхемы для своей рабочей нагрузки.
Прекрасный пример растущего значения FPGA можно найти в области искусственного интеллекта. По мере того как искусственный интеллект продолжает приобретать актуальность, возрастает и важность ПЛИС. В некоторых случаях FGPA превосходят графические процессоры (графические процессоры) в анализе огромных объемов данных для машинного обучения.
Что такое ПЛИС простым языком для начинающих
С чем ассоциируется цифровая электроника? В первую очередь с логическими элементами И, ИЛИ, НЕ. Далее в память приходят сдвиговые регистры, дешифраторы, мультиплексоры и прочее. Однако, по мере роста сложности электронных устройств и тенденции к миниатюризации, создание приборов на базе интегральных микросхем (ИМС) из вышеперечисленных компонентов затруднилось, заказные ИМС нужной топологии и схемотехники оправдывали себя только при крупном тиражировании устройства, в остальных случаях — это было неоправданно дорого.
Выходом из сложившейся ситуации стало развитие программируемых интегральных логических схем (сокращенно — ПЛИС, зарубежная аббревиатура — 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.
Разработчикам, которые работают с ПЛИС доступно графическое программирование. То есть вы можете просто рисовать логические схемы или комбинировать код с графикой. Последнее называют модульным методом разработки, когда конкретные модули прописываются, а верхний модуль, в котором всё объединяется программируется графическим способом.
Подборка полезных статей про микроконтроллеры:
Полезная электроника своими руками, электронные самоделки в Telegram : Практическая электроника на каждый день
Примеры популярных производителей и серий ПЛИС
На момент написания статьи наиболее известными являются изделия двух производителей.
С чего начать изучение FPGA (ПЛИС) ?
В своих статьях я не преследую цели научить вас разрабатывать на FPGA, и сделать из вас крутых разработчиков. Это вы должны сделать сами, имея огромный запас времени, терпения, а главное желания. Своими постами я постараюсь помочь окунуться в эту тему, постараюсь объяснить с чего лучше начать изучение FPGA, и попробую объяснить основы основ. Ну а далее дело за вами.
Внимание! Всё, что мною написано — это бред сумасшедшего это мои личные умозаключения, основанные на собственном опыте, на информации из различных источников, достоверность которых весьма спорная. Поэтому я не несу никакой ответственности за возможный вред, нанесенный вашей тонкой душевной организации, трату вашего бесценного времени. Поэтому пока не поздно закройте этот пост, а потом хорошо промойте глаза, желательно с мылом.
Если вы не вняли моим предупреждениям, и читаете эти строки, значит либо вам реально интересно узнать про FPGA, либо вам совсем делать нечего, что вы читаете этот бред сумасшедшего пост.
Долго думал чего бы мне начать. Поскольку думать это не моё, поэтому буду импровизировать и выкладывать посты, как получиться. Но я постараюсь излагать материал более-менее последовательно, ну а дальше, либо меня заберут санитары, либо улечу в такие минуса, из которых не выбираются самостоятельно. Ну да ладно, будь что будет….
Поскольку я личность крайне ленивая, и мне лень переключать каждый раз раскладку клавиатуры, то зарубежную аббревиатуру FPGA (Field-Programmable Gate Array), что переводиться как Программируемая Полем Вентильная Матрица (ППВМ), я со своей легкой руки заменяю на ПЛИС, что означает Программируемая Логическая Интегральная Схема.
Что же такое ПЛИС, зачем она вообще нужна, когда есть микроконтроллеры, например макетная плата Arduino? Если в вкратце объяснять, то в основе платформы Arduino лежит микроконтроллер, по сути представляющий собой миниатюрный компьютер, имеющий ОЗУ, порты ввода\вывода, набор минимальной периферии, память команд, содержащую инструкции, которые он (контроллер) выполняет, т.е. программу, написанную пользователем, под конкретную архитектуру контроллера.
ПЛИС — это же набор логических элементов, настраивая, и объединяя которые, вы строите цифровую схему, которая выполняет заложенную вами функцию. Уф. Понятно объяснил? Да знаю я, что непонятно! Я сам ничего не понял из своего объяснения, когда прочитал!
Попробую привести пример: представьте, что вам нужно получить от четырех датчиков данные передаваемые по четырем 8 битным шинам. И вычислить среднеарифметическое этих данных, с отбрасыванием дробной части. И делать это надо с максимально возможной скоростью. Допустим наш контроллер, тактируется частотой 10 МГц. Для нахождения среднеарифметического, сначала надо сложить четыре числа. В зависимости от архитектуры контроллера на это уходит от 1 до 5 тактов. Не факт что архитектура контроллера позволяет сложить сразу четыре числа, но допустим, он умеет это делать. Потом сумму этих чисел надо ещё поделить на 4. Надеюсь, вы помните, что деление на числа степени двойки можно заменить сдвигом? Т.е деление на 2 — это сдвиг двоичного числа на 1 разряд вправо, деление на 4 это сдвиг на 2 разряда вправо, деление на 8 это сдвиг на 3 разряда вправо, и.т.д. На контроллере нам, как минимум, придется потратить 1 такт на осуществление этого сдвига. Итого в самом лучшем случае нам потребуется 2 такта машинного времени для нахождения среднеарифметического 4 чисел. Максимальная частота, с которой можно запихивать данные в контроллер составит в самом лучшем случае 5МГц, быстрее контроллер просто не успеет обрабатывать данные.
А если нужно больше? Да не знаю я зачем нужно больше! И вообще не задавайте глупых вопросов! Хочу просто!
Если я хочу больше — я возьму контроллер с большей тактовой частотой. Это разумный подход, когда цена контроллера низкая, и архитектура контроллера позволяет за 2 такта найти среднеарифметическое. Но придется изучать документацию на другой контроллер, скорее всего, переписывать программу. Я думаю, каждый программист контроллеров сталкивался, что для его проекта либо не хватает скорости, либо количества портов.
Как же дела обстоят с ПЛИС? А на ПЛИС мы просто создаём схему, которая будет делать сложение 4 чисел, и сдвигать результат сложения на 2 разряда вправо. И всё это выполнять можно спокойно менее чем за такт, ПЛИС с этим справиться без проблем. Главное сделать правильную схему. Более того, в ПЛИС останется куча места для творчества, и таких вот модулей, которые могут находить среднеарифметическое, можно сделать очень много. И все эти модули будут работать одновременно и независимо друг от друга. Ограничение накладывает лишь количество портов.
Итак — ПЛИС позволяет вести обработку большого количества данных максимально быстро, и одновременно.
За счёт чего это получается? Приведу маленькую, мною придуманную притчу: взялись как-то ПЛИС и контроллер гвозди забивать на скорость. Контроллер взял свой самый большой молоток, оптимизировал свой алгоритм забивания гвоздей на максимальную производительность. И за 1 удар он своим молотком забивал 1 гвоздь. Контроллер смотрит на ПЛИС и ухмыляется. Не догнать его, он работает на пределе, и никто не может его обогнать! На что ПЛИС невозмутимо открывает свой чемоданчик и берет 100 маленьких, невзрачных молоточков, каждый из которых забивает гвоздь за 10 ударов. Видя, как ПЛИС забивает одним молотком гвозди, контроллер просто катается по земле от смеха, так-так она будет забивать гвозди еще миллионы циклов машинного времени, и ей никогда его не догнать. Но, глянув внимательно ещё раз, он увидел, что трудиться то 100 молотков, и постепенно ухмылка контроллера сменяется гримасой отчаяния. Ведь он уже далеко позади. ПЛИС не только догнала контроллер, но и пошла в отрыв, который стремительно увеличивается, и контроллеру за ПЛИС не угнаться !
В чём же дело? Почему контроллер проиграл ПЛИС? А всё дело в том, что, как я уже говорил ранее, контроллер это маленький компьютер, и он выполняет программу, т.е. последовательность операций, заложенную в него программистом. Причем операции выполняются какое-то фиксированное время, которое зависит только от архитектуры контроллера. И это ограничение обойти физически невозможно, поскольку архитектура контроллера – это набор функциональных блоков, которые физически расположены на кремниевой подложке микросхемы. И вы можете только оптимизировать код по критерию минимизации времени выполнения, т.е. написать максимально быструю программу.
На ПЛИС в отличие от контроллера, можно сказать, что нет такого понятия, как архитектура. В ПЛИС есть большая куча. Нет не так! В ПЛИС ОЧЕНЬ большая куча, универсальных логических элементов, которые могут реализовать базовые функции. Например, в ПЛИС Cyclone 3 EP3C10E144C8 таких логических элементов аж 10320 штук
Логический элемент может быть сконфигурирован как D-триггер, может быть мультиплексором, может быть элементом ИЛИ, может быть дешифратором и пр. Объединяя эти логические элементы, которые сконфигурированы на выполнение определённых функций, разработчик постепенно формирует цифровую схему, которая и выполняет возложенные на неё обязанности. Поскольку всю цифровую схему придумывает разработчик сам, он может реализовать арифметические операции так, что они могут выполняться быстрее, чем в контроллере, т.к. в контроллере, все операции вычисления выполняются универсальным элементом – АЛУ (арифметическое логическое устройство), которое умеет делить, складывать, умножать, сдвигать и пр. АЛУ предназначено для всей математики, поэтому одни операции АЛУ выполняет быстрее, а другие медленнее, это зависит от архитектуры контроллера.
На ПЛИС вы сами формируете схему выполнения этих операций. И скорость работы математики будет зависть только от правильности составленной схемы. Более того в ПЛИС, логические ячейки могут работать одновременно, и во власти разработчика реализовывать несколько независимых потоков вычислений. К примеру один модуль делит, второй умножает, третий складывает, четвертый двигает. Задача разработчика — правильно синхронизировать эти параллельные потоки, чтобы схема работала, так как вам надо. Так-же на ПЛИС реально реализовать собственный микроконтроллер, который даже можно программировать как обычный.
Казалось бы если ПЛИС — такая крутая и быстрая штука, то зачем вообще нужны контроллеры? Во-первых — экономическое обоснование. Сравните цены контроллера и ПЛИС, и увидите разницу в цене более чем в 10 раз. Во-вторых — не всегда нужна высокая производительность, которую можно достичь на ПЛИС. Например, вы считываете с датчика температуры показания, и выводите на простенький индикатор. В данной задаче разница в скорости выполнения измерений за 100 тактов на контроллере, или за 1 такт на ПЛИС, на результат почти не влияет, поскольку температура – это очень инертная вещь, которая изменяется бесконечно долго по меркам машинного времени. Зачем покупать дорогую ПЛИС, когда можно купить копеечный контроллер, который прекрасно справиться со своей задачей? Да и запрограммировать контроллер гораздо легче, чем ПЛИС. Ведь вы, наверное, догадались (я на это очень надеюсь), что ПЛИС не выполняет программу , а внутри неё реализуется цифровая схема, придуманная вами. А цифровую схему надо ещё придумать, отладить, протестировать, добиться стабильности, о чём я постараюсь рассказать в следующих постах.
Процесс создания цифровой схемы внутри ПЛИС во многом похож на создание схемы из кучи корпусов микросхем средней степени интеграции, таких как К155 или К555 серии, либо других серий логики. Только очень, и очень быстрой. Не каждый новичок обладает достаточными знаниями, чтобы с ходу взяться рисовать схемы. Ведь написать программу для контроллера и отладить её куда проще, чем нарисовать схему. Да и для работы с ПЛИС надо знать не только цифровую схемотехнику, но и различные интерфейсы. Например, если приёмопередатчик RS232 (COM порт) на большинстве контроллеров «вшит» внутри контроллера и в контроллере его надо правильно сконфигурировать, то на ПЛИС надо его реализовать самостоятельно. Допустимый вариант найти в интернете готовую схему RS232 контроллера для ПЛИС, со всеми багами и глюками оставленные разработчиком…
Именно из-за сложности и времени разработки, высокой цене отладочных плат, и отсутствия задач, где требуется высокая производительность, достигаемая на ПЛИС, она не снискала такой популярности в отличие от контроллеров. В частности небезызвестная платформа Arduino, разобраться с которой может и школьник, за несколько дней. А ведь на ПЛИС ещё и моделировать схему надо, есть куча подводных камней, таких как, пересечение доменов синхрочастоты, метастабильность триггеров, глитчи, синхронизация асинхронного сброса, и прочая лабуда. Вы пока не запоминайте всякие умные слова, потом может быть, я чуть подробнее коснусь этих тем. Это я просто нагнетаю обстановку.
Итак, если ПЛИС дорогая, разработка сложная, и долгая — тогда зачем она нужна? Взять контроллер «пожирнее» и все! А ответ скрывается в моих примерах. В ПЛИС если правильно создать схему, можно добиться производительности в обработке данных, которая контроллерам и не снилась. Более того, в опредёлённом круге задач современные ПЛИС могут дать фору и современным моделям микропроцессоров! ПЛИС крайне выгодно применять, когда скорость вычислений не очень критична, но требуется большое количество портов ввода\вывода, либо одновременность и независимость работы этих портов ввода\вывода. С этим у ПЛИС проблем нет. За счёт параллельности работы, логических ячеек в ПЛИС можно реализовать ряд устройств, работающих независимо друг от друга — и таким образом сэкономить на количество корпусов на печатной плате — что в итоге может существенно снизить стоимость изделий.
Вывод – ПЛИС реализует цифровую схему, заданную разработчиком. Контроллер – выполняет программу написанную программистом. ПЛИС и микроконтроллеры, принципиально разные классы устройств. В одних случаях лучше применять ПЛИС, а в других микроконтроллеры. Каждый случай надо рассматривать отдельно и искать наиболее рациональный вариант. Иногда решающую роль в выборе платформы будет играть срок разработки изделия. К сожалению, по скорости разработки ПЛИС сильно уступает контроллеру. Но у ПЛИС есть ещё одно неявное преимущество перед контроллерами — универсальность знаний. Большинство проектов можно написать практически независимо от серии микросхемы ПЛИС и производителя, с которым в данный момент вы работаете. И сменить производителя и тип ПЛИС можно относительно безболезненно, в отличие от контролеров, где смена типа контроллера подразумевает смену архитектуры, на которую, сильно завязана программа.
Итак, если вы вдруг всё же решитесь взяться за изучение ПЛИС — то начинать надо в первую очередь с основ цифровой схемотехники. После того, как вы познаете тайный смысл слов таких как: счётчик, мультиплексор, компаратор, шифратор, дешифратор, исключающее ИЛИ и прочие умные слова, услышав которые, у вас появлялось стойкое желание спрятаться под кровать и биться в припадке (у меня так и было, честно-честно), необходимо выбрать среду моделирования и софт производителя ПЛИС. Я считаю, что начинать изучать ПЛИС надо с Altera, поскольку их среда разработки — Quartus, крайне проста и удобна в освоении за счёт простого и понятного интерфейса, в отличие от ISE фирмы Xilinx. В принципе, есть и другие производители ПЛИС такие как: Lattice Semiconductor, Actel, но это скорее экзотика, которая не очень походит для изучения ПЛИС.
После выбора среды разработки на ПЛИС, крайне желательно установить среду моделирования Modelsim, производства компании Mentor Graphics. Хотя софт от разработчика ПЛИС и предоставляет инструменты отладки и моделирования схем, однако у них очень ограниченный функционал, да и Quartus от Altera недвусмысленно намекает, что моделируйте схемы в Modelsim. Но на начальном этапе, можно эти намёки игнорировать.
Итак, основы схемотехники вы познали, софт разработки и моделирования установили. Необходимо определиться со способом описания схем в ПЛИС. В настоящее время в основном используется 3 основных способа описания схем на ПЛИС:
Первый – это рисование цифровых схем из элементов, такие как триггеры, счётчики, мультиплексоры и пр. Т.е точно также, как создавали схемы раньше. Например, в САПР Quartus этот способ ещё доступен, но данный способ подходит только для простых схем, поскольку в больших проектах схема становиться не читаемая.
Второй способ – это использовать среду Matlab но, к сожалению, я про этот способ почти ничего не знаю.
И самый продвинутый и удобный способ — описание на языке HDL — hardware description language (Язык описания аппаратуры). На данный момент самые распространённые языки это Verilog и VHDL. Также активно развиваются языки System verilog, System C, про них я говорить не буду, поскольку знаю про них чуть больше чем ничего.
Изначально как Verilog, так и VHDL применялись для описания схем, созданных в схемном виде, и для моделирования этих схем. Но потом умные люди смекнули, что можно эти языки применять и для создания этих схем. И появилось RTL (Register transfer level) подмножество этих языков — уровень регистровых передач. Т.е теперь можно писать программу описывать схему в виде текста, которая средствами САПР будет синтезироваться в схему, на ПЛИС, которая вам нужна. И это оказалось весьма и весьма удобно, именно поэтому текстовый ввод получил наибольшее распространение.
Но из-за того, что основная и первоначальная задача этих языков – это моделирование, появилась жуткая путаница, поскольку часть языковых конструкций применяется для моделирования, а другая часть для синтеза. И часто начинающий разработчик на ПЛИС не читает документацию и стандарты к выбранному HDL языку, и применяет языковые конструкции, которые в реальную схему синтезироваться не могут, и долго не может понять, а почему схема не работает? Появлению этой путаницы немало поспособствовали авторы книг по HDL языкам. Очень многие авторы сначала долго и муторно пишут про подмножество языка, предназначенного для моделирования, а про синтезируемое подмножество пишут только в середине, или посвящают этому несколько глав в конце книги. Получается, что человек прочитал половину книги, а это всё предназначено только для моделирования синтезируемой части языка. А ведь, правда. Кто сразу садиться за моделирование? Чтобы приступить к моделированию, необходимо иметь объект моделирования, т.е. синтезируемую схему. А как её получить читателя не научили.… Более того, правильное написание синтезируемой части языка, основные правила практически не раскрываются в книгах, а если и раскрываются, то очень поверхностно. В итоге получается, что те, кто учиться на примерах, поставляемых фирмой Altera или Xilinx, описывают схемы гораздо лучше, чем те кто учился по книгам, но моделируют хуже.
Я наступил на эти грабли, что в итоге отбило желание читать книги. Язык VHDL, выбранный мной, я изучал на синтезируемых примерах, и только после того, как сделал несколько работающих железяк, и у меня появилось потребность в более быстром и качественном моделировании, чем то, которым я владел на тот момент, и я вернулся к чтению книг. И только после этого, появилось понимание читаемых книг. До этого была каша в голове.
В дальнейшем, если я продолжу писать посты, я буду везде давать примеры на языке VHDL, которым владею. Посоветовать выбрать какой-то конкретный язык описания: Verilog или VHDL я не могу. Причина в том, что каждый язык имеет преимущества и недостатки. Холивары на эту тему идут до сих пор. Но в любом варианте язык – это инструмент. Посмотрите примеры описаний на языках HDL в интернете, и выберете тот, который вам нравиться внешне, большего посоветовать не могу.
Итак, давайте подведём краткие итоги всего написанного мной:
1. ПЛИС штука нужная, быстрая, и дорогая. И применять её надо там, где она реально нужна. И выбор «ПЛИС или микроконтроллер» зависит в первую очередь от класса задачи, срока реализации.
2. Изучение ПЛИС надо начинать с основ схемотехники, поскольку в отличие от микроконтроллера, управляемого программой, внутри ПЛИС описывается цифровая схема, со всеми вытекающими последствиями.
3. Для начального обучения разработки на ПЛИС достаточно установить среду моделирования, или среду разработки. На начальном этапе отладочная плата не нужна, поскольку работу схемы можно смоделировать.
4. Книги, безусловно, нужны, но книги не панацея, и лучшее понимание синтезируемой части языка дадут примеры, которые выкладывают в свободный доступ разработчики ПЛИС, в частности Altera и Xilinx. Практика и ещё раз практика.
5. Начать изучение ПЛИС лучше всего с написания простейших логических элементов, таких как, мультиплексор, триггер, счётчик, и пр. И постепенно наращивать сложность схем, параллельно читая книги, и осваивая новые языковые конструкции, и самое главное, понимая, во что они реально синтезируются внутри ПЛИС.