En 1854 George Boole publico una obra titulada “investigación de las leyes del pensamiento, sobre las que se basan las teorías matemáticas de la lógica y la probabilidad”. En esta publicación formulo la idea del algebra de operaciones lógicas que se conoce hoy en día como Algebra de Boole. El algebra de Boole es una forma que permite expresar y analizar operaciones de circuitos lógicos.
Operaciones Booleanas
En el algebra de Boole, una variable es un símbolo que se utiliza para representar magnitudes lógicas. Cualquier variable puede tener un valor de 1 o 0. El complemento es el inverso de la variable. Un literal se define como una variable o su complemento.
Adición Booleana
La adición Booleana es equivalente a la operación lógica OR. En algebra de Boole, un termino suma es una suma de literales. En circuitos lógicos, un termino suma se produce mediante la operación lógica OR de dos literales. El resultado de la suma es 1 cuando uno o más de los literales es uno.
Las reglas de la suma son:
Entradas
Salida
A
B
S
0
0
0
0
1
1
1
0
1
1
1
1
Multiplicación Booleana
La multiplicación Booleana es equivalente a la operación lógica AND. En algebra de Boole, un termino producto es una producto de literales. En circuitos lógicos, un término producto se produce mediante la operación lógica AND de dos literales. El resultado de la multiplicación es 1 cuando todos sus literales son uno.
Las reglas de la multiplicación son:
Entradas
Salida
A
B
S
0
0
0
0
1
0
1
0
0
1
1
1
Leyes del Algebra de Boole
Al igual que en otras áreas de las matemáticas, existe en el algebra de Boole una serie de leyes que resuelven determinados problemas en las implementaciones de circuitos lógicos.
Ley Commutativa
La ley conmutativa indica que el orden de las variables no altera el resultado. Entonces la ley conmutativa para la adición de dos variables se describe como:
La ley conmutativa para la multiplicación de dos variables se describe como:
Ley Asociativa
La ley asociativa para la adición de tres variables se describe como:
La ley asociativa para la multiplicación de dos variables se describe como:
Ley Distributiva
La ley distributiva para tres variables se describe como:
Reglas del Algebra de Boole
Existen unas reglas básicas para la manipulación y simplificación de expresiones Booleanas. Estas reglas se describen en la siguiente tabla.
Nº
REGLA
DESCRIPCION
1
Al aplicar la operación OR a una variable y a cero el resultado es el valor de la variable
2
Al aplicar la operación OR a una variable y a uno el resultado es uno
3
Al aplicar la operación AND a una variable y a cero el resultado es cero
4
Al aplicar la operación AND a una variable y a uno el resultado es el valor de la variable
5
Al aplicar la operación OR a una variable consigo misma el resultado es el valor de la variable
6
Al aplicar la operación OR a una variable con su complemento el resultado es 1
7
Al aplicar la operación AND a una variable consigo misma el resultado es el valor de la variable
8
Al aplicar la operación AND a una variable con su complemento el resultado es 0
9
El doble complemento de una variable es igual a la variable
10
Aplicando la ley distributiva y las reglas 2 y 4 de esta tabla se puede deducir esta regla
11
Aplicando varias reglas de esta tabla se puede deducir esta regla
12
Aplicando varias reglas de esta tabla se puede deducir esta regla
Teoremas de DeMorgan
DeMorgan, fue un matemático que estuvo relacionado con Boole. Propuso dos teoremas que están fuertemente relacionados con el algebra de Boole. Los teoremas de DeMorgan, demuestran las equivalencias entre las compuertas NAND y Negativa OR y las compuertas NOR y Negativa AND.
El primer teorema de DeMorgan se enuncia como: El complemento de un producto de variables es igual a la suma de los complementos de las variables.
El segundo teorema de DeMorgan se enuncia como: El complemento de una suma de variables es igual al producto de los complementos de las variables.
Una memoria es un dispositivo de almacenamiento de datos binarios. Las memorias almacenan bloques de datos generalmente de 8 bits que corresponde a un byte. Un byte es compuesto por dos bloques de 4 bits que reciben el nombre de nibble. Una unidad de información se denomina palabra y es compuesta por uno o más bytes.
Una memoria esta formada por matrices de celdas. Una celda es un elemento de almacenamiento que puede almacenar un 1 o 0 lógico. La posición en una unidad de datos se denomina dirección. La dirección corresponde a la ubicación de una unida de datos o palabra dentro de la memoria.
La capacidad de una memoria, corresponde al número total de unidades de datos que puede almacenar. La operación de escritura en una memoria coloca los datos en una posición de memoria específica. La operación de lectura toma los datos de una posición de memoria específica.
Lectura y Escritura
Los datos se colocan en la memoria a través del proceso de escritura y se toman de la memoria a través del proceso de lectura mediante un conjunto de líneas denominadas bus de datos. El bus de datos en una memoria es bidireccional, lo que indica que los datos pueden entrar a la memoria o salir de ella. En el caso de la memoria organizada en bytes, el bus de datos tiene 8 líneas que corresponden a 8 bits.
En las operaciones de lectura y escritura, se debe seleccionar una posición de memoria mediante una dirección que se debe colocar en un dato binario. Esta dirección se ubica en un conjunto de líneas denominadas bus de direcciones. El código de la dirección se decodifica mediante un circuito combinacional denominado decodificador de instrucciones y selecciona el registro en donde se debe almacenar o leer el dato. El número de líneas del bus de direcciones depende de la capacidad de la memoria. Esta capacidad esta determinada por potencias base 2, debido a que dicha dirección se encuentra en binario. Por ejemplo, si una memoria tiene un bus de datos de 8 bits, entonces, su capacidad es de 28=256 direcciones de memoria.
La siguiente figura representa un diagrama en bloques de una memoria.
Operación de escritura
En la operación de escritura de una memoria, se introduce en el bus de direcciones un código que corresponde a la dirección en la que se desea almacenar el dato. El decodificador de direcciones decodifica el valor colocado en el bus de direcciones seleccionando el registro en el cual se almacena el dato. Posteriormente, se debe colocar en el bus de datos el dato que se desea almacenar. Finalmente se debe dar una orden de escritura para que el dato quede almacenado en la memoria. Cuando se escribe un nuevo dato en una posición de memoria, el dato anterior es sobreescrito, lo cual indica que ese dato anterior se destruye.
Operación de lectura
En la operación de lectura de una memoria, se introduce en el bus de direcciones un código que corresponde a la dirección de la que se desea capturar o leer el dato. El decodificador de direcciones decodifica el valor colocado en el bus de direcciones seleccionando el registro del cual se toma el dato. Finalmente se debe dar una orden de lectura para que el dato se coloque en el bus de datos. Una vez este en el bus de datos, se puede hacer uso de dicha información. Cuando se lee un dato de una posición de memoria, el dato se mantiene almacenado. Esto permite darle nuevo uso a dicho dato.
Memorias de Solo Lectura ROM
ROM son las siglas de read-only memory, que significa "memoria de sólo lectura". Las memorias ROM mantienen de forma permanente los datos almacenados, los cuales, pueden ser leídos pero no modificados (memoria no volátil). Una memoria ROM almacena datos que se requieren constantemente en las aplicaciones. La ROM suele almacenar la configuración del sistema o el programa de arranque de un computador.
Las memorias de sólo lectura o ROM son utilizada como medio de almacenamiento de datos en los computadores, debido a que no se puede escribir fácilmente, su uso principal reside en la distribución de programas que están estrechamente ligados al soporte físico del computador, y que seguramente no necesitarán actualización. Por ejemplo, una tarjeta gráfica puede realizar algunas funciones básicas a través de los programas contenidos en la ROM.
Una razón de que se utilice la memoria ROM para almacenar datos es la velocidad ya que los discos son más lentos. Además no se puede leer un programa que es necesario para ejecutar un disco desde el propio disco. Por lo tanto, la BIOS, o el sistema de arranque oportuno de la computadora normalmente se encuentran en una memoria ROM.
Las ROMs semiconductoras se fabrican de con tecnología bipolar o con tecnología MOS (Metal-Oxido Semiconductor). La siguiente figura muestra la clasificación de las memorias ROM.
ROM Básica
La ROM básica es una memoria programada permanentemente durante el proceso de fabricación para proporcionar funciones estándar. La mayoría de los circuitos integrados ROM utilizan la presencia o ausencia de de una conexión de transistor en una unión fila-columna para representar un 1 o 0. Las celdas de una memoria pueden ser bipolares, es decir, que están construidas a base de transistores BJT (Bipolar Junction Transistor) o pueden ser construidas a base de transistores MOSFET (Metal-Oxide Semiconductor Field Efect Transistor).
La representación de una memoria ROM pequeña, por ejemplo, una memoria de 256X4, que indica que tiene 256 posiciones de memoria y cada posición es de 4 bits, se realiza mediante una matriz de celdas de 256 filas por 4 columnas. Esta memoria tiene entonces 8 bits en el bus de direcciones y 4 bits en el bus de datos.
PROM
Las PROM (ROM Programable) se encuentran disponibles en tecnología bipolar y en tecnología MOS. Generalmente estas memorias tienen buses de datos de 4 u 8 bits y capacidades de alrededor de 250.000 posiciones de memoria. Las PROM utilizan mecanismos de fundición para almacenar bits donde una celda se funde o no para representar un 1 o 0 lógico, entonces una memoria PROM utiliza fusibles en cada celda. El proceso de la fundición es irreversible. Una vez programada no se puede cambiar.
Durante el proceso de programación de la memoria, a cada celda se le aplica una corriente suficiente para fundir el fusible de la celda. De esta forma esta celda queda abierta y representaría un 0 lógico.
Normalmente una memoria PROM se programa colocándola en un dispositivo denominado programador de PROM. El proceso de programación consiste en colocar una dirección en el bus de direcciones y enviar un impulso que produzca corriente a cada línea del bus de datos para fundir los fusibles requeridos. De esta forma queda almacenado el dato.
EPROM
Una EPROM es una PROM borrable. Una EPROM puede ser reprogramada, si antes se borra los datos que contenga la memoria. Utiliza matrices NMOSFET con estructura de puerta aislada. La puerta del transistor aislada no tiene conexión eléctrica y puede almacenar una carga eléctrica durante un periodo de tiempo indefinido. Los bits en esta matriz se representan mediante la presencia o ausencia de una carga almacenada en la puerta. El borrado consiste en la eliminación de la carga de la puerta. Los tipos fundamentales de EPROM son las UVPROM (PROM Borrable por Ultravioleta) y las EEPROM (PROM Eléctricamente Borrable)
UVPROM
En una UVPROM la puerta aislada del FET esta flotando dentro de un material oxido aislante. El proceso de programación hace que los electrones sean eliminados de la puerta flotante. El borrado se realiza mediante la exposición del chip de la matriz de memoria a una radiación ultravioleta de alta intensidad a través de una ventana de cuarzo que posee la memoria en la parte superior del encapsulado. La carga positiva almacenada en la puerta se neutraliza después de un periodo de tiempo de exposición de la luz ultravioleta sobre la memoria.
EEPROM
Las PROM Borrables Eléctricamente, se puede borrar y programar mediante impulsos eléctricos. Las EEPROM se pueden reprogramar dentro del propio circuito, lo que permite reconfigurar cualquier sistema. Los dos tipos de EEPROM son los MOS de puerta flotante y la de silicio de oxido nitroso (NMOS, Metal Oxide Silicon). La aplicación de una tensión en la puerta de control de la estructura de puerta flotante permite la eliminación y el almacenamiento de la carga en la puerta flotante.
Memorias de Acceso Aleatorio RAM
En una memoria RAM los datos se pueden leer y escribir de forma aleatoria, es decir, que se puede leer y escribir de una posición de memoria deseada. Además, los tiempos de respuesta en una memoria RAM son bajos, esto indica que es una memoria supremamente eficiente. Al escribir un dato en una posición de la memoria, los datos anteriores son reemplazados por el nuevo dato. Sin embargo, cuando los datos son leídos de una posición de memoria, estos datos se conservan. La memoria RAM puede almacenar información, mientras tenga energía eléctrica.
Las memorias RAM, también se fabrican con tecnologías bipolar y MOS. Hay otras memorias que usan ambas tecnologías denominadas BiMOS. La siguiente grafica muestra la clasificación de memorias RAM.
Arquitectura de RAM Estática (SRAM)
Una memoria SRAM se direcciona del mismo modo que una memoria ROM. La principal diferencia entre la organización de las SRAM y las PROM es que las SRAM, tienen bus de datos bidireccional, es decir de entrada y salida y tienen unidad de control de lectura y escritura de información.
En modo de lectura, se coloca en el bus de datos el dato almacenado en la posición de memoria correspondiente a la dirección colocada en el bus de direcciones. En modo de escritura, el dato colocado en el bus de datos, se almacena en la posición de memoria correspondiente a la dirección colocada en el bus de direcciones. El bus de datos se compone de las líneas llamadas DQ0 a DQ7. En el proceso de escritura, estas líneas se denominan D0 a D7 y en el proceso de lectura estas líneas se denominan Q0 a Q7.
La figura anterior muestra la organización de una memoria SRAM. La matriz de celdas de memoria esta organizada en 256 filas y 128 X 8 columnas, es decir, 128 columnas cada una de 8 bits. El modo de operación de la SRAM es el siguiente. La entrada de habilitación E, debe estar a nivel bajo para que el circuito se encuentre habilitado. 8 de las 15 líneas de dirección se decodifican en el decodificador de filas. Esto indica que se selecciona solo una de 256 filas. Las líneas restantes de dirección las decodifica el decodificador de columnas. Esto indica que se selecciona solo una da 128 columnas de 8 bits.
En el proceso de lectura, la entrada de habilitación W debe estar a nivel alto y la entrada de habilitación G, debe estar activa a nivel bajo. Las compuertas negativa AND, posterior a las líneas de habilitación, permiten activar los buffer triestado del bus de datos, de tal forma que los datos almacenados, se presenten en el bus de datos.
En el proceso de escritura, la entrada de habilitación W debe estar activa a nivel bajo y la entrada de habilitación G, debe estar a nivel alto. Las compuertas negativa AND, posterior a las líneas de habilitación, permiten activar los buffer triestado del bus de datos, de tal forma que los datos colocados en el bus de datos, ingresen a la matriz de memoria en la fila y columna seleccionada.
Expansion de Memorias
Las memorias disponibles se pueden ampliar para incrementar la longitud de palabra, es decir, el número de bits de los datos o para ampliar la cantidad de posiciones de memoria, es decir, ampliar el número de direcciones de la memoria.
Expansión de longitud de palabra
El objetivo de la expansión de la longitud de la palabra es ampliar el bus de datos. Para ello, es recomendable utilizar dos memorias RAM o ROM idénticas. La siguiente figura muestra el símbolo de una memoria ROM de 32 X 8.
Con base en la memoria anterior, se puede ampliar el número de bits del bus de datos al doble, utilizando dos circuitos integrados de esta memoria. En este caso se obtendría una memoria PROM de 32 X 16. La implementación de esta memoria expandida seria la siguiente.
En la expansión anterior, se debe colocar el bus de direcciones en común para ambas memorias y la salida se amplia al doble de cada memoria.
De igual forma se implementa para una memoria RAM. La siguiente figura muestra el símbolo lógico de una memoria RAM de 1Kb X 8.
Con base en esta memoria de 1Kb X 8, la implementación de la memoria expandida seria la siguiente.
En la implementación anterior, las entradas del bus de direcciones van en común y el bus de datos expande. Sin embargo, es necesario tener en cuenta que el bus de datos es bidireccional. En esta memoria, al colocar la línea WE en 0, la memoria se encuentra en estado de escritura y al colocar la línea WE en 1, la memoria se encuentra en estado de lectura. Esto indica que el bus de datos es de entrada cuando WE es 0 y de salida cuando WE es 1. Por tal motivo, en este ejemplo se ha conectado diodos LED para visualizar la salida y dipswitch para proporcionar datos de entrada.
Expansión de capacidad de almacenamiento o tamaño
El objetivo de la expansión de la capacidad de almacenamiento es ampliar el bus de direcciones en un bit. Al hacer esta operación, se expande la capacidad de la memoria al doble.
Con base en la memoria PROM 32 X 8, se puede ampliar la capacidad de la memoria al doble usando dos memorias idénticas, resultando una memoria expandida de 64 X 8. La implementación de esta memoria expandida seria la siguiente.
En la expansión anterior, se debe colocar el bus de direcciones en común para ambas memorias. Además la entrada CS, se convierte en el bit de mayor peso del bus de direcciones, de tal forma que cuando es 0 habilita la memoria inferior y cuando es 1 habilita la memoria superior. Las salidas se conectan en común.
Esta expansión con memoria RAM también es posible. Con base en la memoria RAM de 1Kb X 8, la implementación de la memoria expandida seria la siguiente.
En la expansión anterior, se debe colocar el bus de direcciones en común para ambas memorias. Además la entrada CS, se convierte en el bit de mayor peso del bus de direcciones, de tal forma que cuando es 0 habilita la memoria inferior y cuando es 1 habilita la memoria superior. Además, en esta memoria, al colocar la línea WE en 0, la memoria se encuentra en estado de escritura y al colocar la línea WE en 1, la memoria se encuentra en estado de lectura. Esto indica que el bus de datos es de entrada cuando WE es 0 y de salida cuando WE es 1. Por tal motivo, en este ejemplo se ha conectado diodos LED para visualizar la salida y dipswitch para proporcionar datos de entrada.
Los registros son circuitos secuenciales construidos a base de Flip-Flops los cuales permiten almacenamiento de información. Generalmente, los registros están construidos a base de Flip-Flops tipo D, debido a que siempre que a la entrada se coloca un 1 lógico, se desea obtener a la salida Q un 1 lógico, y siempre que a la entrada se coloca un 0 lógico, se desea obtener a la salida Q un 0 lógico. Un registro puede presentar diferentes funcionalidades definida por el desplazamiento de la información y la carga en paralelo de la información.
Los registros, pueden tener diferentes movimientos, los cuales dependen de su forma de entrada y salida de datos.
En la figura anterior se muestra los diferentes movimientos de datos en un registro. La primera imagen corresponde a entrada en paralelo, salida en paralelo. La segunda imagen corresponde a entrada en serie con desplazamiento a la derecha, salida en paralelo. La tercera imagen corresponde a entrada en serie con desplazamiento a la izquierda, salida en paralelo. La cuarta imagen corresponde a entrada en serie con desplazamiento a la derecha, salida en serie. La quinta imagen corresponde a entrada en serie con desplazamiento a la izquierda, salida en serie. La sexta imagen corresponde a entrada en paralelo, salida en serie con desplazamiento a la derecha.
Resgistros con Entrada y Salida en Paralelo
Un registro con entrada y salida en paralelo, tiene como objetivo, capturar un dato en paralelo y colocarlo directamente en la salida del registro. La siguiente figura presenta el diseño de dicho registro.
Registros de Desplazamiento con Entrada y Salida en Serie
Un registro con entrada y salida en serie, tiene como objetivo, capturar un dato bit a bit dado una frecuencia. Con este tipo de implementaciones, la entrada y la salida del registro son solo un bit.
Los registros de desplazamiento pueden tener entrada de datos en el bit de menor peso, de esta forma los bits a la salida se obtienen en el bit de mayor peso. Este tipo de desplazamiento, es un desplazamiento a la izquierda. Este desplazamiento se puede representar de la siguiente forma:
En la representación anterior, se inicializa las salidas Q en 0. Suponiendo que se ingresa por el bit de menor peso un uno, en el siguiente flanco de reloj, se desplaza hacia la izquierda todos los bits, obteniendo un desplazamiento por cada flanco de reloj.
La siguiente figura presenta un registro de desplazamiento hacia la izquierda
Por otro lado, los registros de desplazamiento pueden tener entrada de datos en el bit de mayor peso, de esta forma los bits a la salida se obtienen en el bit de menor peso. Este tipo de desplazamiento, es un desplazamiento a la derecha. Este desplazamiento se puede representar de la siguiente forma:
En la representación anterior, se inicializa las salidas Q en 0. Suponiendo que se ingresa por el bit de mayor peso un uno, en el siguiente flanco de reloj, se desplaza hacia la derecha todos los bits, obteniendo un desplazamiento por cada flanco de reloj.
La siguiente figura presenta un registro de desplazamiento hacia la derecha
Registros de Desplazamiento en Cascada
El registro 74194, contiene en su configuración diferentes posibilidades. Este registro, puede hacer carga en paralelo, desplazamiento a la derecha y desplazamiento a la izquierda. Este circuito además es apropiado para hacer conexiones en cascada, de esa forma, puede implementarse registro de más de 4 bits.
La siguiente figura muestra una implementación de un registro de 8 bits construido a base de registros 74194, los cuales son registros de 4 bits.
El termino síncrono indica que los eventos poseen una relación temporal fija entre ellos, es decir, que ocurren en el mismo instante de tiempo. Esto indica que en un contador síncrono los Flip-Flops siempre comparten la misma señal de reloj.
Contador Síncrono Binario de 2 bits
Para obtener un contador síncrono, se debe usar 2 Flip-Flops J-K. Como todo el reloj es común, no importa si es flanco de subida o bajada en los Flip-Flops, pero todos los Flip-Flops deben ser iguales. Entonces se debe conectar la señal de reloj a todos los Flip-Flops. Las entradas J y K del Flip-Flop cuya salida en Q0, es decir, J0 y K0 deben ir conectados a Vcc, esto va a permitir que esta salida siempre bascula. Luego se conecta Q0 a las entradas J1 y K1. La siguiente figura muestra la implementación del contador y los oscilogramas que dan como resultado de su funcionamiento.
En los oscilogramas, se puede apreciar mismo comportamiento que el contador síncrono de 2 bits, sin embargo, esta implementación tiene una mejora radical. Todos los Flip-Flops actúan en el mismo instante de tiempo, esto indica que el retardo de propagación de un estado a otro siempre es el mismo sin importar el estado en que se encuentre.
Contador Síncrono Binario de 4 bits
Para obtener un contador síncrono de 4 bits, se debe usar 4 Flip-Flops J-K. La implementación es igual que la anterior, es decir que el Flip-Flop cuya salida es Q2 tiene en sus entradas J2 y K2 una AND entre Q0 y Q1. La siguiente figura muestra la implementación del contador y los oscilogramas que dan como resultado de su funcionamiento.
En los oscilogramas, se puede apreciar mismo comportamiento que el contador síncrono de 4 bits, sin embargo, esta implementación tiene una mejora radical. Todos los Flip-Flops actúan en el mismo instante de tiempo, esto indica que el retardo de propagación de un estado a otro siempre es el mismo sin importar el estado en que se encuentre.
Contador Sincrono Ascendente Descendente
Un contador síncrono ascendente descendente, es aquel capaz de contar en una secuencia determinada en cualquier dirección. Suponiendo un contador binario de 3 bits, si es solo ascendente este contaría desde 0 a 7. Si se tiene un contador ascendente descendente, este contador puede contar de 0 a 7 y de 7 a 0, controlando la dirección por una entrada adicional.
En un contador síncrono, las entradas de J y K de cada Flip-Flop, depende de las salidas Q de los Flip-Flops anteriores produciendo un conteo ascendente. Para generar un conteo descendente, Las entradas J y K de cada Flip-Flop, deben depender de las salidas Q negado de los Flip-Flops.
Para diseñar un contador ascendente descendente binario de 3 bits, se debe tener en cuenta la siguiente tabla de secuencia.
CLK
A/D
Q2
Q1
Q0
↓
0
0
0
0
↓
0
0
0
1
↓
0
0
1
0
↓
0
0
1
1
↓
0
1
0
0
↓
0
1
0
1
↓
0
1
1
0
↓
0
1
1
1
↓
0
0
0
0
↓
1
0
0
0
↓
1
1
1
1
↓
1
1
1
0
↓
1
1
0
1
↓
1
1
0
0
↓
1
0
1
1
↓
1
0
1
0
↓
1
0
0
1
↓
1
0
0
0
↓
1
1
1
1
En esta tabla se puede apreciar que si la cuenta es ascendente, el estado siguiente de 1112 es 0002. Si la cuenta es descendente el estado siguiente de 0002 es 1112.
Con base en los conceptos anteriores, la implementación del contador se presenta en la siguiente figura.
En el oscilograma se observa que mientras la entrada A/D se encuentra en 0, el contador cuenta de forma ascendente y mientras la entrada A/D se encuentra en 1, el contador cuenta de forma descendente.
Una aplicacion interesante de este contador, es obtener una secuencia ascendente / descendente automatica, es decir, sin usar una entrada A/D manual. En este caso, se desea hacer la secuencia 0 a 7 a 0. Entonces, el contador debe identificar cuando el estado es 0002 y 1112. Cuando el contador llega al valor 1112 debe asegurar un 1 en la entrada A/D y cuando llega al valor 0002 debe asegurar un 0 la entrada A/D.
La siguiente figura presenta una posible solucion
En esta solucion, se coloca una compuerta NAND que tendra valor 0 cuando la entrada sea 0002 y otra compuerta NAND que tendra el valor 0 cuando la entrada sea 1112. Las salidas de estas compuertas NAND son colocadas en un nuevo Flip-Flop JK cuyas entradas J y K siempre estan en cero. Entonces, la salida de la compuerta que detecta el 1112 se conecta a la entrada asincrona PRESET y la salida de la compuerta que detecta el 0002 se conecta a la entrada asincrona CLEAR.
Esta solucion aunque es efectiva no es muy adecuada ya que se contamina el contador sincrono con un comportamiento basado de señales asincronas. Sin embargo, diseñar una solucion completamente sincrona, puede generar problemas en la secuencia debido a los tiempos de propagacion que toma el Flip-Flop.
Diseño de Contadores Sincronos
Basado en el concepto de contador síncrono, es posible elaborar diseños para obtener una secuencia determinada. Esta secuencia, puede llegar a ser incluso un a secuencia aleatoria.
Para realizar el diseño del contador, es necesario seguir una serie de pasos. Para explicar el proceso de diseño, se plantea un contador de código Gray.
Paso 1 de diseño de contador: Tabla de Secuencia
Es necesario determinar la tabla de secuencia. La tabla de secuencia debe especificar en estricto orden los estados que tendrá el contador. Hay que tener en cuenta que el siguiente estado del último será siempre el primero. Es necesario también tener en cuenta que un estado tendrá únicamente un siguiente estado. La tabla de secuencia también determina el número de bits del contador y a su vez determina el número de Flip-Flops necesarios para el contador. Por cada bit en la tabla de secuencia, se requiere un Flip-Flop en la implementación del contador. Para el caso del contador de código Gray se usara 4 bits que implica usar 4 Flip-Flops. La tabla de secuencia del contador de código Gray es la siguiente:
CLK
Q3
Q2
Q1
Q0
↓
0
0
0
0
↓
0
0
0
1
↓
0
0
1
1
↓
0
0
1
0
↓
0
1
1
0
↓
0
1
1
1
↓
0
1
0
1
↓
0
1
0
0
↓
1
1
0
0
↓
1
1
0
1
↓
1
1
1
1
↓
1
1
1
0
↓
1
0
1
0
↓
1
0
1
1
↓
1
0
0
1
↓
1
0
0
0
Paso 2 de diseño de contador: Tablas de transición de estados del Flip-Flop
Para la implementación del contador, es necesario escoger un tipo de Flip-Flop. Generalmente se elige Flip-Flop J-K gracias a sus 4 posibles estados. La tabla de transición de estados del Flip-Flop, determina que valores se requieren en las entradas J y K para obtener una transición de estado actual a un estado futuro. Un estado actual hace referencia al valor de la salida Q del Flip-Flop un instante antes de efectuar un flanco de reloj. Un estado futuro hace referencia al valor de la salida Q del Flip-Flop un instante despues de efectuar un flanco de reloj. Entonces la tabla de transición de estados del Flip-Flop J-K es la siguiente:
Transiciones de Salida
Entradas
Qt
Qt+1
J
K
0
0
0
X
0
1
1
X
1
0
X
1
1
1
X
0
La tabla anterior expone los siguientes casos:
Si el Flip-Flop tiene un estado presente Qt=0 y se desea obtener un estado futuro Qt+1=0 entonces se le debe proveer al Flip-Flop un estado de no cambio o un estado de reset. Esto indica que se le debe proveer un J=0, K=0 o J=0, K=1. Esto indica que necesariamente J debe ser 0 y K puede ser 0 o 1. Entonces se enuncia como J=0 y K=X.
Si el Flip-Flop tiene un estado presente Qt=0 y se desea obtener un estado futuro Qt+1=1 entonces se le debe proveer al Flip-Flop un estado de set o un estado de basculación. Esto indica que se le debe proveer un J=1, K=0 o J=1, K=1. Esto indica que necesariamente J debe ser 1 y K puede ser 0 o 1. Entonces se enuncia como J=1 y K=X.
Si el Flip-Flop tiene un estado presente Qt=1 y se desea obtener un estado futuro Qt+1=0 entonces se le debe proveer al Flip-Flop un estado de reset o un estado de basculacion. Esto indica que se le debe proveer un J=0, K=1 o J=1, K=1. Esto indica que necesariamente K debe ser 1 y J puede ser 0 o 1. Entonces se enuncia como J=X y K=1.
Si el Flip-Flop tiene un estado presente Qt=1 y se desea obtener un estado futuro Qt+1=1 entonces se le debe proveer al Flip-Flop un estado de no cambio o un estado de set. Esto indica que se le debe proveer un J=0, K=0 o J=1, K=0. Esto indica que necesariamente K debe ser 0 y J puede ser 0 o 1. Entonces se enuncia como J=X y K=0.
Paso 3 de diseño de contador: Mapas de Karnaugh
Los mapas de Karnaugh se usan para determinar la lógica requerida para las entradas J y K de cada Flip-Flop del contador. Se debe utilizar un mapa de Karnaugh para la entrada J y un mapa de Karnaugh para la entrada K. Cada celda del mapa de Karnaugh representa un estado de la tabla de secuencia establecida para el diseño. En cada celda del mapa de Karnaugh, se coloca el valor que requiere el Flip-Flop para obtener estado siguiente necesario. Por ejemplo: el primer estado de la tabla de secuencia es 00002 y el estado siguiente es 00012, entonces si se desea diseñar la salida Q0, se debe hacer una mapa de Karnaugh para J0 y un mapa de Karnaugh para K0. Para el mapa de Karnaugh de J0, se debe colocar en la celda que corresponde al valor 00002, lo que necesita J en un Flip-Flop J-K para que el estado futuro sea 1, dado un estado presente 0. Revisando la tabla de transición de estado del Flip-Flop J-K, se puede observar que el valor necesario es 1, entonces en la celda 0000 del Flip-Flop se coloca un 1. Se llena el mapa de Karnaugh en todas sus celdas. Se obtiene los siguientes mapas:
Paso 4 de diseño de contador: Expresiones Booleanas
Una vez se ha construido los mapas de Karnaugh, se hace la simplificación para obtener las expresiones Booleanas para J y K de cada Flip-Flop.
Paso 5 de diseño de contador: Implementación
Se implementa el contador con base en las expresiones Booleanas obtenidas en el paso anterior. La implementación se presenta en la siguiente figura.
En la implementación anterior, se ha implementado los resultados de los mapas de Karnaugh para cada una de las entradas del Flip-Flop. Los oscilogramas muestra la secuencia descrita en la tabla de secuencia.
Paso 6 de diseño de contador: Pruebas
Se puede probar el funcionamiento del contador con los oscilogramas, sin embargo la lectura de estos puede llegar a ser compleja. En la practica la forma mas adecuada de revisar el comportamiento del contador es usando un conversor binario – BCD, un decodificador manejador y dos displays que van a permitir visualizar los diferentes valores desde 0 hasta 15 decimal.
Contadores en Cascada
Los contadores en cascada son una implementación que permite conectar varios contadores para generar una secuencia de conteo de varios dígitos. Los contadores con los que se construye un contador en cascada, generalmente son contadores modulo 10, sin embargo, pueden ser de modulo menor. Adicionalmente, en un contador en cascada puede intervenir contadores de diferentes módulos. Un ejemplo puede ser un reloj digital. Para implementar un reloj digital, se requeriría un contador modulo 10 para las unidades de segundos, un contador modulo 6 para las decenas de segundos, un contador modulo 10 para las unidades de minutos, un contador modulo 6 para las decenas de minutos y un contador modulo 12 para las horas.
Para implementar un contador en cascada, es necesario partir de contadores previamente implementados preferiblemente síncronos. Para ello se puede hacer uso de diferentes circuitos integrados como el 74LS190.
Por ejemplo, se puede implementar un contador modulo 100 ascendente / descendente con base en dos contadores modulo 10. Para ello, entonces se utilizaría el contador 74LS190. Este contador tiene una salida que es RC (Riple clock), la cual se coloca en 0, cuando el valor del contador es el mayor y su cuenta es ascendente o cuando el valor del contador es el menor y su cuenta es descendente.
Entonces se podría obtener la secuencia deseada conectando los relojes de los dos contadores a un oscilador y la salida RC del contador del digito de menor peso o unidades a la entrada CE (chip enable) del contador del digito de mayor peso o decenas.
La implementación se presenta en la siguiente figura.