Особенности модуля конфигурируемой логики микроконтроллеров AVR

3 февраля

учёт ресурсовавтоматизацияуниверсальное применениеMicrochipстатьяинтегральные микросхемыAVRCCLATtinyATmega

Александр Русу (г. Одесса)

Конфигурируемый логический модуль CCL присутствует во многих 8-разрядных микроконтроллерах AVR производства Microchip, а также в некоторых 32-разрядных МК на ядре SAM L21. Несмотря на простоту, он позволяет реализовать большое количество прикладных задач, решение которых традиционными способами потребовало бы увеличения количества внешних компонентов или дополнительных затрат процессорного времени.

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

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

В этой статье речь пойдет об особенностях модуля конфигурируемой логики  (Configurable Custom Logic, CCL) микроконтроллеров AVR, с помощью которого можно реализовать обработку цифровых сигналов без использования вычислительного ядра и каких-либо внешних компонентов. В семействе AVR модуль CCL является частью комплекса периферийных устройств, работающих независимо от ядра (Core Independent Peripherals, CIP). Использование CIP в комплексе с аппаратной системой обработки событий (Event System, EVSYS) позволяет реализовывать достаточно сложные алгоритмы работы исключительно на аппаратном уровне без использования процессорного времени, в том числе и без использования прерываний (исключение составляет лишь этап инициализации микроконтроллера, во время которого происходит конфигурирование аппаратных связей внутри него).

На сегодняшний день модуль CCL присутствует в достаточно большом количестве 8-разрядных микроконтроллеров с ядром AVR, в том числе и в успевших уже завоевать заслуженную популярность микросхемах tinyAVR (Series 0 и 1) и megaAVR (Series 0). Не являются исключением и новые линейки микросхем на основе этого ядра (AVR-DA, DB и DD), отличающиеся более развитым набором периферийных устройств, более высокой производительностью, оптимизированным энергопотреблением и меньшей ценой. Кроме этого, модули CCL присутствуют и в некоторых линейках 32-разрядных микроконтроллеров на основе ядер Atmel SAM L21, что лишний раз доказывает наличие достаточно высокой потребности в этих периферийных устройствах. 

Структурная схема модуля CCL

Модуль конфигурируемой логики CCL является автономным периферийным узлом, содержащим несколько блоков с настраиваемой логической функцией. Входы и выходы элементов CCL с помощью соответствующих мультиплексоров могут подключаться к большому числу узлов и систем микроконтроллера, например, к другим периферийным модулям или к системе управления событиями EVSYS. Кроме этого, элементы CCL могут соединяться с выводами микросхемы и между собой, что позволяет создавать на основе CCL многокаскадные схемы с достаточно сложной функциональностью. Таким образом, модуль CCL может стать важным аппаратным связующим звеном между различными элементами системы, которые по отношению к микроконтроллеру могут быть как внешними, так внутренними.

В общем случае с помощью модуля CCL можно реализовать:

  • комбинационные схемы с настраиваемой логической функцией, включая базовые (И, ИЛИ, НЕ), их производные (И-НЕ, ИЛИ-НЕ, исключающее ИЛИ, исключающее ИЛИ-НЕ), а также специфические функции, определяемые пользователем;
  • наиболее распространенные узлы на основе секвенциальной (последовательной) логики, в том числе, RS-, JK- и D-триггеры.

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

Базовым элементом модуля CCL является конфигурируемый логический блок (LookUp Tables, LUT) (рисунок 1), главным узлом которого является конфигурируемый логический элемент с тремя входами и одним выходом, логическую функцию которого можно изменять в соответствии с требуемой задачей. В микроконтроллерах AVR может присутствовать только четное количество блоков LUT, поскольку их выходы соединяются попарно с помощью блока последовательной логики (Sequential), что позволяет создавать узлы, работа которых определяется не только комбинацией входных сигналов, но и предыдущим состоянием схемы.

Рис. 1. Структурная схема модуля CCL, содержащего два блока LUT

Рис. 1. Структурная схема модуля CCL, содержащего два блока LUT

Конфигурируемый логический элемент

Конфигурируемый логический элемент является центральным элементом блока LUT. Он имеет три входа IN[0]…IN[2] и один выход OUT. Функционально этот узел является мультиплексором, информационные входы которого соединены с восемью источниками логических сигналов, уровень которых определяется соответствующими битами в регистре TRUTH, а адресные – с тремя входами IN[0]…IN[2] (рисунок 2). Таким образом, регистр TRUTH фактически содержит таблицу истинности этого узла и определяет, каким будет уровень напряжения на выходе OUT при всех возможных комбинациях входных сигналов (таблица 1).

Рис. 2. Структурная схема конфигурируемого логического элемента

Рис. 2. Структурная схема конфигурируемого логического элемента

Таблица 1.  Истинность конфигурируемого логического элемента

IN[2] IN[1] IN[0] OUT
0 0 0 TRUTH[0]
0 0 1 TRUTH[1]
0 1 0 TRUTH[2]
0 1 1 TRUTH[3]
1 0 0 TRUTH[4]
1 0 1 TRUTH[5]
1 1 0 TRUTH[6]
1 1 1 TRUTH[7]

В качестве примера, поясняющего принцип работы конфигурируемого логического элемента, рассмотрим реализацию функции логического умножения трех входных сигналов (рисунок 3). Для функции 3И единица на выходе узла будет только в одном случае – когда на всех трех входах IN[0]…IN[2] будут логические единицы. Для обеспечения этого значение регистра TRUTH должно быть равно 0х80 (0b10000000).

Рис. 3. Определение значения регистра TRUTH для реализации функции 3И

Рис. 3. Определение значения регистра TRUTH для реализации функции 3И

Как видно из этого примера, с помощью регистра TRUTH можно задать любую логическую функцию, как стандартную (таблица 2), так и определяемую пользователем. Единственным ограничением в этом случае является количество входных параметров, которое в данном случае не может быть больше трех.

Таблица 2.  Значения регистра TRUTH для стандартных логических операций

IN[2..0] TRUTH И
(AND)
И-НЕ (NAND) ИЛИ
(OR)
ИЛИ-НЕ
(NOR)
Искл. ИЛИ

(XOR)

Искл. ИЛИ-НЕ

(XNOR)

НЕ

(NOT)

000 TRUTH[0] 0 1 0 1 0 1 1
001 TRUTH[1] 0 1 1 0 1 0 0
010 TRUTH[2] 0 1 1 0 1 0 0
011 TRUTH[3] 0 1 1 0 0 1 0
100 TRUTH[4] 0 1 1 0 1 0 0
101 TRUTH[5] 0 1 1 0 0 1 0
110 TRUTH[6] 0 1 1 0 0 1 0
111 TRUTH[7] 1 0 1 0 1 0 0
TRUTH 0x80 0x7F 0xFE 0x01 0x96 0x69 0x01

Источники входных сигналов для конфигурируемого логического элемента определяются значениями битов INSEL в регистрах Control B (входы IN[0] и IN[1]) и Control С (вход IN[2]). В общем случае каждый вход можно подключить к шестнадцати различным узлам, однако в реальных микроконтроллерах количество активных источников сигналов обычно меньше.

Первые шесть комбинаций значений битов INSEL (0х0…0x5) обычно одинаковы для всех блоков LUT (таблица 3), а вот точка подключения конкретного входа при значении INSEL больше 0x5 уже зависит от модели микроконтроллера, поэтому для определения всех возможных вариантов подключения модуля CCL требуется изучение технической документации на конкретную микросхему.

Таблица 3. Точка подключения входа блока LUT в зависимости от значений битов INSEL

INSEL Обозначение Точка подключения
0x0 MASK Отключен (всегда 0)
0x1 FEEDBACK Выход этой же пары блоков LUTn
0x2 LINK Выход другого (следующего) блока LUT(n + 1)
0x3 EVENT0 Выход канала 0 системы EVSYS
0x4 EVENT1 Выход канала 1 системы EVSYS
0x5 IO Вывод микросхемы
Остальные Выходы периферийных устройств микроконтроллера (в зависимости от модели микроконтроллера)

Если вход конфигурируемого логического элемента не используется, то значение соответствующих битов INSEL следует установить в ноль (MASK). В этом случае на выбранном входе всегда будет уровень логического нуля. Это позволяет уменьшить количество используемых входов конфигурируемого логического элемента в случаях, когда этого требует конкретная задача.

Уменьшение количества входных сигналов приводит к уменьшению количества их возможных комбинаций, что требуется обязательно учитывать при определении значения регистра TRUTH. В этом случае рекомендуется руководствоваться следующим правилом. Поскольку на неиспользуемом входе всегда присутствует уровень логического нуля, то состояние, при котором его значение не равно нулю, в данном случае логически невозможно. Поэтому эту строчку в таблице истинности логической функции вычеркивают, а в значение соответствующего бита регистра TRUTH[x] записывают ноль (хотя, формально он может быть и равен единице – это состояние все равно никогда не возникнет). После этого для оставшихся комбинаций входных сигналов (для которых неиспользуемый вход равен нулю) определяют значение выходного сигнала и уже после этого определяют значение регистра TRUTH (рисунок 4).

Рис. 4. Принцип формирования значения регистра TRUTH для реализации некоторых стандартных бинарных логических операций

Рис. 4. Принцип формирования значения регистра TRUTH для реализации некоторых стандартных бинарных логических операций

Обратите внимание, при реализации унарных и бинарных операций значение регистра TRUTH для одной и той же логической функции будет зависеть от того, какие конкретно входы используются. И лишь при реализации функции НЕ значения регистра TRUTH всегда будет равно 0x01, независимо от того, на какой из трех входов подавать информационный сигнал (таблица 4).

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

IN[2..0] TRUTH Инвертор (функция НЕ) Повторитель входного сигнала
Активный вход Активный вход
IN[0] IN[1] IN[2] IN[0] IN[1] IN[2]
000 TRUTH[0] 1 1 1 0 0 0
001 TRUTH[1] 0 0 0 1 0 0
010 TRUTH[2] 0 0 0 0 1 0
011 TRUTH[3] 0 0 0 0 0 0
100 TRUTH[4] 0 0 0 0 0 1
101 TRUTH[5] 0 0 0 0 0 0
110 TRUTH[6] 0 0 0 0 0 0
111 TRUTH[7] 0 0 0 0 0 0
TRUTH 0x01 0x01 0x01 0x02 0x04 0x10

Наличия всего трех входов в блоке LUT может быть недостаточно для реализации пользовательской задачи. В этом случае для увеличения количества входов комбинационного логического устройства можно использовать каскадное подключение нескольких блоков LUT. Для этого следует присвоить битам INSEL соответствующего входа значение 0x2 (LINK), что приведет к его подключению к выходу блока LUT с большим порядковым номером (вход последнего блока LUT при этом соединяется c выходом самого первого) (рисунок 5). Такой принцип соединения позволяет реализовать достаточно сложные логические функции с большим количеством входных аргументов и создавать на основе CCL самые разнообразные логические схемы.

Рис. 5. Каскадное соединение модулей LUT

Рис. 5. Каскадное соединение модулей LUT

Фильтр-синхронизатор

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

Для увеличения уровня помехозащищенности в каждом блоке LUT присутствует специальный узел – фильтр-синхронизатор (рисунок 1), выполняющий одновременно две функции: игнорирование кратковременных изменений выходного сигнала, в том числе и вызванных шумовыми процессами, и синхронизацию выходных сигналов блока LUT с различными внутренними или внешними процессами. Выбор метода использования фильтра-синхронизатора определяется значениями битов FITSEL в регистре Control A блока LUT (таблица 5).

Таблица 5. Режим работы фильтра-синхронизатора в зависимости от значений битов FITSEL

FITSEL Обозначение Режим работы фильтра-синхронизатора
0x0 DISABLE Фильтр-синхронизатор отключен
0x1 SYNCH Используется лишь функция синхронизации
0x2 FILTER Используются функции фильтрации и синхронизации
0x3 Зарезервировано

Уменьшить вероятность появления дребезга сигнала на выходе LUT проще всего путем синхронизации внешних сигналов с внутренними процессами микроконтроллера. В этом случае фильтр-синхронизатор настраивается в режим синхронизатора, при котором сигнал с выхода конфигурируемого логического элемента перед подачей на дальнейшие узлы блока LUT проходит через два каскадно соединенные D-триггера (рисунок 6). В этом режиме изменение выходного сигнала происходит только при появлении положительных фронтов входного тактового сигнала CLK_MUX_OUT, что значительно уменьшает вероятность появления дребезга.

Рис. 6. Фильтр-синхронизатор, сконфигурированный в режиме синхронизатора

Рис. 6. Фильтр-синхронизатор, сконфигурированный в режиме синхронизатора

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

Такой режим работы может быть полезным при решении достаточно большого количества практических задач, однако при этом следует помнить о двух особенностях работы в этом режиме. Во-первых, синхронизатор вносит дополнительную задержку, равную двум периодам сигнала CLK_MUX_OUT (рисунок 7). Во-вторых, использование синхронизатора полностью не исключает вероятность появления дребезга, ведь если положительный фронт тактового сигнала CLK_MUX_OUT совпадет по времени с моментом изменения входного сигнала, то «неправильный» логический уровень может записаться в первый D-триггер синхронизатора и попасть на выход LUT.

Рис. 7. Диаграммы работы фильтра-синхронизатора в режиме синхронизатора

Рис. 7. Диаграммы работы фильтра-синхронизатора в режиме синхронизатора

Для полного исключения дребезга выходного сигнала следует использовать все узлы, существующие в фильтре-синхронизаторе. В этом случае сигнал с выхода конфигурируемого логического элемента будет проходить уже через четыре каскадно соединенные D-триггера (рисунок 8). При этом запись информации в последний D-триггер может быть заблокирована с помощью дополнительного логического элемента с функцией исключающее ИЛИ, инверсный выход которого соединен с разрешающим входом G последней ячейки синхронизатора. Блокирование прохождения сигнала происходит каждый раз, когда уровни сигнала на входе и выходе предпоследней ячейки отличаются друг от друга.

Рис. 8. Фильтр-синхронизатор, сконфигурированный в полнофункциональном режиме

Рис. 8. Фильтр-синхронизатор, сконфигурированный в полнофункциональном режиме

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

Следует отметить, что подобная схема увеличивает задержку прохождения сигнала через LUT, которая, в данном режиме, равна четырем периодам сигнала синхронизации CLK_MUX_OUT (рисунок 9). Кроме этого, использование всех элементов фильтра-синхронизатора накладывает дополнительные ограничения на минимальную длительность входного импульса, которая, в данном случае, должна быть не менее двух периодов сигнала синхронизации CLK_MUX_OUT (таблица 6).

Рис. 9. Диаграммы работы фильтра-синхронизатора в полнофункциональном режиме

Рис. 9. Диаграммы работы фильтра-синхронизатора в полнофункциональном режиме

Таблица 6.  Особенности прохождения сигналов через фильтр-синхронизатор

FITSEL Режим Длительность дополнительной задержки Минимальная длительность входного импульса
0x0 Транзит Нет Определяется электрическими характеристиками узлов LUT
0x1 Синхронизатор 2 периода сигнала CLK_MUX_OUT 1 период сигнала CLK_MUX_OUT
0x2 Фильтр-синхронизатор 4 периода сигнала CLK_MUX_OUT 2 периода сигнала CLK_MUX_OUT

Таким образом, использование фильтра-синхронизатора позволяет эффективно избавиться от дребезга сигналов на выходе LUT, однако при этом следует помнить, что ее можно использовать только для относительно медленных по сравнению с сигналом синхронизации CLK_MUX_OUT процессов. Для быстро меняющихся сигналов фильтр-синхронизатор придется отключить, установив биты FITSEL в значение 0x0 (DISABLE).

Детектор фронтов

В некоторых случаях от логических схем требуется импульсная реакция на определенные события – когда на выходе аппаратного узла формируется импульс определенной длительности при обнаружении нужной комбинации входных сигналов. Для реализации этой функции можно использовать специализированный детектор фронтов, позволяющий сформировать на выходе LUT импульс положительной полярности при обнаружении требуемой комбинации сигналов на входах IN[0]…IN[2].

Детектор фронтов состоит из D-триггера, вход и инвертирующий выход которого связаны с помощью логического элемента с функцией И (рисунок 10). Такая схема позволяет не вносить дополнительной задержки в прохождении сигнала – при появлении на входе детектора логической единицы она практически сразу появится на его выходе, и при этом максимальная длительность подобного импульса не будет превышать одного периода тактового сигнала CLK_MUX_OUT (рисунок 11).

Рис. 10. Детектор фронта выходного сигнала блока LUT

Рис. 10. Детектор фронта выходного сигнала блока LUT

Рис. 11. Диаграммы работы детектора фронтов

Рис. 11. Диаграммы работы детектора фронтов

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

Управление детектором фронтов осуществляется путем установки бита EDGESET в регистре Control A соответствующего блока LUT. В качестве тактового сигнала детектора фронтов используется тот же сигнал синхронизации CLK_MUX_OUT, что и в фильтре-синхронизаторе.

Общие особенности модуля LUT

Входы и выходы модуля LUT могут быть соединены как с другими узлам микроконтроллера, так и непосредственно с выводами микросхемы. Для подключения входов LUT к выводам необходимо присвоить соответствующим битам INSEL значение 0x5 (IO). За подключение выхода LUT к выходу микросхемы отвечает бит OUTEN в соответствующем регистре Control A. Следует отметить, что не все микроконтроллеры, особенно выпускающиеся в корпусах с малым количеством выводов, имеют возможность подключения всех входов и выходов блока LUT к выводам микросхемы, поэтому перед принятием решения об использовании модуля CCL требуется внимательное изучение технической документации на выбранное устройство.

Количество источников тактового сигнала CLK_MUX_OUT для узлов модуля LUT зависит от конкретной модели микроконтроллера. В простейшем случае это может быть внутренняя шина тактирования периферийных устройств или внешний сигнал, присутствующий на входе IN[2]. В более развитых моделях микроконтроллеров к этому входу могут подключаться тактовые генераторы с различными частотами или другие устройства. Выбор источника сигнала CLK_MUX_OUT определяется битами CLKSRC в регистре Control A блока LUT (в каждом блоке может использоваться собственный источник тактового сигнала).

Таким образом, настройки каждого блока LUT определяются четырьмя регистрами (таблица 7), три из которых (Control A – Control C) являются конфигурационными, а четвертый (TRUTН) определяет логическую функцию этого блока.

Таблица 7. Конфигурационные регистры блока LUT

Регистр Бит Обозначение Описание
Control A 0 ENABLE Включение модуля LUT
 1…6 OUTEN,
FILTSEL,
CLKSRC
Подключение выхода LUT к выходу микросхемы, режим работы фильтра-синхронизатора, источник сигнала синхронизации. Количество и расположение конфигурационных бит зависит от конкретной модели микроконтроллера
7 EDGEDET Режим работы детектора фронтов
Control B 0…3 INSEL0 Точка подключения входа IN[0] конфигурируемого логического элемента
4…7 INSEL1 Точка подключения входа IN[1] конфигурируемого логического элемента
Control C 0…3 INSEL2 Точка подключения входа IN[2] конфигурируемого логического элемента. Источник сигнала синхронизации CLK_MUX_OUT (если бит CLKSRC в регистре Control A установлен в единицу)
4…7 Не используются
TRUTН 0…7 TRUTН Логическая функция конфигурируемого логического элемента

Блок последовательной логики

Наличие блока последовательной логики (Sequencer) позволяет реализовать аппаратные устройства, выходные сигналы которых определяются не только комбинацией входных сигналов, но и предыдущим состоянием этого узла. Блок последовательной логики имеет два информационных входа, подключенных к выходам блоков LUT (из-за этого количество блоков LUT в микроконтроллере всегда четное), и один выход, мультиплексируемый с выходом блока LUT, имеющего четный номер (ноль считается четным числом) (рисунок 1).

Режим работы блоков последовательной логики определяется состоянием битов SEQSEL в регистрах Sequencer Control, относящихся к конфигурационным регистрам модуля CCL. На момент написания статьи возможны пять режимов работы этого блока, позволяющих реализовать четыре наиболее распространенные типа логических элементов (таблица 8).

Таблица 8. Режимы работы блока последовательной логики

FITSEL Обозначение Режим работы фильтра-синхронизатора
0x0 DISABLE Отключен (не используется)
0x1 DFF Динамический D-триггер (D Flip-Flop)
0x2 JK Синхронный JK-триггер
0x3 LATCH Статический D-триггер (D Latch)
0x4 RS Асинхронный RS-триггер
Остальные Не используются

Наиболее простым последовательным логическим элементом является асинхронный RS-триггер (рисунок 12), имеющий два входа: вход установки (S) и сброса (R), подключенные к выходам блоков LUT, соответственно, с четными и нечетными номерами. Алгоритм работы RS-триггера (таблица 9) ничем не отличается от классической реализации этого узла: при подаче на вход S сигнала с высоким логическим уровнем на выходе Q триггера будет установлен уровень логической единицы, а при подаче единицы на вход R триггер будет сброшен.

Рис. 12. Асинхронный RS-триггер

Рис. 12. Асинхронный RS-триггер

Таблица 9. Алгоритм работы RS-триггера

Вход S Вход R Выход Q Комментарии
0 0 x Состояние не меняется
0 1 0 Сброс
1 0 1 Установка
1 1 x Запрещенная комбинация

Наличие на входах S и R логических нулей не приведет к изменению состояния этого элемента, а одновременное присутствие на двух входах сигналов с высоким логическим уровнем является запрещенным, поэтому реальное поведение этого узла в этом режиме не регламентируется.

JK-триггер (рисунок 13) по праву считается универсальным логическим элементом подобного типа, поскольку на его основе можно реализовать практически все существующие виды триггеров. Алгоритм работы JK-триггера (таблица 10) аналогичен алгоритму работы RS-триггера за исключением того, что у JK-триггера отсутствует запрещенная комбинация входных сигналов. При одновременной подаче на входы J и К сигналов с уровнями логической единицы произойдет переключение триггера на противоположное состояние. Этот режим может использоваться, в частности, при необходимости реализации Т-триггера (переключаемого триггера). В этом случае входы J и К должны подключаться к одному и тому же источнику сигнала, что подразумевает одинаковую настройку блоков LUT с четным и нечетным номерами.

Рис. 13. Синхронный JK-триггер

Рис. 13. Синхронный JK-триггер

Таблица 10.  Алгоритм работы JK-триггера

Вход R Вход J Вход K Выход Q Комментарии
1 x x 0 Асинхронный сброс
0 0 0 x Состояние не меняется
0 0 1 0 Сброс
0 1 0 1 Установка
0 1 1 x Переключение

В отличие от асинхронного RS-триггера, JK-триггер является синхронным. Изменение его состояния происходит по положительному фронту тактового сигнала CLK_MUX_OUT, источником которого является блок LUT с четным порядковым номером. Если этот блок отключен, то триггер переходит в асинхронный режим работы (при этом возможет только сброс триггера, поскольку на входе J будет всегда присутствовать сигнал с уровнем логического нуля). Кроме этого, JK-триггер имеет асинхронный вход R, соединенный с узлом общего сброса микроконтроллера.

D-триггеры широко используются в системах, где необходимо фиксировать («защелкивать») уровень некоторого сигнала или добавлять задержку в прохождении информации. Модуль CCL позволяет создать две версии D-триггера: статический (потенциальный) (D-Latch) (рисунок 14) и динамический (D Flip-Flop) (рисунок 15). Обе версии D-триггера имеют два входа: информационный D и управляющий G, подключенные к выходам LUT, соответственно, с четными и нечетными номерами.

Рис. 14. Статический (потенциальный) D-триггер

Рис. 14. Статический (потенциальный) D-триггер

Рис. 15. Динамический D-триггер

Рис. 15. Динамический D-триггер

В статической версии D-триггера (D-Latch) фиксация состояния на входе D происходит сразу после его изменения (таблица 11). Таким образом, при наличии логической единицы на входе G этот элемент работает как буфер выходного сигнала блока LUT с четным номером. После установки на входе G сигнала с уровнем логического нуля изменение состояния триггера блокируется и триггер запоминает состояние информационного сигнала.

Таблица 11. Алгоритм работы статического D-триггера

Вход G Вход D Выход Q Комментарии
0 x x Состояние не меняется
1 0 0 Сброс
1 1 1 Установка

Динамическая версия D-триггера (D Flip-Flop) работает аналогично (таблица 12), за исключением того, что изменение состояния триггера происходит в момент прихода положительного фронта тактового сигнала CLK_MUX_OUT. Кроме этого, динамический D-триггер имеет асинхронный вход R, позволяющий установить его в ноль при сбросе микроконтроллера.

Таблица 12. Алгоритм работы динамического D-триггера

Вход R Вход G Вход D Выход Q Комментарии
1 x x 0 Асинхронный сброс
0 0 x x Состояние не меняется
0 1 0 0 Сброс
0 1 1 1 Установка

Пример реализации логического элемента

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

Для настройки модуля CCL воспользуемся программным пакетом Atmel Start. После создания нового проекта и выбора нужного микроконтроллера на вкладке DASHBOARD следует нажать на кнопку «Add software component» и в появившемся диалоговом окне в списке «Drivers» выбрать «Digital Glue Logic» (рисунок 16).

Рис. 16. Добавление программного компонента CCL

Рис. 16. Добавление программного компонента CCL

После этого в левой части главного окна появится кнопка «CCL», нажатие на которую приведет к переходу в окно конфигурации этого аппаратного модуля. Для настройки этого модуля необходимо установить отметку «Enable CCL», после чего станут доступными инструменты для конфигурирования его блоков. В данном случае нам необходимо настроить один из доступных блоков LUT, общее количество которых уже зависит от конкретной модели микроконтроллера.

Доступ к настройкам блока LUT открывается после установки отметки в поле «Enable». Быстрее всего настроить модуль LUT, как и любой другой аппаратный блок, можно, нажав на кнопку «Settings», расположенную в пределах поля графического изображения настраиваемого узла. В данном случае, после нажатия на кнопку «Settings» блока LUT откроется диалоговое окно, в котором следует установить нужные параметры (рисунок 17). В данном случае нам необходимо подключить все три входа к выводам микросхемы, выбрав в раскрывающихся списках позицию «IO pin LUTn-INx input source», а также установить отметку в поле «OUTEN: Output Enable». В этом же окне можно установить значение регистра TRUTH, однако, если оно на данном этапе неизвестно, то для его определения лучше воспользоваться графическим инструментом в основном окне настроек модуля CCL.

Рис. 17. Диалоговое окно настройки блока LUT

Рис. 17. Диалоговое окно настройки блока LUT

Следует отметить, что если входные сигналы блоков LUT будут генерироваться другими периферийными модулями микроконтроллера, в том числе и системой управления событиями EVSYS, то настройку модуля CCL лучше всего проводить уже после настройки этих узлов микроконтроллера.

Продолжить настройку остальных блоков можно в основном окне конфигуратора CCL (рисунок 18). Особо следует отметить наличие удобного инструмента для настройки логической функции. В раскрывающемся списке «Gate Type» уже присутствуют готовые комбинации для стандартных логических операций (таблица 2), например, в данном примере для установки регистра TRUTH достаточно выбрать пункт «AND». Для нестандартных функций следует выбрать пункт «Custom», после чего станут доступны поля, в котором логическую функцию можно будет указать с помощью выражения (поле «Expression»), числом (поле «Value (hex)»), либо вручную путем установки соответствующих бит для каждой комбинации входных сигналов.

Рис. 18. Окно настройки модуля CCL

Рис. 18. Окно настройки модуля CCL

После этого будет создан исходный код для настойки модуля на языке С (рисунок 19), который можно будет скопировать в свой проект (исходный код доступен при нажатии на кнопку «View Code»). Программный пакет Atmel Start позволяет также сгенерировать полностью готовые проекты, которые можно импортировать в большинство интегрированных сред разработки, предназначенных для работы с микроконтроллерами AVR, в том числе Atmel Studio, Microchip Studio, MPLAB X IDE и IAR Embedded Workbench.

Рис. 19. Сгенерированный исходный код для настройки модуля CCL

Рис. 19. Сгенерированный исходный код для настройки модуля CCL

Примеры реализации детектора состояния 

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

Рис. 20. Аппаратный детектор состояния пяти входных сигналов

Рис. 20. Аппаратный детектор состояния пяти входных сигналов

Вход блока LUT может подключаться только к выходу блока LUT с большим порядковым номером, поэтому в нашем случае первым (по схеме) конфигурируемым логическим элементом, подключаемым к выводам PA0, PA1, PA2, будет блок LUT1, а вторым – блок LUT0, два входа которого соединены с выводами PC1, PC2, а третий – с выходом LUT1.

При ручном написании кода без использования специализированных программных инструментов Microchip рекомендуется все настройки проводить при выключенном модуле CCL, когда бит ENABLE в регистре Control A (не путать с аналогичными битами и регистрами блоков LUT) сброшен. В данном случае, регистры Control B обоих блоков LUT будут иметь одинаковое значение (таблица 13), поскольку их входы IN[0] и IN[1] подключаются к выводам микросхемы. А вот значения регистров Control C будут отличаться, поскольку вход IN[2] блока LUT1 подключается к выводу микросхемы, а вход IN[2] блока LUT0 – к выходу LUT1.

Таблица 13. Значения регистров LUT аппаратного детектора состояния

Регистр LUT0 LUT1
Control A CCL_ENABLE_bm | CCL_OUTEN_bm CCL_ENABLE_bm
Control B CCL_INSEL0_IO_gc | CCL_INSEL1_IO_gc CCL_INSEL0_IO_gc | CCL_INSEL1_IO_gc
Control C CCL_INSEL2_LINK_gc CCL_INSEL2_IO_gc
TRUTН 0x40 0x20

Также разными будут и значения регистров Control A. В обоих регистрах, как минимум, необходимо установить значение бита ENABLE. Кроме этого, в блоке LUT0 необходимо еще установить в единицу бит OUTEN, отвечающий за подключение выхода этого блока к выводу микросхемы.

Выходной сигнал блока LUT1 должен быть равен логической единице в случае, когда на входе присутствует комбинация сигналов «110». Таким образом, регистр TRUTH  блока LUT1 должен содержать единицу только в шестом разряде  (0b01000000). В шестнадцатеричной системе счисления этой комбинации соответствует число 0х40. Аналогично, выходной сигнал блока LUT0 должен иметь высокий уровень при комбинации входных сигналов «101». Такую реакцию можно обеспечить, установив значение регистра TRUTH, равным 0х20 (0b00100000).

Настройка значений регистров Control A…С и TRUTH блоков LUT может проходить в любой последовательности. И только после того, как она завершена, можно установить бит ENABLE в регистре Control A модуля CCL, что приведет к включению модуля. Таким образом, исходный код для настройки модуля CCL может выглядеть приблизительно так, как показано в листинге 1.

Листинг 1. Исходный код настройки модуля CCL для реализации аппаратного детектора состояния с пятью входами



// настройка блока LUT0

CCL.LUT0CTRLA = CCL_OUTEN_bm | CCL_ENABLE_bm;

CCL.LUT0CTRLB = CCL_INSEL0_IO_gc | CCL_INSEL1_IO_gc;

CCL.LUT0CTRLC = CCL_INSEL2_LINK_gc;

CCL.TRUTH0 = 0x40;

// настройка блока LUT1

CCL.LUT1CTRLA = CCL_ENABLE_bm;

CCL.LUT1CTRLB = CCL_INSEL0_IO_gc | CCL_INSEL1_IO_gc;

CCL.LUT1CTRLC = CCL_INSEL2_IO_gc;

CCL.TRUTH1 = 0x20;

// включение блока CCL

CCL.CTRLA |= CCL_ENABLE_bm;

Пример реализации RS-триггера

RS-триггеры относятся к последовательным логическим устройствам, поэтому для их реализации кроме блоков LUT необходимо использовать и блоки последовательной логики. Рассмотрим пример реализации классического аппаратного RS-триггера, входы и выходы которого соединены с выводами микросхемы (рисунок 21).

Рис. 21. Аппаратный RS-триггер на основе модуля CCL

Рис. 21. Аппаратный RS-триггер на основе модуля CCL

В данном примере в каждом из двух блоков LUT будет использоваться только один информационный вход, пусть это будет вход IN[1]. В этом случае значения битов INSEL в регистрах Control B и С для активных входов следует установить в значение 0х5 (IO), а для неактивных – в значение 0x0 (MASK) (таблица 14). Значение регистров TRUTH для каждого блока LUT будет зависеть от активного уровня сигнала для каждого входа. Если активным уровнем будет уровень логической единицы, тогда регистр TRUTH при использовании входа IN[1] должен иметь значение 0х02 (таблица 4). При инверсном сигнале управления, когда активным уровнем является уровень логического нуля, значение регистра TRUTH должно быть равно 0x01 независимо от того, какой конкретно вход блока LUT является активным. Пусть в нашем примере оба входа триггера будут инверсными.

Таблица 14. Значения регистров LUT реализации аппаратного RS-триггера

Регистр LUT0 LUT1
Control A CCL_ENABLE_bm | CCL_FILTSEL_FILTER_gc
| CCL_OUTEN_bm
CCL_ENABLE_bm | CCL_FILTSEL_FILTER_gc
Control B CCL_INSEL0_MASK_gc | CCL_INSEL1_IO_gc CCL_INSEL0_MASK_gc | CCL_INSEL1_IO_gc
Control C CCL_INSEL2_MASK_gc CCL_INSEL2_MASK_gc
TRUTН 0x01 0x01
SEQSEL0 CCL_SEQSEL0_RS_gc

Для RS-триггера одновременная подача двух сигналов с высоким логическим уровнем приводит к переводу его в режим запрещенного состояния, поэтому при принятии решения об использовании этого логического элемента разработчик должен исключить возможность появления такой комбинации сигналов в системе. Однако в процессе работы из-за наличия шумов и импульсных помех подобную комбинацию может кратковременно создать сам модуль CCL, поэтому входные сигналы для каждого блока LUT лучше всего пропустить через фильтры-синхронизаторы, настроенные в полнофункциональном режиме (рисунок 8). Для этого битам FILTSEL регистров Control A каждого блока LUT следует присвоить значение 0х2.

При настройке блока LUT с четным порядковым номером (в данном примере – LUT0) нужно не забыть подключить его выход к выводу микросхемы, для чего нужно установить бит OUTEN в регистре Control A.

Активизация блока последовательной логики происходит в регистрах Sequencer Control выбранной пары блоков LUT (для каждой пары обычно используется отдельный регистр). В нашем примере режим работы блока последовательной логики для блоков LUT0 и LUT1 определяется битами SEQSEL0 в регистре SEQCTRL0, которым нужно присвоить значение 0х4 (RS).

Таким образом, исходный код для настройки модуля CCL при реализации RS-триггера может выглядеть приблизительно так, как показано в листинге 2.

Листинг 2. Исходный код настройки модуля CCL для реализации аппаратного RS-триггера



// настройка блока LUT0

CCL.LUT0CTRLA = CCL_ENABLE_bm | CCL_FILTSEL_FILTER_gc | CCL_OUTEN_bm;

CCL.LUT0CTRLB = CCL_INSEL0_MASK_gc | CCL_INSEL1_IO_gc;

CCL.LUT0CTRLC = CCL_INSEL2_MASK_gc;

CCL.TRUTH0 = 0x01;

// настройка блока LUT1

CCL.LUT1CTRLA = CCL_ENABLE_bm | CCL_FILTSEL_FILTER_gc;

CCL.LUT1CTRLB = CCL_INSEL0_MASK_gc | CCL_INSEL1_IO_gc;

CCL.LUT1CTRLC = CCL_INSEL2_MASK_gc;

CCL.TRUTH1 = 0x01;

// настройка блока последовательной логики

CCL.SEQCTRL0 = CCL_SEQSEL0_RS_gc;

// включение блока CCL

CCL.CTRLA |= CCL_ENABLE_bm;

Пример реализации Манчестерского кодера

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

Рис. 22. Принцип Манчестерского кодирования

Рис. 22. Принцип Манчестерского кодирования

Одним из способов реализации Манчестерского кодера является объединение информационного и тактового сигналов с помощью логического элемента с функцией Исключающее ИЛИ. В данном примере в качестве источника обоих сигналов был выбран модуль SPI (рисунок 23).

Рис. 23. Манчестерский кодер

Рис. 23. Манчестерский кодер

В этом случае Манчестерский кодер можно реализовать на единственном блоке LUT, входы которого необходимо подключить к выходу модуля SPI. Один из вариантов исходного кода для реализации такого решения приведен в листинге 3. Единственным условием для практической реализации этого примера является наличие в микроконтроллере модуля SPI и возможность его подключения к модулю CCL.

Листинг 3. Исходный код настройки модуля CCL для реализации Манчестерского кодера



// настройка блока LUT0

CCL.LUT0CTRLA = CCL_ENABLE_bm | CCL_OUTEN_bm;

CCL.LUT0CTRLB = CCL_INSEL0_MASK_gc | CCL_INSEL1_SPI0_gc;

CCL.LUT0CTRLC = CCL_INSEL2_SPI0_gc;

CCL.TRUTH0 = 0x14;

// включение блока CCL

CCL.CTRLA |= CCL_ENABLE_bm;

Заключение

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

•••

Наши информационные каналы

О компании Microchip

Microchip Technology Inc. - ведущий поставщик микроконтроллеров, схем смешанного сигнала, аналоговых полупроводников и решений на основе флэш-IP. Решения Microchip обеспечивают разработку с низким уровнем риска, снижают общую стоимость системы и сокращают время выхода на рынок для тысяч различных клиентских приложений по всему миру. Штаб-квартира в Чандлер, штат Аризона. Продукция Microchip обладает высокими качеством и уровнем технической поддержки. Продукция Microchip обладает высоким уровн ...читать далее

Товары
Наименование
ATMEGA3208-AF (MCRCH)
ATMEGA3208-MF (MCRCH)
ATMEGA1609-AFR (MCRCH)
ATMEGA1609-MFR (MCRCH)
ATTINY804-SSNR (MCRCH)
ATTINY804-SSF (MCRCH)
ATTINY406-MF (MCRCH)
ATTINY406-MZT-VAO (MCRCH)
ATTINY1614-SSF (MCRCH)
ATTINY1614-SSZT-VAO (MCRCH)
ATTINY816-MFR (MCRCH)
ATTINY816-SF (MCRCH)
ATTINY1626-MUR (MCRCH)
ATTINY1626-SUR (MCRCH)
ATTINY826-MFR (MCRCH)
ATTINY826-SFR (MCRCH)
AVR64DA32-I/RXB (MCRCH)
AVR64DA32T-I/RXB (MCRCH)
AVR64DA48-I/PT (MCRCH)
AVR64DA48T-I/PT (MCRCH)