Нажатие на те же строки клавиш одновременно


9

Я проектирую клавиатуру в VHDL. Все работает нормально, когда нажата только одна клавиша. Я сканирую каждый столбец на предмет нажатия клавиши на конечном компьютере, и когда ни одна клавиша не нажимается, это условие, при котором pin4pin6pin7pin2 = "0000"я переключаюсь в следующее состояние для сканирования следующего столбца. Таким образом, я устанавливаю столбцы pin3pin1pin5последовательно "001", "010"и "100".

При сканировании « pin3pin1pin5как» "001"и «если pin4pin6pin7pin2есть» "0100"просто нажимается «9». Я объявляю в VHDL pin4pin6pin7pin2как входные и pin3pin1pin5выходные порты. Когда я нажимаю 6 и 9 одновременно pin6и pin7есть high. Первая нажатая клавиша читается, вторая игнорируется. Когда я нажимаю 3 и 7 одновременно, первый нажимается за несколько мс до выигрыша, и первая клавиша читается, вторая клавиша игнорируется pin2и pin4остается high.

Вот сложная часть. Когда я нажимаю 4 и 6 одновременно, я ожидаю, что pin7это будет, highно это становится lowи pin4pin6pin7pin2 = "0000", что я не понимаю, как и почему. Поскольку "0000"обнаруживается, что не нажата ни одна клавиша, конечный автомат переходит из состояния в состояние. Удерживая 4 и 6, если один нажимает и уходит 4 несколько раз, это определяется как нажатие 6 несколько раз, что является большой ошибкой . Я был бы рад, если вы можете помочь мне отладить это!

То же самое происходит с «1» и «2», то же самое с «7» и «8» только для ключей в одном ряду. Поскольку это постоянный проект, я не могу разместить свой VHDL-код в Интернете :( Я был бы рад, если бы вы могли дать мне советы по преодолению этого!

введите описание изображения здесь

Ниже я не загружаю свой код на доску, код не работает. При подключении Pin5к заземлению однократное нажатие на 1,2,4,5,7,8, *, 0 не приводит к включению Pin3светодиода, но если я нажимаю 6, а затем 4 одновременно, Pin3светодиод светится и Pin7светодиод все еще горит, но когда мой код работает, этого не происходит. Может быть, я подключил что-то не так и, к счастью, включен Pin7, я не знаю ...

введите описание изображения здесь

Ниже приведена схема платы клавиатуры:

Schematics


Как вы гарантируете, что одновременное нажатие кнопок 4 и 6 не приводит к короткому замыканию контактов 3 и 5?
fru1tbat

@ fru1tbat Можете ли вы рассказать немного подробнее? Не загружая мой код, когда на плате ничего нет, я подключаю контакт 5 к земле, затем включаю светодиод pin5, затем нажимаю «6», включаю светодиод pin7 позже, я нажимаю одновременно «4» и «6», на этот раз pin3 Светодиод горит, а светодиод pin7 все еще горит.
Анарки

@ Ты хочешь сказать, что я должен использовать подтягивание для строк и подтягивание для столбцов? Я не могу изменить схему. Также мало что понял из вашего комментария :(
Анарки

Чтобы быть более полным, я дам ответ. Было бы полезно, если бы вы могли предоставить схему, показывающую резисторы, светодиоды, драйверы колонок и любые инверторы или транзисторы, которые могут быть в цепи. 4 строки и 3 столбца подключены напрямую к CPLD или FPGA?
Тут

@Tut Клавиатура не подключена напрямую к FPGA, между ними есть другая плата для подключения различных плат к FPGA, и я добавил схемы.
Анарки

Ответы:


4

Краткий ответ:

Инвертируй свою логику. Управляйте строками выбора столбцов с помощью логики с открытым стоком (или с открытым коллектором), когда выбранный столбец находится на низком уровне, а невыбранные столбцы плавают. Когда вы смотрите на строку, нажатие клавиши будет распознаваться как «0». Не нажатые клавиши будут обнаружены «1».

Теперь подробности:

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

Поскольку добавление диодов не является для вас вариантом, вам нужно смещать выходы ваших неактивных столбцов, чтобы не пытаться настроить их на противоположную полярность, как ваш активный столбец. Это делается с использованием логики с открытым стоком. Если выбранные вами столбцы привязаны непосредственно к CPLD или FPGA, вы сможете выполнить это в своем коде VHDL.

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

Мне пришлось сделать некоторые предположения о вашей схеме, так как вы не предоставили полную схему или свой код VHDL. Ты говоришь

когда ни одна клавиша не нажата, что является условием pin4pin6pin7pin2 = "0000"

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

Редактировать:

Согласно вашему комментарию, вы используете отрицательную логику в своих описаниях: «0000» означает, что все четыре контакта имеют высокий уровень и т. Д. В этом случае предполагается, что столбец выбирается, а сигналы строк поступают непосредственно из разъема 2 вашей схемы в ПЛИС, просто следуйте моим указаниям выше, используя логику с открытым стоком для выходов выбора столбца в вашей FPGA.

Я не эксперт по VHDL, но я нашел это в Xilinx :

Выведите буфер с открытым стоком, используя следующий код:

VHDL:

dout <= 'Z', когда din = '1' иначе '0';

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


Я собираюсь сканировать схемы установки драйвера сканера
Anarkie

Вы правы насчет того, чтобы pin4pin6pin7pin2 = "0000"не нажимать клавишу на самом деле 1111. В моем вопросе 1s должен быть 0, 0s должен быть 1s, я попытался немного
зашифровать

Я добавил схемы.
Анарки

Большое спасибо за ваши объяснения, после прочтения вашего ответа, у меня есть несколько идей, но сначала, что вы имеете в виду под «столбцы плавающие», «нужно плавать результаты», под float вы подразумеваете: 110, 101, 011? Это я уже делаю, на самом деле в моем коде, когда нажата клавиша, все остальные клавиши должны игнорироваться. Я просто не понимаю, как светодиод гаснет, а контакт 7 становится высоким (1) во время выполнения кода. В любом случае, если я правильно понял, ваше решение предлагает, пока я сканирую pin5, выходные порты "110", я должен был бы out <= 'pin3' when din='1' else '0';
Anarkie

1
Посмотрите на ссылку, которую я предоставил: с открытым стоком (или с открытым коллектором) . Активный столбец выбирается путем подачи 0 В на этой строке столбца. Неактивные колонки НЕ должны работать с напряжением 3,3 В на этой линии, но должны быть плавающими (переведены в состояние высокого сопротивления), что эффективно отключает эти линии от цепи. Если вы попытаетесь подвести их к напряжению 3,3 В, короткое замыкание, вызванное одновременным нажатием двух кнопок в одном ряду, вызовет конфликт между одним, пытающимся двигаться с низким уровнем, и другим, пытающимся с высоким уровнем.
Тут

2

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

См. Вопрос, который я задал некоторое время назад: VHDL: при получении битов модуль приема не работает

Теперь вы говорите, что:

Поскольку «0000» определяется как нажатие клавиши «no», конечный автомат переходит из состояния в состояние. Удерживая 4 и 6, если один нажимает и уходит 4 несколько раз, это определяется как нажатие 6 несколько раз, что является большой ошибкой.

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

Если вы прочтете ответы на вопрос, связанный выше, вы увидите, что рекомендуется добавить синхронизатор в строку ввода, прежде чем он будет введен в конечный автомат. Обычно это достигается двумя последовательными D-шлепками:

введите описание изображения здесь

Отсутствие синхронизации ввода кнопок с вашим HW вызывает очень странные проблемы, с которыми я столкнулся в моем проекте N64. Добавление этого небольшого количества HW было почти как волшебство.

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


Внедрить Синхронизатор в ответ не кажется трудным, но когда я читаю процесс, я понимаю, что async_inон задерживается на 3 такта, но его значение и все одинаковые?
Анарки

Большая разница в том, что ваш сигнал будет преобразован из асинхронного в синхронный. Что происходит в HW иногда с асинхронными сигналами (такими как ваши кнопки), так это то, что биты находятся в «метастабильности», это вызывает очень странные ошибки в HW. Использование D-триггеров гарантирует, что метастабильность не возникает в вашем дизайне. Я также скептически относился к эффективности этого, но это решило мою проблему отлично.
Ник Уильямс

Я попробовал, стоило попробовать, но это не помогло :(
Анарки

1

Это интересный вопрос! Причина, по которой вы видите низкий уровень на контакте 7 при нажатии клавиши 4 и 6, связана с контактами 3 и 5.

Чтобы объяснить далее, pin3 и pin5 никогда не будут высокими одновременно, один из них всегда будет путем к земле (в соответствии с вашим дизайном). Таким образом, когда вы нажимаете клавишу 4 и клавишу 6, вы создаете путь к земле для контакта 7.

Смотрите изображение:

Контакт 7 видит путь к земле.  У вас короткое замыкание.


Я добавил картинку к своему вопросу, и pin7 выглядит высоко, когда обе клавиши нажаты.
Анарки

ОП объяснил, что он не поднимает штырь 3, 1 или 5 ВЫСОКИЙ одновременно в любой момент. Он упорядочивает столбцы следующим образом: «001», «010» и «100. Пины 3 и 5 никогда не бывают ВЫСОКИМИ одновременно,
Ник Уильямс,

1
В этом и заключается смысл @EEIngenuity: между выводами 3 и 5 существует очевидный путь, который никогда не будет иметь одинакового значения ", поэтому, когда вы нажимаете клавиши 4 и 6, вы создаете путь к земле для контакта 7. "
fru1tbat

1
@ Anarkie На рисунке Pin3 не подключен к GND или VDD. Это плавающий узел. Это не создает сценарий короткого замыкания, который вы имеете в исходной пробной версии. Попробуйте подключить контакт 3 к VDD и контакт 5 к GND и повторить этот тест.
Мирон V

1
@EEIngenuity Вы абсолютно правы !!! Да, да, когда я подключаю контакт 3 к VDD, контакт 7 становится низким !!! Поэтому, пожалуйста, помогите мне, как я могу преодолеть эту проблему и заставить ее работать :( Я использую VHDL, а также другого коллегу, который находится в том же проекте в другой команде, не сталкивался с этой проблемой, так что каким-то образом он решил ее, но я не не знаю, как, та же клавиатура, та же плата!
Anarkie
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.