Хабрахабр

[Перевод] UDB. Что же это такое?

Как я уже отметил в статье, про UDB кратко не написать, но можно просто перевести фирменную документацию на него, чтобы познакомить отечественного читателя со столь мощным средством для реализации микропрограммных функций.
Но прежде, давайте рассмотрим, что вообще такое PSoC. В комментариях к моей статье про управление RGB светодиодами средствами блока UDB микроконтроллеров PSoC фирмы Cypress было высказано мнение, что неплохо бы в начале статьи кратко рассказать, что такое вообще UDB. Разные семейства имеют разное процессорное ядро (для PSoC 3 это MCS-51, для PSoC 4 — Cortex M0, для PSoC 5LP — Cortex M3, а для PSoC 6 — сразу два: Cortex M0+ и Cortex M4) и набор программируемой логики. PSoC — это набор семейств микросхем фирмы Cypress для реализации систем на кристалле. Кроме набора различных АЦП, там присутствуют также аналоговые коммутаторы. Причём логика эта не чисто цифровая, есть там и аналоговые вещи. Есть внутри PSoC и операционные усилители, которые можно программно коммутировать, а значит — строить на них разные аналоговые блоки. Можно даже программно связывать ножки через аналоговые цепи, правда, сопротивление у цепи будет измеряться килоомами.

7 до 5. Кстати, PSoC’и можно питать любым напряжением от 2. То есть не нужно думать о каких-то стабилизаторах ни при батарейном питании, ни при питании от USB. 5 вольт.

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

Многие разработчики привыкли к тому, что Программируемые Логические Интегральные Схемы (ПЛИС) бывают двух видов: CPLD и FPGA. И вот здесь часто возникает некоторое недопонимание. По факту — и да, и нет. Поэтому многие, кто слышал про PSoC, считают, что там кроется некая CPLD-шка, которую можно программировать на языке Veriolg. Но реально, эти PLD входят в состав блоков UDB. Некоторое количество PLD (без «C», просто PLD) там действительно есть, и на Verilog их программировать действительно можно. Этот блок чрезвычайно самобытен и предоставляет просто широчайшие возможности для разработчика. И именно UDB является основным элементом программируемой логики, реализованной в PSoC. Рассмотрим рисунок из фирменной документации, поясняющий суть использования блоков UDB.

Но перед тем, как начать, скажу пару слов про цену этих контроллеров. Так как я изучал всё на примере семейства PSoC 5LP, переводить буду документацию именно на него. Прямо скажем, по сравнению с STM32-DISCOVERY они ещё ничего, а вот на фоне макеток STM32F103C8T6 дороговаты. Если зайти на Ali Express и посмотреть на макетные платы для них, возникает грустное ощущение. Функции JTAG реализуются на PSoC 5LP, даже если целевой контроллер и PSoC 4 (у последнего обычно нет порта USB). В первую очередь, это связано с тем, что на фирменных макетках всегда стоит не один, а два таких контроллера.

Тем не менее, если мы добавим к тому самому STM32 снаружи ещё и даже самую простенькую CPLD, то суммарная цена уже выйдет в пользу PSoC. Но и поделив цену на два, всё равно получаем, что она выше, чем у сходного по процессорному ядру STM32F103. А ещё цену квадратных сантиметров платы. А ещё добавим потерянные ножки на связь этих двух корпусов (у PSoC же все связи внутри). Если же нужно какой-то функционал вынести на микропрограммный или аппаратный уровень — тут нужен именно PSoC. Вот и получается, что, если нужно работать только с процессорным ядром, в PSoC действительно нет необходимости. На нём система выйдет дешевле и проще.

Для этого я изучил методику разработки Bare Metal приложений под Altera V SoC (увы, выяснилось, что особенность архитектуры там такая, что ОС можно замедлить, но нельзя ускорить — одиночные запросы к аппаратуре там идут с бешеной латентностью). На самом деле, у меня есть маниакальная идея попробовать сделать аппаратную поддержку ядра нашей ОСРВ МАКС. До разгона ядра ещё не дошёл (есть только общие мысли), но сама идея программирования UDB мне жутко понравилась. Для этого же я начал осваивать и PSoC. Поэтому приступаем к переводу соответствующей части фирменной документации Cypress, посвященной UDB. Само собой, я теперь заинтересован в том, чтобы донести эту идею до максимального числа отечественных программистов. Нумерацию глав и рисунков сохраняем в соответствии с оригинальным документом.

21. Универсальные цифровые блоки

В этой главе мы рассмотрим, как универсальные цифровые блоки (англ. Universal Digital Blocks, UDB) позволяют разрабатывать программируемые цифровые периферийные функции. Архитектура UDB обеспечивает баланс между гранулярностью конфигурации и эффективной реализацией. UDB состоят из комбинации нескоммутированной логики, схожей с программируемой логической матрицей (ПЛМ, англ. PLD), структурированной логики (операционные автоматы, далее — Datapath) и гибкой схемы трассировки.

21.1 Особенности

  • Для обеспечения оптимальной гибкости каждый UDB содержит следующие компоненты:
    • 8-битный Datapath на базе АЛУ (Arithmetic and Logic Unit, ALU) с хранилищем инструкцией на 8 слов, несколькими регистрами и буферами FIFO;
    • две PLD, каждая из которых имеет 12 входов, восемь конъюнктивных термов (англ. Product Terms, PT) и четыре выхода макроячеек;
    • регистры управления и статуса;
    • модули тактирования и сброса.
  • PSoC 5LP содержит массив размером до 24 UDB.
  • Гибкая трассировка между элементами массива UDB.
  • Элементы UDB могут разделяться или связываться в цепочки для создания более крупных функций.
  • Гибкая реализация ряда цифровых функций, включая таймеры, счетчики, широтно-импульсные модуляторы (в том числе ШИМ с генератором мёртвой зоны), UART, шину I2C, шину SPI и проверку/генерирование CRC.

21.2 Блок Схема

Рисунок 21-1 показывает UDB в виде конструкции, содержащей два базовых логических блока PLD, Datapath и функции управления, статуса, тактирования и сброса.

Блок схема UDB.
Рисунок 21-1.

21.3 Как это работает

Основными компонентами UDB являются:

  • PLD (2). На входы этих блоков подаются данные из трассировочных ресурсов. В них реализуется комбинаторная логика и защелкивание данных, что позволяет реализовать конечные автоматы, управлять операциями блока Datapath, настраивать входные условия и управлять выходами.
  • Datapath. Этот блок содержит динамически программируемое АЛУ, четыре регистра, два буфера FIFO, компараторы и генерацию условий.
  • Управление и статус (Status and Control). Эти модули предоставляют механизм взаимодействия микропрограмм центрального процессора (ЦП, англ. CPU) и синхронизации с операциями UDB. Регистры управления воздействуют на внутренние элементы, а регистры статуса считывают состояние внешних элементов.
  • Управление тактированием и сбросом (Clock and Reset Control). Эти модули обеспечивают выбор и включение тактирования, а также выбор сброса внутри UDB.
  • Объединение сигналов в цепочку (Chaining Signals). PLD и Datapath имеют сигналы, которые позволяют связывать соседние блоки в цепочку для создания функций с более высокой разрядностью.
  • Трассировочный канал (Routing Channel). UDB соединены с трассировочным каналом через программируемые коммутационные матрицы для связи между блоками в рамках одного UDB и для связи с другими UDB в массиве.
  • Интерфейс системной шины (Sysytem Bus Interface). Все регистры и ОЗУ в каждом UDB проецируются на системное адресное пространство, и доступ к ним можно получить как при помощи центрального процессора, так и через прямой доступ к памяти (англ. Direct Memory Access, DMA) в виде 8-битных и 16-битных данных.

21.3.1. PLD

В каждом UDB есть две PLD «12С4». Блоки PLD, показанные на рисунке 21-1, можно использовать для реализации конечных автоматов, обработки данных ввода/вывода и для создания табличной логики (англ. Lookup Table, LUT). Кроме того, PLD можно настроить для выполнения арифметических функций, установки последовательности Datapath и генерации статуса. Общая логика может быть синтезирована и спроецирована на блоки PLD. Этот раздел содержит обзор архитектуры PLD.

В каждом конъюнктивном терме можно выбрать прямой (true, Т) или инверсный (complement, С) вход. PLD имеет 12 входов, которые передают информацию на 8 конъюнктивных термов в массиве AND. Буква ‘C’ в 12С4 показывает, что термы OR постоянны для всех входов, а каждый вход OR может получить программный доступ к любому конъюнктивному терму. Выход конъюнктивных термов идет на вход массива OR. Такая структура обеспечивает максимальную гибкость и гарантирует, что все входы и выходы могут быть перемещены.

Структура PLD 12С4.
Рисунок 21-2.

21.3.1.1 Макроячейки PLD

Архитектура макроячеек показана на рисунке 21-3. Выход управляет трассировочным массивом и может быть защелкнут или комбинаторным. Для защелкивания используется D-триггер с прямым или инверсным входом либо T-триггер с высоким или низким входным уровнем. Выходной триггер может быть установлен или сброшен при инициализации или асинхронно при нормальной работе, по внешнему сигналу из трассировочного канала.

Архитектура макроячейки.
Рисунок 21-3.

Регистр макроячейки PLD «только для чтения»
Помимо управления трассировочным массивом, выходы макроячеек обеих PLD спроецированы на адресное пространство в виде 8-битного регистра «только для чтения», доступ к которому можно получить при помощи CPU или DMA.

Регистр макроячейки PLD «только для чтения».
Рисунок 21-4.

21.3.1.2 Цепь переносов PLD

PLD связаны вместе в адресации UDB. Как показано на рисунке 21-5, вход цепи переносов «selin» пробрасывается из предыдущего UDB в цепи, через каждую макроячейку в обеих PLD, после этого направляется на следующий UDB в виде выхода цепи переносов «selout». Для поддержки эффективного размещения арифметических функций, генерируются специальные конъюнктивные термы (PT), которые используются в макроячейках совместно с цепочкой переносов.

Цепь переносов PLD и входы специальных конъюнктивных термов.
Рисунок 21-5.

21.3.1.3 Конфигурация PLD

Каждая PLD предстает перед CPU или DMA в виде ОЗУ с 16-битным доступом. Массив AND имеет 12×8×2 бит или 24 байта для программирования, а массив OR имеет 4×8 бит или 4 байта для программирования. Кроме того, каждая макроячейка имеет один байт конфигурации, итого, 32 байта конфигурации на каждую PLD. Так как каждый UDB имеет 2 PLD, всего конфигурация каждого UDB занимает 64 байта.

В следующий раз мы будем рассматривать Операционные автоматы (Datapaths).

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть