Estou projetando um teclado em VHDL. Tudo funciona bem quando apenas uma tecla é pressionada. Estou digitalizando cada coluna para pressionar uma tecla em uma máquina de estado e quando nenhuma tecla é pressionada, que é a condição que pin4pin6pin7pin2 = "0000"
eu alterno para o próximo estado para digitalizar a próxima coluna. Assim, defino as colunas pin3pin1pin5
sequencialmente para "001"
, "010"
e "100"
.
Durante a digitalização de pin3pin1pin5
como "001"
e se pin4pin6pin7pin2
é "0100"
, em seguida, simplesmente "9" é pressionado. Declaro em VHDL pin4pin6pin7pin2
como pin3pin1pin5
portas de entrada e saída. Quando eu pressiono 6 e 9 ao mesmo tempo pin6
e pin7
são high
. A primeira tecla pressionada é lida, a segunda é ignorada. Quando pressiono 3 e 7 ao mesmo tempo, o primeiro pressiona com alguns ms antes de vencer e a primeira tecla é lida, a segunda tecla é ignorada pin2
e o pin4
é high
.
Aqui está a parte complicada. Quando pressiono 4 e 6 ao mesmo tempo, espero pin7
ser, high
mas ele se torna low
e pin4pin6pin7pin2 = "0000"
, o que não entendo como e por quê. Como "0000"
é detectada como uma tecla não pressionada, a máquina de estado pula de estado para estado. Enquanto segura 4 e 6, se alguém empurra e sai 4 várias vezes, é detectado como 6 pressionado várias vezes, o que é um grande erro . Ficaria feliz se você puder me ajudar a depurar isso!
O mesmo acontece com "1" e "2", o mesmo com "7" e "8" apenas para as chaves na mesma linha. Como este é um projeto em andamento, não posso colocar meu código VHDL on-line :( Ficaria feliz se você pudesse me dar dicas para superar isso!
Abaixo, não estou carregando meu código no quadro, nenhum código está sendo executado. Ao conectar Pin5
ao terra, uma única pressão de 1,2,4,5,7,8, *, 0 não Pin3
acende o LED, mas se eu estiver pressionando 6 e 4 ao mesmo tempo, o Pin3
LED está aceso e o Pin7
LED ainda está aceso, mas quando meu código está sendo executado, isso não acontece. Talvez eu tenha conectado algo errado e, felizmente, Pin7
esteja ligado, eu não sei ...
Abaixo está o esquema da placa do teclado:
fonte
Respostas:
A resposta curta:
Inverta sua lógica. Conduza as linhas de seleção de coluna com a lógica de dreno aberto (ou coletor aberto) em que a coluna selecionada é puxada para baixo e as colunas não selecionadas estão flutuando. Quando você olha para uma linha, um pressionamento de tecla é detectado por um '0'. As teclas não pressionadas serão detectadas por um '1'.
Agora os detalhes:
Como a EEIngenuity aponta, quando você pressiona 2 botões na mesma linha, isso resulta em um curto-circuito entre as colunas correspondentes. Isso (e outros problemas que envolvem várias pressionamentos de tecla) geralmente é superado em uma matriz de teclado , adicionando um diodo em série a cada comutador.
Como adicionar diodos não é uma opção para você, será necessário flutuar as saídas das seleções de coluna inativas para evitar tentar conduzi-las para a polaridade oposta à seleção de coluna ativa. Isso é feito usando a lógica de dreno aberto. Se sua coluna selecionada estiver vinculada diretamente a um CPLD ou FPGA, você poderá fazer isso no seu código VHDL.
A foto na sua pergunta mostra que você tem um resistor de pull-up em cada coluna e cada linha. As flexões nas colunas são desnecessárias, mas não prejudicam nada. As pull-ups em cada linha garantirão uma condição alta, a menos que o driver de dreno aberto na coluna selecione baixo (através de uma chave fechada).
Eu tive que fazer algumas suposições sobre o seu circuito, pois você não forneceu um esquema completo ou seu código VHDL. Você diz
No entanto, na foto que você fornece, os resistores pull-up são mostrados. Isso implica que você já tem uma inversão lógica em algum lugar, possivelmente no seu código VHDL ou (menos provável) inversores entre suas linhas e o seu dispositivo lógico (CPLD ou FPGA).
Editar:
De acordo com seu comentário, você está usando lógica negativa em suas descrições: "0000" indica que todos os quatro pinos estão altos, etc. Nesse caso, assumindo que a coluna seleciona e os sinais de linha vão diretamente do conector 2 no seu esquema para o FPGA, apenas siga minhas instruções acima usando a lógica de dreno aberto para as saídas de seleção de coluna no seu FPGA.
Não sou especialista em VHDL, mas achei isso no Xilinx :
Observe também no seu esquema que todos os LEDs são mostrados com fio para trás. Os ânodos vão para os resistores limitadores de corrente e os cátodos vão para as linhas de sinal. Os LEDs acendem quando as linhas de sinal são puxadas para baixo.
fonte
pin4pin6pin7pin2 = "0000"
não pressionar a tecla1111
. Na minha pergunta 1s deve 0, 0s deve ser 1s, tentei cripta a questão um pouco, pena de que, se ele causou mal-entendidos ...out <= 'pin3' when din='1' else '0';
Como você está usando VHDL e possui uma entrada assíncrona, estou escrevendo esta resposta para garantir que você tomou uma precaução. Não tenho certeza se esse é o seu problema, mas pode muito bem ser.
Veja uma pergunta que fiz há algum tempo: VHDL: módulo de recebimento falha aleatoriamente ao contar bits
Agora você diz isso:
O que é um pouco semelhante ao que eu estava enfrentando. Eu tive um problema em que minha máquina de estados ignorava estados, o que parecia impossível.
Se você ler as respostas para a pergunta vinculada acima, verá que é recomendável adicionar um sincronizador à linha de entrada antes que ela seja alimentada em sua máquina de estado. Isso geralmente é realizado com dois chinelos D em série:
Não ter a entrada do botão sincronizada com o HW causa problemas muito bizarros, que eu experimentei no meu projeto N64. Adicionar este pouco de HW foi quase como mágica.
Portanto, verifique primeiro se suas entradas estão sendo sincronizadas.
fonte
async_in
está atrasado com 3 ciclos de clock, mas seu valor e tudo são iguais?Esta é uma pergunta interessante! O motivo pelo qual você vê um baixo no pin7 ao pressionar as teclas 4 e 6 é por causa dos pinos 3 e 5.
Para explicar melhor, o pin3 e o pin5 nunca serão altos ao mesmo tempo - um deles sempre será um caminho para o solo (de acordo com o seu design). Assim, quando você pressiona as teclas 4 e 6, está criando um caminho para o aterramento do pino7.
Veja a imagem:
fonte