lunes, 19 de noviembre de 2007

6: El flip-flop J-K. Contadores




En este capítulo estudiaremos uno de los elementos más importantes, si no el más importante, en el arsenal de los bloques fundamentales de los circuitos lógicos conocidos como secuenciales. Este elemento es el flip-flop J-K y se representa de la manera siguiente:


Como puede verse en el símbolo del flip-flop J-K, este posee dos salidas complementarias Q y Q al igual que el flip-flop R-S.

Las características del flip-flop J-K son las siguientes:

(1) Cuando J=1 y K=1, al ir la entrada de la terminal de reloj C (clock) de 1 a 0 nada ocurre y el flip-flop J-K retiene el estado que poseía anteriormente.

(2) Cuando J=1 y K=0, al ir la entrada C de 1 a 0 el flip-flop J-K tomará el estado Q=1 independientemente del estado en el que se encontraba anteriormente.

(3) Cuando J=0 y K=1, al ir la entrada C de 1 a 0 el flip-flop J-K tomará el estado Q=0 independientemente del estado en el que se encontraba anteriormente.

(4) Cuando J=0 y K=0, al ir la entrada C de 1 a 0 el flip-flop J-K tomará un estado opuesto a aquél en el cual se encontraba anteriormente. Esto quiere decir que si antes de la transición en la terminal C de 1 a 0 el flip-flop J-K se encontraba en el estado Q=1, entonces tomará el estado Q=0 después de la transición. Asimismo, si se encontraba en el estado Q=0 antes de la transición, entonces tomará el estado Q=1 después de la transición.

Obsérvese que la transición de 0 a 1 en la terminal C no produce efecto alguno en la salida Q. Unicamente la transición de 1 a 0 es la que puede producir efecto alguno. Puesto que es una caída de 1 a 0 o una transición negativa la que produce esta acción, este flip-flop J-K es reconocido como uno accionado por una señal de reloj negativa en la terminal de “reloj” (clock).

Existen también en el mercado flip-flops J-K en los cuales la transición que produce la acción en la terminal de salida Q es una transición positiva de 0 a 1 y no la transición negativa de 1 a 0 (precaución: aquí no hay voltajes negativos involucrados). Estos flip-flops J-K son conocidos en el mercado como flip-flops accionados por una señal de reloj positiva.

Obsérvese cuidadosamente que es únicamente una transición en la terminal C la que puede producir acción alguna a la salida del flip-flop J-K. Si la entrada en la terminal C permanece constante, cualesquier variación en las terminales J yK no podrá producir efecto alguno en la salida Q del flip-flop J-K.

En forma similar al flip-flop R-S, el flip-flop J-K también posee dos salidas complementarias, Q y Q, con la diferencia de que el flip-flop J-K no posee estados no-definidos.

Repasemos con la ayuda de gráficos animados usando foquitos encendidos y apagados algunas de las características del flip-flop J-K dadas arriba, empezando por la primera que nos dice que cuando J=1 y K=1 entonces al ir la entrada de la terminal de reloj C (clock) de 1 a 0 nada ocurre y el flip-flop J-K retiene el estado que poseía anteriormente (en este ejemplo, el flip-flop J-K se encuentra en el estado Q=1; y si se encontrara en el estado Q=0 también permanecería en dicho estado sin importar el número de pulsos recibidos en la entrada C):


Veamos ahora lo que ocurre de acuerdo a la segunda característica que nos dice que cuando J=1 y K=0, al ir la entrada C de 1 a 0 el flip-flop J-K tomará el estado Q=1 independientemente del estado en el que se encontraba anteriormente (en este caso se supondrá que el flip-flop J-K está inicialmente en el estado Q=0):


Repasemos ahora lo que ocurre de acuerdo a la tercera característica que nos dice que cuando J=0 y K=1, al ir la entrada C de 1 a 0 el flip-flop J-K tomará el estado Q=0 independientemente del estado en el que se encontraba anteriormente (en este caso se supondrá que el flip-flop J-K está inicialmente en el estado Q=1, y para mayor simplicidad visual se indicará únicamente el “final” de la secuencia de estados, entendiéndose tras esto que la misma secuencia se volverá a repetir):


Aún más interesante es la cuarta característica que nos dice que cuando J=0 y K=0 entonces al ir la entrada C de 1 a 0 el flip-flop J-K tomará un estado opuesto a aquél en el cual se encontraba anteriormente:


El flip-flop J-K, al igual que todos los bloques fundamentales dentro de los circuitos lógicos, se construye utilizando funciones lógicas básicas.

Consideramos a continuación una configuración hecha exclusivamente a base de flip-flops J-K:


Para analizar cualesquier circuito lógico que contenga flip-flops J-K, la regla es extremadamente sencilla: Suponemos que todos los flip-flops J-K de la configuración están en el estado Q=0. Aplicamos varias transiciones negativas en la terminal de entrada (o terminal "reloj") C y hacemos una lista de los estados que adquieren los flip-flops J-K de la configuración después de haber ocurrido cada transición. Continuamos el procedimiento hasta que todos los flip-flops J-K de la configuración original hayan regresado al estado original Q=0.

Teniendo lo anterior en cuenta, empezamos suponiendo que la salida del primer flip-flop J-K es Q1=0 y que la salida del segundo flip-flop J-K es también Q2=0. En otras palabras, el estado original de la configuración es Q1Q2=00.

Vemos entonces en el diagrama de la configuración cuáles son las entradas a cada flip-flop J-K:


Al llevarse a cabo la primera transición negativa en la terminal de entrada, el primer flip-flop J-K tomará el estado Q1=1, ya que antes de la transición estaba condicionado por las entradas J=1 y K=0. Simultáneamente, el segundo flip-flop J-K tomará el estado opuesto al que tenía anteriormente, esto es, tomará el estado Q2=1, ya que antes de la transición estaba condicionado por las entradas J=0 y K=0.

Por lo tanto, después de la primera transición la configuración habrá tomado el estado Q1Q2=11. La situación de la configuración es ahora la siguiente:


Al llevarse a cabo la segunda transición en la terminal de entrada, el primer flip-flop J-K tomará el estado Q1=0, ya que antes de la segunda transición estaba condicionado por las entradas J=0 y K=1. Simultáneamente, el segundo flip-flip J-K tomará el estado Q2=0, ya que antes de la segunda transición estaba condicionado por las entradas J=0 y K=1.

Por lo tanto, después de la segunda transición la configuración toma el estado Q1Q2=00. El circuito ha regresado a su estado original.

Podemos resumir la secuencia de estados en una “tabla” que a primera vista podría asemejar una “Tabla de Verdad”, pero que sin embargo no es tal, ya que es conceptualmente diferente. Se trata de una tabla conocida como tabla de estados y también como tabla de secuencias, la cual no nos dice cuál es la salida del circuito para una cierta combinación de entradas, sino que nos muestra cuál es la secuencia de un estado del circuito al siguiente estado, en forma ordenada, de arriba hacia abajo:


Con el fin de evitar confusiones, se han dibujado las tablas de secuencias que serán mostradas en este libro de un modo algo diferente a como se han dibujado las Tablas de Verdad. En una tabla de secuencias, cada “bit” de información, ya sea un “0” ó un “1”, está encerrado en su propia “cajita”, la cual podemos visualizar como representando un flip-flop J-K o cualquier otro tipo de flip-flop. De este modo, cada renglón en una tabla de secuencias representa en un momento dado el estado de todos los flip-flops de los que está hecho el circuito, representa lo que llamamos comúnmente el estado de la máquina, simbolizado simplemente como Q. Cualquier circuito lógico con elementos de memoria en un momento dado está completamente determinado por el estado en el que están cada uno de sus elementos de memoria, lo cual incluye sus flip-flops R-S, sus flip-flops J-K, los valores que hay en cada una de las “celdas” de su memoria RAM, en fin, todos los registros y elementos de memoria de los que está hecha la máquina. Y como el número de estos elementos es siempre una cantidad finita, estas máquinas son conocidas comúnmente como máquinas de estado finito (finite state machines).

A diferencia de la Tabla de Verdad en la cual el orden en el que están puestos los renglones es un asunto sin trascendencia, en la tabla de secuencias el orden de los renglones tiene que ser mantenido intacto para poder leer de la misma cuál será el siguiente estado Qn+1 al cual avanzará un contador en una transición de estados cuando se encuentra dentro de cierto estado Qn. El avance del tiempo en una tabla de secuencias siempre debe ser leído de arriba hacia abajo, y el paso de un renglón al siguiente debe ser leído como la transición de un estado a otro tras cada “pulso” en la señal de entrada para la terminal de “reloj”. Si continuamos aplicando transiciones negativas a la terminal de entrada reloj C, la secuencia arriba mostrada se repetirá indefinidamente.

Circuitos hechos a base de flip-flops J-K como el que acabamos de estudiar son conocidos comunmente como contadores.

Puesto que el contador estudiado requiere dos transiciones para regresar a la condición inicial, decimos que es un contador módulo-2. En general, si un contador requiere n transiciones para regresar a la condición inicial, decimos que es un contador módulo-n. El término técnico se ha tomado “prestado” directamente del campo de las matemáticas, en donde tenemos aritméticas finitas módulo-n en las cuales al ir contando hacia arriba la suma no se va acumulando indefinidamente sino que, al llegar al número n, el conteo comienza nuevamente otra vez de cero. (Es una lástima que aquellos estudiantes que tienen problemas para entender las aritméticas modulares no tengan acceso a simuladores lógicos en los cuales con circuitos como los flip-flops J-K se pueden apreciar aritméticas modulares en acción. En otras palabras, el asunto de las aritméticas modulares no es un asunto meramente teórico que inventaron unos matemáticos ociosos que no tenían mejor cosa que hacer. Es algo que tiene aplicación directa en la práctica, y aquí lo estamos viendo en acción.)

Obsérvese cómo en el contador estudiado todos los flip-flops J-K son activados simultáneamente. Todo contador en el cual sus flip-flops J-K son accionados a un mismo tiempo con una señal de “reloj” común a sus terminales de entrada de reloj C es conocido como un contador síncrono.

Existen también contadores en los cuales cada flip-flop J-K a través de su terminal de salida Q acciona la terminal C del flip-flop J-K que le sigue. Este tipo de contadores recibe el nombre de contador asíncrono. Esta definición se extiende hacia cualquier otro tipo de contadores y circuitos secuenciales de todo género basado no sólo en el flip-flop J-K sino en otros flip-flops derivados del flip-flop J-K. Por ejemplo, el siguiente circuito secuencial construído con flip-flops del tipo D (derivable del flip-flop J-K según se verá en la sección de problemas resueltos) es un contador asíncrono:


mientras que el siguiente contador es un contador síncrono (obsérvese cómo la terminal de reloj resaltada de color azul alimenta todas las entradas C de los flip-flops del contador):


En la parte que corresponde a la serie de problemas resueltos para este capítulo, veremos que es posible construír de una manera muy sencilla un contador binario de conteo ascendente con el simple hecho de conectar varios flip-flops J-K en cascada. Si denotamos el estado de cada flip-flop J-K como Q, y conectamos cuatro flip-flops J-K en cascada, entonces representando el estado del contador como Q1Q2Q1Q2 y empezando el conteo binario desde cero, usando foquitos para representar con cada foquito encendido el estado de “1” y representando el estado de “0” con el foquito apagado la secuencia de estados que revelan al contador como un contador binario ascendente es, dinámicamente hablando, la siguiente:


Tan fácil es construír con flip-flops J-K un contador binario de conteo ascendiente como un contador binario de conteo descendiente. Nuevamente, para el caso de un contador binario de conteo descendiente de cuatro bits utilizando cuatro flip-flops J-K y utilizando foquitos para visualizar el estado de cada flip-flop, dinámicamente tendríamos algo como lo siguiente:


Aquí se podría objetar que mientras que un contador binario ascendente de cuatro bits sería el contador ideal para contar en un sistema hexadecimal, con 16 símbolos diferentes, puesto que un humano cuenta de diez en diez en el sistema decimal entonces tendría dificultades para poder “comunicarse” con un contador binario puro que use cuatro flip-flops J-K y el cual recorra 16 estados diferentes antes de regresar al estado “cero”. Lo ideal sería un contador binario cuya secuencia de estados abarque únicamente diez estados diferentes en lugar de 16, o sea, un contador binario que nos dé el equivalente de un decimal codificado en código binario (conocido en literatura técnica inglesa como contador binario BCD, del acrónimo Binary Coded Decimal). La secuencia de estados que recorrería un contador tal sería la siguiente:


Esto se puede lograr forzando al contador binario a que cuando trate de llegar al estado 0101 dicho contador binario sea forzado o condicionado de alguna manera para entrar en el estado 0000. Los detalles sobre las maneras en las cuales podemos lograr esto se verán en mayor detalle en la sección de problemas resueltos.

Otro concepto clave es el de los contadores con peso. Existe cierto tipo de contadores en los cuales si asignamos un cierto “peso” numérico a cada flip-flop J-K que los compone , el contador parece llevar a cabo un conteo ascendente en el sistema decimal. Consideremos un contador cuya tabla de secuencias mostrando su secuencia natural de estados es la siguiente:


Supongamos ahora que asignamos una unidad de peso al primer flip-flop J-K con salida Q1, una unidad de peso al segundo flip-flop J-K de salida Q2, dos unidades de peso al tercer flip-flop J-K de salida Q3 y cuatro unidades de peso al cuarto flip-flop J-K de salida Q4.

Al empezar el conteo, el estado de la configuración es Q1Q2Q3Q4=0000, cuyo equivalente decimal es 0. Después de la primera transición, el contador toma el estado Q1Q2Q3Q4=1000. Puesto que la salida del primer flip-flop J-K es Q1=1 y a su vez contribuye con un peso de una unidad, el equivalente decimal del estado del contador será 1. Después de la segunda transición, el contador toma el estado Q1Q2Q3Q4=1100. Puesto que la salida de los dos primeros flip-flops es 1 y cada uno contribuye con un peso de una unidad, el equivalente decimal del estado del contador será 1+1=2. Después de la tercera transición, el contador toma el estado Q1Q2Q3Q4=1010. Puesto el primer flip-flop contribuye con un peso de una unidad y el tercer flip-flop contribuye con un peso de dos unidades, el equivalente decimal del estado del contador será 1+2=3. Continuando el análisis, vemos que el contador produce una cuenta decimal ascendente ordenada que llega hasta el estado con un equivalente del número decimal 8. Puesto que el peso del contador es una unidad - una unidad - dos unidades - cuatro unidades, representamos dicho peso como 1-1'-2-4. Obsérvese el uso de la comillla puesta en el peso correspondiente al segundo flip-flop que repite el mismo peso del primero.

Ahora bien, para diseñar un contador hecho a base de flip-flops J-K existen varias alternativas, algunas de las cuales se discuten en los problemas resueltos correspondientes a este capítulo. El diseñista deberá estar alerta para determinar cuál de todos producirá el diseño óptimo para lograr la secuencia deseada.

Debemos mencionar también que todo contador que produzca una salida simétrica de pulsos en su último flip-flop J-K es conocido como un contador simétrico. De no ser así, el contador es conocido como un contador asimétrico. (Definimos un tren simétrico de pulsos como aquél en el cual los “unos” y los “ceros” siempre ocurren de manera alternada, y cada “1” tiene la misma duración de tiempo que un “0”.)

Aunque el flip-flop J-K es un elemento central para la construcción de contadores electrónicos, su uso no está limitado a este tipo de circuitos. Las aplicaciones de un bloque tan versátil como lo es el flip-flop J-K son tan amplias que están limitadas únicamente por la imaginación del diseñista. Del flip-flop J-K se pueden obtener otros componentes más sencillos y más especializados como el flip-flop D y el flip-flop T. Aquí es en donde tenemos el punto de partida para la construcción de componentes funcionales más especializados tales como el registro de transferencia (shift register), conocido también como registro de desplazamiento y como registro de corrimiento. En este componente podemos ir metiendo varios bits de uno en uno hasta llenarlo a su máxima capacidad, tras lo cual podemos enviarlos juntos hacia afuera en forma paralela o inclusive en forma serial a la vez que vamos reintroduciendo la información de nuevo al registro de desplazamiento para otro uso posterior. Esta acción la podemos esquematizar de la siguiente manera en un circuito lógico que podemos suponer que se ha construído con cuatro flip-flops J-K:


En este ejemplo, tras el primer “pulso de reloj”, el último bit correspondiente a la palabra binaria 1011 ha entrado ya en el primer flip-flip del registro de transferencia. Al siguiente “pulso de reloj”, le toca su turno al penúltimo bit de la palabra binaria entrar al primer flip-flop del registro de transferencia, a la vez que el bit que estaba en el primer flip-flop es desplazado hacia el segundo flip-flop hacia su derecha. De este modo, la palabra binaria va entrando al registro de desplazamiento hasta que está completamente dentro del registro, y eventualmente empieza a salir del registro bajo la acción de los siguientes pulsos de reloj. Puesto que este es un registro de transferencia en el cual la información binaria entra en forma serial (por la izquierda) y sale en forma serial (por la derecha), este tipo de registro es conocido como de entrada-serial salida-serial o siso (serial-input serial-output).

Suponiendo que hayamos construído un registro de transferencia de cuatro bits y en el cual se haya metido la palabra binaria 1011, entonces si imaginamos que hemos conectado foquitos a las salidas Q de cada flip-flop J-K para representar el estado de “encendido” (“1”) y “apagado” (“0”), entonces podemos representar con un gráfico dinámico de la siguiente manera la salida serial de la palabra binaria 1011 empezando el bit que está más hacia la derecha, lo cual dejará al registro de transferencia en el estado 0101 (suponiendo que no le entra nada por la izquierda) tras el primer “pulso de reloj”, pasando al estado 0010 tras el segundo “pulso de reloj, y así sucesivamente hasta que los cuatro bits hayan salido por la derecha y el registro de transferencia haya quedado completamente vacío con puros ceros (foquitos apagados) al finalizar la secuencia de operaciones de transferencia de bit por bit:


Se pueden concebir otros tres tipos de registros de transferencia, empezando por el que es conocido como de entrada-serial salida-paralela o sipo (serial-input parallel-output):


y el que es conocido como de entrada-paralela salida-serial o piso (parallel-input serial-output):


y el que es conocido como de entrada-paralela salida-paralela o pipo (parallel-input parallel-output):


Diseñar un registro de transferencia con flip-flops J-K o cualquier otro tipo de flip-flop es un asunto relativamente fácil. El problema general en el diseño de circuitos secuenciales consiste en, dada una tabla de secuencias, diseñar un circuito lógico que pueda producir en forma ordenada dicha tabla de secuencias, todo bajo el control de un “pulso de reloj” maestro.

En otros tiempos, dados los costos altísimos de un componente tan básico como el inversor lógico NOT construído a base de lentos relevadores electromecánicos o de componentes más rápidos pero aún más costosos como los tubos electrónicos al vacío, diseñar un circuito secuencial con la menor cantidad teórica posible de componentes era un asunto de la más alta prioridad, y para ello se invertían muchas horas de estudio refinando al máximo técnicas como el mapa de Karnaugh para poder obtener los diseños más económicos posibles. Pero el dramático abaratamiento de los circuitos integrados en donde se implementan las funciones lógicas básicas ha hecho posibles otros recursos más prácticos de diseño que no enfatizan tanto aquellas herramientas teóricas de tan laborioso acceso que inclusive estaban fuera del alcance de la mayoría de los técnicos por ser impartidas en cursos a nivel universitario en las carreras de ingeniería eléctrica, ingeniería electrónica y ciencias computacionales.

Supóngase que se desea construír una máquina secuencial que sea capaz de generar una secuencia de ocho palabras de 4 bits cada palabra. Si tenemos la tabla de secuencias a la mano, entonces todo lo que tenemos que hacer es proporcionar un contador binario de conteo ascendente que empezando con el estado Q1Q2Q3=000 suba al estado Q1Q2Q3=001 en el siguiente “pulso de reloj”, tras esto al estado Q1Q2Q3=010 en el siguiente “pulso de reloj”, y así sucesivamente, llevando a cabo un conteo binario ascendente. Podemos construír fácilmente un contador de este tipo con flip-flops J-K. O mejor aún, lo podemos comprar ya hecho dentro de un circuito integrado como el CD4520 (el cual incluye dos contadores binarios ascendentes por el precio de uno):


Todo lo que tenemos que hacer ahora es agregarle una memoria ROM, conectando directamente las salidas Q del contador binario a las entradas A de domicilios de la memoria ROM. El ROM tiene que tener grabada en su memoria la tabla de secuencias en forma ordenada, con la primera secuencia puesta como el dato localizable en el primer domicilio, la segunda secuencia puesta como el dato localizable en el segundo domicilio, y así sucesivamente. El circuito presenta así el siguiente aspecto:


Todo lo que tenemos que hacer ahora es aplicarle “pulsos” de la señal de reloj de la duración deseada en la terminal de entrada “Reloj” para ver trabajar a nuestro secuenciador.

Existe otra alternativa de diseño, explorada en la sección de problemas resueltos de este capítulo, la cual consiste en utilizar una memoria ROM en la cual se recurre al “truco” de retroalimentar las entradas del ROM con sus salidas, de modo tal que cada domicilio apunte hacia una localidad que es otro domicilio del mismo ROM y a la vez la secuencia que sigue. De esta manera, el abaratamiento de la microelectrónica no solo ha hecho posible que un técnico pueda lograr lo mismo que lo que antes requería a un ingeniero para lograr, ha hecho obsoletos muchos de los conocimientos tan arduamente adquiridos por este ingeniero que hoy en día nos sirven únicamente como ejercicio intelectual, un ejercicio intelectual muy interesante pero de dudosa utilidad en la práctica.