Estoy diseñando un teclado en VHDL. Todo funciona bien cuando se presiona una sola tecla. Estoy escaneando cada columna para presionar una tecla en una máquina de estado y cuando no se presiona ninguna tecla, esa es la condición pin4pin6pin7pin2 = "0000"
que cambio al siguiente estado para escanear la siguiente columna. Por lo tanto, establezco las columnas pin3pin1pin5
secuencialmente en "001"
, "010"
y "100"
.
Mientras escanea pin3pin1pin5
como "001"
y si pin4pin6pin7pin2
es "0100"
, simplemente se presiona "9". Declaro en VHDL pin4pin6pin7pin2
como pin3pin1pin5
puertos de entrada y salida. Cuando presiono 6 y 9 al mismo tiempo pin6
y pin7
son high
. Se lee la primera tecla presionada, se ignora la segunda. Cuando presiono 3 y 7 al mismo tiempo, el primero presiona con unos pocos ms antes de que gane y la primera tecla se lee, la segunda tecla se ignora, pin2
y pin4
son high
.
He aquí la parte complicada. Cuando presiono 4 y 6 al mismo tiempo, espero pin7
que sea, high
pero se convierte en low
y pin4pin6pin7pin2 = "0000"
, lo que no entiendo cómo y por qué. Como "0000"
se detecta como una tecla sin presionar, la máquina de estado salta de estado a estado. Mientras mantiene presionado 4 y 6 si uno empuja y deja 4 varias veces, se detecta que 6 presionó varias veces, lo cual es un gran error . ¡Me alegraría si me pueden ayudar a depurar esto!
Lo mismo sucede con "1" y "2", lo mismo con "7" y "8" solo para las teclas en la misma fila. Dado que este es un proyecto en curso, no puedo poner mi código VHDL en línea :( ¡Me gustaría que me dieras consejos para superar esto!
A continuación, no estoy cargando mi código en el tablero, no se está ejecutando ningún código. Conectando Pin5
a tierra, una sola pulsación en 1,2,4,5,7,8, *, 0 no enciende el Pin3
LED, pero si estoy presionando 6 y luego 4 al mismo tiempo, el Pin3
LED está encendido y el Pin7
LED sigue encendido, pero cuando mi código se está ejecutando, esto no sucede. Tal vez conecté algo mal y por suerte Pin7
está encendido, no sé ...
A continuación se muestran los esquemas de la placa del teclado:
fuente
Respuestas:
La respuesta corta:
Invierte tu lógica. Conduzca las líneas de selección de columna con lógica de drenaje abierto (o colector abierto) donde la columna seleccionada se tira hacia abajo y las columnas no seleccionadas están flotando. Cuando miras una fila, una 'tecla' será detectada por un '0'. Las teclas no presionadas serán detectadas por un '1'.
Ahora los detalles:
Como señala EEIngenuity, cuando presiona 2 botones en la misma fila, se produce un cortocircuito entre sus columnas correspondientes. Este (y otros problemas que involucran múltiples pulsaciones de teclas) generalmente se resuelven en una matriz de teclado al agregar un diodo en serie con cada interruptor.
Dado que agregar diodos no es una opción para usted, deberá flotar las salidas de sus selecciones de columnas inactivas para evitar tratar de conducirlas a la polaridad opuesta a su selección de columna activa. Esto se hace utilizando la lógica de drenaje abierto. Si las selecciones de su columna están vinculadas directamente a un CPLD o FPGA, debería poder lograr esto en su código VHDL.
La foto en su pregunta muestra que tiene una resistencia pull-up en cada columna y cada fila. Los pull-ups en las columnas son innecesarios, pero no dañarán nada. Los pull-ups en cada fila asegurarán una condición alta a menos que el controlador de drenaje abierto en la columna seleccione (a través de un interruptor cerrado).
He tenido que hacer algunas suposiciones sobre su circuito ya que no ha proporcionado un esquema completo o su código VHDL. Tu dices
Sin embargo, a partir de la foto que proporciona, se muestran resistencias pull-up. Esto implica que ya tiene una inversión lógica en algún lugar, posiblemente en su código VHDL o (menos probable) inversores entre sus filas y su dispositivo lógico (CPLD o FPGA).
Editar:
Según su comentario, está utilizando lógica negativa en sus descripciones: "0000" indica que los cuatro pines son altos, etc. En ese caso, suponiendo que la columna selecciona y las señales de fila van directamente desde el conector 2 en su esquema al FPGA, solo siga mis instrucciones anteriores utilizando la lógica de drenaje abierto para las salidas de selección de columna en su FPGA.
No soy un experto en VHDL, pero encontré esto de Xilinx :
También tenga en cuenta en su esquema, todos los LED se muestran cableados al revés. Los ánodos van a las resistencias limitantes de corriente y los cátodos van a las líneas de señal. Los LED se iluminan cuando las líneas de señal se ponen bajas.
fuente
pin4pin6pin7pin2 = "0000"
no hay ninguna pulsación de tecla en realidad1111
. En mi pregunta 1s debería 0, 0s debería ser 1s, intenté encriptar la pregunta un poco, lo siento si causó malentendidos ...out <= 'pin3' when din='1' else '0';
Como está utilizando VHDL y tiene una entrada asincrónica, estoy escribiendo esta respuesta para asegurarme de que haya tomado precauciones. No estoy seguro de si este es tu problema, pero podría muy bien serlo.
Vea una pregunta que hice hace algún tiempo: VHDL: el módulo de recepción falla aleatoriamente al contar bits
Ahora dices eso:
Lo cual es algo similar a lo que estaba enfrentando. Tuve un problema en el que mi máquina de estado omitiría estados, lo que parecía imposible.
Si lee las respuestas a la pregunta vinculada anteriormente, verá que se recomienda agregar un sincronizador a la línea de entrada antes de que se alimente a su máquina de estado. Esto generalmente se logra con dos chanclas D en serie:
No tener la entrada de su botón sincronizada con su HW causa problemas muy extraños, lo que he experimentado con mi proyecto N64. Agregar este poco de HW fue casi como magia.
Por lo tanto, compruebe primero que sus entradas se estén sincronizando.
fuente
async_in
se retrasa con 3 ciclos de reloj pero su valor y todo es lo mismo.¡Esta es una pregunta interesante! La razón por la que está viendo un nivel bajo en pin7 cuando presiona key4 y key6 es debido a pin3 y pin5.
Para explicarlo más, pin3 y pin5 nunca serán altos al mismo tiempo, uno de ellos siempre será un camino a tierra (de acuerdo con su diseño). Por lo tanto, cuando presiona la tecla 4 y la tecla 6, está creando una ruta a tierra para el pin7.
Ver imagen:
fuente