Я проектирую клавиатуру в 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
, я не знаю ...
Ниже приведена схема платы клавиатуры:
источник
Ответы:
Краткий ответ:
Инвертируй свою логику. Управляйте строками выбора столбцов с помощью логики с открытым стоком (или с открытым коллектором), когда выбранный столбец находится на низком уровне, а невыбранные столбцы плавают. Когда вы смотрите на строку, нажатие клавиши будет распознаваться как «0». Не нажатые клавиши будут обнаружены «1».
Теперь подробности:
Как указывает EEIngenuity, при нажатии 2 кнопок в одной строке это приводит к короткому замыканию между соответствующими столбцами. Это (и другие проблемы, связанные с несколькими нажатиями клавиш) обычно преодолеваются в матрице клавиатуры путем добавления диода последовательно с каждым переключателем.
Поскольку добавление диодов не является для вас вариантом, вам нужно смещать выходы ваших неактивных столбцов, чтобы не пытаться настроить их на противоположную полярность, как ваш активный столбец. Это делается с использованием логики с открытым стоком. Если выбранные вами столбцы привязаны непосредственно к CPLD или FPGA, вы сможете выполнить это в своем коде VHDL.
На фотографии в вашем вопросе показано, что у вас есть подтягивающий резистор в каждой колонке и каждой строке. Подтягивания на колоннах не нужны, но ничего не повредят. Подтягивания в каждом ряду обеспечат высокое состояние, если только драйвер низкого уровня не выберет нижнюю колонку (через замкнутый переключатель).
Мне пришлось сделать некоторые предположения о вашей схеме, так как вы не предоставили полную схему или свой код VHDL. Ты говоришь
однако на фотографии, которую вы предоставляете, показаны подтягивающие резисторы. Это означает, что у вас уже есть где-то логическая инверсия, возможно, в вашем коде VHDL или (менее вероятно) инверторах между строками и вашим логическим устройством (CPLD или FPGA).
Редактировать:
Согласно вашему комментарию, вы используете отрицательную логику в своих описаниях: «0000» означает, что все четыре контакта имеют высокий уровень и т. Д. В этом случае предполагается, что столбец выбирается, а сигналы строк поступают непосредственно из разъема 2 вашей схемы в ПЛИС, просто следуйте моим указаниям выше, используя логику с открытым стоком для выходов выбора столбца в вашей FPGA.
Я не эксперт по VHDL, но я нашел это в Xilinx :
Также обратите внимание, что в вашей схеме все светодиоды показаны с обратной стороны. Аноды идут к токоограничивающим резисторам, а катоды - к сигнальным линиям. Светодиоды загораются, когда сигнальные линии находятся на низком уровне.
источник
pin4pin6pin7pin2 = "0000"
не нажимать клавишу на самом деле1111
. В моем вопросе 1s должен быть 0, 0s должен быть 1s, я попытался немногоout <= 'pin3' when din='1' else '0';
Поскольку вы используете VHDL и у вас есть асинхронный ввод, я пишу этот ответ, чтобы убедиться, что вы приняли меры предосторожности. Я не уверен, что это ваша проблема, но она вполне может быть.
См. Вопрос, который я задал некоторое время назад: VHDL: при получении битов модуль приема не работает
Теперь вы говорите, что:
Что несколько похоже на то, с чем я столкнулся. У меня была проблема, когда мой конечный автомат пропускал состояния, что казалось невозможным.
Если вы прочтете ответы на вопрос, связанный выше, вы увидите, что рекомендуется добавить синхронизатор в строку ввода, прежде чем он будет введен в конечный автомат. Обычно это достигается двумя последовательными D-шлепками:
Отсутствие синхронизации ввода кнопок с вашим HW вызывает очень странные проблемы, с которыми я столкнулся в моем проекте N64. Добавление этого небольшого количества HW было почти как волшебство.
Поэтому, пожалуйста, сначала проверьте, синхронизируются ли ваши входы.
источник
async_in
он задерживается на 3 такта, но его значение и все одинаковые?Это интересный вопрос! Причина, по которой вы видите низкий уровень на контакте 7 при нажатии клавиши 4 и 6, связана с контактами 3 и 5.
Чтобы объяснить далее, pin3 и pin5 никогда не будут высокими одновременно, один из них всегда будет путем к земле (в соответствии с вашим дизайном). Таким образом, когда вы нажимаете клавишу 4 и клавишу 6, вы создаете путь к земле для контакта 7.
Смотрите изображение:
источник