Изучение плис. Программируемые логические интегральные схемы (плис)

6. ПРОГРАММИРУЕМЫЕ ЛОГИЧЕСКИЕ ИНТЕГРАЛЬНЫЕ СХЕМЫ (ПЛИС)

Программируемая логическая интегральная схема (ПЛИС, Programmable Logic Device, PLD) - электронный компонент,

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

История развития ПЛИС начинается с программируемых постоянных запоминающих устройств (PROM – Programmable Read Only Memory). Первое время PROM использовались исключительно для хранения данных, позже их стали применять для реализации логических функций. Для реализации систем булевых функций с большим числом переменных были разработаны программируемые логические массивы ПЛМ (PLA – Programmable Logic Array) – наиболее традиционный тип ПЛИС, имеющий программируемые матрицы «И» и «ИЛИ». Примерами таких ПЛИС могут служить отечественные схемы K556PT1, PT2, PT21.

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

Рис. 6.1. Схема построения PLA

Недостаток такой архитектуры - слабое использование ресурсов программируемой матрицы «ИЛИ», поэтому дальнейшее развитие получили микросхемы, построенные по архитектуре программируемой матричной логики (PAL - Programmable Array Logic) - это ПЛИС, имеющие программируемую матрицу «И» и фиксированную матрицу «ИЛИ» (рис. 6.2). К этому классу относятся большинство современных ПЛИС небольшой степени интеграции. В качестве примеров можно привести отечественные ИС КМ1556ХП4, ХП6, ХП8, ХЛ8, ранние разработки (середина-конец 1980-х годов) ПЛИС фирм INTEL, ALTERA, AMD, LATTICE и др.

Рис. 6.2. Схема построения PAL

Совершенствование ПЛИС привело к появлению программируемой макрологики. Они содержат единственную программируемую матрицу «И- НЕ» или «ИЛИ-НЕ», но за счёт многочисленных инверсных обратных связей способны формировать сложные логические функции. К этому классу относятся, например, ПЛИС PLHS501 и PLHS502 фирмы SIGNETICS, имеющие матрицу «И-НЕ», а также схема XL78C800 фирмы EXEL, основанная на матрице «ИЛИ-НЕ».

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

Дальнейшее усовершенствование технологии производства привело к возможности реализации на одном кристалле нескольких PAL, объединенных программируемыми соединениями. Подобные архитектуры получили название сложных (комплексных) программируемых логических

ПРОГРАММИРУЕМЫЕ ЛОГИЧЕСКИЕ

ИНТЕГРАЛЬНЫЕ CХЕМЫ

устройств (CPLD – Complex Programmable Logic Device) – это ПЛИС,

Рис. 6.3. Схема макроячейки CPLD

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

К этому классу относятся ПЛИС семейства MAX фирмы ALTERA, семейства XC9500 и CoolRunner фирмы XILINX, а также большое число микросхем других производителей (Atmel, Vantis, Lucent и др.).

Другой тип архитектуры ПЛИС – программируемые вентильные матрицы (FPGA – Field Programmable Gate Array Logic), состоящие из конфигурируемых логических блоков (КЛБ) и коммутирующих путей – программируемых матриц соединений (рис. 6.4). Конфигурируемые логические блоки таких ПЛИС состоят из одного или нескольких относительно простых логических элементов, в основе которых лежит таблица перекодировки (LUT – Look-up table), программируемые мультиплексоры, триггер, а также цепи управления. Характерными для FPGA-архитектур являются блоки ввода/вывода (IOB – input/output blocks),

позволяющие реализовать двунаправленный ввод/вывод, третье состояние и т. п.

Рис. 6.4. Структура FPGA

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

К FPGA классу относятся ПЛИС семейства Spartan, Virtex фирмы

XILINX; Fusion, M1 и M7 Fusion и др. фирмы ACTEL, а также семейства Cyclone, Stratix фирмы ALTERA, ПЛИС фирм Atmel и Vantis.

6.1. Особенности программирования ПЛИС

Конфигурационные данные для CPLD хранятся в энергонезависимой памяти внутри ПЛИС, поэтому нет необходимости их

ЦИФРОВЫЕ УСТРОЙСТВА И МИКРОПРОЦЕССОРЫ. ЧАСТЬ 2

ПРОГРАММИРУЕМЫЕ ЛОГИЧЕСКИЕ

ИНТЕГРАЛЬНЫЕ CХЕМЫ

перепрограммировать при включении. Программа для конфигурации FPGA хранится в распределённой энергозависимой оперативной памяти микросхемы, которая при выключении питания стирается, поэтому файл конфигурации хранится во внешней памяти, и при включении питания файл конфигурации загружается в память ПЛИС. Для хранения файла конфигурации используются, как правило, перепрограммируемое ПЗУ

(EPRM, EEPROM или FLASH).

При работе в подобных системах конфигурация схемы, которая должна быть получена «внутри» ПЛИС или алгоритм ее работы задается либо на текстовом языке описаний: VDHL (V ery high speed integrated circuitsH ardwareD escriptionL anguage – язык описания аппаратуры высокоскоростных интегральных схем), Verilog, ADHL (A lteraH ardwareD escriptionL anguage), напоминающем язык программирования высокого уровня (например Си); либо в графическом редакторе (в виде электрической схемы); либо при помощи блок-схем алгоритмов или графа состояний. Далее, все этапы работы, включая программирование или загрузку ПЛИС, выполняет автоматизированная система проектирования. Такие системы выпускают как все ведущие производители ПЛИС

(www.actel.com) ACTEL, (www.altera.com) ALTERA, (www.xilinx.com) XILINX, так и другие компании.

7. ЦИФРО-АНАЛОГОВЫЕ И

7.1 Принципы построения цифро-аналоговых преобразователей

Цифро-аналоговый преобразователь (ЦАП) представляет собой устройство для преобразования числовых кодов в эквивалентные им значения напряжения или тока. Схемы ЦАП строятся с использованием как цифровых, так и аналоговых элементов (операционных усилителей, ключей, резистивных матриц и т.п.). Большинство ЦАП, выполненных в виде интегральных схем, представляют собой устройства параллельного типа. Их работа основана на суммировании токов, величины которых пропорциональны весовым коэффициентам разрядов входного кода.

Схема 4-разрядного ЦАП приведена на рис. 7.1.

Рис. 7.1. Принцип построения схемы ЦАП

Она включает в себя резистивную матрицу, источник опорного напряжения U R , операционный усилитель и переключателиS 0 − S 3 .

Сопротивления резисторов матрицы таковы, что протекающие через резисторы токи соответствуют весовым коэффициентам разрядов числа

D = d 3 d 2 d 1 d 0 . Положение контактов переключателей зависит от значенийd i . Еслиd i = 0 , то ток, протекающий через резистор матрицы под действием опорного напряженияU R , замыкается на общий провод.

При d i = 1 ток резистора черезS i . течет к схеме суммирования

токов, выполненной на операционном усилителе с параллельной обратной связью по напряжению. Узел суммирования имеет практически нулевой

ЦИФРОВЫЕ УСТРОЙСТВА И МИКРОПРОЦЕССОРЫ. ЧАСТЬ 2

ЦИФРО-АНАЛОГОВЫЕ И

АНАЛОГО-ЦИФРОВЫЕ ПРЕОБРАЗОВАТЕЛИ

потенциал относительно общего провода, поэтому выходное напряжение можно записать следующим образом:

U 0= − R R 0 U R (2 3 d 3+ 2 2 d 2+ 2 1 d 1+ 2 0 d 0) .

Для увеличения разрядности ЦАП необходимо добавить соответствующее количество резисторов и переключателей.

Изготовление высокоточных резисторов для матриц сопряжено с трудностями, особенно в случае многоразрядных ЦАП (значения сопротивлений резисторов находятся в широком диапазоне - от R до

R 2 n − 1 , но требования к абсолютной точности установления

сопротивлений одинаковы для всех резисторов). Поэтому часто используют матрицу сопротивлений типа R − 2R (рис. 7.2).

Рис. 7.2. ЦАП с матрицей типа R – 2R

Весовые коэффициенты ступеней задаются последовательным делением опорного напряжения. Коэффициент ослабления каждой ступени матрицы равен двум. Выходное напряжение ЦАП равно:

U 0=− 16 R 0 R U R (2 3 d 3+ 2 2 d 2+ 2 1 d 1+ 2 0 d 0) .

В качестве электронных переключателей в схемах ЦАП часто используют МОП-транзисторы (рис.7.3). Находят применение также токовые ключи на биполярных транзисторах.

Рис. 7.3. 4-разрядный ЦАП:

а – фрагмент схемы с МОП-ключами, б – УГО

Примеры ИС:

К572ПА1 - 10-разрядный ЦАП. ИС содержит прецизионную матрицу типаR − 2R , ключи на МОП-транзисторах, входные усилителиинверторы, а также резистор для цепи обратной связи операционного усилителя. Для преобразования суммарного тока в напряжение необходимо подключение операционного усилителя. Требуется также внешний источник опорного напряжения.

ЦИФРОВЫЕ УСТРОЙСТВА И МИКРОПРОЦЕССОРЫ. ЧАСТЬ 2

ЦИФРО-АНАЛОГОВЫЕ И

АНАЛОГО-ЦИФРОВЫЕ ПРЕОБРАЗОВАТЕЛИ

7.2. Принципы построения аналого-цифровых преобразователей

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

По способу преобразования можно разделить АЦП на параллельные

и последовательные.

В параллельных АЦП входное напряжение одновременно сравнивается со всеми пороговыми уровнями шкалы квантования (рис. В.1. ). В результате сравнения находится ближайший уровень квантования, номер которого с помощью шифратора выражается в двоичном коде. Схема, представляющая собой 3-разрядный параллельный АЦП, показана на рис. 7.4. Источник опорного напряжения и набор резисторов позволяют сформировать напряжения, равные пороговым уровням.

Опорное напряжение в (2n -1) = 7 раз превышает значение шага квантованияU S . Если, например, входное напряжение находится в

диапазон от (4+ 1 2 ) U S до,(5+ 1 2 ) U S оно должно быть представлено

уровнем квантования, равным 5U S , и, соответственно, двоичным кодом 101. Формирование выходного кода происходит следующим образом. При заданном значенииU I на выходах шести компараторов устанавливаются

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

примере это X 5 ).

Рис. 7.4. Параллельный АЦП: а – схема, б - УГО

Пример ИС :

К1107ПВ1 - 6-разрядный параллельный АЦП. ИС изготавливается по биполярной технологии. Максимальная частота дискретизации - 20 МГц.

В последовательных АЦП входное напряжение последовательно уравновешивается набором (суммой) эталонов, значения которых кратны шагу квантования. Разновидностью таких преобразователей является АЦП

ЦИФРОВЫЕ УСТРОЙСТВА И МИКРОПРОЦЕССОРЫ. ЧАСТЬ 2

ЦИФРО-АНАЛОГОВЫЕ И

АНАЛОГО-ЦИФРОВЫЕ ПРЕОБРАЗОВАТЕЛИ

последовательного счета. Его работа основана на подсчете числа суммирований шага квантования, необходимого для получения значения входного напряжения. Схема АЦП последовательного счета показана на рис. 7.5. Она состоит из n -разрядного реверсивного счетчика, компаратора иn -разрядного цифро-аналогового преобразователя, включенного в цепи обратной связи.

Рис. 7.5. АЦП последовательного счета

С помощью компаратора сравниваются входное напряжение U I и выходное напряжение ЦАПU O . ЕслиU I > U O , то на выходе компаратора единичный уровень и счетчик работает в режиме суммирования тактовых импульсовC . Благодаря этому напряжениеU O стремится кU I . Когда они сравниваются,n -разрядный выходной кодD будет представлять входное напряжение АЦП. ЕслиU I < U O то счетчик работает в вычитающем режиме. Таким образом, напряжениеU O , а следовательно, и выходной код, отслеживают выходное напряжениеU I Для того, чтобы

предотвратить колебания сигнала реверсирования U /D после завершения процесса отслеживания, можно дополнить схему АЦП устройством

блокировки счетчика при U I − U O < U S 2 .

Схема АЦП, показанного на рис. 7.5, очень проста. Но при скачках входного напряжения процесс отслеживания может занять до 2n тактов (периодов импульсовC ). Ускорение преобразования достигается в АЦП поразрядного взвешивания. Его схема похожа на схему рис. 7.5, только счетчик заменяется регистром с устройством управления. Работа АЦП поразрядного взвешивания происходит следующим образом. Сначала все разряды регистра устанавливаются в нулевое состояние. Затем в старший разряд регистра вводится 1. При этом на выходе ЦАП

устанавливается напряжение U O = 2n − 1 U S , равное половине всего2 n − 2) ,

то d n − 2 = 1

Если нет,

d n − 2 = 0 .

После n

этапов процесс уравновешивания заканчивается и на выходе регистра устанавливается кодовая комбинация, представляющая входное напряжение АЦП. Для того, чтобы во время преобразования напряжение

U I не изменялось, на входы компаратора ставится схема выборкихранения.

Известны и другие последовательные АЦП, например, АЦП, работающие по методу интегрирования.

Примеры ИС :

К572ПВ1 - 12-разрядный АЦП поразрядного взвешивания. ИС изготавливается по КМОП-технологии. Используется с внешним операционными усилителями и источником опорного напряжения. Типовое время преобразования - 110 мксек.

К1113ПВ1 - 10-разрядный АЦП поразрядного взвешивания. ИС изготавливается по биполярной технологии и содержит все функциональные узлы АЦП, включая источник опорного напряжения и генератор тактовых импульсов. Выходные каскады выполнены по схеме с тремя состояниями. Время преобразования - не более 30 мксек.

Сопоставляя параллельные и последовательные АЦП, можно отметить следующее. Параллельные АЦП являются схемами быстродействующими, но их реализация требует больших аппаратурных затрат (6-разрядный АЦП содержит 64 компаратора). АЦП последовательного счета имеют самую простую схему, но работают сравнительно с низкочастотными напряжениями. АЦП поразрядного взвешивания занимают по показателям сложности и быстродействию промежуточное положение. Сочетание схем параллельных и последовательных АЦП позволяет построить большое число вариантов преобразователей с различными параметрами и разнообразными функциональными возможностями.

ЦИФРОВЫЕ УСТРОЙСТВА И МИКРОПРОЦЕССОРЫ. ЧАСТЬ 2

ЛИТЕРАТУРА

ЛИТЕРАТУРА

1. Гласман К.Ф., Покопцева М.Н. Цифровые устройства и микропроцессоры. Учебное пособие для студентов специальности 210312 «Аудиовизуальная техника». Часть 1. – СПб.: СПбГУКиТ, 2008.

2. Новиков Ю.В. Основы цифровой схемотехники. Базовые элементы и схемы. Методы проектирования. – М.: Мир, 2001.

3. Новиков Ю., Скоробогатов П. Основы микропроцессорной техники: Курс лекций. – М.: ИНТУИТ.РУ, 2003.

4. Белов А. Самоучитель по микропроцессорной технике. – М.: Наука и техника, 2003.

5. Новожилов О.П. Основы цифровой техники: Учебное пособие. – М.: Радио Софт, 2004.

6. Угрюмов Е. Цифровая схемотехника от логического элемента до перспективных БИС/СБИС с программируемыми структурами. – СПб.: БХВ – Петербург, 2004.

7. Бойко В. Схемотехника электронных систем. Цифровые устройства.

– СПб.: БХВ – Петербург, 2004.

8. Бойко В. Схемотехника электронных систем. Микропроцессоры и микроконтроллеры. – БХВ – Петербург, 2004.

9. Нарышкин А.К. Цифровые устройства и микропроцессоры. – М.: Изд. центр «Академия», 2004.

10. Уилкинсон Б. Основы проектирования цифровых схем. – Киев.: Вильямс, 2004.

11. Фрике К. Вводный курс цифровой электроники. – М.: Техносфера, 2004.

12. Опадчий Ю.А. Аналоговая и цифровая электроника. Учебник для ВУЗов. – М.: Горячая линия – Телеком, 2005.

13. Точчи Р. Уидмер Н. Цифровые системы. Теория и практика. – Киев.: Вильямс, 2004.

14. Алексеева Л.А., Буль М.П., Гласман К.Ф., Покопцева М.Н.. Методические указания по выполнению лабораторных работ для студентов специальности 201400 «Аудиовизуальная техника» по курсу «Цифровые устройства и микропроцессоры». – СПб.: СПбГУКиТ, 2002.

Altera-Cyclone and Arduino

Суть вопроса. Разница между ПЛИС и микроконтроллером

Каждый начинающий микропрогер на определенном этапе своего развития задается вопросом в чем же разница между ПЛИС (фирм Altera или Xilinx) и микроконтроллером (микропроцессором)?

Читаешь форумы — знатоки дела пишут, что это совершенно разные вещи, которые нельзя сравнить, аргументируя это тем, что у них разная архитектура . Читаешь мануал по Verilog или C++ — и тот и другой используют похожие операторы со схожим функционалом, даже синтаксис похож, а почему разные? Заходишь на марсоход — там светодиодами (или даже просто лампочками) с помощью FPGA моргают, смотришь проекты на Arduino — там роботами управляют. СтОп!

А вот теперь остановимся и спросим себя: почему с ПЛИС — тупо лампочка, а Ардуино — умно робот? Ведь и первый и второй вроде как программируемое устройство, неужели у ПЛИС возможностей для робота не хватает?

В какой-то степени суть вопроса «В чем разница между ПЛИС и микроконтроллером ?» раскрывается именно на таком примере.

Отметим сразу. Функционал ПЛИС изначально не уступает микроконтроллеру (и микропроцессору, кстати, тоже), точнее — основные функции у одного и второго по сути идентичны — выдавать логические 0 или 1 при определенных условиях, а если говорить о быстродействии, количестве выводов(ножек) и возможностях конвейерной обработки, то микроконтроллеру до ПЛИС а вообще далеко. Но есть одно «но». Время на разработку одного и того же программного алгоритма на двух разных устройствах (ПЛИС и микроконтроллер ) различается в разы, а то и в десятки раз. Именно ПЛИС здесь в 99% случаев сильно уступает МК. И дело вовсе не в замороченности языков Verilog , VHDL или AHDL , а в устройстве самой ПЛИС .

О взаимодействии программного языка с архитектурой ПЛИС и микроконтроллера

FPGA : в ПЛИС и нет сложных автоматизированных цепочек(делающих часть работы за вас). Есть только железные проводные трассы и магистрали, входы, выходы, логические блоки и блоки памяти. Среди трасс есть особый класс — трасса для тактирования(привязанная к определенным ножкам, через которые рекомендуется проводить тактовую частоту).

Основной состав:

Трасса — металл, напаянный на слои микросхемы, является проводником электричества между блоками.

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

Ячейки — группы от нескольких единиц до нескольких десятков транзисторов.

Транзистор — основной элемент ТТЛ логики.

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

Тактовый генератор — внешняя микросхема, вырабатывающая тактовые импульсы, на которых основывается большая часть работы ПЛИС .

Архитектура ПЛИС. Взаимосвязь составляющих элементов

Трассы подключаются к блокам с помощью специальных КМОП-транзисторов. Эти транзисторы способны сохранять свое состояние(открытое или закрытое) на протяжении длительного периода времени. Изменяется состояние транзистора при подаче сигнала по определенной трассе, которая используется только при программировании ПЛИС . Т.е., в момент прошивки осуществляется именно подача напряжения на некоторый набор КМОП-транзисторов. Этот набор определяется прошивочной программой. Таким образом происходит сложное построение огромной сети трасс и магистралей внутри ПЛИС , связывающей сложным образом между собой огромное количество логических блоков. В программе вы описываете какой именно алгоритм нужно выполнять, а прошивка соединяет между собой элементы, выполняющие функции, которые вы описываете в программе. Сигналы бегают по трассе от блока к блоку. А сложный маршрут задается программой.

Архитектура ПЛИС (FPGA)

Архитектура Микроконтроллера

В этом элементе ТТЛ логики все операции по обработкам отдельных сигнальчиков проводятся независимо от вас. Вы лишь указываете что делать с тем или иным набором принятых сигналов и куда выдавать те сигналы, которые нужно передать. Архитектура микроконтроллера состоит совсем из других блоков, нежели ПЛИС . И связи между блоками осуществляются по постоянным магистралям(а не перепрошиваемым). Среди блоков МК можно выделить основные:

Постоянная память (ПЗУ) — память, в которой хранится ваша программа. В нее входят алгоритмы действий и константы. А так же библиотеки(наборы) команд и алгоритмов.

Оперативная память (ОЗУ) — память, используемая микроконтроллером для временного хранения данных(как триггеры в ПЛИС ). Например, при вычислении в несколько действий. Допустим, нужно умножить первое пришедшее число на второе(1-е действие), затем третье на четвертое(2 действие) и сложить результат(3 действие). В оперативную память при этом занесется результат 1 действия на время выполнения второго, затем внесется результат 2 действия. А затем оба этих результата пойдут из оперативной памяти на вычисление 3 действия.

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

Средства (порты) ввода-вывода и последовательные порты ввода-вывода — ножки микроконтроллера , предназначенные для взаимодействия с внешним миром.

Таймеры — блоки, предназначенные для подсчета количества циклов при выполнении алгоритмов.

Контроллер шины — блок, контролирующий обмен между всем блоками в микроконтроллере . Он обрабатывает запросы, посылает управляющие команды, организовывает и упорядочивает общение внутри кристалла.

Контроллер прерываний — блок, принимающий запросы на прерывание от внешних устройств. Запрос на прерывание — сигнал от внешнего устройства, информирующий о том, что ему необходимо совершить обмен какой-либо информацией с микроконтроллером .

Внутренние магистрали — трассы, проложенные внутри микроконтроллера для информационного обмена между блоками.

Тактовый генератор — внешняя микросхема, вырабатывающая тактовые импульсы, на которых основывается вся работа микроконтроллера .

Взаимосвязь составляющих блоков микроконтроллера

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

Основное отличие ПЛИС и микроконтроллера

ПЛИС прошивается на уровне железа, практически по всей площади кристалла. Сигналы проходят через сложные цепочки транзисторов. Микропроцессор же прошивается на уровне программы для железа, сигналы проходят группами, от блока к блоку — от памяти к процессору, к оперативной памяти, от оперативной к процессору, от процессору к портам ввода-вывода, от портов ввода-вывода к оперативной памяти, от оперативной памяти… и так далее. Вывод: за счет архитектуры ПЛИС выигрывает в быстродействии и более широких возможностях конвеерной обработки, МК выигрывает в простоте написания алгоритмов. За счет более простого способа описания программ, фантазия разработчика Микроконтроллера менее скованна временем на отладку и разработку, и, таким образом, время на программирование того же робота на МК и ПЛИС будет отличаться во многие и многие разы. Однако робот, работающий на ПЛИС будет гораздо шустрее, точнее и проворнее.

Железо и программа.

В ПЛИС всю работу нужно делать самому, вручную: для того, чтобы реализовать какую-либо программу на ПЛИС , нужно отследить каждый сигнальчик по каждому проводку, приходящему в ПЛИС , расположить какие-то сигнальчики в ячейки памяти, позаботиться о том, чтобы в нужный момент именно к этим ячейкам памяти обратился другой сигнальчик, который вы так же отслеживаете или даже генерируете, и в итоге набор сигнальчиков, задержанный в памяти задействовал нужный вам сигнальчик, который, например, пойдет на определенную выходную ножку и включит светодиодик, который к ней подключен. Часть сигнальчиков идет не в память, а например на запуск определенной части алгоритма(программы). То есть, говоря языком микропрогера, эти ножки являются адресными. Например, имеем на нашей плате в нашей программе три адресные ножки для включения неких не связанных(или связанных) друг с другом алгоритмов, которые мы реализовали на языке Verilog в ПЛИС . Также в программе, кроме трех адресных ножек, у нас есть еще например 20 информационных ножек, по которым приходит набор входных сигнальчиков(например с разных датчиков) с какой-либо информацией (например температура воды в аквариуме с датчика температуры воды в аквариуме). 20 ножек = 20 бит. 3 ножки -3 бита. Когда приходит адресный сигнал 001(с трех ножек адреса) — запускаем первый алгоритм, который записывает 20 информационных сигнальчиков в 20 ячеек памяти(20 триггеров), затем следующие 20 сигнальчиков умножаем на полученные ранее 20, а результат умножения записываем в память, а потом отсылаем по другим ножкам например в терморегулятор воды в аквариуме. Но Отошлем мы этот результат только тогда, когда на наши адресные ножки придет код например 011 и запустит алгоритм считывания и передачи. Ну, естественно «отсылаем», «считываем» и еще что-то прописываем в ручную. Ведем каждый сигнальчик в каждый такт работы ПЛИС по определенному пути, не теряем. Обрабатываем или записываем. Складываем или умножаем. Не забываем записать. Не забываем принять следующий сигнал и записать в другие триггеры. Еще добавьте сюда работу, привязанную к тактовой частоте, синхронизацию (которая так же реализуется вручную), неизбежные ошибки на этапах разработки и отладки и кучу других проблем, которые в данной статье рассматривать просто бессмысленно. Трудно. Долго. Но зато на выходе работает супер оперативно, без глюков и тормозов. Железно!

Теперь микроконтроллер . 20 ножек на прием информации — для большинства микроконтроллеров физически невозможная задача. А вот 8 или 16 — да пожалуйста! 3 информационных — в легкую! Программа? По адресу 001 умножить первое пришедшее число на второе, по адресу 011 отсылай результат в терморегулятор. Все! Быстро. Легко. Не супер, но оперативно. Если очень грамотно написать программу- без глюков и тормозов. Программно!

Железо и Программа! Вот главное отличие между ПЛИС и Микроконтроллером .

В микроконтроллере большинство замороченных, но часто используемых алгоритмов уже вшиты железо(в кристалл). Нужно лишь вызвать программным способом нужную библиотеку, в которой этот алгоритм хранится, назвать его по имени и он будет делать всю грязную работу за вас. С одной стороны это удобно, требует меньшего количества знаний о внутреннем устройстве микросхемы. Микрик берет на себя заботу об отслеживании принятых, генерируемых и результирующих сигналов, об их складировании, обработке, задержке. Все делает сам. В большинстве микропрогерских задач это то, что нужно. Но если безграмотно использовать все эти удобства, то возникает вероятность некорректной работы. Железо и Программа!

Заключение

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

По характеристикам выдаваемого сигнала, ПЛИС чаще всего рассчитана на 3,3В, 20мА, Микроконтроллер на 5В, 20мА.

Под микроконтроллер AVR, успешно внедренный в платформу Arduino, написано множество открытых программ, разработано великое множество примочек в виде датчиков, двигателей, мониторчиков, да всего, чего только душе угодно! Arduino в настоящее время больше похож на игровой конструктор для детей и взрослых. Однако не стоит забывать, что ядро этого конструктора управляет «умными домами», современной бытовой электроникой, техникой, автомобилями, самолетами, оружием и даже космическими аппаратами. Несомненно, такой конструктор будет являться одним из лучших подарков для любого представителя сильной половины человечества.

В принципе, все просто!

Остались вопросы? Напишите комментарий. Мы ответим и поможем разобраться =)

Начну свою первую статью с того, что сообщу: в предмете статьи я сам новичок, но выбрал именно такую тему. Объясню почему. Читаю хабр уже достаточно долго и мне всегда были интересны топики тех, кто сам в настоящий момент изучает то, о чем повествует. Такие статьи всегда понятны, всегда находят свою аудиторию и всегда предают читающему интерес и энтузиазм автора, который у новичков в любой области обычно зашкаливает!

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

С назначением разобрались, вопрос – как? Внутри ПЛИС находятся некие базовые элементы, которые соединяются на основе конфигурационной записи. Возможные базовые элементы, вид и место хранения конфигурационной записи зависят от вида ПЛИС и от конкретной модели. В современных ПЛИС выделяют два вида: CPLD и FPGA, уделим им по абзацу.

CPLD (complex programmable logic device - сложные программируемые логические устройства) - ПЛИС, базовыми элементами которой являются макроячейки и простые логические вентили (И(-НЕ)/ИЛИ(-НЕ)). Обычно содержит меньше базовых элементов, чем FPGA, но является более быстродействующей. Также обычно содержит энергонезависимую конфигурационную память прямо на кристалле, но имеет ограниченное число циклов конфигурирования.

FPGA (field-programmable gate array - Программируемая пользователем вентильная матрица) – ПЛИС, которые обычно имеют целый букет видов базовых блоков, это и настраиваемые логические элементы (таблицами истинности) и блоки сложения-умножения (Digital signal processing - DSP) и PLL (Phase-Locked Loop) для деления и умножения частоты и некоторые другие в зависимости от модели. Обычно имеют энергозависимую внутреннюю память и функционал для загрузки конфигурации с внешней энергонезависимой памяти.

Определения этих видов ПЛИС и разницы между ними можно встретить самые различные, как в книгах, так и в интернете. Поэтому не стоит зацикливаться на этой разнице, производители сами классифицируют выпускаемые ими ПЛИС. Если вы не запомнили аббревиатур или не поняли значений некоторых слов – не страшно, главное чтобы появилось общее понятие о ПЛИС, надеюсь я этого добился. А теперь к практике!

Начнем с обсуждения инструментов. Я буду пользоваться стартовым набором разработчика Altera Cyclone II FPGA Starter Board, это готовая плата, на которой установлена FPGA серии Cyclone II – EP2C20F484C7N, а также различная периферия и интерфейсы. В этой статье мы используем светодиоды и семисегментные индикаторы. Мы не будем использовать никаких специальных блоков данной серии FPGA, поэтому при желании вы можете использовать почти любую другую ПЛИС (FPGA и CPLD).

Сильно заинтересовавшиеся могут купить себе один из наборов разработчика или самим собрать устройство, что является достаточно сложной для новичка, но вполне выполнимой задачей. Схемы программаторов и схемы подключения самих ПЛИС легко гуглятся, к тому же, кто ранее занимался любительской прошивкой AVR, может обнаружить у себя подходящий программатор Altera Byte Blaster. В общем, схемную реализацию я предоставляю тебе хабраюзер (В конце статьи схема моей Starter Board). Кто хочет попробовать без денежных затрат и увидеть результат работы – можно использовать встроенный в Quartus II симулятор (в этой статье работа с ним не описана).

Из ПО мы будем использовать Quartus II, free версию которого вы сможете найти на сайте производителя (Altera), как в Windows, так и в Linux вариантах.

И вот мы подошли к практике вплотную! Запускаем наш САПР Quartus II и создаем проект. Первыми шагами визарда указываем имя проекта и его место дислокации, затем пропустим шаг добавления файлов (еще успеем). Закончим создание проекта на этапе выбора устройства, если делаем на железяке – точно знаем имя ПЛИС, его и выбираем. Если просто делаем проект для ПЛИС выберем что-нибудь помощней, например третий циклон. Я же выбираю FPGA которая установлена в моем стартер ките.

Жмем Finish – проект создан. Структура проекта в Quartus – иерархическая, нам необходимо выбрать верхушку иерархии (Top-Level Entity). Мы можем использовать для проектирования схемные файлы и файлы с описанием логики на одном из HDL (Hardware description language – язык описания аппаратуры). Мое мнение – наглядней всего в качестве верхушки иерархии использовать схемный файл с основными блоками логики, а сами блоки реализовывать на HDL. Мнения могут быть разными, пока выбирал, прочитал немало холиварных тем, но остановился пока на такой модели, вы можете сделать свой выбор. В качестве HDL языка проекта я выбрал VHDL ((Very high speed integrated circuits) Hardware Description Language), вы можете использовать любой другой, например Verilog или AHDL, все зависит от ваших предпочтений.

Создаем наш первый файл проекта (File – New..) выбираем Block Diagram/Schematic File. Теперь давайте нарисуем простейшую схему, добавим один Input, один Output и соединим их (в реальной ПЛИС эта схема будет передавать сигнал с одной ножки на другую). Для этого Double Click на пустом месте схемы и в открывшемся диалоге Symbol выбираем необходимый элемент.

Соединяем просто так, линией. Дадим пинам имена (Double Click по элементам), input назову CLOCK_27, а output назову LEDR. Имена выбраны не случайно – CLOCK_27 я затем ассоциирую с входом генератора 27Mhz, а LEDR с нулевым красным светодиодом. Сохраняем файл, оставив галочку добавления в проект. Теперь установим полученный файл вершиной иерархии проекта. Для этого окне Project Navigator, во вкладке Files, в контекстном меню нашего файла выбираем Set as Top-Level Entity. Hello, world готов. Компилируем проект (Processing – Start Compilation), если видим Info: Quartus II Full Compilation was successful. – радуемся и считаем, что первый этап пройден.

Теперь разберемся с нашими целями. Наше устройство будет при включении питания начинать отсчет минут и часов. Значит нам понадобится четыре семисегментных индикатора «ЧЧ: ММ». Для отсчета времени нам нужен более-менее точный сигнал 1Hz. Его мы получим путем деления частоты 27Mhz, затем мы будем отсчитывать его на 60 (секунды), потом еще раз на 60 (минуты), а потом на 24 (часы). С последних двух блоков двоичное число минут и часов будет поступать на декодер Bin -> BCD (binary-coded decimal) -> 7seg. Вот, в общем, и все устройство. Сразу оговорюсь, что схема будет асинхронная (Минуты заводятся от секунд, а часы от минут), для простоты и наглядности.

Итак, создадим наш первый блок - блок деления частоты. Создадим новый файл, как мы уже умеем, только тип файла будет VHDL File. Вставим в него код:

Library ieee;
use ieee.std_logic_1164.all;

Entity Div_27Mhz_to_1Hz is
port(clk:in std_logic; clk_out:out std_logic);
end Div_27Mhz_to_1Hz;

Architecture div_behavior of Div_27Mhz_to_1Hz is
begin
process(clk)
variable cnt: integer range 0 to 27000000;
begin
then

If(cnt >= 13500000)
then
clk_out <= "1";
else
clk_out <= "0";
end if;

If(cnt = 27000000)
then
cnt:= 0;
else
cnt:= cnt + 1;
end if;

End if;
end process;
end div_behavior;

Пропущу служебные директивы (можно посмотреть в справочнике, ссылки в конце), уделю внимание только логике работы. Вначале мы объявляем сущность, т.е. сам блок. Указываем его входы и выходы, их типы и имена. Тип std_logic в простонародье значит бит. Далее мы описываем внутреннюю архитектуру этого блока. Архитектура состоит из параллельных процессов. Каждый процесс имеет свой список чувствительности, например единственный процесс в примере выше чувствителен к изменениям на входе clk. Для процесса можно объявить переменные, в нашем примере это переменная типа integer range 0 to 27000000. Далее в теле процесса задается элементарная логика: пока не прошла половина периода - пихаем в выход логический ноль, как половина прошла – пихаем единицу, при этом не забываем считать и обнулять счетчик по достижению 27000000. На идеальный код не претендую – пока учусь, буду рад поправкам:)

Сохраняем файл с кодом и создаем символ (File – Create/Update – Create Symbol Files For Current Files), это необходимо для того чтобы вставить данный блок в нашу главную схему. Найти свои символы можно в папке Project в диалоге вставки символа. Теперь пробежимся по остальным блокам менее подробно.

Library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

Entity cnt_0_to_59 is
port(clk:in std_logic; c59:out std_logic; vector:out std_logic_vector(5 downto 0));
end cnt_0_to_59;

Architecture cnt_behavior of cnt_0_to_59 is
begin
process(clk)
variable cnt: integer range 0 to 59;
begin
if(clk"event and clk = "1")
then
if(cnt = 59)
then
cnt:= 0;
c59 <= "1";
vector <= CONV_STD_LOGIC_VECTOR(cnt, 6);
else
cnt:= cnt + 1;
c59 <= "0";
vector <= CONV_STD_LOGIC_VECTOR(cnt, 6);
end if;
end if;
end process;
end cnt_behavior;

Это блок счета от нуля до 59, который мы используем для счета минут и секунд. Из новинок тут тип выхода std_logic_vector(5 downto 0), который определяет группу битов (битовый вектор), а также функция CONV_STD_LOGIC_VECTOR(cnt, 6), которая преобразует переменную в битовый вектор указанной длины.

Library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

For CONV_STD_LOGIC_VECTOR:
use ieee.std_logic_arith.all;

Entity cnt_0_to_23 is
port(clk:in std_logic; vector:out std_logic_vector(4 downto 0));
end cnt_0_to_23;

Architecture cnt_behavior of cnt_0_to_23 is
begin
process(clk)
variable cnt: integer range 0 to 23;
begin
if(clk"event and clk = "1")
then
if(cnt = 23)
then
cnt:= 0;
vector <= CONV_STD_LOGIC_VECTOR(cnt, 5);
else
cnt:= cnt + 1;
vector <= CONV_STD_LOGIC_VECTOR(cnt, 5);
end if;
end if;
end process;
end cnt_behavior;

Выше счетчик часов. Ничего нового.

Library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

For CONV_STD_LOGIC_VECTOR:
use ieee.std_logic_arith.all;

Entity bin2bcd_5bit is
port(bin:in std_logic_vector(4 downto 0);
bcd1:out std_logic_vector(3 downto 0);
bcd10:out std_logic_vector(3 downto 0)
);

End bin2bcd_5bit;

Architecture converter_behavior of bin2bcd_5bit is
begin
process(bin)
variable i: integer range 0 to 23;
variable i1: integer range 0 to 9;
begin
i:= conv_integer(bin);
i1:= i / 10;
bcd10 <= CONV_STD_LOGIC_VECTOR(i1, 4);
i1:= i rem 10;
bcd1 <= CONV_STD_LOGIC_VECTOR(i1, 4);
end process;
end converter_behavior;

Преобразователь Binary в BCD, по сути, просто разбивает одно бинарное число на два, каждое из которых представляет разряд десятичного числа. Из новинок – оператор rem, остаток от деления. Аналогично написан и преобразователь для шести бит, его приводить не буду.

Library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

Entity BCD_to_7seg is
port(
BCD:in std_logic_vector(3 downto 0);
seg:out std_logic_vector(6 downto 0)
);

End BCD_to_7seg;

Architecture conv_behavior of BCD_to_7seg is
begin
process(BCD)
begin
if BCD = "0000" then seg <= "0000001";--0
elsif BCD = "0001" then seg <= "1001111";--1
elsif BCD = "0010" then seg <= "0010010";--2
elsif BCD = "0011" then seg <= "0000110";--3
elsif BCD = "0100" then seg <= "1001100";--4
elsif BCD = "0101" then seg <= "0100100";--5
elsif BCD = "0110" then seg <= "0100000";--6
elsif BCD = "0111" then seg <= "0001111";--7
elsif BCD = "1000" then seg <= "0000000";--8
elsif BCD = "1001" then seg <= "0000100";--9
else seg <= "1001001";--err
end if;
end process;
end conv_behavior;

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

В ПЛИС для конфигурации используется оперативная память CRAM (Configuration RAM). Эта память распределена по всему кристаллу, значения, записанные в нее, управляют внутренним коммутационным полем, определяя структуру синтезируемого цифрового устройства. Как правило, в ПЛИС архитектуры FPGA эта память энергозависимая и при подаче питания на устройство требуется загрузить в нее значения из какого-либо внешнего (по отношению к кристаллу ПЛИС) носителя, часто для этих целей используется микросхема ПЗУ (Постоянное Запоминающее Устройство), либо , а в случае стенда LESO2, загрузка осуществляется из компьютера.

Одной из важнейших характеристик ПЛИС является ее логическая емкость. Емкость определяет насколько сложные цифровые устройства можно синтезировать. Другими словами, логическая емкость показывает сколько всего поместится в кристалле. Если вам уже доводилось компилировать в Quartus II проект для ПЛИС, то должны были обратить внимание на итоговый отчет, где указывается какие ресурсы и в каком количестве использованы в проекте, а также указывается процентное соотношение от максимального. Основной ресурс ПЛИС – это логические элементы (Logic Elements). В ПЛИС EP4CE6E22C8, а именно такая использована в учебном стенде, таких элементов 6272. Это много или мало? Для того, чтобы ответить на это вопрос, следует рассмотреть, что же из себя представляет этот логический элемент.

Базовый логический элемент

Из булевой алгебры известно, что используя некий элементный базис, например элемент И-НЕ или ИЛИ-НЕ, можно реализовать любую логическую функцию. Однако использование лишь одного типа элемента не всегда оправдано технически, при синтезе сложных устройств большое количество элементов увеличит время прохождения сигнала и тем самым снизит быстродействие. Поэтому в ПЛИС структуры FPGA в качестве простейшего логического элемента используют более сложную структуру, представляющей собой соединение программируемого комбинационного устройства и D-триггера . На рисунке 1 показана упрощенная структура такого элемента.

Рисунок 1 – Обобщенная структура логического элемента (LE) ПЛИС

Ячейка имеет три логических входа DATAA, DATAB и DATAC, вход тактовых импульсов CLK и один выход LEOUT. В случае если от ячейки требуется работа в качестве только комбинационного устройства, то выходной мультиплексор коммутирует выход элемента LUT на выход всей ячейки, если выход должен быть регистровым, то сигнал с LUT защелкивается по сигналу синхронизации в D-триггер, выход которого через мультиплексор соединяется с LEOUT. Управляющий вход мультиплексора (на рисунке не показан) подключен к соответствующему биту конфигурационной памяти CRAM.

Если ни у кого не вызывает вопросов как работает триггер и мультиплексор , то с элементом, обозначенным на схеме как LUT , все несколько сложнее. Аббревиатура LUT расшифровывается как Look-Up Table или просто Lookup Table, что дословно можно перевести как "справочная таблица" или "таблица поиска". LUT – это больше, чем таблица, LUT – это скорее метод реализации функции, в котором непосредственное вычисление заменяется поиском по таблице готовых решений. Применительно к ПЛИС это позволяет реализовать любую логическую функцию в виде памяти SRAM, где адрес – это аргумент, а содержимое ячейки – значение. Таким образом, для того, чтобы описать логическую функцию трех переменных (в приведенном примере именно три переменные: DATAA, DATAB и DATAC) достаточно памяти на 8 ячеек. Требуемая таблица истинности хранится в виде маски (LUT-mask) в соответствущей ячейке CRAM. С помощью мультиплексоров выбирается нужное значение. Мультиплексорами управляют сигналы входных портов для построения k-входовой LUT (k-LUT), которая реализует любую логическую функцию из k переменных, требуется 2 k бит SRAM и 2 k-1 мультиплексоров. На рисунке ниже показана трехвходовая LUT.

Рисунок 2 – Устройство LUT

При таком подходе можно достаточно точно спрогнозировать время прохождения сигнала и оно не будет зависеть от реализуемой логической функции. Эта важная особенность делает возможным временной анализ схемы.

Хорошо! Используя логический элемент, показанный на рисунке 1, можно получить любую логическую функцию трех переменных и ее регистровый вариант. А как быть, если нам понадобится реализовать какой-либо триггер, отличный от D-триггера? Для реализации некоторых типов достаточно имеющегося комбинационного устройства (LUT) на входе D-триггера, но для реализации всех известных триггеров нам все же придется внести некоторые изменения в базовую схему. Во-первых, необходимо ввести обратную связь: для этого с выхода D-триггера подадим сигнал на один из входов LUT. Для того, чтобы достигнутый ранее функционал не пострадал, мы не имеем право занимать уже имеющиеся входа, заменим LUT на 4-х входовый. Во-вторых, увеличим функциональность самого D-триггера, добавим дополнительные линии управления: вход разрешения ENA (от английского "Enable" – "Включить") и вход асинхронного сброса ACLR (от английского "Asynchronous Clear" – "Асинхронная Очистка"). В результате получим схему пригодную для синтеза любых триггеров:

Рисунок 3 – Структура логического элемента (LE) с обратной связью

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

Рисунок 4 – Структура логического элемента (LE) с каналом переноса

Фактически для переноса требуется ввести дополнительную LUT, как показано на рисунке 4, но для простоты восприятия комбинацию LUT будем рассматривать как один целый модуль.

Используя канал переноса, легко объединить ячейки для получения многоразрядного сумматора. На рисунке 5 показана схема 4-разрядного сумматора с последовательным переносом, построенная на четырех базовых логических элементах.

Рисунок 5 – Четырехразрядный сумматор

При разработке базовой логической ячейки решались две задачи: во-первых, синтезируемые устройства должны обладать максимальным быстродействием, во-вторых, использование ресурсов должно быть как можно более полным. В предыдущем примере, если требуется работа сумматора исключительно как комбинационной схемы, выходные мультиплексоры сигнал возьмут с выходов LUT, а вся цепочка триггеров окажется неиспользованной. В противоположность этому, при синтезе последовательного или параллельного регистра, все LUT будут по сути выполнять функцию проводника: соединять вход LE с входом D-триггера. Небольшое дополнение к схеме, даст возможность при необходимости использовать комбинационное устройство и триггер элемента раздельно для синтеза независимых модулей. Мультиплексор на входе триггера позволит выбирать источник сигнала: либо с входа DATAC, либо с выхода LUT. Кроме того, появляется возможность организовать дополнительный канал соединения триггеров соседних LE для увеличения быстродействия при построении последовательных регистров. На рисунке 6 показана схема получившегося логического элемента. Вход REGIN и выход REGOUT образуют выделенный канал для соединения триггеров, вход SLOAD (от английского "Synchronous Loading" – "Синхронная загрузка") управляет выбором источника сигнала для входа триггера.

Рисунок 6 – Структура логического элемента (LE) с возможностью разделения LUT и триггера

Базовый логический ПЛИС Cyclone IV

Рассмотренный элемент LE в том или ином виде присутствует в различных семействах ПЛИС, в нем может быть увеличено количество входов и сложность LUT, добавлены дополнительные соединения внутри LE и порты для интеграции в глобальную коммутационную сеть ПЛИС. Так, например, в топовом семействе Stratix IV в один элемент входит две шестивходовые LUT, два выделенных полных сумматора и четыре триггера! Однако, с практической точки зрения, для эффективной работы со стендом LESO2 нам целесообразно рассмотреть более подробно реализацию LE в семействах Cyclone, в частности в Cyclone IV.

На рисунке 7 показана схема логического элемента ПЛИС Cyclone IV.

Рисунок 7 – Логический элемента (LE) Cyclone IV

Также, как и в базовом логическом элементе, каждый триггер имеет вход данных, вход тактовых импульсов CLK, вход разрешения ENA и вход асинхронного сброса (очистки) ACLR. Добавился сигнал синхронной очистки SCLR (от английского "Synchronous Clear" – "Асинхронная Очистка"): если на этом входе появится логическая единица, то следующим тактовым импульсом в триггер будет записал логический ноль. Все это позволяет настроить программируемый триггер каждой LE на работу в режиме D, T, JK или RS триггера.

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

В Cyclone IV LUT может работать в двух режимах: нормальном и арифметическом. при компиляции автоматически выберет оптимальный режим для реализации требуемой функции. Нормальный режим предназначен для реализации основной логики и различных комбинационных функций. В этом режиме четыре входа LE (DATAA, DATAB, DATAC, DATAD) поступают на четыре входа LUT. Компилятор автоматически выбирает вход переноса CIN, вход DATAC или выход триггера (цепь обратной связи) в качестве одного из входов LUT. Арифметический режим подходит для синтеза сумматоров, счетчиков, аккумуляторов и компараторов (цепей сравнения). В этом режиме LUT представляет собой полный одноразрядный сумматор, включающий обработчик логики флага переполнения. Компилятор сам создает цепи переноса во время синтеза многоразрадных арифметических устройств.

Можно обратить внимание, что на рисунке логического элемента Cyclone IV отсутствует выходной мультиплексор, на самом деле он есть и не один. Но для того, чтобы понять логику их работы, нужно рассмотреть LE в контексте общей архитектуры ПЛИС.

Логические элементы LE объединяются в логические блоки LAB (Logic array blocks). В Cyclone IV каждый LAB содержит:

  • 16 логических ячеек;
  • сигналы управления LAB;
  • цепи флага переноса LE;
  • цепи каскадного объединения регистров;
  • цепи локальных соединений.

Цепи локальных соединений передают сигналы между ячейками LE в одном LAB. Цепи объединения регистров соединяют выход регистра одного LE с входами регистров прилегающих ячеек LE. Компилятор Quartus II размещает связанную логику в LAB или в соседних LAB, позволяя использовать локальные цепи связи и связи регистров для увеличения производительности и эффективности размещения.

На цепи локальных соединений поступают сигналы со строк и столбцов глобального коммуникационного поля и с выходов ячеек LE, принадлежащих этому же блоку LAB. Соседние логические блоки, блок генератора с фазовой автоподстройкой частоты (PLL), ячейки памяти M9K RAM, встроенные умножители, расположенные с правой или левой стороны через специальные соединители, могут быть напрямую подключены к цепям локальных соединений LAB. Таким образом, любая ячейка LE может иметь соединение с шестнадшатью LE из своего блока (включая саму себя) и тридцатью двумя LE из LAB, расположенных слева или справа. Всего до 48-ми соединений! Такие непосредственные прямые соединения минимизируют использование глобальных маршрутов, обеспечивают большую гибкость при синтезе схемы и увеличивают общее быстродействие.

На рисунке 8 показана интеграция блока LAB в глобальную коммуникационную сеть ПЛИС.

Рисунок 8 – Структура соединений LAB в коммутационном поле ПЛИС

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

Для того, чтобы можно было управлять всеми ячейками LE в пределах одного LAB одновременно, в логический блок встроена специальная логика и выделены особые линии – каналы управления. По таким каналам распространяются широковещательные (в пределах одного LAB) сигналы управления. Архитектура позволяет одновременно использовать до восьми управляющих сигналов:

  • два тактовых сигнала (labclk1 и labclk2);
  • два сигнала разрешения (labclkena1 и labclkena2);
  • два сигнала асинхронного сброса (labclr1 и labclr2);
  • сигнал синхронного сброса/очистки (synclr);
  • сигнал синхронной загрузки (syncload).

Сигналы синхронной загрузки и сброса удобно использовать для синтеза различных счетчиков и регистров. Эти сигналы оказывают воздействие на все триггеры LE в пределах одного LAB.

На рисунке 9 показано подключение управляющих сигналов LAB и цепей локальных соединений к логической ячейке. Выводы LE соответствуют рисунку 7.

Рисунок 9 – Структура взаимодействия LE с сигналами управления

Каждый LAB имеет два тактовых сигнала и два сигнала разрешения. На уровне логического элемента выбирается какой сигнал будет подан на триггер, но тактовый сигнал связан с сигналом разрешения. Поэтому, хотя для любого LE в конкретной LAB можно выбрать какой тактовый сигнал использовать: labclk1 или labclk2, вместе с ним должен использоваться соответствующий сигнал разрешения. Например, если используется labclk1, вместе с ним будет использоваться только labcken1. Если LAB использует оба фронта (нарастающий и падающий) тактового сигнала, то будут задействованы оба канала тактирования, при этом логика выбора усложнится.

Chip Planer

После компиляции в окне Flow Summary можно посмотреть, какие ресурсы были использованы. После небольшого экскурса в архитектуру ПЛИС становился понятно, что значит Total logic elements и почему Total combinational function вынесено отдельной графой. Безусловно информация полезная, но для того, чтобы держать руку на пульсе этого явно недостаточно.

Рисунок 10 – Отчет компиляции

Для визуального контроля используемых ресурсов в Quartus II применяется утилита Chip Planer . Она показывает расположение и использование элементарных блоков в общей архитектуре целевой ПЛИС. Запустить Chip Planer можно из среды Quartus: меню Tools -> Chip Planer. На карте кристалла (рисунок 11) показаны все ресурсы ПЛИС: LE, объединенные в LAB, аппаратные умножители (DSP block), ячейки памяти, буферы ввода вывода, генераторы PLL. Цветом показана степень использования: светлым – неиспользуемые блоки, темным – максимально загруженные. Если увеличить масштаб (соответствующий инструмент на панел или ctrl+колесико мышки), то доступна детализация на уровне LE, здесь синим показан LUT, темно красным – триггер.

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

Рисунок 11 – Карта ресурсов ПЛИС

Если в LE выделить LUT или триггер, то на панели Node Properties можно увидеть схему LE и описание свойств и режимов работы. Двойной клик мыши по LUT или триггеру запустит в новом окне инструмент Resource Property Editor, в котором можно исследовать соединения внутри логического элемента. Синим выделены используемые цепи.

Рисунок 12 – Логический элемент в Resource Property Editor

Вместо заключения

Это далеко не полное описание архитектуры ПЛИС, за кадром остались такие важнейшие элементы как DSP блоки (умножители), блоки оперативной памяти, генератор PLL, буферы ввода-вывода, в последующих статьях цикла я постараюсь уделить им должное внимание. Однако следующий материал будет посвящен применению знаний о структуре логического элемента LE и об их объединении при проектировании простейших цифровых устройств.

  • Программирование микроконтроллеров
  • Ты ждал знак? Вот он!

    Много лет я не решался начать программировать ПЛИС, потому что это сложно, дорого и больно (как мне казалось). Но хорошо, когда есть друзья, которые помогают сделать первый шаг. И теперь я не понимаю одного - ПОЧЕМУ Я ЖДАЛ ТАК ДОЛГО?

    Сейчас я помогу сделать первый шаг и тебе!

    А зачем оно мне?

    Ты устал постоянно читать доки по своему МК или держать кучу информации в голове. Ты все переписал на asm, но скорости все равно не хватает. Ты подключил два внешних устройства к своему МК, подключаешь третье, но у тебя кончились прерывания, перестают работать те модули, что уже работали. Ты берешь другой МК, более мощный из той же линейки, но опять мануалы, регистры флагов, биты… ад. Меняешь платформу: переходишь на другой МК и выкидываешь на помойку свои знания по прежней платформе. Что бы ты не делал - оно дается тяжело. Ты находишь популярную платформу, в которой можно легко из компонентов собирать проект, но выше аппаратных ограничений данного МК все равно не удается прыгнуть… Где-то на краешке сознания иногда проскакивает мысль, что вот на ПЛИС это бы точно заработало быстро и параллельно, что это «именно та задача, которую бы надо решать на плис», но я стар/глуп/занят/etc чтобы суметь/начать такое делать.

    Хочешь наконец вздохнуть свободно? Идем дальше!

    Радость от разработки на ПЛИС

    У меня был тяжелый рабочий день. С одной работы я приехал на вторую работу, потом на дачу, вечером домашние дела, уроки, потом семейный просмотр кино и только в 23 часа я оказался совершенно свободен! Сказать, что я был уставший - ничего не сказать. Но в таком состоянии я сел за ноут с твердой целью: сделать генератор меандра на 440 Гц. Прошло 20 минут и я уже слышал его в наушниках. Я не верил своим ушам! Еще 15 минут мне потребовалось, чтобы сделать ШИМ и менять громкость. К тому времени плата с ПЛИС у меня была всего с неделю и до этого я пролистал всего пару книг по Verilog.

    В тот вечер я понял: ВОТ ОНО! Вот та платформа, в которой я быстро и легко могу превращать свои мысли в реально работающее железо!

    Почему так?

    Опишу плюсы, которые есть в изучении и применении ПЛИС, хотя их и так все знают:
    • Универсальность знаний - при смене модели МК нужно читать доки. При смене производителя МК нужно читать доки. Нужно постоянно читать доки, постоянно держать в голове кучу информации. При разработке на ПЛИС, если знаешь Verilog или VHDL, то можно не только программировать любой ПЛИС из линейки одного производителя, но и при желании перейти на другого (Altera, Xilinx). Хоть и будут моменты с освоением другой среды разработки, тонких аппаратных моментов, но сама суть подхода проектирования устройств на HDL от этого не изменится.
    • От идеи к железу - при разработке проекта, если тебе не хватает одного мк, то приходится выбирать другой. В принципе можно строить предположения справится или не справится этот МК с проектом. Либо есть какой-то конкретный МК и ты пытаешься туда вместить проект. Чаще всего именно так. Мне это чем-то напоминает подход моего деда, который делает лестницу из того, что есть в сарайке. Хотя можно спроектировать лестницу, купить досок, которые подойдут… От идеи к железу, а не наоборот.
    • Простота применения чужих разработок - можно взять чужой модуль и применить его в своем проекте. По коду сможете понять, как он работает. Даже, если он для xilinx, а вы делаете под altera. Иногда это получается не сарзу, но это проще, чем, например, добавлять двоичные библиотеки к проекту на c++/Qt
    • Независимость блоков. Блоки в HDL, как чистые фунции в ЯП. Зависят только от входных сигналов. Разработанный и отлаженный модуль в будет и дальше работать правильно, как бы не рос проект. Ничто снаружи не повлияет на правильность его работы изнутри. Да и вообще можно забыть, как он работает - это черный ящик. К тому же, блоки работают параллельно .

    Проблема выбора

    Сильно останавливают вопросы, что выбрать: Altera/Xilinx, Verilog/VHDL, какую отладочную плату взять. Но обо всем по порядку.

    Производитель

    Я выбрал Altera . Почему? Ну мы вот так с другом решили, хотя название Xilinx мне красивее. НО. Если ты сейчас не можешь выбрать, то я сделаю это за тебя. Тебе нужен Altera! Почему? Я не знаю. Сейчас важнее сделать шаг: сделать выбор. Я выбрал Altera и пока не пожалел.



    Язык

    Берем Verilog - потомучто … ну ты понял.

    Отладочная плата

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

    В семействе Altera, за разумные деньги мы можем купить платы с CPLD MAX II на 240, 570 и 1270 элементов, либо более старшие микросхемы FPGA, которые Cyclone 1, 2, 3, 4 с количеством до 10000 и более ячеек. Как же выбрать?

    Даже на базе 240 ячеек, проект Марсоход делает просто огромное количество проектов . Настоятельно рекомендую ознакомиться, чтобы иметь примерное представление о сложности проектов, которые можно уместить в 240 ячеек. С другой стороны, существуют проекты , которые полностью программируются под аппаратную копию определенного ПК, включая процессор и всю логику вокруг него (NES , Speccy , Orion , ЮТ-88 , etc). Для этого уже требуется пять, десять и более тысяч ячеек. Плюс эти платы содержат дополнительные внешние устройства.

    Поэтому я бы посоветовать взять что-то среднее между 240 и 10000 ячейками, с предпочтением в сторону увеличения в зависимости от доступных средств. На отладочной плате лишние ячейки это не страшно, а если их не хватит - уже ничего не поделаешь. Потом, когда устройство отлажено, станет ясно, сколько надо ячеек, купить под нужное количество, без лишнего «обвеса», дешевле и оставить в готовом устройстве.

    То, чем действительно отличаются MAX от Cyclone"ов, кроме количества ячеек, это:
    1) У серии MAX внутри нет PLL. На каждой отладочной плате есть генератор, как правило на 50 МГц. Основной массе проектов этого будет достаточно. Все синхронизации будут происходить путем деления 50 МГц на какое-нибудь значение. Либо, можно взять внешний генератор и подать на отдельный вход ПЛИС. А что, если потребуется частота выше 50 МГц? Мне не удалось с ходу найти генераторы выше 50 МГц. Но тут как раз на помощь и приходит PLL, который встроен в Циклоны. На нем можно умножить частоту, например, до 100 МГц.
    2) В серии Cyclone встроены аппаратные блоки умножения. Их количество зависит от конкретной модели - тут как раз можно «всетаки заглянуть в инструкции», чтобы узнать сколько. Если предполагаете делать какой-то ЦОС, то они пригодятся: сэкономят ячейки, увеличат скорость. С другой стороны, если нет умножителей, их можно синтезировать, но у маленькой ПЛИС на это может не хватить ресурсов.

    Во всем остальном у меня критерий «влезло/не влезло». Отладка на заведомо бОльшей, чем нужно плате, с последующей заливкой в минимально необходимую для этого.

    Сколько нужно денег?


    Программатор
    Я считаю, что у меня нет времени, чтобы паять программаторы на рассыпухе.

    300 рублей. Я свой брал на ебее , выглядит так:

    Отладочная плата
    Выбор широкий, в зависимости от количества денег.

    Начальный уровень 350 - 550 рублей. Это платы на MAX II ( или ячеек). Могут подойти для начального ознакомления и дальнейшего пристройства в конечные устройства. На плате есть генератор, пара кнопок, пара светодиодов, остальные 80 выводов на свое усмотрение.

    Блок питания
    Обязательно должен быть, но не всегда идет в комплекте. Потребуется БП на 5 вольт и ток 2А.

    Средний уровень от 900 до 1500 рублей. Это платы Cyclone 1, 2, 3, 4 отличающиеся в основном количеством ячеек.
    Маркируются примерно так:
    EP2 C5 T144 - Cyclone 2 примерно 5к ячеек
    EP4 CE6 E22C8N - Cyclone 4 примерно 6к ячеек
    EP2 C8 Q208C8N - Cyclone 2 примерно 8к ячеек

    Можно заметить, что Cyclone 3 может иметь больше ячеек, чем Cyclone 4.

    Вот несколько вариантов:

    835 рублей.
    ALTERA FPGA CycloneII EP2C5T144 Minimum System Board for Learn good

    880 рублей
    Altera CycloneII EP2C5T144 FPGA Mini Development Learn Core Board E081

    1265 рублей
    EP2C8 EP2C8Q208C8N ALTERA Cyclone II FPGA Evaluation Development Core Board

    Платы с расширенными возможностями . Это платы, на которых установлены дополнительные модули (UTP, USB, AUDIO), разъемы (SD, VGA), кнопки, переключатели, светодиоды, семисегментные индикаторы и т.д. Либо может идти базовая плата, а к ней могут прилагаться платы расширения отдельно.

    У меня трудится такой комплект - плата + плата расширения:
    Altrea EP4CE10E22 FPGA CORE Board+ Device Board USB/Sound/Ethernet/SD Card/VGA
    2760 рублей

    Вот основная плата. На ней есть 2 светодиода, 2 кнопки, 4 переключателя, семисегментный интикатор и микросхема оперативной памяти.

    Плата расширения. На ней распаяны SD, VGA, а так же контроллеры USB(High Speed USB2.0 Chip: CY7C68013A), AUDIO(Sound Card up to 96kHz/32bit ADC/DAC: WM8731S), UTP(100M Ethernet interface: DM9000A):

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