KEEN SIDE успешно заменяет аналогичные продукты таких известных брендов, как Phoenix Contact, Weidmueller, Degson, Winstar, Hsuan Mao, KLS, G-NOR, Mean Well и др.
РадиоЛоцман - Все об электронике

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

Журнал РАДИОЛОЦМАН, январь 2016

Mark Hastings, Cypress Semiconductor

EE Times

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Чтобы принять оптимальное решение относительно того, что наилучшим образом будет работать в вашем проекте, вы должны понять, как реализуют внутреннюю программируемую логику различные производители микроконтроллеров

За последние 25 лет внутренние периферийные устройства микроконтроллеров кардинально изменились. Первоначально многие микроконтроллеры содержали только ОЗУ, ПЗУ и, в некоторых случаях, элементарный таймер. С прогрессом микроконтроллеров дополнительные периферийные модули были включены в устройства стоимостью около доллара или меньше. Теперь таймеры/счетчики, ШИМ и стандартные последовательные интерфейсы, такие как UART, SPI и I2C, стали обычным устройствами в этих недорогих микроконтроллерах. Еще одна важная перемена связана с происходящим переходом от 8-битных устройств к 32-битным при сохранении того же ценового диапазона.

Тем не менее, даже при использовании этих многофункциональных недорогих микроконтроллеров всегда будет возникать необходимость сопряжения с нестандартными аппаратными интерфейсами или с новыми интерфейсами сторонних компаний, поддержка которых производителями микроконтроллеров не может быть обеспечена в короткие сроки. Зачастую это заставляет разработчиков использовать внешние аппаратные устройства или эмулировать интерфейс программно, используя технологию «bit-banging». Эта технология использует программное переключение линий порта ввода/вывода, обычно для того, чтобы воспроизвести работу последовательного интерфейса. Я тоже пользуюсь этим, когда нужно считывать информацию с порта для декодирования последовательных данных. Использование как внешних устройств, так и «bit-banging» приводит к увеличению стоимости проекта. Со стоимостью дополнительного внешнего оборудования все очевидно, но для использования программной реализации последовательного интерфейса может также потребоваться более быстрый и, следовательно, более дорогой процессор.

Наиболее распространенные микроконтроллеры сегодня поддерживают интерфейсы SPI, UART и I2C, но существует много случаев, когда очень полезной может оказаться внутренняя логика, программируемая пользователем. Чтобы решить некоторые из этих проблем, ряд компаний, включая Atmel, Cypress, Microchip и NXP, добавили в свои продукты пользовательскую логику. В основном такими устройствами являются микроконтроллеры с добавленной логикой. Процессор здесь по-прежнему остается основной рабочей лошадкой, а дополнительная логика используется для того, чтобы сделать процессор более эффективным. Обычно такие устройства можно увидеть в бюджетных продуктах, но также они используются в качестве небольших сопроцессоров, чтобы повысить эффективность основного процессора, разгрузив его при работе с низкоуровневыми задачами.

Что касается FPGA, они двигались к той же цели, но с другого направления. Уже много лет назад Xilinx и Altera стали добавлять аппаратные и программные процессорные ядра, чтобы создать системы-на-кристалле (СнК). Решения на FPGA, как правило, дороже, но когда проект требует значительного количества настраиваемых логических элементов, такой подход может быть экономически оправдан. Эти устройства имеют неоценимое значение для прототипирования специализированных микросхем, реализации малотиражных продуктов, где время выхода на рынок является ключевым, а также создания продуктов, требующих регулярной модернизации оборудования.

Оба типа этих устройств (микроконтроллеры с логикой и FPGA с процессорами) обеспечивают гибкую настройку в полевых условиях. После повсеместного распространения устройств на основе Flash-памяти обновление в полевых условиях стало нормой. По началу разработчик имел возможность модернизировать только прошивку, но теперь можно легко обновить как аппаратную часть (логику), так и программную. Устройства от компьютерной мыши до высокоскоростных сетевых маршрутизаторов могут обновляться в рабочих условиях с возможностью перепрограммирования аппаратуры и программ в одном устройстве.

Упомянутые выше четыре компании (Atmel, Cypress, Microchip и NXP) имеют всю настраиваемую логику, необходимую для того, чтобы помочь разгрузить основной процессор или отказаться от внешней логики. Каждая компания придерживается своего подхода, как в отношении типов предоставляемых логических блоков, так и способов, которым эти блоки взаимодействуют друг с другом и с другими объектами на кристалле, такими как таймеры, UART и линии ввода/вывода.

Программируемая логика в микроконтроллерах может дать значительный прирост производительности
Рисунок 1. Простой модулированный выходной сигнал UART.

Для того чтобы принять оптимальное решение относительно того, что будет работать лучше всего в вашем проекте, важно понять, как каждый из этих производителей реализовал внутреннюю программируемую логику. Иногда для того, чтобы исключить внешний компонент или повысить производительность процессора, может быть достаточно простых внутренних вентилей «И» или «ИЛИ». Все четыре метода позволяют пропускать входные и выходные сигналы через настраиваемую логику. Показанный на Рисунке 1 простой пример, поддерживаемый каждым из четырех типов логических блоков, демонстрирует способ модуляции выходного сигнала UART для ИК-связи. Это не просто факт наличия внутреннего логического элемента «И», но и возможность завести сигналы от тактового генератора или счетчика и выхода UART на элемент «И».

Настраиваемая логика Atmel XMEGA (XCL)

Блок Atmel XCL содержит два блока LUT (lookup table – таблица поиска) вместе с двумя блоками 8-разрядного таймера/счетчика (Рисунок 2). LUT не должны соединяться с блоками таймера/счетчика, но вместо этого могут быть подключены к UART, блокам EVENT или к линиям ввода/вывода. Два блока LUT могут использоваться в качестве двух независимых двухвходовых модулей или одного модуля с тремя входами. Из логических блоков можно конфигурировать элементы комбинаторной логики, такие как «И», «И-НЕ», «ИЛИ», «ИЛИ-НЕ», «исключающее ИЛИ», «исключающее ИЛИ-НЕ» и мультиплексоры. Помимо этого, с помощью логических блоков можно сформировать элементы последовательной логики, например, D- или RS-триггеры. Благодаря способности подключаться к другим логическим блокам и линиям ввода/вывода, эти простые блоки LUT позволяют разработчику легко сэкономить несколько внешних логических компонентов или освободить циклы процессора. Так, в руководстве по применению Atmel XCL Module (AT01084) объясняется, как может быть сконфигурирован модуль XCL, чтобы обеспечить манчестерское кодирование на выходе UART, не нагружая процессор и не используя внешнюю логику. Устройства AVR XMEGA E содержат один блок XCL.

Программируемая логика в микроконтроллерах может дать значительный прирост производительности
Рисунок 2. Настраиваемая логика Atmel XMEGA.

Конфигурируемая логическая ячейка Microchip (CLC)

Конфигурируемая логическая ячейка CLC компании Microchip позволяет пользователю выбрать до четырех сигналов с восьми входов. Такими входами могут быть комбинации двух линий ввода/вывода, внутренние источники тактовых импульсов, периферийные модули или биты регистров. Эти четыре сигнала затем проходят в программируемый логический блок. Логический блок может быть запрограммирован на выполнение восьми комбинаций таких логических функций как «И-ИЛИ», «исключающее ИЛИ», четырехвходовая схема «И», RS-триггер или одна из четырех других комбинаций триггеров. Несколько примеров Microchip предоставляет в своем руководстве по применению Configurable Logic Cell Tips 'n Tricks. Один из таких примеров показывает, как следует сконфигурировать эти блоки для декодирования квадратурных сигналов. Без дополнительных логических блоков процессору пришлось бы производить выборку сигналов гораздо чаще, чтобы избежать детектирования ложных переходов, когда один из сигналов находится между переходами, однако при использовании логических блоков процессор прерывается только на реальные смены уровней входных сигналов. Устройства Microchip PIC10(L)F320/322 содержат по одному блоку CLC, состоящему из четырех блоков, показанных на Рисунке 3.

Программируемая логика в микроконтроллерах может дать значительный прирост производительности
Рисунок 3. Конфигурируемая логическая ячейка Microchip (одна из четырех).

Конфигурируемая логика NXP (Pattern Match Engine)

У NXP есть конфигурируемая пользовательская логика, называемая Pattern Match Engine (Рисунок 4). В качестве входов такого логического блока могут быть выбраны до восьми линий ввода/вывода общего назначения. Эти восемь входов могут быть использованы для создания конъюнктивных членов сложных булевых выражений. Выходы могут использоваться для запуска прерываний, управления специальными линиями ввода/вывода, или же подключаться к следующим логическим блокам или секциям. Другие функции позволяют обнаруживать фронты или срезы импульсов и инвертировать сигналы. Это дополнительное оборудование может быть настроено так, чтобы прерывать процессор только при возникновении сложной (или простой) комбинации событий. Устройства LPC81x компании NXP содержат один блок Pattern Match Engine.

Программируемая логика в микроконтроллерах может дать значительный прирост производительности
Рисунок 4. Конфигурируемая логика NXP.

Универсальный цифровой блок Cypress (UDB)

Cypress выбрала более продвинутое решение, основанное на универсальных цифровых блоках (Universal Digital Blocks – UDB) (Рисунок 5), которое ставит Cypress где-то между подходами, используемыми обсуждавшимися выше тремя производителями и FPGA. UDB состоит из двух программируемых логических устройств (PLD) 12C4 и операционного автомата (DataPath). PLD могут использоваться для управления работой и потоками данных в DataPath, или для реализации универсальной логики и конечных автоматов. DataPath представляет собой настраиваемый блок, реализующий 8-разрядные функции («И», «ИЛИ», сложение, вычитание, инкремент, декремент, «исключающее ИЛИ»), функции сдвига (влево и вправо), а также содержащий два четырехбайтных буфера FIFO для организации очереди данных. Эти блоки, в свою очередь, могут быть объединены, чтобы получить 16-, 24- или 32-разрядные функции.
Входы и выходы UDB могут быть подключены к любым линиям ввода/вывода общего назначения, периферийным/компонентным линиям ввода/вывода, прерываниям и т.д. Взаимосвязь между UDB, аналоговыми и цифровыми блоками с фиксированными функциями и линиями ввода/вывода устанавливается с помощью интерфейса цифровых сигналов (Digital Signal Interface, или DSI). UDB могут быть запрограммированы для реализации чего угодно – от простых логических элементов до счетчиков и модулей ШИМ и стандартных последовательных интерфейсов, таких как UART и I2C.

Программируемая логика в микроконтроллерах может дать значительный прирост производительности
Рисунок 5. Универсальный цифровой блок (UDB)
устройств PSoC компании Cypress.

Пользователю предоставляется несколько опций, с помощью которых он может создать проект на основе UDB. Простейшие логические элементы могут быть либо просто помещены в схему, либо проект может быть создан в среде языка Verilog. Для выполнения разработки без использования Verilog предоставляется пользовательский графический интерфейс. Семейства микроконтроллеров PSoC 3, PSoC 4 и PSoC 5 могут содержать от 4 до 24 таких логических блоков UDB.

Пример создания специализированного интерфейса

Недавно я обратил внимание на интересные драйверы RGB светодиодов, предлагаемые компанией Worldsemi. Микросхемы имеют обозначения WS2811, WS2812 и WS2812B, но принцип работы всех устройств одинаков. С помощью лишь одной линии ввода/вывода вы можете управлять такими элементами в количестве 1000 и более. Идея управления столькими RGB драйверами по одной линии показалась мне интригующей. Для соединения этих компонентов использовался специализированный интерфейс, а не SPI, UART или I2C. Сигнал в канале связи является асинхронным, каждый его бит начинается с нарастающего фронта. Логические состояния «1» или «0» определяются длиной импульса, как показано на Рисунке 6.

Программируемая логика в микроконтроллерах может дать значительный прирост производительности
Рисунок 6. Временная диаграмма сигналов «лог. 0»
и «лог. 1» микросхем WS2811/12.

Каждому RGB светодиоду требуются 24 бита данных – по 8 бит на каждый цвет (красный, зеленый, синий), в формате, изображенном на Рисунке 7.

Устройства WS2811/12 имеют выводы DIN (вход данных) и DOUT (выход данных), с помощью которых они могут быть очень просто соединены в последовательную цепочку. Каждый светодиод сохраняет первые 24 бита, пришедшие по линии DIN, а все остальные данные, как показано на Рисунке 8, ретранслирует на выход DOUT.

Программируемая логика в микроконтроллерах может дать значительный прирост производительности
Рисунок 7. Формат данных драйверов WS2811/12.
 
Программируемая логика в микроконтроллерах может дать значительный прирост производительности
Рисунок 8. Включение нескольких микросхем WS2811/12.

После начала информационного потока каждое устройство ожидает увидеть непрерывную последовательность данных. Если длительность переднего фронта сигнала не превышает 50 мкс, микросхема защелкивает данные и переходит к ожиданию следующей 24-битной порции предназначающейся ей информации, а все остальное ретранслирует дальше (Рисунок 9).

Программируемая логика в микроконтроллерах может дать значительный прирост производительности
Рисунок 9. Сброс устройства при задержке передачи данных более чем на 50 мкс.

Как видите, все не очень сложно, но сложно адаптировать это к стандартной архитектуре микроконтроллера. Я встречал случаи, когда люди для целей синхронизации использовали интерфейс SPI, но для этого требовалось, по крайней мере, три бита SPI на фактический бит данных, поэтому выигрыш по сравнению с методом программной эмуляции (bit-banging) здесь был бы невелик. Поскольку требования к временной диаграмме достаточно строги, при программной реализации интерфейса до тех пор, пока состояние всех светодиодов не обновится, процессор не мог бы заниматься ничем, кроме отправки управляющих сигналов. Это означает, что во время работы со светодиодами вам придется запретить все прерывания и не реагировать на любые другие входные сигналы.

Например, если у вас в цепочке 1000 светодиодов, время обновления составит
(0.40 мкс + 0.85 мкс) × 24 бита × 1000 светодиодов = 30,000 мкс или 30 мс.

Это не обязательно станет проблемой, но если вы захотите обновлять состояние светодиодов с частотой 30 Гц, вы израсходуете почти 100% ресурсов процессора!

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

У блоков UDB в составе Cypress PSoC есть пара полезных функций, позволяющих сделать это довольно легко. В DataPath каждого UDB имеются два четырехбайтных буфера FIFO и сдвиговый регистр. При реализации UART один из них можно использовать для буфера Tx, а другой для буфера Rx. В случае с WS2811/12 мне потребуется только один FIFO и сдвигатель. Я остановился на такой конфигурации аппаратуры, когда для каждого устройства генерируется по одному прерыванию. Обработчик прерываний будет загружать 24 бита (3 байта) и выполнять возврат, пока FIFO не опустеет. Таким образом я получал бы прерывания каждые 30 мкс, и мне не пришлось бы отключить все прерывания и организовать «bit-banging» с разрешением 150 нс или лучше. Выбирая микроконтроллер, я остановился на Cypress PSoC CY8C4245AXI. При оптовых закупках он стоит около $1, имеет четыре UDB и работает на частоте 48 МГц, обеспечивая более чем достаточный запас по скорости и оборудованию, чтобы проделать такой трюк.

В моем проекте использовались два из четырех UDB. Один UDB служил для буферизации данных с помощью FIFO и сдвига этих данных для того, чтобы все 24 бита (3 байта), предназначенные одному устройству, могли бы быть записаны за один раз. Второй UDB был задействован для генерации сигнала ШИМ с двумя выходами сравнения. Один формирует логический ноль, другой – логическую единицу. Последовательные данные использовались для управления цифровым мультиплексором для выбора сигнала «1» или «0». Блок-схема показана на Рисунке 10.

Программируемая логика в микроконтроллерах может дать значительный прирост производительности
Рисунок 10. Блок-схема интерфейса WS2811/12 с использованием PSoC UDB.

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

Далее следует выяснить, насколько такое дополнительное оборудование снижает нагрузку на процессор. Для примера рассмотрим массив из 1000 светодиодов, которые нужно обновлять с частотой 30 Гц. При программной реализации интерфейса это потребует практически 100% ресурсов процессора. Использование программируемых аппаратных средств в устройстве PSoC вызывает прерывания каждые 30 мкс, что, конечно же, весьма ощутимо, но не так уж плохо для ARM Cortex-M0, работающего на частоте 48 МГц. Для проверки загрузки процессора я создал простой цикл, в котором дисплей обновлялся с частотой около 30 Гц. В основном цикле я поочередно выводил на линию логические «0» и «1» и с помощью осциллографа подсчитывал количество переключений за период 40 мс. Затем я запретил прерывания, запустил проект снова и сравнил результаты. Непрерывное обновление дисплея отнимало примерно 12% ресурсов процессора, по сравнению с почти 100% при использовании «bit-banging». Соответственно, для внешней связи и пользовательского интерфейса остается 88% циклов процессора. Если бы в проект были добавлены DMA (устройства прямого доступа к памяти), то нагрузка на процессор снизилась бы с 12% до 2%, или даже меньше. Я использовал самый недорогой (~ $1) из тех микроконтроллеров PSoC, в которых есть UDB, но DMA в нем не было. Впрочем, некоторые старшие модели семейства содержат DMA.

Для тестирования этой микросхемы была сделана и использована настоящая «вывеска» с 960 RGB светодиодами, собранными в матрицу 60×16 (Рисунок 11). Она работала точно так, как и ожидалось, и может быть использована в качестве графического интерфейса с поддержкой элементарных линий, прямоугольников, кругов и текста.

Программируемая логика в микроконтроллерах может дать значительный прирост производительности
Рисунок 11. Вывеска из 960 RGB светодиодов.

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

Материалы по теме

  1. Datasheet Cypress CY8C4245AXI
  2. Datasheet Microchip PIC10(L)F320/322
  3. Datasheet NXP LPC81x
  4. Datasheet Worldsemi WS2811
  5. Datasheet Worldsemi WS2812B

Перевод: Mikhail R по заказу РадиоЛоцман

На английском языке: Programmable Logic In MCUs Can Provide Big Performance Boost

Электронные компоненты. Бесплатная доставка по России
Для комментирования материалов с сайта и получения полного доступа к нашему форуму Вам необходимо зарегистрироваться.
Имя