Конфигурируемые логические ячейки в PIC микроконтроллерах

в 15:59, , рубрики: diy или сделай сам, microchip, pic контроллеры, микроконтроллеры, схемотехника, Электроника для начинающих

Первоначальный замысел статьи состоял в описании Периферии Независимой от Ядра микроконтроллеров Microchip, но тема оказалась весьма обширной, поэтому в качестве первого шага расскажем о CLC – конфигурируемых логических ячейках (Configurable Logic Cell).

В статье (Использование конфигурируемых логических ячеек для управления светодиодной лентой WS2812 [1]) было рассмотрено как логические ячейки CLC PIC-контроллеров могут существенно упростить решение задачи формирования сигналов управления драйверами WS2812 и аппаратно реализовать функции, на программное решение которых может не хватать быстродействия простого микроконтроллера.
Цель представленной статьи заключается в более близком знакомстве с конфигурируемыми логическими ячейками в PIC микроконтроллерах Microchip, в демонстрации примеров реализаций и, по возможности, натолкнуть читателя на мысли по использованию CLC своих проектах.

Если очень кратко, то CLC это одна из частей ПНЯ.

Введение.
Описание. Варианты конфигурации. Что может быть входами и выходами

Конфигурируемые логические ячейки CLC являются частью ПНЯ – Периферии Независимой от Ядра (Core Independent Peripheral, CIP), т.е. функционирование такой периферии не зависит (почти) от тактовой частоты микроконтроллера и его состояния (RUN, IDLE, SLEEP).
Конечно же, подобная периферия конфигурируется программой микроконтроллера, но дальнейшее функционирование может быть независимым.

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

Конфигурируемые логические ячейки в PIC микроконтроллерах - 1

Рис.1. Структура одной логической ячейки CLC

Каждая из логических ячеек имеет 4 входа, сигналы для которых выбираются входным мультиплексором, при этом каждый вход может быть прямым или инверсным. Часть входов может не использоваться и подключаться к уровню лог.0 или лог.1.
Входы для ячеек могут иметь внешние подключения (порты ввода/вывода) и внутренние (сигналы другой периферии: ШИМ, компараторы, таймеры и др. и выходы самих CLC).
Выход ячейки CLC имеет управляемую полярность, может подключаться на выходной порт микроконтроллера, к другой периферии, формировать запрос на прерывание по изменению состояния (по фронту и/или спаду).

Логическая функция каждой ячейки выбирается из 8-и вариантов (см. табл.1)

лог. ячейка лог. ячейка
Конфигурируемые логические ячейки в PIC микроконтроллерах - 2 Конфигурируемые логические ячейки в PIC микроконтроллерах - 3
Конфигурируемые логические ячейки в PIC микроконтроллерах - 4 Конфигурируемые логические ячейки в PIC микроконтроллерах - 5
Конфигурируемые логические ячейки в PIC микроконтроллерах - 6 Конфигурируемые логические ячейки в PIC микроконтроллерах - 7
Конфигурируемые логические ячейки в PIC микроконтроллерах - 8 Конфигурируемые логические ячейки в PIC микроконтроллерах - 9

Таблица 1. Варианты функций логических ячеек.

Так как логические ячейки имеют массу настроек, то проще всего конфигурировать CLC через плагин MPLAB Code Configurator в среде разработки MPLAB X, который создает Си файлы настроек задействованной периферии.

Конфигурируемые логические ячейки в PIC микроконтроллерах - 10

Рис. 2. Среда разработки Mplab X IDE с запущенным плагином Mplab Code Configurator (MCC)
где:
1 – редактируемая ячейка;
2 – настройка входного мультиплексора и полярности входов;
3 – функция логической ячейки;
4 – резервирование портов ввода/вывода.

Примеры использования CLC

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

Если сигналы двух ШИМ с близкими частотами подключить к входам CLC сконфигурированной как элемент XOR (исключающее ИЛИ), то можно организовать «мерцание» светодиода (периодическое изменение скважности). При этом решение полностью аппаратное и не требует участия ядра МК (программы).

Конфигурируемые логические ячейки в PIC микроконтроллерах - 11

Рис. 3a. Схема «ШИМ модулятора»

Конфигурируемые логические ячейки в PIC микроконтроллерах - 12

Рис. 3b. Диаграммы демонстрирующие принцип изменения скважности

Если под такую простую задачу жалко использовать два ШИМ-модуля, то возможны варианты реализации без ШИМ:

А) Используем сигналы переполнения двух таймеров (события), плюс три ячейки CLC.
На два JK- триггера в счетном режиме подаем сигналы с таймеров (postscaled out) – получаем на выходе меандры, которые затем подаем на элемент XOR.

Конфигурируемые логические ячейки в PIC микроконтроллерах - 13

Рис. 3c. Реализация ШИМ модулятора без входных ШИМ сигналов

Б) Используем сигналы переполнения двух таймеров и одну CLC.
На входы RS триггера подаем сигналы с Таймера (postscaled out) – получаем на выходе «пилообразный ШИМ» (рис. 3e).

Конфигурируемые логические ячейки в PIC микроконтроллерах - 14

Рис. 3d.

Конфигурируемые логические ячейки в PIC микроконтроллерах - 15

Рис. 3e.

Делитель частоты

Схема делителя частоты на 2 приведена на рис. 4a. Используется один D-триггер в счетном режиме. Входной сигнал подается на вход тактирования, вход D соединен с инверсным выходом триггера. В момент поступления на вход тактирования фронта на входе D всегда будет инверсный сигнал относительно текущего состояния триггера, т.е. состояние триггера будет меняться только по фронту входного сигнала.

Конфигурируемые логические ячейки в PIC микроконтроллерах - 16

Рис.4а. Делитель на 2.

В плагине MPLAB Code Configurator подобная схема может выглядеть так:

Конфигурируемые логические ячейки в PIC микроконтроллерах - 17

Рис. 4b. Делитель на 2 в настройках MCC.

Конфигурируемые логические ячейки в PIC микроконтроллерах - 18

Рис.4c. Диаграмма на входе и выходе делителя.

Делитель на 3 изображен на рис. 4d.

Конфигурируемые логические ячейки в PIC микроконтроллерах - 19

Рис. 4d. Делитель на 3.

Делитель на 4 это два последовательно включенных делителя на 2 ;-)

Где могут применяться делители? Там, где нужно поделить частоту.
Следующий пример использует делители частоты.

Драйвер шагового двигателя

Один из самых простых вариантов управления Шаговым Двигателем (ШД) это полношаговое управление (full step). В этом варианте сигналы управления сдвинуты на 90°. Поэтому можно взять периодический сигнал, на один делитель частоты подать его в прямом виде, на другой – в инверсном.

Конфигурируемые логические ячейки в PIC микроконтроллерах - 20

Рис. 5a. Формирователь сигналов управления шаговым двигателем.

Конфигурируемые логические ячейки в PIC микроконтроллерах - 21

Рис. 5b. Диаграмма на выходе формирователя.

Изменение частоты на входе CLC будет изменять частоту управляющих сигналов шагового двигателя. Входную частоту можно брать с входа микроконтроллера (внешний сигнал), либо от внутреннего источника – ШИМ или NCO генератора.
При управлении ШИМ-ом нужно менять 2 параметра: регистр периода (частота) и регистр скважности, так как управляющий сигнал должен быть с 50% скважностью.
Применение NCO (Numerically Controlled Oscillator, управляемый генератор) выглядит более привлекательным, так как это генератор может автоматически формировать меандр, поэтому для изменения частоты нужно менять значения только в одном регистре.
Для смены направления нужно инвертировать сигналы на одной из фаз.

Задержка. Формирование импульса по фронту, спаду, изменениям

Для некоторых задач может понадобиться формирование задержанного импульса.
Для этого можно применить D-триггер. На счетный вход падаем входной сигнал, на вход тактирования – какой либо высокочастотный сигнал (например тактовой частоты Fosc). Таким образом, изменение выхода триггера будет происходить только по фронту тактового сигнала.
Данный метод будет сдвигать фронт и спад сигала на период Fosc (тактовой частоты) только если оба сигнала синхронны. Поэтому для гарантированного сдвига на 1 период Fosc сдвигаемый сигнал должен формироваться самим микроконтроллером (ШИМ, NCO и др.). Если входной сигнал асинхронный, то на входе можно поставить синхронизатор на точно таком же D-триггере (т.е. сперва сдвинуть асинхронный сигнал до первого тактового импульса, а затем сдвинуть на полный период тактового сигнала).

Конфигурируемые логические ячейки в PIC микроконтроллерах - 22

Рис. 6a. Формирователь задержанного сигнала.

Конфигурируемые логические ячейки в PIC микроконтроллерах - 23

Рис. 6b. Диаграммы на входе и выходе формирователя задержанного сигнала.

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

Формирование импульсов по фронту и спаду

Конфигурируемые логические ячейки в PIC микроконтроллерах - 24

Рис. 7a. Формирователь импульсов по фронту и спаду

Конфигурируемые логические ячейки в PIC микроконтроллерах - 25

Рис. 7b. Диаграммы на входе и выходе формирователя импульсов по фронту и спаду

Формирование импульсов по фронту

Конфигурируемые логические ячейки в PIC микроконтроллерах - 26

Рис. 8a. Формирователь импульсов по фронту.

Конфигурируемые логические ячейки в PIC микроконтроллерах - 27

Рис. 8b. Диаграммы на входе и выходе формирователя импульсов по фронту

Формирование импульсов по спаду

Конфигурируемые логические ячейки в PIC микроконтроллерах - 28

Рис. 9a. Формирователь импульсов по спаду

Конфигурируемые логические ячейки в PIC микроконтроллерах - 29

Рис. 9b. Диаграммы на входе и выходе формирователя импульсов по спаду

Где могут применяться подобные схемы?
Можно использовать, например, при построении импульсного источника питания для бланкирования сигнала обратной связи от компаратора во время переключения силового ключа (подробнее см.ниже).

Подавление дребезга контакта

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

Конфигурируемые логические ячейки в PIC микроконтроллерах - 30

Рис.10a. подавление дребезга.

Конфигурируемые логические ячейки в PIC микроконтроллерах - 31

Рис.10b. Диаграммы сигналов на входе и выходе схемы подавления дребезга.

Где применяется?
Собственно опрос кнопок, предотвращение многократных ложных срабатываний.

Еще варианты

Конфигурируемые логические ячейки в PIC микроконтроллерах - 32

Рис.10c. Подавление дребезга с задержкой с RC-цепочкой

Конфигурируемые логические ячейки в PIC микроконтроллерах - 33

Рис.10d. подавление дребезга

В отличие от предыдущего примера задержка определяется параметрами RC цепи и не требует задействование таймера.

Квадратурный энкодер

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

Ниже приведены две схемы декодирования сигналов квадратурного энкодера.

Конфигурируемые логические ячейки в PIC микроконтроллерах - 34

Рис. 11a. Квадратурный декодер со счетным выходом и сигналом направления.

Эта схема детектирует фазы входных сигналов (состояние выхода D показывает направление вращения энкодера) и выдает тактовые сигналы (выход С).

Конфигурируемые логические ячейки в PIC микроконтроллерах - 35

Рис 11b. Квадратурный декодер с двумя счетными выходами

Эта схема выдает импульсы. Один выход при вращении по часовой стрелке, второй выход – при обратном вращении.

При переключении контактов энкодер выдает множественные ложные срабатывания (дребезг контактов).

Конфигурируемые логические ячейки в PIC микроконтроллерах - 36

Рис. 11c. Сигналы с выходов механического квадратурного энкодера

Вот тут фрагмент покрупнее:

Конфигурируемые логические ячейки в PIC микроконтроллерах - 37

Рис. 11d. Сигналы с выходов механического квадратурного энкодера

Поэтому обе схемы нуждаются в очищенных от дребезга сигналов. Ранее мы уже рассматривали варианты подавления дребезга аппаратно на ячейках CLC.

Конфигурируемые логические ячейки в PIC микроконтроллерах - 38

Рис. 11e. Входные сигналы с энкодера и очищенные от дребезга.

Под обработку сигналов квадратурного энкодера понадобятся 4 ячейки CLC – две для подавления дребезга и две для детектирования.

Конфигурируемые логические ячейки в PIC микроконтроллерах - 39

Рис. 11f. Диаграммы сигналов обработки квадратурного энкодера для схемы с выходом направления

Конфигурируемые логические ячейки в PIC микроконтроллерах - 40

Рис. 11g. Диаграммы сигналов обработки квадратурного энкодера для схемы с двумя счетными выходами.

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

Где применяется?
Механические и оптические энкодеры, подсчет числа входящих и выходящих людей, закрытие турникета при прохождении в неположенном направлении ))

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

Манчестерское кодирование широко применяется при передаче сигналов. Каждый бит делится на два интервала, после первого интервала (в середине информационного бита) происходит смена уровня сигнала. Передача каждого информационного бита сопровождается изменением уровня, Нули и Единицы отличаются фазой (1 – перепад из 0 в 1, «0» — из 1 в 0). Таким образом, манчестерский код имеет следующие особенности:

  • Самосинхронизирующийся – нет необходимости передачи специальных синхро сигналов, так как уровень передаваемого сигнала гарантировано меняется в середине информационного бита; высокая плотность информации
  • Нет постоянной составляющей (сигнал меняется каждый такт)

Схема кодирования очень проста и использует один логический элемент ИСКЛЮЧАЮЩЕЕ ИЛИ.

На выходе получаем кодированный поток.

Конфигурируемые логические ячейки в PIC микроконтроллерах - 41

Рис. 12. Диаграммы формирователя Манчестерского кода

Декодер манчестерского кода

Схема манчестерского декодера гораздо сложнее. Её задача выделить синхро-импульсы и битовый поток.

В примере применения AN1470 [2] предлагается следующая реализация аппаратного декодирования Минчестерского кода на основе CLC и NCO (управляемого генератора).

Конфигурируемые логические ячейки в PIC микроконтроллерах - 42

Рис.13a. Схема декодера Манчестерского кода

Конфигурируемые логические ячейки в PIC микроконтроллерах - 43

Рис. 13b. Диаграммы, поясняющие работу декодера

Стадия 1 – D-Триггер
Ячейка CLC4 (D-триггер) защелкивает входной поток по спаду сигнала синхронизации. Выход с этого триггера будет являться декодированными (восстановленными) данными из входного потока.

Стадия 2 – элемент XOR (CLC2)
Поскольку в Манчестерском кодировании изменение сигнала происходит в середине каждого информационного бита, то можно использовать элемент ИСКЛЮЧАЮЩЕЕ ИЛИ чтобы обеспечить нарастающий фронт на стадии 3 в середине каждого бита, т.е. мы синхронизируем декодер в середине каждого бита.

Стадия 3 – NCO + AND-OR (CLC1)
модуль NCO, используется для генерации ¾ битового интервала по завершении которого производится захват (фиксация) данных. NCO используется в режиме с активным низким состоянием. Длительность импульсов можно регулировать с помощью регистров. Модулю NCO необходим источник тактовых импульсов, которые поступают ему из CLC1.
Эти два блока являются наиболее важными в декодере. Они создают импульсы фиксированной длины после каждого нарастающего фронта сигнала, выходящего из «стадия 2». Выходной сигнал NCO подается обратно в элемент И-ИЛИ так, что если выход из «стадия 2» становится равным нулю, то NCO будет продолжать тактироваться до своего переполнения.

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

Ждущий мультивибратор

Для формирования одиночного импульса по фронту или спаду входного сигнала служат ждущие мультивибраторы.

Конфигурируемые логические ячейки в PIC микроконтроллерах - 44

Рис. 14a. Схема ждущего мультивибратора на JK-триггере.

Конфигурируемые логические ячейки в PIC микроконтроллерах - 45

Рис. 14b. Реализация ждущего мультивибратора на JK-триггере в PIC-контроллере.

Конфигурируемые логические ячейки в PIC микроконтроллерах - 46

Рис. 14c. Диаграммы поясняющие работу ждущего мультивибратора

Инвертирование сигнала на входе синхронизации реализует ждущий мультивибратор с запуском по спаду входного сигнала (Рис.14d).

Конфигурируемые логические ячейки в PIC микроконтроллерах - 47

Рис. 14d. Диаграммы ждущего мультивибратора с запуском по спаду.

В отличие от рассмотренных ранее формирователей импульса по фронту и спаду (см.рис 8а, 9а) у данной схемы длительность импульса задается не частотой сигнала на входе тактирования, а параметрами RC-цепочки.

Мультивибратор

Простейший генератор можно сделать на двух CLC (D-триггер + инвертер).
Недостатком является низкая стабильность, так как пороги переключения зависят от уровней лог.0 и 1 конкретного типа микроконтроллера, которые могут «гулять» от температуры, напряжения питания и др. К тому же не очень правильно когда на цифровом входе уровень сигнала продолжительное время находится между 0 и 1.

Конфигурируемые логические ячейки в PIC микроконтроллерах - 48

Рис. 15a. Простейший мультивибратор на D-триггере.

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

Конфигурируемые логические ячейки в PIC микроконтроллерах - 49

Рис.15b. Мультивибратор на двух компараторах и RS-триггере.

Для данного примера от ПНЯ помимо CLC нам понадобятся 2 компаратора, а так же источники опорного напряжения (внешние на делителе или внутренние).
В начальном состоянии на выходе триггера установлен уровень лог.0, конденсатор разряжен, на компараторе COMP1 на выходе появляется лог.1, триггер устанавливается в 1, конденсатор заряжается через резистор до уровня напряжения верхнего порога (Vref hi), при достижении которого на входе R триггера появляется лог.1. Триггер перекидывается в противоположное состояние, конденсатор начинает разряжаться через резистор и т.д… Таким образом, мы получили полностью программно-независимый генератор. Но в данной схеме микроконтроллер может программно изменять частоту с помощью изменения порога срабатывания одного из компараторов (изменением опорного напряжения встроенным ЦАП или др.).

Конфигурируемые логические ячейки в PIC микроконтроллерах - 50

Рис.15c. Диаграммы сигналов мультивибратора

Измерение Емкости. Емкостной сенсор. Сенсорная кнопка

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

сигналы комментарий
Конфигурируемые логические ячейки в PIC микроконтроллерах - 51 Осциллограммы без касания сенсора
Конфигурируемые логические ячейки в PIC микроконтроллерах - 52 Осциллограмма при "нажатом" сенсоре

Рис.16a. Диаграммы работы мультивибратора при изменении времязадающей емкости.

Подобным методом можно детектировать протечку воды или определять влажность почвы и использовать для автоматизации полива цветов ))

Импульсный источник питания

Еще один пример использования конфигурируемых логических ячеек совместно со встроенными компараторами.
Таймер TMR периодически устанавливает RS-триггер и открывает силовой транзистор. Ток начинает течь через индуктивность, напряжение на резисторе R1 линейно увеличивается. При достижении напряжения на R1 порогового значения срабатывает компаратор COMP1 и сбрасывает триггер, транзистор закрывается. Ток через индуктивность не может прерваться мгновенно, поэтому ток начинает течь через диод D1 и заряжает выходной конденсатор. По срабатыванию таймера триггер снова устанавливается и процесс повторяется.

Конфигурируемые логические ячейки в PIC микроконтроллерах - 53

Рис.17a. Простейший импульсный источник питания.

На рисунке приведена схема повышающего источника, но для других топологий (см. рис. 17b) работа схемы будет аналогичной, поэтому выходной каскад далее рисовать не буду.

схема описание
Конфигурируемые логические ячейки в PIC микроконтроллерах - 54 повышающий
Конфигурируемые логические ячейки в PIC микроконтроллерах - 55 понижающий
Конфигурируемые логические ячейки в PIC микроконтроллерах - 56 Sepic

Рис.17b. Различные топологии импульсных источников питания

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

Конфигурируемые логические ячейки в PIC микроконтроллерах - 57

Рис.17c. ИИП с гистерезисным управлением

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

Конфигурируемые логические ячейки в PIC микроконтроллерах - 58

Рис.17d. Помеха при коммутации силового ключа

Конфигурируемые логические ячейки в PIC микроконтроллерах - 59

Рис.17e. ИИП с гистерезисным управлением и бланкированием помехи переключения.

Элементы U1 и U2 можно привести к реализации на элементах ИЛИ и отнести к входу CLC1, тогда вся логическая часть схемы реализуется на трех ячейках CLC (обычно в микроконтроллерах Microchip имеется 4 ячейки).
Все что на схеме изображено левее силового ключа – находится внутри микроконтроллера, связи периферийных модулей так же осуществляются внутри кристалла микроконтроллера. Напряжения порогов Ref и Ref1 могут задаваться встроенными источниками опорного напряжения или ЦАП. Таким образом, импульсный источник питания с регулируемым выходным напряжением можно реализовать на периферийных модулях микроконтроллера. После первоначального конфигурирования схема будет работать полностью аппаратно без необходимости участия ядра в поддержании функции преобразователя. Ядро может заниматься интерфейсными задачами, индикации контроля и др.

Вообще, для построения импульсных источников питания в новых семействах PIC16F17xx микроконтроллеров Microchip есть дополнительные аналоговые (операционные усилители) и специализированные периферийные модули: модули пилообразной компенсации (Slope Compensation) и программируемый рамп-генератор (Programmable Ramp Generator, PRG), операционные усилители, модуль формирования комплементарных выходных сигналов (COG), HLT таймера. Но об этих частях ПНЯ постараемся рассказать в следующий раз.

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

Литература

  1. Использование конфигурируемых логических ячеек для управления светодиодной лентой WS2812
  2. AN1470. Manchester Decoder Using the CLC and NCO

Автор: ariz0na

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js