Главная » Микроконтроллеры
Призовой фонд
на октябрь 2020 г.
1. 1500 руб
Сайт Паяльник
2. Тестер компонентов MG328
Сайт Паяльник
3. 150 руб.
От пользователей


Паяльный фен с функцией автоматического отключения на подставке

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Теги:

Опубликована: 0 2
Я собрал 0 Участие в конкурсе 0
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 0 Проголосовало: 0 чел.

Комментарии (20) | Я собрал (0) | Подписаться

0
Публикатор #
На форуме автоматически создана тема для обсуждения статьи.
Ответить
0
Gauss #
Если уж VHDL или Verilog, то нужно было и начинать хотя бы с синтаксиса, краткого описания языков, структуры программы, а то получается, что вроде как бы с нуля про плис, но не знаем VHDL или Verilog, на которых примеры и разжевывания, а зная VHDL или Verilog особо нет смысла в изучении статьи. Может я и не прав, но так логичней с моей точки зрения
Ответить
0

[Автор]
sboldenko #
Может быть Вы и правы, но статья ориентирована на людей, которые никогда не имели дело с ПЛИС и не знают никакого языка, и вроде бы и хотели начать работать с данной БИС, но в силу того что нет простых исчерпывающих статей в стиле "как понять с чего начать изучать ПЛИС", не хотят/не могут/боятся подступаться к этому делу. А так я рассмотрел банальное сложение, не нужно знать язык, чтобы понять что происходит в коде. Не все знают VHDL и не все знают Verilog, не хотелось опираться именно на язык.
Ответить
0
Gauss #
Язык основа, без которой понимать процессы в коде нереально, особенно не зная вообще никакого языка (зная хотя бы Си, и то будет много вопросов, потому что идет привязка к процессам самой плис и специфике VHDL или Verilog). Может быть правильнее было бы просто в процессе рассмотрения простых операций описывать и сам язык, сделав предварительно описание его основ. Язык будет фундаментом работы с плис, а без фундамента прочные знания не построить.
Ответить
0

[Автор]
sboldenko #
В самом начале этой статьи я указал на свою предыдущую статью (Внутреннее устройство ПЛИС), где рассмотрел на аппаратном уровне специфику выполнения кода на ПЛИС без углубленного рассмотрения синхронностей и асинхронностей. И да, насчет того что язык это основа я не согласен, извините, но основа это алгоритмы. Зная алгоритм можно перенести программу с языка который не знаешь, на известный язык. Осциллограммы прикрепленные к статье вполне себе могут считаться неким алгоритмом записанным в виде длительностей сигналов. В любом случае спасибо Вам за обоснованную критику. Я не волшебник, я только учусь (писать статьи).
Отредактирован 12.02.2017 13:05
Ответить
0
Vascom #
Хотел скопировать код, а это оказались картинки. Нехорошо.
Код должен быть доступен для копирования.
P.S. Некоторые редакторы умеют сохранять подсветку синтаксиса в виде HTML или другой разметки.
Ответить
0
Стальной #
Явно описание языка пропущено. Не рассказано про разницу сигнала,провода, что такое вход-выход...
Ответить
0

[Автор]
sboldenko #
Эммм, в чем разница между сигналом и проводом? Да и как описать что такое вход/выход, когда вход это вход, а выход это выход? Суть статьи не в описании языка, а в том, чтобы показать КАК процессы выполняются синхронно или асинхронно на аппаратном уровне.
Ответить
0
Стальной #
Между проводом и регистром, конечно.
Вот я , например, едва сталкивался с ПЛИС, и мне не понятно, как выбрать ПЛИС и память, бластер, как это зашить. И нигде нет такой инфы. В отличие от МК. Даже даташитов разверныутых нет, все сводится к таким вот учебным урокам теории или раборты на готовых отладочных платах.
Ответить
0
Vascom #
ПЛИС всё же более дорогое и сложное устройство (для программиста), чем микроконтроллер. С ним несколько сложнее работать. Однако на сайтах Xilinx и Altera (Intel) в свободном доступе исчерпывающая информация по работе с ними, программированию, заливке прошивки, разводке печатной платы под них и т.д.
МК - это как лопатка и куличики в песочнице, а ПЛИС - как экскаватор и серьёзная стройка.
Ответить
0

[Автор]
sboldenko #
Многих смущает, что если на микроконтроллер один PDF, то для ПЛИС даташит разбивается на 20 PDF по 200-300 страниц и им просто лень читать.
Ответить
0
Vascom #
Тут ни чего не поделаешь. ПЛИС предоставляет гораздо большие возможности и требует некоторых дополнительных усилий.
Также у ПЛИС несколько другая ниша, это не аналог, не замена МК.
Ответить
0
Стальной #
Я работаю с STM, и там даже не пахнет одним файликом. Минимум надо 2 прочитать, а так их с десяток.
Ответить
0
Стальной #
Пока инфу найдешь - ногу сломишь! Но я несколько про другое говорю - про МК море русскоязычной инфы, про плис нет. А на английском искать несколько утомительно.
Ответить
0
Vascom #
В радиоэлектронике без технического английского ни куда. Лучше один раз подучить язык, чем искать крохи информации на русском.
Ответить
0
Стальной #
Я свободно разговариваю на английском, но всё равно при работе с документами утомляет.
Ответить
0

[Автор]
sboldenko #
Я Вас уверяю, что далее в цикле я опишу все стадии разработки под ПЛИС, у меня есть план и я его придерживаюсь. Что касается "провода" и регистра, то тут как бы то, что Вы называете регистром вполне себе может оказаться шиной данных, т.е. совокупностью "проводов", так что назначение зависит от контекста, и вот как раз чтобы не утонуть во всех тонкостях и понятиях ПЛИС, я разбиваю материал на маленькие и простые статьи. В любом случае, Ваши пожелания учтены, спасибо за комментарий.
Ответить
0
Стальной #
Я имел в виду, что регистр умеет хранить данные, а провод только передаёт.
Ответить
0
Геннадий #
Здравствуйте. Для начала можно бы описать на VHDL и Verilog верхнюю схемку. Это было бы весьма доходчиво и дало бы немного понимания в механизме написания кода
Ответить
0

[Автор]
sboldenko #
К сожалению, верхняя схемка выполнена в асинхронном стиле, а целью данной статьи являлось показать, что в ПЛИС есть асинхронные и асинхронные процессы, следовательно аспект синхронности по этому изображению не раскрыть. Более полно раскрыть механику создания дизайна для ПЛИС я постарался в этой статье.
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическая мощность?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Pickit 2 - USB-программатор PIC-микроконтроллеров
Pickit 2 - USB-программатор PIC-микроконтроллеров
Мультиметр Mastech MS8268 Осциллограф DSO138
вверх