АнтиДРЕБЕЗГ на VHDL

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

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

В результате этого появляются ложные срабатывания логических элементов в Вашей схеме. Это значит, что Вы нажали на кнопку один раз, а в итоге реакция устройства на это получилась такая, будто нажатий было, как минимум, тридцать. Это произошло именно в результате ДРЕБЕЗГА КОНТАКТОВ.

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

Как же избавиться от этого неприятного эффекта? Конечно же, устранить механический дребезг мы не сможем (если только ножичком не раздраконить кнопку и не применить самые новейшие суперсекретные технологии обработки электрических контактов; при этом кнопка будет стоить, как подержанный Bentley). Ergo, необходимо между дребезжащей кнопкой и входом логического элемента, который мы хотим защитить от дребезга, поставить логический элемент, который я назову ANTITWIT.

Я приведу на этой странице два варианта этого элемента: с фиксацией и без фиксации.

ANTITWIT без фиксации при нажатии на кнопку и удержании будет выдавать импульсы строго ограниченной длительности (например, 256 мс) через равные промежутки времени. Такая последовательность называется ППВИ – периодическая последовательность видео-импульсов. Пауза между импульсами будет равна 1 мс. Как только вы убираете палец с кнопки, ППВИ прекращаются.

«Железная» структура элемента защиты от дребезга без фиксации будет такая:

Структура АНТИДРЕБЕЗГА без фиксации
Структура АНТИДРЕБЕЗГА без фиксации

На структуре, как и всегда, я назначил имена внешним и внутренним сигналам. Элементы розового цвета – 2ИЛИ и 8ИЛИ соответственно. Элемент СТ – восьмиразрядный счетчик импульсов со входом разрешения счета EN. Зеленый элемент – буфер для разделения выходного сигнала OUTSIG и сигнала двунаправленного INT2 (этот внутренний сигнал является двунаправленным, ибо нам требуется не только чтение этого сигнала, но и запись его; иначе говоря, он является и входным, и выходным).

Приведу краткое описание работы:

При подаче на вход INSIG первой логической единицы (из множества импульсов в сигнале дребезга на входе) счетчик СТ начинает считать импульсы с частой повторения 1 кГц (период 1 мс). В это же время сигнал INT2 принимает значение ‘1’ и сохраняет его весь первый полный цикл счета, который будет закончен через 28 х 1 мс = 256 мс. И всё это время на выходе OUTSIG будет устойчивая логическая единица, что нам и нужно. Исходя из того, что 256 мс > 200 мс, защита от дребезга обеспечена. Так же это время больше времени среднестатистического однократного нажатия. Таким образом, эргономичность также обеспечена.

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

Далее, привожу VHDL-код элемента защиты от дребезга без фиксации:

VHDL-код антидребезга без фиксации
VHDL-код антидребезга без фиксации

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

«Железная» структура элемента защиты от дребезга с фиксацией будет такая:

Структура АНТИДРЕБЕЗГа с фиксацией
Структура АНТИдребезга с фиксацией

На структуре, как и всегда, я назначил имена внешним и внутренним сигналам. Элементы розового цвета – 2ИЛИ и 8ИЛИ соответственно. Элемент СТ – восьмиразрядный счетчик импульсов со входом разрешения счета EN. Зеленый треугольник – буфер для разделения выходного сигнала порта OUTSIG и сигнала INT2 (этот внутренний сигнал является двунаправленным, ибо нам требуется не только чтение этого сигнала, но и запись его; иначе говоря, он является и входным, и выходным).

Приведу краткое описание работы. При подаче на вход INSIG первой логической единицы (из множества импульсов в сигнале дребезга на входе) сигналу INT3 на выходе зелёного триггера T присваивается ‘1’ и счетчик СТ начинает считать импульсы с частой повторения 1 кГц (период 1 мс). В это же время сигнал INT2 принимает значение ‘1’ и сохраняет его весь полный цикл счета, который будет закончен через 28 х 1 мс = 256 мс. И всё это время на выходе OUTSIG будет устойчивая логическая единица, что нам и нужно. Исходя из того, что 256 мс > 200 мс, защита от дребезга обеспечена.

Как только состояние шины BUS1 станет равно “11111111” , сигналу INT4 будет присвоена единица. Ergo, триггер T сбросится в ‘0’ и одновременно со следующим тактовым импульсом счет CT прекратится и выходу OUTSIG присвоится ‘0’. И, сколько бы мы не продолжали держать палец на кнопке, ни единого импульса эта конструкция больше не выдаст. Естественно, до тех пор, пока мы не нажмем на кнопку вдругорядь.

Далее, привожу VHDL-код элемента защиты от дребезга с фиксацией:

АНТИДРЕБЕЗГ с фиксацией

VHDL-код антидребезга с фиксацией


 

Об авторе admin

Инженер. Окончил НГТУ по специальности "Радиосвязь, телевидение и радиовещание". С 2003 г. занимаюсь разработкой электронной начинки различных радиотехнических устройств и приборов.
Запись опубликована в рубрике VHDL-коды компонентов, Все статьи с метками . Добавьте в закладки постоянную ссылку.

3 комментария на «АнтиДРЕБЕЗГ на VHDL»

  1. Тима говорит:

    Классная статья) Супер!

  2. Игорь говорит:

    Очень полезно.
    Спасибо автору.
    Жду новых статей с практическими примерами.
    ;)

  3. Петр Борисенко говорит:

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

Оставить комментарий