47 / 63 · Теория
Реальная кнопка: синхронизация, подавление дребезга и одно событие
Разделите синхронизацию асинхронного входа и подавление дребезга, спроектируйте фильтр по последовательным выборкам.
Уроки доступны бесплатно. Запишитесь, чтобы сохранять прогресс.
Одно нажатие может дать много переходов
Контакты механической кнопки могут несколько раз замкнуться и разомкнуться до установления. Сигнал одновременно асинхронен системному такту. Синхронизация переносит его в тактовый домен, подавление дребезга распознаёт короткие повторные переходы как одно устойчивое состояние. Два триггераТриггер записывает вход на заданном фронте такта и удерживает его до следующего фронта. Вход должен удовлетворять ограничениям setup и hold. Подробнее сами по себе не удаляют дребезг.
- Асинхронная кнопка: Дребезг контактов и асинхронность такта присутствуют одновременно
- Синхронизация: Примите однобитный уровень в тактовый домен
- Подавление дребезга: Подтвердите изменение лишь после последовательных стабильных отсчётов
- Обнаружение фронта: Создайте событие на один цикл для подтверждённого перехода 0→1
Этот путь предполагает достаточно долго удерживаемый однобитный уровень кнопки. Короткие импульсы, согласованная многобитная передача и обработка самого асинхронного такта требуют отдельных решений.
Правило N последовательных выборок
Пусть q — принятое состояние, x — синхронизированный вход, count — число последовательных выборок, отличающихся от q. При x=q обнулите count. При x≠q увеличивайте его; на N-й последовательной выборке обновите q=x и верните count в 0.
Рассмотрим N=3, начальное q=0. Каждый столбец — момент наблюдения синхронизированного входа, а не физическое напряжение контакта.
| Выборка | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|---|---|---|---|---|---|---|---|---|---|
| x | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 |
| count после | 0 | 1 | 0 | 1 | 2 | 0 | 0 | 1 | 0 |
| q после | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 |
| rise event | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
Показать данные диаграммы
| Сигнал | Диаграмма | Значения шины |
|---|---|---|
| отсчёт | 234523452 | 0 → 1 → 2 → 3 → 4 → 5 → 6 → 7 → 8 |
| x | 0101...01 | |
| q после | 0....1... | |
| событие 0→1 | 0....10.. |
Явно задайте задержку и ширину счётчика
При интервале выборки в зависимости от фазы изменения входа принятие занимает примерно от до , плюс отдельная задержка предшествующей синхронизации. Для консервативного требования «устойчиво 10 ms» учитывайте и расстояние между первой и последней выборками при выборе N. Короткие переходы между выборками не наблюдаются, поэтому совпадение последовательных выборок не доказывает неизменность физического напряжения весь интервал. Нужно совместно задавать свойства переключателя и условия выборки.
Если count хранит только 0–N−1, ширина . Обработайте и N=1: первая противоположная выборка должна приниматься сразу, поэтому порядок сравнения с N−1 существенен.
Одно нажатие — одно событие
Для нового принятого q_next получаем . Таблица задаёт событие на той же выборке, что и принятие состояния. Реализация, сравнивающая q с задержанным на цикл q в отдельном регистреРегистр хранит многобитное состояние. Синхронные регистры в этом курсе записывают определённый вход на фронте тактового сигнала. Подробнее, может добавить задержку в зависимости от точки наблюдения. Поэтому определите и момент потребления события.
Попробуйте сами
При N=3, начальном q=0 поданы 1,1,0,1,1,1. На какой выборке изменится состояние? Какова минимальная ширина счётчика 0–7 при N=8?
Прочитать объяснение
Ноль третьей выборки сбрасывает число последовательных несовпадений, поэтому 1 принимается на шестой. Для count=0–7 нужны 3 бита. Иная реализация, сохраняющая также 8, потребует 4 бит: сначала проверяйте диапазон хранения.