1,7K подписчиков

Проектируем контроллер клавиатуры PS/2

663 прочитали

Видео в конце...

На основании предыдущих наработок с автоматом состояний сделаем очень полезный модуль. Он позволит нам расширить сферу применения отладочного комплекта при помощи подключенной клавиатуры. Благо, для этого имеется специальный разъем. До эпохи тотального применения интерфейса USB, при подключении клавиатуры и мыши к вычислительным устройствам применялся интерфейс PS/2.

Внешний вид клавиатуры и напряжений в интерфейсе PS/2
Внешний вид клавиатуры и напряжений в интерфейсе PS/2

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

На стороне вычислителя встает задача принять последовательность бит для дальнейшего использования. Что мы наблюдаем в сигнальных линиях. На линии данных при отсутствии информации выставлена единица.

Детальное рассмотрение кадра данных и проектируемого автомата состояний
Детальное рассмотрение кадра данных и проектируемого автомата состояний

Перед началом передачи кода нажатой клавиши выставляется так называемый стартовый бит уровня логического нуля. Далее передаются 8 бит кода начиная с младшего бита, заканчивая старшим. После идет бит четности. Он служит для проверки целостности кода. Завершает последовательность стоп бит. Его уровень единица. Каждый бит сопровождается передним фронтом тактового сигнала.

Зная каким образом решаются такие задачи, проектируем граф состояний. В начальном состоянии startbit ожидается появление стартового бита уровня логического нуля. Если приходят единицы, то остаемся в этом состоянии. Как только ноль появился, то переходим в состояние data считывания кода нажатой клавиши. Находимся в этом состоянии 8 тактов по числу бит в коде. Сохраняем каждый приходящий бит в регистре для хранения кода. Автоматически переходим в новое состояние parity, где считывается бит четности. В этой учебной задаче мы его никак не будем обрабатывать. В последнем состоянии stop считываем стоповый бит. Проверим его уровень и только если он единичный, то выставим принятый код на выход устройства. Нулевой стоповый бит говорит о какой-то ошибке. В этом случае код нажатой клавиши не выставляем, но все равно переходим в начальное состояние ожидания стартового бита.

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

Синтезированная схема контроллера клавиатуры
Синтезированная схема контроллера клавиатуры

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

Код контроллера

Пишем код контроллера интерфейса. Так как будем показывать коды клавиш на индикаторах, то описываем их линии активации. У интерфейса две линии. Данные и сигнал. На выходе модуля сигнал о готовности кода и сам код.

Опишем все возможные состояния автомата.

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

Обнулим состояние всех регистров, в том числе и регистра состояния автомата.

На индикаторы отправляются соответствующие сигналы для их активации.

Отправляем сигналы со входа модуля в провода.

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

В состоянии проверки бита четности ничего не проверяем, готовности кода нет, следующее состояние это стоп бит.

При приеме последнего бита следующим состоянием будет начальное. Если стоп бит единица, что правильно, то на светодиоды выставляем содержимое регистра кода. Готовность единица. Если стоп бит не единица, то содержимое регистра светодиодов оставляем как было, сигнала готовности не будет.

Моделируем разработанный контроллер.

В тестовом модуле имитируем сигнал клавиатуры.

На основании предыдущих наработок с автоматом состояний сделаем очень полезный модуль. Он позволит нам расширить сферу применения отладочного комплекта при помощи подключенной клавиатуры.-4

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

Эксперимент

Проводим эксперимент. Постоянно нажимаем единицу. Каждый раз меняется содержимое регистра. Это значит неправильно считывается уровень сигнала. И сейчас будет еще один важный урок.

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

Иногда вычислитель воспринимает этот звон как многократно появляющийся передний фронт.

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

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

Исходный код

Видео-обзор с канала YouTube

Поддержите статью лайком если понравилось и подпишитесь чтобы ничего не пропускать.