Conecte las 40 entradas a los cinco registros de desplazamiento paralelo a serie de 8 bits (8 entradas cada uno). Los registros de desplazamiento pueden ser en serie. Léalos en un microprocesador simple como el AVR en un Arduino. Puede "golpearlos" con una salida digital para sincronizar los registros de desplazamiento y una entrada digital para recolectar los bits a medida que ingresan. Luego encuentre los bits que se encuentran en el estado lógico que busca con un código simple. El registro de los datos probablemente lleva alrededor de 40 microsegundos en un Arduino Uno de 8 MHz, por ejemplo ($ 11 o más, creo que en eBay). En una serie M ARM Cortex, más como 4 microsegundos. Consulte 74HC165 o 74LV165.
¿Se supone que la salida de 6 bits es una representación entera de una sola línea de entrada activa? Puede contar los relojes hasta que encuentre e ingrese lo que está activado (o ninguno). Probablemente guarde los datos y luego revise los cinco bytes y luego calcule el valor. Si la velocidad es importante, una tabla de consulta para cada byte será más rápida. Creo que hay una forma inteligente de encontrar el valor de 6 bits con lógica y cambio que es óptimo. Algo así para 8 bits a la vez: x es el byte que se está probando. Números en hexadecimal.
si x = 0 regresa (el valor que desea para ninguna de las entradas confirmadas. ¿Quizás 0?)
n = 0
si x AND F0 == 0 entonces n = 4; Desplazar x a la izquierda por 4 bits
si xY 3F == 0 entonces n = n + 2; Desplazar x a la izquierda por 2 bits
si x AND 7F == 0 entonces n = n + 1
devuelve n
Agregue 8 a n para el segundo byte, 16 para el tercero, 24 para el cuarto y 32 para el quinto.
Para 32 bits a la vez, va así.
FFFF0000 n = 16 turno 16
FF000000 n = n + 8 turno 8
F0000000 n = n + 4 turno 4
3F000000 n = n + 2 shift 2
7F000000 n = n + 1
Esto cuenta desde el bit de orden superior hasta el bit de orden bajo (llamado conteo de los ceros iniciales). Los cambios son de bajo a alto y asume que los 0 se desplazan a medida que los datos se desplazan. Es solo una idea, ya que puede hacer varias cosas con la forma en que ordena los datos a medida que se ingresan. No hay garantía de que lo haya hecho bien, sino un punto de partida.
Tenga en cuenta que en un ARM, puede cargar 4 bytes a la vez y tiene un cambiador de barril que hará cambios arbitrarios en un ciclo. En ARM verdadero (no en el pulgar) todas las instrucciones son condicionales, por lo que if + add + shift es una sola instrucción. Entonces, todo el asunto es de 9 o 10 instrucciones largas. Si no necesita una solución de hardware pura, pruebe los 5 chips más un Arduino y algún código.
Si necesita ayuda, un foro de Arduino (o el procesador que use) o el canal IRC puede ser excelente. Simplemente proporcione el número de referencia, como 75HC165 y una descripción de una línea, y la gente sabrá lo que está tratando de hacer y podrá dar sugerencias más detalladas para adaptarse a su implementación.
Las personas con más experiencia pueden encontrar una solución más económica con un chip de tipo de matriz de compuerta.