Hola. Continuamos con: "Latch D comandado por compuerta" Existen varios tipos de "latch", uno de ellos es el "Latch D". Y en el caso del "latch" D, tiene una entrada de datos y esa entrada de datos es la que me define la salida, es súper simple. Cuando el "clock" es 0, da lo mismo lo que sea mi entrada de datos. La salida del tiempo siguiente va a ser la salida del tiempo actual. Cuando el "clock" vale 1 y mi entrada es 0, mi salida es 0. Cuando el "clock" vale 1 y mi entrada es 1, mi salida es 1. Es más simple que el SR. Es una especie de "latch" SR, donde en realidad las señales S y R, las que me va a partir de la entrada de datos. Es una versión más simple, para efectos de alto nivel. Nosotros miramos esto y nos parece más simple, porque tiene solo una entrada, que es "latch" SR, sin embargo, tiene más transistores. Entonces, tiene solo una entrada, a diferencia de "latch" SR que tiene dos entradas. Ya vimos que cuando el "clock" es 1, la salida puede cambiar. Cuando el "clock" es 0, la salida mantiene su valor anterior. Y esta implementación resuelve el problema que ocurre, en el caso del "latch" SR, cuando S es igual R, igual 1, porque en este caso no puede ocurrir. Si "data" es 1, S es 1, R es 0. Si "data" es 0, S es 0, R es 1. Con eso se ha resuelto el problema. Debido a que la salida depende del nivel de la señal D, en contraposición aquí, depende del nivel, en contraposición a depender del flanco, depende del nivel. Si la señal D está en 1, durante todo ese rato, desde este punto hasta este punto, mi salida puede cambiar. Entonces, como el "latch" es sensible al nivel del "clock", no al flanco del "clock", entonces decimos que el "latch" es sensible al nivel. Esto puede ser un problema, por ejemplo, en este ciclo. En este ciclo aquí, en t3 el "clock" vale 1. Cuando el "clock" está en 1, tenemos D en 1 y nos arrepentimos y cambiamos D. Entonces, mi salida vale 1 y vuelve a 0, exactamente en ese tiempo. Ahí baja y luego, al bajar el "clock" mi salida se mantiene en 0. ¿Cuál es el peligro? El peligro es que aquí, en este punto, haya un "glitch", pasen cosas extrañas. Eso es un problema que ya vamos a entender con mayor cuidado. ¿Cómo hacemos un "latch" D en Verilog? Una manera simple de especificar el comportamiento de un "latch", es en un bloque always, porque recordemos que los bloques "always" nos permiten crear registros y los registros son elementos que almacenan memoria en Verilog. Este es nuestro módulo. Aquí dice, "module D latch", que tiene entradas D y "clock" y tiene salida Q y el Q es un registro. Entonces, siempre que ocurra un D o que ocurra un "clock", si el "clock" es 1, Q es D. Listo. Nada más sencillo. ¿Qué pasa cuando "clock" no es igual a 1? Por ejemplo, si "clock" es 0, no ejecuta lo que está en este bloque "always" y por lo tanto, Q va a valer lo que valía en el ciclo anterior. Si no se especifica el comportamiento del circuito cuando "clock" es 0, el compilador de Verilog asume que Q debe mantener su valor y por lo tanto, hicimos un elemento con memoria, en Verilog. Se sintetiza un "latch", que mantiene el valor de Q, cuando "clock" vale 0. ¿Qué pasa con los retardos de propagación? El cambio de "clock" no es instantáneo, por lo que es necesario asegurarse que la señal D sea estable y con eso evitamos un comportamiento errático. Existen algunos tiempos que se deben cumplir en los "latches". Está el "Sep-up time", "T_su". Corresponde al mínimo tiempo que la señal D debe ser estable. Cuando hablamos de estable, nos referimos sin cambiar, antes de que la señal de "clock" se apague. Después, está el "Hold time", que está aquí, que corresponde al mínimo tiempo que la señal se debe mantener estable, esto es sin cambios, después de que la señal de "clock" se apague. Entonces, nuestro punto crítico aquí es cuando la señal de "clock" baja. Antes de que la señal de "clock" baje, en el tiempo "Set-up", mi D tiene que ser fijo, estable, y después de que la señal de "clock" se apague, durante un tiempo "t_h", mi D tiene que ser fijo. Si es que no fuera fijo, si es que D tuviera algún "glitch" aquí, durante el "set-up", o un "glitch" durante el "hold", yo no puedo asegurar cómo va a ser mi salida, eso es un problema y esto debe ser respetado en cualquier circuito. Estos valores, los de "set-up" y los de "hold", dependen de la tecnología utilizada, de la implementación específica del "latch" y son especificadas por el fabricante. En chips discretos, de esos que uno compra, son de esos que, simplemente, que uno no diseña, en esos chips, típicamente el tiempo de "set up" es de 20 nanosegundos, el tiempo de "hold" es de 3 nanosegundos. Eso es para los chips TTL, por ejemplo, los chips antiguos. En tecnologías más moderna, los tiempos de "set up" son del orden de 10 picosegundos, los tiempos de "hold" son del orden de 2 picosegundos. Suele ocurrir que el tiempo de "hold" es menor que el tiempo de "set-up". ¿Qué aprendimos hoy? Aprendimos qué es un "latch" D, que es un "latch" sensible al nivel, "level sensitive", a diferencias de otros que son sensibles a un flanco. Aprendimos el diseño de un "latch" D en Verilog. Aprendimos que el código es muy sencillo y con eso ya obtenemos un elemento que guarda memoria. Y vimos, además, los efectos del retardo en la propagación de las señales y que eso nos resulta en tiempos de "set-up" y tiempos de "hold", que tenemos que respetar. Muchas gracias por ver esta clase.