Obtener el número de bits establecidos en la lógica digital

9

Como ejercicio, estoy tratando de diseñar una implementación del Juego de la Vida de Conway en lógica digital simple. Podría hacer todo esto minimizando una función de 9 variables, pero imagino que todavía será bastante grande. Uno de los elementos centrales del algoritmo es determinar cuántos de sus 8 vecinos están "vivos".

Dadas 8 entradas, ¿cuál es la forma más fácil de determinar cuántas se configuran? Particularmente necesito una salida que sea alta cuando se configuren 2, y una salida que sea alta cuando se establezcan 3.

Mi idea principal ahora consiste en un registro de cambios PISO, un contador y un decodificador 3: 8, pero necesito un microcontrolador para manejar todo eso. No parece tan complicado de una función. Tal vez una ROM de 256x2 también funcionaría, pero mis búsquedas no han encontrado ninguna de esas partes.

Sé que cualquier imagen con 10 IO podría hacer esto de forma trivial, pero quiero implementarla de la manera más mínima posible.

    
pregunta captncraig

3 respuestas

13

Puede encontrar los diversos algoritmos en Recuento rápido de bits . Los dos últimos: Nifty Parallel Count y MIT HAKMEM Count bien podrían ser fáciles de convertir en puertas. Consulte esta página para obtener una buena explicación de cómo funciona.

Podrías hacer esto usando el hardware de gates. Utilice cuatro sumadores de 1 bit para agregar pares de bits juntos. Esto te da cuatro números de 3 bits. Agregue estos en pares utilizando dos sumadores de 3 bits. Esto le da dos números de 4 bits para agregar usando un solo sumador de 4 bits. Esto te deja con un valor de 5 bits, pero puedes ignorar el bit superior. Luego use dos comparadores de 4 bits para probar los valores 2 y 3.

Para un recuento mínimo de piezas, ¿por qué no hacerlo de forma analógica?

Cree un divisor de voltaje con una resistencia en la parte superior y sus 8 entradas conectadas a la parte inferior mediante 8 resistencias en paralelo. Luego simplemente use dos comparadores para detectar los niveles de voltaje que producirán 2 o 3 bits. Eso es solo 6 partes:

Laredde8resistenciasproduciráunvoltajeentre0v(paraelconjuntode0bits)a5v(paralosconjuntosde8bits).2bitsproducirán0.5v.3bitsproducirán1.56v.

  • Con0o1bits,lasalidaserá00.
  • Con2o3bits,lasalidaserá01.
  • Con4omásbits,lasalidaserá11.

Añadido:

GraciasaDavidCaryporunaexcelentesugerencia.Despuésdeunmontóndecálculos,creoqueheencontradounconjuntoderesistenciasquefuncionan,peroprimerodebesrevisarcuidadosamentemiscálculos.Aquíestoyusandocomparadoresconsalidasdedrenajeabiertoycreoquehelogradoquetengaunasalidaúnica.Bajosignificamuertoenlasiguienteronda,Altosignificavivoenlapróximaronda.

Lo bueno es que este circuito solo tiene dos componentes más que el otro circuito. Todos ellos son resistores de la serie E8, por lo que debería ser posible obtenerlos. Además, R6 debería haber sido un valor más alto, como 4.7k o algo así.

    
respondido por el Rocketmagnet
6

¿Qué es mínimo? El microcontrolador es solo 1 parte, y puede producir el resultado con un retraso mínimo (< 1 \ $ \ mu \ $ s). A 54 centavos, ATTiny20 es el microcontrolador más barato con 10 I / O en Digikey.

La tabla de búsqueda también es solo 1 parte, y es más rápida que el microcontrolador. Olvídate de las EEPROM paralelas, son caras. Utilice un Flash paralelo de todo el byte. Este es 512 kByte, eso es 2000 veces más que lo que Lo necesitas, pero es la solución más barata (1 dólar). Y puede agregar 6 funciones más de 1 bit por el mismo precio.

También puedes usar un CPLD . Escriba la función en VHDL o Verilog como una larga declaración SOP (Sum Of Products), y deje que el sintetizador cree la lógica.

El registro de desplazamiento está bien si puede esperar el resultado; Esta es la solución más lenta.

Finalmente, puede hacerlo con puertas lógicas , pero pasará mucho tiempo para reducir el SOP a su forma mínima si quiere ir todo lo básico. Rocketmagnet tiene la idea correcta de usar sumadores, pero sus números están desactivados: un medio sumador de 1 bit da 2 bits, no 3. Por lo tanto, agregar las salidas de los medio sumadores de dos en dos requiere dos de 2 bits Medio sumador, dando dos resultados de 3 bits. Utilice un medio sumador de 3 bits para obtener el resultado de 4 bits. Al utilizar sumadores completos de 1 bit, solo necesitará un sumador de 2 bits.

    
respondido por el stevenvh
1

Los circuitos híbridos de secuencia paralela tienden a ser mucho más compactos que los circuitos puramente paralelos. Por ejemplo, si ajusta las reglas para que un cuadro de 3x3 dé vuelta a la celda en el centro muerto si hay menos de tres celdas vivas o más de cuatro, y la convierta en vivo si hay exactamente tres celdas vivas las nuevas reglas coincidirán con las originales), se puede simplificar la lógica haciendo una secuencia de dos pasos:

tempVal[x,y] = orig[x-1,y] + orig[x,y] + orig[x+1,y] ' Two-bit sum of three one-bit numbers
orig[x,y] = LiveDeadFunc(orig[x,y], tempval[x,y-1] + tempVal[x,y] + tempVal[x,y+1])

La matriz tempVal[x,y] tiene dos bits por celda; la última operación suma tres de estos números para producir un valor 0-9 (aunque todos los valores que exceden cuatro son equivalentes), que luego se pueden usar para calcular un estado de bit / vivo de bit único para la próxima generación.

Por cierto, una alternativa a hacer una suma aritmética en la segunda etapa y examinar el valor sería convertir tempVal [x, y] en una representación de un solo calor, y luego verificar explícitamente una de las nueve combinaciones de valores que produciría tres celdas, o una de las doce que daría cuatro.

    
respondido por el supercat

Lea otras preguntas en las etiquetas