Qué lenguaje de HDL me recomendais??

Dudas, cuestiones, sugerencias y peticiones en general sobre el proyecto / Questions and requests about the project
Avatar de Usuario
mcleod_ideafix
Mensajes: 828
Registrado: 27 Sep 2015, 00:14
Ubicación: Jerez de la Frontera
Contactar:

Re: Qué lenguaje de HDL me recomendais??

Mensaje por mcleod_ideafix » 19 Oct 2015, 01:43

k_mirror escribió:Supongo que habrá alguna razón por la que nos enseñan las cosas de una forma distintas a como son en realidad, como por ejemplo en el caso del flip-flop dito D, yo to contento explicando algo basado en algo que me enseñaron, por lo cual lo daba por cierto, y después te enteras de que no es del todo correcto.
Porque en esencia, lo que nos enseñaron es correcto. Es decir, con el circuito que pusiste obtienes un latch D. Lo que pasa es que a la hora de integrar todo eso en un chip es cuando viene típo Paco con la rebaja y dice "aquí sobran transistores. Esto se puede hacer con menos".

La otra razón es que para simplificar el diseño hay que meter elementos que no son puertas lógicas en sentido estricto: son los transistores estos que implementan lo que se llama "lógica de paso". Vamos, los que hacen de interruptores. Esto es algo que no se puede modelar con una ecuación booleana. Para poder modelar algo como un interruptor hay que tirar por otro camino y el resultado es..... ¡el circuito que te enseñaron!

Recuerda que todo esto de los flip flops, cuando lo enseñan, es porque se parte del circuito secuencial más sencillo del mundo. Este fue el primer circuito secuencial que me enseñaron, el primer circuito con memoria.
1_puerta_or_secuencial.png
Este circuito es capaz de recordar si en algún momento la entrada S valió 1, aunque fuera por un momento. Si es así, la salida Q valdrá 1. Da igual que S valiera 1 durante un microsegundo y después volviera a 0. La salida Q recordará el evento y seguirá a 1.

Recuerda que esto funciona porque en realidad la salida de la puerta OR no se actualiza inmediatamente cuando cambian las entradas, sino que hay un ligero retraso. Los cables podemos suponer que llevan las señales de forma inmediata, pero la puerta en sí tiene un cierto retraso. Cuando S deja de valer 1 para volver a valer 0, Q aún sigue valiendo 1 durante un poquitín más, y como Q está conectada a la otra entrada de la OR, la salida seguirá siendo 1, aunque S vuelva a valer 0. Se dice que la salida se "enclava".

Esta es por tanto la memoria más simple: es capaz de recordar un 1. Lamentablemente no es de mucha ayuda, porque sólo recuerda unos, no recuerda ceros. Para que esta memoria pueda recordar un 0 hay que ser capaz de romper la realimentación que hay desde la salida a la entrada, para que la OR vuelva a ver dos ceros en las entradas y vuelva por consiguiente a sacar un 0. Esto es lo que hace el siguiente circuito:
2_biestable_rs_minimo.png
El lazo de realimentación ahora pasa por una puerta AND controlada por una señal R. Cuando R vale 0, la puerta AND se comporta como un interruptor cerrado que deja pasar la señal que venga por su otra entrada hacia la salida, sin cambiarla. Pero si R vale 1, entonces la AND saca en su salida un 0 independientemente de lo que venga por su entrada, por lo que se asemeja a un circuito abierto que no deja pasar la señal de su entrada a su salida. Al poner un 1 en R (y estando S a 0) la puerta OR vuelve a ver dos ceros en sus entradas, y saca un cero, pudiendo de esta forma guardar ahora tanto un 1 (activando S) como un 0 (activando R). Esto sería nuestro biestable RS más simple posible.

Antes de seguir, voy a redibujar este circuito, simplemente colocando los componentes en otro orden. Es el mismo circuito de antes:
3_biestable_rs_reordenado.png
3_biestable_rs_reordenado.png (9.5 KiB) Visto 870 veces
Bien. La primera consideración práctica es que hay que intentar usar un único tipo de puertas, y no tres como en este caso. Para ello, hay que recordar que tanto las puertas NAND como las NOR son puertas completas, es decir, que con ellas se pueden realizar todas las funciones de las demás puertas OR, AND y NOT. Las siguientes identidades lo demuestran:
equivalencias_demorgan.png
equivalencias_demorgan.png (1.46 KiB) Visto 870 veces
Lo que he hecho es conseguir una equivalencia de cada puerta lógica original a una expresión en la que sólo hay productos negados, esto es, puertas NAND. Las equivalencias en circuito, sacadas de estas ecuaciones, son éstas:
4_equivalencia_puertas.png
Pues bien, cojamos nuestro biestable RS y rediseñémoslo usando sólamente puertas NAND, sabiendo qué circuito de puertas NAND sustituye a cada puerta original. Nos queda este churro impresionante:
5_biestable_rs_nand.png
Aunque rapidamente vemos que hay dos puertas que sobran: U4 y U2 se cancelan la una a la otra (ambas funcionan como inversores), así que con esa simplificación nos queda esto:
6_biestable_rs_nand_simplif.png
Voy a volver ahora a las ecuaciones en lógica booleana para intentar simplificar este circuito, pero antes, y por comodidad, voy a cortar la realimentación, consiguiendo así un circuito que pueda modelar fácilmente con una expresión booleana:
7_biestable_rs_nand_simplif_real_cortada.png
Pues bien: el circuito, expresado en notación booleana, es el siguiente, el cual lo opero para intentar simplificarlo:
simplificacion_nand_a_nor.png
simplificacion_nand_a_nor.png (2.14 KiB) Visto 870 veces
Esto es: lo que he hecho es ponerlo en función de otra puerta lógica: la NOR, aunque hay por ahí una puerta OR y un inversor. Bien: el circuito queda así (con la realimentación restituida):
8_biestable_rs_casi_nor.png
8_biestable_rs_casi_nor.png (13.56 KiB) Visto 870 veces
He marcado una señal dentro del circuito, Q negada. Q sale de la puerta OR y sólo llega a un sitio, que es el inversor U3, del cual sale obviamente negada, para entrar en U1. La entrada a U1 es por tanto Q negada. Como la señal Q no se usa en ningún otro sitio salvo para llevarla al inversor, ¿por qué no integramos el inversor en la puerta OR (U2) de forma que la señal ya negada (Q negada) entre directamente en U1. Eso convierte U2 en una puerta NOR, como U1, con lo que simplificamos más aún el circuito y nos queda así:
9_biestable_nor.png
9_biestable_nor.png (10.5 KiB) Visto 870 veces
¡Pues ya lo tenemos! Este circuito es el latch RS que conocemos de siempre. Lo que pasa es que normalmente se suele dibujar con las dos puertas una debajo de la otra y a la misma altura. Reordenando el circuito queda así:
10_biestable_rs_final.png
10_biestable_rs_final.png (10.28 KiB) Visto 870 veces
Y esta es la razón por la cual nos enseñan los biestables, latches y flip flops de esta forma. Es un método constructivo como ves: de lo más sencillo a lo más complejo. Si desde el primer momento te plantan la célula de memoria como de verdad se hace, no serías capaz de ver el funcionamiento interno. Cuando ya sabes cómo y por qué funciona este tipo de memoria (la clave es el lazo de realimentación) es cuando puedes echar a un lado las ecuaciones booleanas y trabajar directamente con transistores, quedando el circuito como te enseñé antes.
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA

Responder