¿Simula correctamente una puerta NAND? (Estoy construyendo una computadora en mi computadora)

Estoy a punto de embarcarme en un proyecto, inspirado en Nand2Tetris (http://www.nand2tetris.org/), para simular completamente una computadora, construyendo todo a partir de puertas NAND.

Quiero simular todo desde cero, comenzando con una implementación primitiva de una puerta NAND que simula cómo funcionaría una puerta NAND en el nivel físico , y luego conectarlos para construir una computadora.

La cuestión es que no entiendo lo suficiente acerca de cómo funcionaría una puerta NAND en el nivel físico para escribir esto.

Para ser claros, esto ciertamente no es lo que estoy buscando:

def nand(a, b)
  return !(a && b)
end

Me gustaría implementar la puerta NAND como una clase, para que funcione más como un objeto real. Me gustaría que tuviera pines, y me gustaría poder conectar los pines entre sí y aplicar voltaje, etc.

¿Puede alguien mostrarme cómo podría implementar una simulación adecuada de una puerta NAND física, una que podría vincularse para finalmente construir una computadora?

Si bien creo que lo que está haciendo es excelente, creo que esta pregunta es demasiado amplia para Stack Overflow. ¿De qué bajo nivel estás hablando aquí? ¿A nivel de transistores individuales? átomos individuales?
Gran pregunta. Creo que los transistores serían un buen punto de partida. Atoms, guardemos eso para un proyecto posterior :)
Si su proyecto es "construir todo a partir de puertas NAND", como dice en su primer párrafo, entonces no debe preocuparse por cómo se realizan físicamente las puertas NAND. Si haces eso, estás construyendo todo a partir de transistores, no de puertas.
Deberías echar un vistazo a Digital . En particular, eche un vistazo al archivo LÉAME: contiene algunos buenos detalles sobre cómo se implementa el programa y varias dificultades que se encontraron.

Respuestas (3)

La mejor manera es implementar una rueda de eventos y definir un retraso de propagación para la puerta. Sin este retardo es imposible simular cualquier tipo de elemento de memoria. Puede buscar el término "rueda de eventos" en Google, es la base para los simuladores HDL. Alternativamente, puede escribir todo en verilog, lo que tiene la ventaja de realizar el hardware más tarde con las herramientas adecuadas y el simulador puede ser gratuito (busque "Icarus").

Si realmente desea aplicar voltajes, deberá implementar un modelo de transistor o usar BSIM3 en algún tipo de simulador personalizado, pero eventualmente tendrá que volver a implementar SPICE ya que el modelo de objeto que propone no funcionará bien para los circuitos donde las "entradas" son en realidad, cables conectados a puertas que pueden cargar las salidas y cambiar el comportamiento del circuito.

Buena suerte.

No, esto no funcionará. No puede asignar un retraso arbitrario para una puerta, eso no cumpliría con los requisitos de tiempo y el circuito no funcionaría
@ShashankVM, no, absolutamente DEBE tener un retraso en la puerta si desea simularlo correctamente. Las puertas NAND reales tienen retrasos: las señales de los pines de entrada tardan en propagarse a través de los transistores dentro de la puerta. El retraso no debería ser arbitrario , pero debería existir. Ah, y los requisitos de tiempo se basan en los retrasos reales de los elementos del circuito, no al revés.
Las simulaciones lógicas impulsadas por eventos no usan retrasos de propagación bajo el capó, sino que usan el concepto de ciclos delta. Los retrasos de propagación, si se escriben explícitamente, se modelan utilizando las mismas técnicas basadas en eventos.
@BillNace, mi punto es que no puede simplemente agregar retrasos a un diseño lógico y esperar que el circuito funcione. Además, las simulaciones lógicas utilizan ciclos delta y no retardos de propagación. La simulación RTL a menudo se denomina simulación de "retraso cero"

Construir una computadora a partir de puertas NAND sería doloroso. Pero si deseas bajar al nivel de voltajes y corrientes, necesitas un simulador a nivel de transistores como el de Spice . Tal vez una vez que tenga el transistor uno funcionando, puede asumir que funciona y cambiar a HDL como mostró y sugirió apalopoapa.

Estoy bastante confundido acerca de su problema real.

La cuestión es que no entiendo lo suficiente acerca de cómo funcionaría una puerta NAND en el nivel físico para escribir esto.

pero luego escribes todo lo que hay que saber sobre una puerta NAND:

def nand(a, b) volver !(a && b) fin

Todo lo que te falta es "cómo convertirlo en un objeto", pero eso no es una cuestión de la puerta NAND física, sino de tu comprensión de la programación.

escribió la función de una puerta NAND con ambas entradas flexibles y la salida determinada por la persona que llama. Todo lo que necesita ahora es convertirlo en un Objeto con entradas y salidas fijas [Además, como las otras preguntas dijeron un retraso de tiempo mínimo para el almacenamiento]