Codigo Hamming Ejercicios Resueltos

November 24, 2017 | Author: jorbur | Category: Bit, Logarithm, Logic Gate, Ascii, Error Detection And Correction
Share Embed Donate


Short Description

Download Codigo Hamming Ejercicios Resueltos...

Description

7: Tópicos Especiales

Este capítulo está dedicado tanto al estudio de ciertos temas selectos que ocurren con bastante frecuencia en las aplicaciones cotidianas de los circuitos lógicos como a ciertos temas cuya discusión había sido postpuesta mientras el lector se familiarizaba con el contenido de los capítulos anteriores. Dada la gran variedad de aplicaciones que encuentra la lógica digital en la práctica, es imposible cubrir todas ellas en una obra limitada como la presente. Posiblemente la aplicación más importante de esta rama de la electrónica sea la computadora digital. Un estudio a fondo sobre este tema queda fuera del alcance de este libro, aunque de cualquier manera se ha incluído información introductoria en los Suplementos puestos al final de esta obra. Se hace hincapié, sin embargo, en el hecho de que podemos construír una computadora digital usando los elementos estudiados en los capítulos anteriores. De cualquier manera, se deja el estudio de dicho tema a obras más especializadas. Idealmente, en lógica positiva, un "0" lógico equivale exactamente a cero volts, y un "1" lógico equivale exactamente al máximo nivel de voltaje proporcionado por la fuente de poder, y la transición de "0" a "1" ó de "1" a "0" se lleva a cabo de una manera instantánea. En la práctica, sin embargo, esto no es posible. Conforme las señales digitales van siendo procesadas y van pasando de un circuito a otro, ni el "0" lógico se puede mantener exactamente en cero volts, ni el "1" lógico alcanza a llegar hasta el máximo nivel de volta dado por la fuente de poder que alimenta al sistema. Esto se hace más notorio conforme la velocidad de las señales va aumentando y estas tienen que salir inclusive fuera de la computadora hacia un mundo hostil en donde las interferencias eléctricas y los ruidos generados por motores pesados o aparatos electrodomésticos degradan a la señal agregándole un componente de "ruido" que antes no tenía. Para que las señales digitales del mundo real puedan ser de utilidad, es necesario establecer límites arriba de los cuales un "0" lógico no puede ser considerado ya como tal y debajo de los cuales tampoco un "1" lógico puede ser considerado así. En la siguiente figura en donde podemos distinguir pulso digital, vemos definidas dos bandas amarillas dentro de las cuales el "0" se puede considerar como una señal útil y el "1" también puede ser considerado como una señal útil:

La región intermedia entre estas dos bandas, determinada por el tipo de electrónica que se esté utilizando, es considerada como la "tierra de nadie", y para evitar indefiniciones es necesario incorporar dentro del arsenal de funciones lógicas básicas componentes que sean capaces de "limpiar" una señal ruidosa extrayendo los verdaderos "unos" y los verdaderos "ceros" de todo el ruido circundante, componentes tales como el gatillo Schmitt que será explorado más a fondo en los problemas resueltos. Frecuentemente, quizá con demasiada frecuencia, al transmitir señales digitales de un punto a otro la señal de cualquier modo pese a los mecanismos compensadores usados para intentar distinguir claramente entre un "0" y un "1" fallan, y en vez de recibirse lo que debería ser un "0" se recibe erróneamente un "1", o en vez de recibirse lo que debería ser un "1" se recibe erróneamente un "0". Es por ello que, además de la electrónica correctora implementada por medio del hardware para tratar de reafirmar un "0" como un "0" y un "1" como un "1", se llevan a cabo procedimientos de detección de errores agregando información adicional a la señal digital. El mecanismo más frecuentemente utilizado para la detección de errores quizá lo sea la adición del bit de paridad. Esta técnica empezó a tener aplicaciones amplias al utilizarse el código ASCII para transmitir caracteres alfanuméricos de byte en byte. Como el código ASCII no utiliza más de 7 bits para la transmisión de cada caracter ASCII, se puede utilizar como bit adicional el octavo bit de cada byte que normalmente no se utilizaría, una información extra que se considera una redundancia pero que nos permite determinar si ocurrió un error durante el proceso de transmisión. Existen dos variantes del bit de paridad: el bit de paridad par y el bit de paridad impar. El bit de paridad par es puesto como "1" si la cantidad de "unos" en un conjunto dado de bits es impar, haciendo de este modo a la cantidad total de "unos" par. Y el bit de paridad impar es puesto en "1" si la cantidad de "unos" en un subconjunto dado de bits es par, haciendo de este modo al total de "unos" impar. Usando el bit de paridad par, si un caracter ASCII de siete bits que está siendo transmitido tiene un número impar de "unos" como en la palabra 1100001 que contiene tres "unos", entonces se le añade un bit de "1" adicional tranformando a la palabra en 11100001 para que el total de los "unos" en la palabra binaria sea par:

y si la palabra tiene un número par de "unos" entonces se le agrega un "0" para que el total de "unos" de la palabra siga siendo par, como en el caso de la palabra 01100011. De este modo, todos los bytes que están siendo enviados contendrán un número par de bits. Esta adición del "bit de paridad" se hace desde el punto de la transmisión de la señal (que puede ser de una computadora a otra a través de una red o inclusive dentro de la misma electrónica de cada computadora, como cuando se está enviando información del disco duro a la memoria RAM). Al ir llegando cada byte, lo primero que hace el sistema es checar la paridad del byte. Si el número de bits es par, entonces se sabe que la información llegó correctamente, pero si el número de bits es impar, entonces se sabe que ocurrió un error durante el proceso de transmisión del byte, y en tal caso el receptor le pidiría al transmisor envíar de nuevo esa palabra binaria o el paquete completo de palabras binarias dentro del cual está incluído el caracter que llegó erróneo. La detección de la paridad en el punto receptor se puede llevar a cabo de una manera extremadamente sencilla con un circuito construído a base de un bloque con el cual ya debemos estar familiarizados: el bloque OR-EXCLUSIVO. Por su Tabla de Verdad, sabemos que un OR-EXCLUSIVO de dos entradas A y B dá un "1" cuando ambas entradas son iguales, y dá un "0" cuando ambas entradas son diferentes. Pero ahora veremos al OR-EXCLUSIVO desde otra perspectiva. Cuando ambas dos entradas A y B son iguales, la salida del OR-EXCLUSIVO es "1", o sea cuando las dos entradas son ambas "0" ó cuando las dos entradas son ambas "1", o sea cuando la paridad de la palaba de entrada AB es par. El OREXCLUSIVO es capaz de detectar la paridad en una palabra de dos bits, o sea un número par de "unos" cuando hay "unos" en la palabra. ¿Podemos extender este concepto a una palabra binaria de tres bits? La respuesta es afirmativa, y para ello podemos seguir utilizando el mismo OR-EXCLUSIVO de la siguiente manera:

La construcción de la Tabla de Verdad para este circuito, que es la siguiente:

es extremadamente sencilla. Tomamos las entradas combinadas A y B cuando ambas solo están produciendo un "1" a la salida del OR-EXCLUSIVO del cual son entradas (o sea, cuando ambas A y B son iguales). Esta salida de "1" del OREXCLUSIVO de arriba es la entrada al OR-EXCLUSIVO de abajo. Y cuando ambas entradas al OR-EXCLUSIVO inferior son iguales, la salida del OREXCLUSIVO que es a su vez la salida del circuito será "1", y en caso contrario la salida será "0". Un efecto curioso es que este circuito, el cual tiene una cantidad impar de entradas (tres entradas: A, B y C), produce un "1" a su salida cuando la palabra binaria de entrada ABC es impar (o sea, cuando hay un número impar de "unos" a la entrada), y produce un "0" cuando la palabra binaria de entrada ABC es par. Contrástese esto con el funcionamiento del OREXCLUSIVO de dos entradas, cuyo comportamiento es el reverso de esto. Si queremos que se produzca un "1" cuando la paridad de la palabra de entrada sea par (como ocurre con el OR-EXCLUSIVO de dos entradas), todo lo que tenemos que hacer es agregar un inversor lógico NOT a la salida del circuito. Así como construímos el circuito anterior usando tres bloques OR-EXCLUSIVO, podemos construír otro circuito que incorpore cuatro bloques OR-EXCLUSIVO:

Empleando el mismo razonamiento que el que utilizamos arriba para construír la Tabla de Verdad para el circuito de 3 bits, encontramos que la Tabla de Verdad para el circuito con cuatro bloques OR-EXCLUSIVO es la siguiente:

En este caso, con una cantidad par de entradas, encontramos que el circuito produce un "1" cuando la palabra binaria de entrada ABC es impar, y produce un "0" cuando la palabra binaria de entrada ABC es par. Este circuito recibe el nombre de árbol de paridad. Podemos extender el mismo concepto con toda facilidad para construír un árbol de paridad de seis bits, o de ocho bits como el árbol de paridad que se muestra a continuación, al cual le hemos dado una salida convencional X y el inverso de la salida, X, con el fin de utilizar la salida "par" como productora de una señal que podemos interpretar y usar en un diseño simplemente como PAR y la salida impar como

productora de una señal que podamos interpretar y usar en un diseño simplemente como IMPAR:

Como una cortesía de la Universidad de Hamburgo en Alemania, se encuentra disponible en Internet en el siguiente domicilio un árbol de paridad de ocho bits completamente interactivo, en el que haciendo "clic" con el mouse podemos ir "encendiendo" o "apagando" cada una de las entradas en los puntos marcados como d0, d1, d2, d3, etc.: http://tams-www.informatik.uni-hamburg.de/applets/hades _______/webdemos/10-gates/12-parity/parity8.html Para que la demostración intercativa pueda funcionar, es necesario que la computadora en la cual se corra la simulación tenga instalada la plataforma Java (la cual se puede descargar sin costo alguno de Internet). En esta simulación, podemos comprobar cómo al ir encendiendo alternadamente una cantidad par o impar de "unos" en las entradas la salida del árbol en la terminal "o" se va "apagando" (esto lo tomamos como indicativo de un "0") o se va "encendiendo" (esto lo tomamos como indicativo de un "1") dependiendo en que el total de las entradas "encendidas" sea una cantidad impar o par (podemos invertir el sentido de la paridad en este árbol de paridad simulado con sólo "activar" la entrada en el extremo inferior izquierdo que dice "odd"). Con la misma facilidad con la cual se construye un árbol de paridad de ocho bits podemos, si queremos, construír un árbol de paridad de doce bits. Pero en este último caso, podemos ahorrarnos una buena cantidad de tiempo y esfuerzo adquiriendo comercialmente algún circuito integrado cuya función sea precisamente la misma que la de un árbol de paridad, un circuito integrado como el 4531, el cual es un árbol de paridad de 12 bits:

Este circuito integrado trabaja de la manera siguiente: Las entradas al circuito son puestas desde la terminal identificada como Input 0 hasta la terminal identificada como Input 11. En operación normal, la terminal "pin" 10 (Odd/Even Select) tiene puesto un "0". Si una cantidad par de entradas está en el estado de paridad "cero" el circuito pone un "0" en la terminal de salida identificada como Output (terminal "pin" 9), y si un número impar de entradas están en el estado de paridad "cero" entonces el circuito pone un "1" en la terminal de salida Output. Poniendo un "1" en la terminal 10 invierte el sentido de la salida Output. En general, el árbol de paridad puede ser utilizado de dos maneras: para generar el "bit" de paridad en la palabra que será transmitida, y para detectar la paridad de la palabra recibida. Otra técnica que ha sido ampliamente utilizada para la detección de errores es la técnica del chequeo-de-suma (sumcheck). Esta consiste en generar un número checksum, que es enviado junto con un "paquete" de datos, a partir de los mismos datos. Al recibirse el "paquete" de datos, el número checksum puede ser generado nuevamente por el receptor sumando los números que corresponden al paquete recibido, y comparado con el número checksum enviado. Si los dos checksum resultan ser diferentes, entonces se sabrá que hubo un error. Con una ligera variante, podemos hacer un poco más eficiente el proceso en la forma que se describirá a continuación. Supóngase que vamos a enviar cuatro palabras: la palabra 00100101 (equivalente al número hexadecimal 25h), la palabra 01100010 (equivalente al número 62h), la palabra 00111111 (equivalente al número 3Fh) y la palabra 01010010 (equivalente al número 52h), junto con su checksum. El primer paso consiste en sumar (en suma binaria) las cuatro palabras como si fueran números (pueden serlo, pero también podrían ser caracteres alfabéticos ASCII). Esto dará como resultado una palabra de nueve bits en vez de ocho, la palabra 100011000 (cuyo equivalente hexadecimal es 118h). El siguiente paso consiste en ignorar el bit excedente resultante de la operación aritmética de "llevar", lo cual nos deja con la palabra 00011000 (cuyo equivalente hexadecimal es 18h).

El tercer paso consiste en obtener el 2-complemento (véase el Capítulo 3: El álgebra Boleana) de la palabra obtenida, el cual resulta ser 11101000 (cuyo equivalente hexadecimal es E8). Este es el byte del chequeo-de-suma que es enviado hacia afuera junto con los datos. El receptor todo lo que tiene que hacer de su lado es sumar el checksum recibido a la suma total que obtenga del grupo recibido de cuatro bytes, sabiendo que el resultado debe ser siempre cero (recuérdese que la suma de un número al número 2-complemento derivado de ella es cero). En este caso, si sumamos 11101000 a 100011000 (la palabra de nueve bits resultante de la suma de los cuatro bytes), obtenemos 1000000000, o sea el número hexadecimal 200h, y como en el procedimiento ignoramos los bits generados por la operación aritmética de "llevar", ignoramos los dos bits "10", lo cual nos deja con la palabra 00000000, lo cual nos indica que hubo una generación de cero errores. Otra técnica potente muy utilizada para la detección de errores es el chequeo de redundancia cíclica (Cyclic Redundancy Check ó CRC). Su modo de empleo se muestra a continuación (ampliar imagen):

Como lo muestra el diagrama, el proceso comienza con la palabra binaria a3a2a1a0 que va a ser transmitida. Se toma la palabra binaria que en este caso es de cuatro bits y se le añaden tres ceros. Hecho esto, se lleva a cabo un proceso de división binaria entre esta palabra y un divisor de cuatro bits identificado como d3d2d1d0 (tanto el transmisor como el receptor deben tener disponible en todo momento el mismo valor binario para el divisor d3d2d1d0). El resultado de este proceso aritmético se lleva a cabo en un "generador" (el cual puede ser un circuito lógico especializado o un secuenciador programable capaz de poder llevar a cabo el proceso de división), en el cual después de haberse llevado a cabo la división binaria se produce el residuo resultante de la división, identificado como r3r2r1r0, el cual es frecuentemente conocido como el CRC. Este residuo (CRC) es anexado a la palabra-dato original a3a2a1a0 formando la palabra-código a3a2a1a0r3r2r1r0. Esta palabra de siete bits es la palabra que es enviada por el "transmisor" mediante un canal de comunicaciones poco fiable, el cual puede ser una línea telefónica ruidosa. La palabra que llega al "receptor" es la palabra código de siete bits b3b2b1b0q2q1q0. Si el canal de comunicaciones fuera altamente confiable y no hubiera ocurrido ningún error durante el proceso

de transmisión, la palabra código recibida b3b2b1b0q2q1q0 sería idéntica en todo respecto a la palabra código enviada a3a2a1a0r3r2r1r0. Una vez recibida la palabra código, el receptor utilizando como punto de referencia el mismo divisor d3d2d1d0 lleva a cabo el mismo proceso aritmético de división (dividiendo el mensaje entre el divisor d3d2d1d0) en un bloque "checador" obteniendo una palabra "síndrome" de tres bits s2s1s0. Si la palabra síndrome resulta estar constituída de puros "ceros", ello significa que no hubo error alguno durante el proceso de transmisión de la palabra, con lo cual se abre una compuerta dejando pasar los bits b3b2b1b0 aceptándolos como la palabra-dato original a3a2a1a0. Pero si la palabra síndrome tiene un valor diferente de cero binario, entonces la compuerta no se abrirá y por el contrario será descartada como defectuosa. Como ya se dijo, esta técnica se puede implementar con electrónica digital, con circuitos usando funciones lógicas básicas y flip-flops, como lo muestra la siguiente "tabla de secuencias" representativa del comportamiento de una "máquina CRC":

En esta "máquina" que esencialmente está hecha a base de un registro de desplazamiento del tipo entrada serial y salida serial de 5 bits (usando cinco flip-flops) con los bits desplazándose dentro de ella de derecha a izquierda en cada "pulso de reloj", se utiliza como generador del CRC la palabra binaria "1011" para obtener el CRC a partir de la palabra-dato o "mensaje" a ser transmitido que en este caso es "01100111". En la implementación de la máquina, puesto que se van a estar llevando a cabo operaciones aritméticas en el sistema binario (base-2), será inevitable en cualquier diseño de este tipo de máquina la inclusión de una función lógica que encontramos previamente tanto en la construcción del Medio-Sumador como del Medio-Substractor: el bloque

OR-EXCLUSIVO o XOR. Desde el punto de vista de la máquina (del lado del transmisor), el procesamiento se lleva a cabo bit por bit, resultando en una serie de dígitos binarios (los bits del CRC) que serán anexados posteriormente al mensaje original. El proceso comienza con todos los flip-flops de la máquina puestos en "ceros", tras lo cual el mensaje va siendo desplazado hacia la izquierda siendo introducido bit por bit dentro del registro de desplazamiento (esto está simbolizado con una letra "M" que tiene anexada una flecha a la misma apuntando hacia la izquierda) seguido de cuatro ceros (simbolizado cada uno de ellos con un número "0" también con una flecha anexada apuntando hacia la izquierda), de modo tal que entra el mensaje seguido de cuatro ceros. Obsérvese que cuando el bit más significativo (el bit más a la izquierda) es "1" (esta es la situación que tenemos en el séptimo renglón de la tabla de secuencias, con el "1" de color rojo sobre un fondo negro) se lleva a cabo entonces la operación de OREXCLUSIVO con el "generador" que en este ejemplo es la palabra "10011". Esto se repite cada vez que el bit más significativo es "1", lo cual ocurre tres veces (en el séptimo, en el noveno y en el 13avo renglón). Los cuatro bits de orden más bajo, resultado final del proceso de división aritmética en el sistema binario (base-2), son entonces el CRC que será anexado a la palabra-dato original justo antes de llevarse a cabo la transmisión del mensaje, el cual en este caso es "0110" (en el renglón inferior de la tabla de secuencias) descartando el "0" que está en la posición del bit más significativo. Para este proceso hemos supuesto que el generador es una palabra no de cuatro bits sino de cinco; sin embargo el bit más significativo en el generador no es realmente de interés y por lo tanto no se le toma en cuenta, porque en primer lugar el bit más significativo en el generador siempre es "1", y cuando el bit más significativo (más a la izquierda) dentro del registro se vuelve "1", el generador es sometido a una operación de OR-EXCLUSIVO contra los contenidos del registro, "limpiando" el bit más significativo. Por lo tanto, el bit más significativo no necesita ser transmitido. También la palabra código resultante (la palabra-dato más la secuencia CRC), al pasar por el "hardware" CRC, deja "limpio" el registro. Esto se puede visualizar mejor alimentando la secuencia "01101110110" (consistente en la palabra-dato "0110111" con el CRC "0110" anexado) adentro del registro de transferencia siguiendo las reglas indicadas. El contenido del registro terminará siendo "cero" al final. Puesto que a las velocidades actuales de procesamiento que actualmente andan arriba del orden de 1 Gigabit por segundo es muy difícil diseñar circuitos lógicos CRC que puedan hacer todas sus operaciones a esta velocidad, los ingenieros frecuentemente diseñan los circuitos CRC para procesar varios bits a la vez. Para que el chequeo de redundancia cíclica pueda trabajar, matemáticamente hablando, es necesario que la palabra que va a ser transmitida sea considerada en nuestros análisis como un polinomio. A modo de ejemplo, para el siguiente dato binario de 16 bits a ser transmitido: 0010 0110 1111 0000 (26F0h, hexadecimal) el polinomio formado directamente a partir de cada uno de los bits es el

siguiente (obsérvese la correspondencia entre cada uno de los bits de la palabra y cada uno de los coeficientes "unos" y "ceros" del polinomio): M(X) = 0 + 0X1 + 1X2 + 0X3 + 0X4 + 1X5 + 1X6 + 0X7 + 1X8 + 1X9 + 1X10 + 1X11 + 0X12 + 0X13 + 0X14 + 0X15 lo cual, ignorando los términos en los que los coeficientes son "ceros", se reduce a: M(X) = 1X2 + 1X5 + 1X6 + 1X8 + 1X9 + 1X10 + 1X11 Tras esto, y tomando n como la cantidad de bits de que está formada la palabra que será transmitida (n=16 en este ejemplo) se lleva a cabo un proceso de división entre este polinomio M(X) y un polinomio generador G(X) que tiene propiedades especiales: M(X)Xn/G(X) = Q(X) + R(X) en donde Q(X) es el cociente de la división y R(X) es el residuo resultante de la misma. Es precisamente este residuo binario R(X) lo que es anexado a la palabra-dato que será transmitida. A continuación tenemos detallado el proceso de división para el ejemplo que estamos utilizando, en donde nuestro polinomio generador G(X) es un polinomio utilizado con mucha frecuencia, el polinomio G(X)=X16+X15+X2+1 (ampliar imagen):

En el receptor,después del cálculo CRC de su lado, el residuo R(X) debe ser cero para que la palabra pueda ser considerada como transmitida sin error alguno. Una cosa que hay que tener presente es que, al nivel de la máquina digital, la cual trabaja en el sistema binario, no es necesario proporcionarle a la máquina una "calculadora" para que pueda llevar a cabo el proceso de división binaria; ya al igual que en el caso de la multiplicación binaria, la cual se puede llevar a cabo con un registro de transferencia serial y simples adiciones, la división binaria se puede llevar a cabo también con un registro de transferencia serial y simples substracciones. No hay que olvidar que este proceso, que a nosotros nos puede parecer muy laborioso, al final del día no será llevado a cabo por nosotros sino

por la misma máquina en donde esté instalado ya sea el productor (en el transmisor) o el verificador (en el receptor) de la redundancia cíclica. Sin embargo, considerando que en un proceso de transmisión de datos de un archivo sumamente grande (con un tamaño en el orden de los megabytes) estos procesos aritméticos repetidos una y otra vez miles y miles de veces invariablemente tendrán un impacto en la disminución de la velocidad de la transmisión de los datos, esto ciertamente tiene que ser considerado como un factor en cualquier diseño que tenga que ver con las áreas de aplicación de la técnica CRC. A continuación se muestra un cálculo simplificado, muy a la manera de como los matemáticos efectúan el proceso algebraico de división sintética, prescindiendo de las "equis" (que en realidad sólo están haciendo "bulto" aquí), en donde el polinomio M(X) es obtenido de la palabra 11100110 y en donde el polinomio generador G(X) es el que está dado por la palabra 11001, obteniéndose el residuo 0110 que es lo que será anexado a la palabra-dato original a ser enviada (ampliar imagen):

Además de la capacidad para poder detectar errores (error detection), es posible darle a los circuitos lógicos también la capacidad para poder corregir errores (error correction). Esto requiere, desde luego, agregar información redundante adicional a una palabra que permita localizar la posición exacta del bit que está produciendo un error de paridad, ya que el error de paridad por sí solo en una palabra no nos indica cuál de todos los bits es el bit incorrecto. Un esquema utilizado en algunos diseños consiste en tomar varias palabras binarias "en bloque", digamos unas ocho palabras, de modo tal de que además de que cada palabra (representada por un renglón) tenga un bit de paridad, al final de cada bloque de ocho palabras haya una palabra completa "extra" redundante, la

cual consistirá de ocho bits de paridad, uno para cada columna. De esta manera, si en lugar de un "1" tenemos un "0" en una palabra, además de la paridad incorrecta que nos permite identificar cuál de las ocho palabras viene con un error tenemos la paridad incorrecta del bloque que nos permite identificar cuál bit de esas ocho palabras es el que está en el error. Seleccionando una paridad impar como denotando una palabra correcta sin errores y también como denotando una bloque completo de palabras correcto sin errores, a continuación tenemos un bloque que carece errores en la transmisión y en la recepción (cada renglón representa una palabra binaria diferente):

Puesto que todas las palabras binarias del bloque tienen la paridad correcta (impar), no hay errores en la transmisión de este bloque. En cambio, en el siguiente bloque, tenemos una palabra con tres errores:

En este caso, la penúltima palabra (en el penúltimo renglón) viene con tres errores. Su paridad par nos dice que tiene por lo menos un error. Además, la

paridad en las columnas nos permite detectar la presencia de tres errores en la palabra e identificar la localización precisa de los tres bits erróneos: están en el cuarto, el quinto, y el séptimo bit de la penúltima palabra binaria. La localización exacta de un bit erróneo nos permite diseñar una máquina que sea capaz no sólo de detectar estos tres errores sino también corregirlos. Y aunque a nosotros como humanos el proceso nos pueda parecer dificultoso, es relativamente fácil enseñarle a una máquina a corregir este tipo de errores, lo cual haría con rapidez electrónica. Existen procedimientos matemáticos muy específicos para agregar bits redundantes que permitan no sólo la detección de errores sino la corrección de los mismos, conocidos como códigos correctores de errores (error correcting codes ó ECC). Uno de ellos es el código Hamming. Considérese una palabra binaria consistente de únicamente cuatro bits de datos que será transmitida como una palabracódigo (codeword) con la adición de tres bits de control de error. Esto sería llamado un código (7,4). Los tres bits agregados son tres bits de paridad par, en donde la paridad de cada uno es calculada en distintos subconjuntos del mensaje de la manera que se muestra abajo:

La razón teórica para este tipo de arreglo es que los tres bits de paridad (1,2,4) están relacionados con los cuatro bits de datos (3,5,6,7) de la manera que se muestra a continuación:

En este diagrama cada círculo corresponde a un bit de paridad, y define los cuatro bits que contribuyen al cálculo del bit de paridad. Por ejemplo, el bit de datos 3 contribuye a los bits de paridad 1 y 2. Cada círculo (bit de paridad) abarca un total de cuatro bits (tres bits de datos y un bit de paridad), y cada círculo por lo tanto debe tener una paridad par. Dados cuatro bits de datos cualesquiera en cualquier combinación de "unos" y "ceros", los tres bits de paridad pueden ser seleccionados fácilmente para cumplir con esta condición, y como de costumbre le dejaremos la carga de este trabajo a la máquina. Se puede observar en el diagrama que cambiando cualesquier bit numerado del 1 al 7 afecta de modo único los tres bits de paridad. Alterando el bit 7 afecta todos los tres bits de paridad, mientras que un error en el bit 6 afecta únicamente a los bits de paridad 2 y4, mientras que un error en un bit de paridad (lo cual también puede ocurrir durante el proceso de transmisión) afecta únicamente a ese bit de paridad. La localización de cualquier error individual en un bit está determinada unívocamente después de checarse los tres círculos de paridad. Con este esquema de detección y corrección de errores, la palabra binaria (datos) "1101" sería enviada como la palabra-código "1100110" con la adición de los tres bits de paridad, puesto que:

Cuando estos siete "unos" y "ceros" son introducidos en los círculos de paridad, se puede confirmar que la selección de los tres bits de paridad asegurará que la paridad dentro de cada círculo será par, como se muestra aquí:

Se puede observar aquí que si ocurre un error en cualesquiera de los siete bits, ese error afectará distintas combinaciones de los tres bits de paridad dependiendo de la posición del bit que llega con error. Supóngase por ejemplo que se envía el mensaje "1100110" y que ocurre un error en un solo bit tal que se recibe la palabra-código "1110110":

El error en el mensaje, en el bit 5, puede ser corregido examinando cuáles de los tres bits de paridad fueron afectados por el bit defectuoso:

En el segundo renglón en el cual se utiliza el bit de paridad 1 y el cual tiene un valor de un "0", la cantidad total de "unos" es un número impar, 3, lo cual indica que ha ocurrido un error de acuerdo con el criterio de que bajo la paridad par si se produce un "1" en lugar de un "0" ello apunta hacia la presencia de un

error. En el tercer renglón, en el cual se utiliza el bit de paridad 2 y el cual tiene un valor de un "1", la cantidad total de "unos" es un número par, 4, lo cual indica que aquí no hay indicación de error alguno según el criterio de que bajo la paridad par se debe producir un "0" como consecuencia de un número par de "unos". Y en el cuarto renglón, en el cual se utiliza el bit de paridad 4 y el cual tiene un valor de "0", la cantidad total de "unos" es un número impar, 3, lo cual indica que ha ocurrido un error. Los bits de paridad así como la palabra código original permiten determinar la posición del "bit" que llegó defectuoso, o sea el bit 5 que llegó como un "1" en vez de haber llegado como el "0" que debía haber sido. El examen de los círculos de paridad confirma que cualquier bit defectuoso puede ser corregido de esta manera. El código Hamming tiene pues las siguientes características (1) La capacidad para detectar en una palabra transmitida dos bits en el error, lo cual supone que no se intentará llevar a cabo una corrección del error, (2) La corrección de bits individuales de error, o sea un error de un bit en una palabra transmitida, y (3) Un costo de tres bits que se tienen que añadir a un mensaje de 4 bits. Esto último puede parecer oneroso. Sin embargo, la capacidad para poder corregir errores viene a un costo que es menor que el tener que enviar de nuevo el mensaje completo, y tómese en cuenta que el envío del mensaje por partida doble no logra ninguna corrección de error. Al hablar sobre el tema de la detección y corrección de errores, es frecuente manejar el concepto de la distancia entre dos palabras binarias. Aunque a este concepto casi siempre se le dá en los libros de texto una definición formal que también casi siempre resulta críptica, aquí daremos una definición naïve del concepto: es simplemente la cantidad de bits que tienen que ser cambiados para igualar una palabra binaria con otra. Así, la distancia entre las palabras 10011000 y 00011000 es 1 porque basta con cambiar el primer bit de cualquiera de las dos palabras para igualar una con otra. Entre más "alejada" esté una palabra binaria de la otra, tanto mayor será la cantidad de bits que tengamos que cambiar para igualar una de ellas con la otra. El código Hamming permite la corrección de errores porque la distancia mínima entre dos palabras código es 3. En la figura de abajo, dos palabras código en ocho posibles palabras código de tres bits están acomodadas para tener una distancia de 3 entre ellas. Se requieren tres cambios de bits (errores) para moverse de una palabra código 000 válida a los siguientes 111. Si la palabra código 000 es transmitida y ocurre un error en un bit, la palabra recibida necesariamente será una del conjunto {001, 010, 100}, cualquiera de las cuales puede ser identificada fácilmente como una palabra código inválida, y la cual podría haber sido únicamente la palabra código 000 antes de la transmisión.

El código Hamming define esencialmente 16 palabras código válidas dentro de todas las 128 palabras código posibles de 7 bits. Estas 16 palabras están acomodadas de modo tal que la distancia mínima entre dos palabras cualesquiera sea 3. Estas palabras código son mostradas en la siguiente tabla:

Se puede verificar que la distancia de cualquier palabra código M={0,1,2,...,E,F} de esta tabla a cualquier otra palabra código N es de por lo menos 3. A continuación tenemos unos ejemplos en donde medimos la distancia de la palabra código 3 hacia otras palabras código para confirmar esta aseveración:

La distancia es 4 entre 3 = 0011110 y 0 = 0000000 La distancia es 3 entre 3 = 0011110 y 1 = 0000111 La distancia es 3 entre 3 = 0011110 y 2 = 0011001 La distancia es 4 entre 3 = 0011110 y D = 1100110 La distancia es 4 entre 3 = 0011110 y E = 1111000 La distancia es 3 entre 3 = 0011110 y F = 1111111 Continuando con el chequeo de la distancia entre la palabra código 3 y todas las demás palabras código restantes, podemos concluír que la palabra código 3 está situada a una distancia de por lo menos 3 de todas las demás palabras código. Con la misma facilidad con la que construímos el código (7,4) podemos construír otros códigos Hamming, por ejemplo el código (8,4). Con un poco de análisis matemático podemos obtener una fórmula que nos indica en forma precisa cuántos bits redundantes adicionales se requieren para garantizar la detección y corrección de un error con el código Hamming. La fórmula es Ham(2n, 2n-n-1). Por ejemplo, si n=7, tenemos entonces Ham(128,120), lo cual nos dice que para cada 120 bits de datos únicamente se requieren ocho bits extra redundantes para protegernos en contra de un error dándonos la capacidad no sólo para poder detectarlo sino también para poder corregirlo. Y cuando n=20, entonces obtenemos Ham(1048576,1048555), lo cual nos dice que se requieren únicamente 21 bits para codificar más de un millón de bits y aún garantizarnos una protección en contra de un error. Como una cortesía de la Universidad de Hamburgo en Alemania, se encuentra disponible en Internet en el siguiente domicilio un programa interactivo que permite al estudiante el poder "experimentar" con un envío y recepción de un mensaje binario utilizando la adición de bits de paridad y el código Hamming para poder detectar la presencia de errores así como la determinación del bit defectuoso. El programa interactivo puede ser accesado en el siguiente domicilio: http://tams-www.informatik.uni-hamburg.de/applets/hades _______/webdemos/10-gates/50-hamming/hamming.html Esta simulación trabaja con un circuito que utiliza un código Hamming de 4 bits para detección y corrección de errores. Los cuatro interruptores a la izquierda se utilizan para fijar el valor de 4 bits para el codificador, el cual calcula el valor requerido por cada uno de los tres bits de paridad que serán transmitidos junto con los cuatro bits de datos como una palabra código. Los siete interruptores (Set channel faults) y las compuertas OR-EXCLUSIVO en la parte media del circuito permiten introducir manualmente "fallas" en el mensaje transmitido. Si todos los interruptores están "apagados", el mensaje es transmitido en forma normal, pero si se "enciende" uno de los interruptores entonces la compuerta OR-EXCLUSIVO asociada al interruptor invierte el bit del dato correspondiente (conviertiendo un "0" en un "1" ó un "1" en un "0"), lo cual equivale a que ese bit haya sido transmitido como error. El bloque decodificador a la derecha del circuito toma los siete bits del mensaje e intenta reconstruír con los siete bits la información original, o sea los cuatro bits del mensaje original. Los creadores del programa interactivo recomiendan tener todos los siete interruptores "apagados" experimentando con el envío de algunos mensajes; seleccionando

algunos valores de entrada para el codificador con los interruptores a la izquierda para así poder observar los bits de paridad que se generan así como el modo de funcionamiento del decodificador. Tras esto, recomiendan "jugar" con algunos de los interruptores para introducir manualmente "fallas" individuales en el mensaje transmitido, observando la operación del decodificador. Y finalmente, invitan al experimentador a descubrir qué es lo que ocurre cuando se activa más de un "interruptor generador de error". Si queremos aligerar nuestra carga de trabajo en el diseño de un circuito que tenga no sólo la capacidad para poder detectar errores sino también para corregirlos, en tal caso podemos recurrir a un circuito integrado como el 74LS636 que recurre a la paridad para la corrección de errores relacionados con los circuitos integrados usados en la memoria RAM de las computadoras caseras:

Este circuito integrado trabaja almacenando cinco bits de paridad con cada byte de datos, los cuales pueden ser puestos y sacados del circuito integrado a través de las terminales de data byte DB0 a la DB7. Los cinco bits de chequeo de paridad están puestos en las terminales de check bit CB0 a la CB4. El circuito integrado incorpora dos terminales de control (S0 y S1) y dos salidas para notificar la presencia de un error (en la terminal Single Error Flag o SEF) o de dos errores (en la terminal Double Error Flag o DEF). Además del método Hamming, existen otras técnicas para la detección y corrección de errores, tales como el código BCH, el código Reed-Solomon, el código Reed-Muller, el uso de los algoritmos de "picadillo" hash, y muchas otras, cada una con sus propias ventajas y desventajas. En torno a todo esto, existe un teorema muy importante, conocido como el teorema fundamental de la teoría de la informática y también como el teorema de Shannon (en honor a su descubridor Claude Shannon, el mismo que descubrió la relación entre el álgebra Boleana y el comportamiento de los circuitos digitales electrónicos) que nos dice que es posible enviar información digital de un punto a otro prácticamente libre de errores hasta cierto límite máximo a través de un canal de comunicación sin importar qué tan contamido pueda estar el canal con ruido circundante. Para quienes deseen tener una alguna idea así sea remota sobre los procedimientos matemáticos involucrados en la demostración de este teorema, se les recomienda consultar la Wikipedia

bajo el encabezado "Noisy-channel coding theorem", accesible en el siguiente domicilio: http://en.wikipedia.org/wiki/Shannon%27s_theorem Una de las consecuencias directas de este teorema es el teorema de Shannon-Hartley que nos dice que la capacidad de un canal de comunicaciones cualquiera (con esto nos estamos refiriendo al límite teórico máximo de la rapidez de datos digitales "limpios" que pueden ser enviados por dicho canal) con una señal con una potencia promedio S viajando a través de un canal de comunicaciones analógico (como lo es el caso del cable telefónico o el cable coaxial), sujeto a la adición de un ruido "blanco" Gaussiano de potencia N está dada por la fórmula: C = Blog2(1 + S/N) en donde: C es la capacidad del canal en bits por segundo. B es el "ancho de banda" (bandwith del canal en ciclos por segundo (Hertz). S es la potencia total de la señal a lo largo del ancho de banda, medida en watts. N es la potencia total del ruido a lo largo del ancho de banda, medida en watts. S/N es la razón de la potencia de la señal a la potencia del ruido (Signal to Noise Ratio ó SNR) expresada como un número directo (no en decibeles). Obsérvese que en esta fórmula aparece el logaritmo en sistema binario o sistema base-2, lo cual podrá parecer novedoso para muchos acostumbrados al uso de los logaritmos decimales (logaritmos base-10) o a los logaritmos naturales cuya base es el número e, y ciertamente desconcertante porque las calculadoras científicas de bolsillo no manejan esta clase de logaritmos. Hay que enfatizar que la aparición del logaritmo base-2 es una consecuencia directa de los pasos requeridos para la demostración del teorema, y de hecho aparece también en muchas otras fórmulas que tienen que ver con el diseño de sistemas digitales. De cualquiera manera, para poder obtener el logaritmo de un número en la base 2 no es necesario adquirir una calculadora especial, todo lo que hay que hacer es recordar que el logaritmo de un número en cierta base n es el exponente al cual hay que elevar la base para obtener el número dado. Esto significa que si x es el logaritmo de un número n en la base 2, entonces : 2x=n Tomando logaritmos decimales en ambos lados: log(2x) = log(n) y usando las propiedades de los logaritmos: xlog(2) = log(n) x = log(n)/log(2) Entonces, dado un número n cualquiera, podemos obtener su logaritmo en

sistema base 2 con el simple hecho de tomar el logaritmo decimal del número y divirlo entre el logaritmo decimal de 2. De cualquier modo, existen disponibles en Internet calculadoras que pueden calcular el logaritmo de un número en cualquier base, como: http://www.1728.com/logrithm.htm Las implicaciones de la fórmula fundamental del teorema Shannon-Hartley las podemos ver con dos ejemplos. El primer ejemplo es aplicable a una línea de comunicaciones telefónicas, en donde la razón S/N es típicamente por lo menos de unos 20 decibeles (con esto queremos decir que la potencia de la señal es unas 100 veces mayor que la potencia del ruido eléctrico circundante) y en donde el ancho de banda que va desde los 33 ciclos por segundos hasta los 3,300 ciclos por segundo (desde los sonidos más bajos o graves hasta los sonidos más agudos que se pueden enviar por la línea telefónica) es de 3000 ciclos por segundo. La aplicación de la fórmula nos dá en este caso: C = (3000)log2(1 + 100) C = (3000)log2(101) C = (3000)(6.658) C = 19,973 bits/segundo En el segundo ejemplo, queremos transmitir una señal por un canal a una rapidez de 50 mil bits por segundo, con un ancho de banda de 1 Megahertz (un millón de ciclos por segundo). En tal caso,de la fórmula: C = Blog2(1 + S/N) llevamos a cabo un despeje para obtener S/N: log2(1 + S/N) = C/B Usando la definición de logaritmo para una base dada que en este caso es 2: S/N + 1 = 2C/B S/N = 2C/B - 1 S/N = 2(50,000/1,000,000) - 1 S/N = 0.035 ó -14.5 decibeles Este segundo ejemplo demuestra que es posible transmitir señales digitales que inclusive son mucho más débiles que el ruido eléctrico circundante, y aún así poder recuperar la señal inmersa entre tanto ruido, lo cual tal vez puede parecer sorprendente a muchos.

En capítulos anteriores, hablamos sobre cómo la respuesta de cualquier función lógica implementada con componentes reales no es instantánea, siempre hay un retardo de propagación introducido por todo componente lógico, como lo ilustran los siguientes dibujos en los cuales el pulso inferior que es aplicado a un flip-flop R-S produce una respuesta en su salida ilustrada en la parte superior que no ocurre instantáneamente:

Además de este retardo de tiempo inherente a toda función lógica, obra el hecho de que un pulso aplicado a un circuito no sube instantáneamente de "0" a "1", siempre hay un retardo conocido en la literatura técnica como el tiempo de ascenso (rise time), del mismo modo que cuando el pulso cae de "1" a "0" tampoco lo hace instantáneamente, siempre hay un retardo de tiempo conocido en este caso como tiempo de caída (fall time). Debemos formalizar de manera más precisa lo que queremos decir con estos dos términos. Por convención, el tiempo de ascenso se define como el tiempo que tarda una señal en ascender del 10 por ciento del valor del voltaje de la fuente de poder al 90 por ciento de dicho valor. Esto está mejor esquematizado en el siguiente diagrama:

Estos diagramas muestran la aplicación de un pulso de entrada a un NAND

conectado para que funcione como un simple inversor lógico, en donde en el diagrama superior muestra un pulso de entrada Vi ascendiendo de un nivel de "0" (voltage input low ó Vil) a un nivel de "1" (voltage input high ó Vih), produciendo una respuesta retardada en la salida Vo cuando dicha respuesta retardada cae de un nivel de "1" (voltage output high ó Voh) a un nivel de "0" (voltage output low ó Vol). En el diagrama mostrado, el tiempo de caída thl (fall time high to low) indica el lapso de tiempo que transcurre cuando la señal cae del 90 por ciento del valor de Voh al 10 por ciento del valor de Voh. Estos retardos de tiempo detallados en las especificaciones técnicas son precisamente lo que determinará la velocidad máxima con la cual pueda trabajar cualquier sistema digital, y es una de las primeras cosas que consultará un diseñista que esté trabajando en proyectos de vanguardia. También en los capítulos anteriores, trabajamos sobre el supuesto de que podíamos conectar un número indefinido de elementos a la salida de una función lógica cualquiera. En la práctica, desafortunadamente, esto no es así. Todo componente lógico tiene un límite máximo de unidades que puede alimentar, que se pueden conectar a su salida, el cual dependerá del tipo de componente utilizado y de la cantidad de las funciones lógicas que dicho componente está alimentando. Para determinar el límite máximo de unidades que pueden ser alimentadas por una función lógica, es común usar el concepto de factores de carga. Dependiendo de la tecnología usada, todo elemento lógico trae en su lista de especificaciones un factor de carga de entrada (también conocido en la literatura técnica como fan-in) que es igual al número mínimo de unidades de carga que requiere la entrada del mismo para poder trabajar adecuadamente, y un factor de carga de salida (también conocido como fan-out) que es igual al número máximo de unidades de carga que puede proporcionar su salida para alimentar otros elementos. Si el elemento tiene varias entradas, cada entrada estará especificada con un factor de carga de entrada. Supóngase, por ejemplo, que una función NOR tiene un factor de carga de salida (fan-out) de 6 y que ésta va a alimentar varias funciones NOT con un factor de carga de entrada (fan-in) de 1 cada una. Vemos entonces que el NOR podrá alimentar hasta 6 funciones NOT. Si el factor de carga de entrada (fan-in) de cada NOT hubiese sido 2, el NOR habría podido alimentar únicamente hasta tres funciones NOT. Si queremos conectar más funciones NOT a la salida del NOR, tenemos que amplificar la salida del mismo de alguna manera. Para lograr dicho propósito, utilizamos un elemento ampliamente conocido como el buffer, el cual se representa de la siguiente manera:

Obsérvese que por su representación el buffer nos indica que no puede llevar a cabo ningún procesamiento de información. En efecto, su única función es amplificar las señales a su entrada. Supóngase que tenemos un buffer con un factor de carga de entrada (fan-in) de 1 y un factor de carga de salida (fan-out) de 8. Podemos conectar entonces hasta seis buffers de este tipo a la salida de la función NOR discutida previamente. Puesto que cada uno de los seis buffers tiene un factor de carga de salida (fanout) de 8, tendremos un total de (6)(8) = 48 factores de carga de salida (fan-out) a la salida del NOR. De esta manera, la función NOR podrá alimentar por sí sola hasta 48 de las funciones NOT discutidas anteriormente. Además de los componentes básicos que ya hemos estudiado tales como las tres funciones lógicas básicas AND, OR y NOT, los multiplexers, los flip-flops R-S y otros componentes, existen bloques adicionales que son necesarios para poder construír un sistema digital completo. Uno de ellos es el bloque tri-state, el cual simplemente deja pasar un "0" a su entrada inalterado como un "0" a su salida y un "1" a su entrada como un "1" a su salida, pero que además de estos dos estados posibles cuenta con un tercer estado (de allí su designación como tres-estados o tri-state) en el cual la salida es esencialmente "desconectada" por completo de la entrada, o usando terminología un poco más técnica, la salida es aislada eléctricamente de la entrada. Podemos representar simbólicamente la acción de la lógica de tres-estados de la siguiente manera:

Este componente siempre tiene tres terminales, una terminal de Entrada, una terminal de Salida, y una tercera terminal designada en la figura como Habilitar en la cual, dependiendo de que se activada o desactivada con un "1" o con un "0" lógico, cierra los interruptores habilitando la conexión eléctrica entre la entrada y la salida o desconecta eléctricamente la salida de la entrada. La enorme versatilidad de este componente permite que esté disponible comercialmente en circuitos integrados como el 74125:

La burbuja inversora en las terminales de "habilitar" (enable) de cada una de las cuatro compuertas disponibles en este circuito integrado indica que con un "0" (puesto por ejemplo en la terminal 13) entonces la salida (disponible en la terminal 11) estará "activada" conectada eléctricamente a la terminal respectiva de entrada (terminal 12), mientras que con un "1" se "romperá" la conexión eléctrica. En los circuitos integrados como el 74126 (similar al 74125 excepto que en los diagramas esquemáticos del mismo no aparece dicha burbuja), entonces la "desconexión" eléctrica se lleva a cabo aplicando un "0" en la terminal de "habilitar", y la "conexión" entre la entrada y la salida se lleva a cabo aplicando un "1" en la terminal de "habilitar". Otro componente ampliamente utilizado en la construcción de sistemas con

circuitos lógicos es el interruptor bilateral (bilateral switch), cuya acción se puede simbolizar de la siguiente manera:

Como puede verse en el símbolo del interruptor bilateral, este componente posee una característica extraordinariamente interesante que lo hace sumamente útil. Puede canalizar una señal en ambas direcciones, tanto de izquierda a derecha como de derecha a izquierda. Aplicando una señal en la terminal de la derecha que actuará como terminal de entrada In, si la terminal de Control está habilitada con un "1" lógico entonces la terminal de la derecha que estará actuando como terminal de salida Out será conectada a la terminal de la izquierda permitiendo el paso de la señal que está siendo puesta en la terminal de la derecha. Pero si la señal es aplicada en la terminal de la izquierda, entonces será canalizada hacia la terminal de la derecha, siempre y cuando la terminal de Control esté habilitada con un "1". Y si la terminal de Control es inhabilitada con un "0", entonces la terminal de salida quedará desconectada eléctricamente por completo de la terminal de entrada. En efecto, el switch bilateral es un interruptor eléctrico como el que se utiliza para encender las lámparas de la sala, excepto que es un interruptor eléctrico implementado con semiconductores de estado sólido. Otra enorme ventaja del interruptor bilateral es que al establecer una conexión para el paso de señales eléctricas el valor de dichas señales no está limitado a los valores extremos de voltaje que representan el "0" y el "1" lógico en un sistema, sino que puede pasar cualquier valor intermedio entre dichos voltajes. En efecto, el interruptor bilateral permite no sólo el paso de señales digitales sino también el paso de señales analógicas tales como una señal de audio o de video. La enorme utilidad de un componente de este tipo hace que se venda comercialmente listo para ser utilizado en un algún diseño recurriendo a circuitos integrados tales como el 4066 construído con tecnología CMOS:

Obsérvese que un interruptor bilateral puede ser utilizado como un componente tri-state, pero un componente tri-state no puede ser utilizado como un interruptor bilateral en virtud de que en el componente tri-state la información sólo puede fluír en una dirección y no en ambas. Hasta aquí hemos supuesto que la aplicación de un voltaje a la entrada de una función lógica básica puede ser tomado como "1" mientras que la ausencia de dicho voltaje puede ser tomada como un "0", sin hacer distinción sobre si la ausencia de dicho voltaje se puede deber a que la terminal de entrada está conectada al polo negativo de la fuente de poder (denominado "tierra" eléctrica) o si simplemente está desconectada por completo del resto del circuito, esto es, sin estar conectada ni al polo positivo ni al polo negativo de la fuente de poder. Sin embargo, esta desconexión total es lo que llamamos una terminal flotante, y aunque no proporciona voltaje alguno de referencia al componente lógico, el hecho de estar flotando la hace susceptible de recibir señales momentáneas de "ruido eléctrico" al estar actuando esa terminal sin conexión como una pequeña antena de radio, señales de ruido que pueden introducirse en el componente lógico y ser amplificadas por el mismo, produciendo efectos sumamente indeseables en el procesamiento de la información digital que debe llevar a cabo el componente. Generalmente hablando, es muy mala práctica de diseño dejar terminales de entrada flotando sin estar conectadas ni a un "0" ni a un "1" lógico. En el siguiente diagrama tenemos un ejemplo de uno de los inversores lógicos NOT disponibles en el circuito integrado 74HC04 (equivalente funcionalmente al 7404), cuya entrada tiene un "0" cuando el interruptor S1 es cerrado, pero cuya entrada queda flotando cuando el interruptor es abierto:

Este sería el caso típico de un mal diseño por el hecho de que al abrir el interruptor S1 no se está desconectando la terminal de entrada del "0" lógico para enviarla al "1" lógico sino que se le está dejando en un estado indefinido, en un estado flotante. Y el siguiente diseño es un diseño peor aún porque si bien al estar abierto el interruptor S1 la entrada del NOT es definitivamente un "1", al ser cerrado el interruptor la entrada no es enviada al "0" lógico por la conexión a tierra que es proporcionada por el interruptor, sino que se crea directamente un corto circuito eléctrico entre la fuente de poder Vcc y la tierra eléctrica de un modo tal que se podría destruír al sistema:

Si el diseño digital que estamos llevando a cabo es de naturaleza tal que tenemos que conectar a la entrada de uno o varios de los componentes lógicos uno o varios interruptores eléctricos (un caso típico sería el interruptor de RESET como el que tienen algunas computadoras como "botón de pánico" para inicializar de nuevo la computadora desde el principio cuando ésta se ha quedado atorada dentro de algún programa software mal elaborado), entonces para evitar el tener que dejar alguna terminal flotante podemos recurrir a una táctica conocida como el uso de las resistencias pull-up. A continuación tenemos un ejemplo sobre cómo se aplica este tipo de diseño en la práctica:

En este caso, cuando el interruptor S1 se encuentra abierto la entrada en la terminal # 1 del NOT inversor está siendo alimentada a través de la resistencia R1 con el voltaje Vcc, o sea con un "1" lógico, el cual al ser invertido sale como un "0" lógico en la terminal # 2. Al cerrarse el interruptor S1, la entrada del NOT inversor es "aterrizada" a "tierra", lo cual le pone un "0" que sale en la terminal # 2 como un "1", el cual a su vez puede ser la señal lógica de RESET al sistema para que se apague y se encienda de nuevo comenzando desde el principio. El valor de la resistencia R1 generalmente se selecciona entre los 10K (10 mil ohms) y los 47K (47 mil ohms), de modo tal que su consumo de corriente de la fuente de poder no sea oneroso. Siempre que veamos en un diagrama esquemático este tipo de resistencias a la entrada de un circuito lógico sabemos que su propósito es actuar como resistencias de pull-up. Una variante al diseño que emplea resistencias pull-up es el diseño que emplea resistencias pull-down. El anterior circuito, implementado con una resistencia pull-down, se muestra a continuación:

En este caso, la resistencia R1 es colocada entre la terminal de entrada del inversor NOT y la "tierra" eléctrica. Cuando el interruptor S1 se encuentra abierto, la entrada en la terminal # 1 del NOT inversor está siendo conectada a la "tierra" eléctrica, o sea a un "0" lógico, el cual al ser invertido sale como un "1" lógico en la terminal # 2. Al cerrarse el interruptor S1, la entrada del NOT inversor es alimentada a través de la resistencia R1 con el voltaje Vcc, o sea con un "1" lógico, el cual al ser invertido sale como un "0" lógico en la terminal # 2. Obsérvese que la acción lógica de un diseño con una resistencia pull-down es inversa a la de un diseño con una resistencia pull-up. En los diseños que acabamos de ver, la única ocasión en la cual el interruptor S1 puede quedar en un estado indefinido es en el momento justo en el que se está cerrando el contacto eléctrico, o en el momento justo en el que se está abriendo el contacto. Es precisamente en este intervalo brevísimo de tiempo en el cual se puede generar una cantidad enorme de ruido que puede ser malinterpretada y mal procesada por un circuito lógico. Con el objeto de "limpiar" la señal de entrada por completo de modo tal que a la salida tengamos definitivamente un "0" o un "1" podemos refinar aún más nuestro diseño añadiendo un flip-flop RS, teniendo así lo que comúnmente se conoce en la literatura técnica como eliminador de rebotes (debouncer):

Para ver la forma en la cual trabaja este diseño cuyas entradas normalmente están conectadas a la fuente de poder de +5 volts mediante resistencias pull-up, remitámonos al diagrama de tiempos en el cual la entrada A de este flip-flop RS construído con bloques NAND es un "1" lógico mientras que la entrada B tiene puesto un "0" lógico, lo cual supone que el interruptor está movido hacia su posición inferior. El interruptor utilizado en estos casos es generalmente del tipo que se vende en las ferreterías como un interruptor eléctrico de "dos polos un tiro" o DPST (Double Pole Single Throw). Aquí suponemos que la salida Q del flip-flop es un "0" lógico. Estando el flip-flop R-S en el estado Q=0, si ponemos un "1" en la entrada B el flip-flop por su forma de operar simplemente retendrá su estado anterior, o sea se mantendrá en Q=0. Obsérvese cómo al subir la entrada B de "0" a "1" aparece en ella el inevitable ruido mientras el contacto eléctrico termina por asentarse. Tras esto, con la terminal B puesta en "1", al bajar la entrada A de "1" a "0" la salida Q pasa limpiamente del estado Q=0 al estado Q=1. Los pulsos de ruido son ignorados por completo, porque para que pudieran tener algún efecto sobre la salida Q la terminal A tendría que estar puesta a "0". La acción final resultante es que tenemos un circuito sin terminales flotantes a la entrada en el cual la presencia del ruido eléctrico al abrir o cerrar el interruptor ha sido eliminada por completo. Una forma en la cual podemos introducir información a un equipo o sistema que trabaje con lógica digital es por medio de una cinta ya sea de tipo magnético o físicamente perforada de acuerdo con algún código alfanumérico previamente convenido. Un agujero en la cinta representa un 1 y la ausencia del mismo representa un 0. Para ciertas aplicaciones, existen otros elementos que se usan conjuntamente con funciones lógicas; tales como el amplificador operacional, el comparador de voltaje, el conversor A/D que convierte una señal de voltaje analógica (esto es, una señal que varía en forma continua con una cantidad infinita de valores intermedios) en una señal digital y el conversor D/A cuya función es opuesta a la del conversor A/D. Sobre esto último, el conversor A/D es prácticamente una necesidad para poder llevar a cabo la digitalización de cualquier señal proveniente del mundo real,

convirtiéndola al formato binario de "unos" y "ceros" que los circuitos lógicos son capaces de entender. Así, para que un artista pueda grabar sus canciones y distribuírlas en un disco CD, es necesario convertir sus interpretaciones al formato binario conforme va interpretando sus obras ante un micrófono, y este trabajo lo lleva a cabo la tarjeta de sonido (como las tarjetas de sonido fabricadas por la empresa Sound Blaster) a la cual va conectada el micrófono:

Para poder llevar a cabo el proceso de conversión de una señal analógica a su forma digitalizada, podemos utilizar un conversor A/D de alta calidad como el conversor Burr-Brown PCM1802 (el cual puede digitalizar una señal con 24 bits de precisión), o si estamos trabajando bajo un presupuesto limitado o diseñando un circuito de bajo costo para producir muchas unidades en serie para el mercado consumidor, podemos recurrir a un circuito integrado económico como el ADC0804 fabricado por la empresa National Semiconductor (el cual tiene una más modesta capacidad de digitalización limitada a 8 bits), y cuya relación de terminales "pins" es la siguiente:

Para poder digitalizar una señal analógica continua, es necesario llevar a cabo un muestreo (sampling) de la señal analógica de una manera como se muestra a continuación (la señal analógica que está siendo muestreada es mostrada en color azul):

Aquí resulta más que obvio que entre cada muestreo la porción de la señal situada entre una toma de muestra y la toma de la muestra que le sigue se perderá irremisiblemente. La pérdida de información en el procedimiento de conversión a la forma digitalizada es un hecho ineludible. Lo único que podemos hacer para minimizar la pérdida de información es aumentar la frecuencia de los muestreos, aunque en la práctica hay límites para ello por cuestiones de costo. Cada muestra de la señal será convertida directamente a un formato binario dependiendo de la "altura" (el nivel de voltaje) de la señal en una manera como se muestra en la siguiente figura:

En este caso, la primera muestra tendrá un nivel de voltaje que pudiera ser algo como +0.5 volts equivalente en nuestro diagrama a un número 5 en su formato binario (00000101), la segunda muestra también tendrá un nivel de voltaje de +0.5 volts, pese a que la señal analógica tiene un voltaje un poquito mayor al que tenía al ser tomada la primera muestra. La tercera muestra tendrá un nivel de voltaje de +0.7 volts equivalente a un número 7 en su formato binario (00000111) mientras que la cuarta muestra tendrá un nivel de voltaje de +1.2 volts equivalente al número 12 en su formato binario (00001100), y así sucesivamente. De este modo, el conversor A/D habrá enviado al procesador digital la siguiente secuencia de números binarios: 00000101 00000101 00000111 00001100 : : : : De este modo, conforme se va llevando a cabo el proceso de digitalización de la señal analógica, para una señal de entrada continua el conversor A/D estará enviando un torrente constante de palabras binarias (en la siguiente figura suponemos un proceso de conversión A/D de cuatro bits):

La ventaja de utilizar un circuito integrado como el ADC0804 ya mencionado es que hace todo el trabajo por nosotros. Para energizar el circuito, le aplicamos el polo positivo del voltaje de la fuente de poder al "pin" 20 que corresponde a la terminal Vcc y el polo negativo o "tierra" a los pins 8 (que corresponde a la terminal A GND) y 10 (B GND). El voltaje analógico a ser convertido que llega del exterior se le aplica al pin 6 que corresponde a la terminal de entrada (Vin+), y el equivalente binario del voltaje puesto en la entrada estará disponible desde los pins 11 (D7) al 18 (D0). La terminal 1 encargada de la función Chip Select (CS) que habilita al circuito debe ser conectada a "tierra" (a un "0" lógico) para que el circuito integrado esté habilitado todo el tiempo. La notación inversora lógica puesta encima del símbolo CS indica que la función es activada con un "0" y es desactivada con un "1", razón por la cual para habilitar al circuito integrado tenemos que ponerle un "0" y no un "1" en esta terminal de entrada. (Si se quiere utilizar más de un conversor ADC0804 en un diseño, se puede utilizar esta terminal para controlar cuál de ellos estará habilitado en un momento dado.) La terminal 7 (Vin-) es conectada a tierra. El ADC0804 incluye un oscilador interno que para poder funcionar requiere de dos componentes pasivos externos que sirven para fijar la frecuencia de operación Fclk del reloj (la cual puede variar entre los límites permisibles de 100 mil ciclos por segundo o 100 KHz, y 1.46 millones de ciclos por segundo o 1.46 MHz): un condensador que debe ser conectado entre la terminal 4 (CLK IN o CLK) y tierra, y una resistencia que debe ser conectada entre la terminal 4 y la terminal 19 (CLK R). A continuación se muestra un diagrama de esto con componentes típicos:

La otra alternativa consiste en aplicar directamente una señal de "pulsos de reloj" directamente a la terminal CLK del ADC0804, lo cual tiene la ventaja de sincronizar el comportamiento del conversor con un reloj "maestro" del sistema. Las terminales 2 (RD, o Read invertida lógicamente) y 3 (WR, o Write también invertida lógicamente) son utilizadas para leer o escribir datos hacia el sistema al cual está conectado el componente. La acción se lleva a cabo del modo siguiente (ampliar imagen):

Como podemos ver en el diagrama de tiempos, para inicializar la conversión la terminal WR debe ser pulsada brevemente con un "0" lógico o "tierra", lo cual en virtud de la lógica inversora utilizada en la notación equivale a activar la función de la escritura de un dato (o mejor dicho, una conversión de una muestra analógica a su contraparte digital almacenando la conversión de la muestra dentro del componente) con un "1"; y la terminal también debe ser pulsada con un "0" lógico en caso de no estar conectada permanentemente al "0" lógico. La señal de requisición de interrupción INTR en la terminal 5 es usada por el componente para hacerle saber al sistema que el proceso de conversión A/D para la muestra tomada ha terminado y que la palabra binaria representante de dicha muestra ya se encuentra disponible. La aplicación de un breve pulso de "0" en la terminal RD es utilizado para recoger el resultado binario de la muestra, o sea para la lectura del dato. El procedimiento inverso a lo que hemos visto, la conversión de una señal digital a una señal analógica, puede ser mejor ilustrado con la siguiente figura en la cual alimentamos una señal binaria a una bocina de un sistema de sonido (ampliar imagen para poder ver la acción animada):

En este diagrama se supone que tenemos todas las cinco terminales de entrada (marcadas como 16, 8, 4, 2 y 1) conectadas a la misma fuente de voltaje cuando se pone un "1" lógico en dichas terminales. Lo único que cambia es el valor de la resistencia de cada terminal hacia la bobina de la bocina. Al principio, cuando la señal binaria de entrada es "0" en todas las terminales, o lo que es lo mismo, al poner la palabra binaria "00000" en la entrada, no hay voltaje alguno aplicado en ninguna de las terminales, y por lo tanto no se produce corriente eléctrica alguna en ellas. Al cambiar la señal binaria de entrada de "00000" a "00001", esto tiene el efecto de poner en la terminal 1 un "1" lógico, con lo cual fluirá una corriente eléctrica a través de la resistencia de 256 ohms hacia la bobina de la bocina, lo cual a su vez creará un campo magnético que moverá al cono de la bocina un poco hacia adelante (hacia la derecha en la figura). La siguiente señal binaria de "00010" quita el "1" de la terminal 1 y lo pone en la terminal 2. Pero como la resistencia que va de la terminal 2 hacia la bobina de la bocina es de 128 ohms, o sea la mitad del valor de la resistencia que va de la terminal 1 a la bocina, la corriente electrica que fluirá de la terminal 2 hacia la bocina será el doble de la corriente eléctrica que puede fluír de la terminal 1 hacia la bocina, lo cual puede mover al cono de la bocina con una fuerza dos veces mayor. Puesto que cada una de las resistencias conectadas en las terminales de entrada tiene un valor que es la mitad de la resistencia que le precede, la corriente eléctrica irá doblando en intensidad conforme va aumentando la palabra binaria. Si la corriente eléctrica que puede enviar la terminal 1 hacia la bocina es de 1 miliampere cuando tiene puesto un "1" lógico, entonces la terminal 2 enviará una corriente de 2 miliamperes, la terminal 4 enviará una corriente de 4 miliamperes, la terminal enviará una corriente de 8 miliamperes y la terminal 16 enviará una corriente de 16 miliamperes. De este modo, la palabra binaria "00101" enviará una corriente de 5 miliamperes, al sumarse los 4 miliamperes

que envía la terminal 4 al 1 miliampere que envía la terminal 1. Es así como el cono de la bocina se va moviendo hacia la derecha conforme va aumentando el valor de la palabra binaria. La figura muestra cómo se mueve el cono de la bocina con una palabra binaria que va aumentando (en el sentido binario) de uno en uno. Pero podemos meter cualquier palabra de cinco bits formada con cualquier combinación de "unos" y "ceros". Podemos ir metiendo una secuencia binaria como la siguiente: 00101 00101 00111 01100 : : : : Si suponemos que la secuencia de palabras binarias se va introduciendo rápidamente en la bocina a una rapidez mayor que la rapidez con la cual el salto de una palabra binaria a la siguiente pueda ser detectada por el oído, entonces nuestro oído percibirá una ilusión de continuidad, del mismo modo que las imágenes de una película no son vistas como 15 cuadros por segundo sino como algo "continuo". Los "saltos" de una palabra binaria a la siguiente pasarán desapercibidos para el oído, y el sonido que escucharemos será un sonido perfectamente "normal". Obsérvese que esta es la misma secuencia binaria como la que obtuvimos anteriormente al analizar la discretización de una señal continua, posiblemente una señal obtenida al enviar algún sonido de un micrófono a una tarjeta de audio. Aquí estamos recuperando de nuevo el sonido del formato binario. Y de hecho, esta es la forma en la cual nosotros podemos escuchar la música que está digitalizada en formato binario MP3, la acción de escuchar piezas musicales de un archivo MP3 es esencialmente un proceso de conversión D/A. Para la conversión eficiente de una señal digital cualquiera a una señal analógica, o sea la conversión D/A, podemos usar un componente de la misma empresa National Semiconductor como el DAC0830 o su equivalente el DAC0832, cuya relación de terminales "pins" es la siguiente:

y cuyo diagrama funcional se muestra a continuación para mayor claridad:

Como puede verse en el diagrama funcional, para poder utilizar este conversor D/A es necesario amplificar su señal de salida, puesta entre las terminales IOUT1 (en la terminal 11) e IOUT2 (en la terminal 12), conectándolas a un amplificador operacional (véase el Suplemento # 6: El amplificador operacional). La palabra binaria a ser convertida a señal analógica es puesta en las terminales designadas por el fabricante como DI (Data Input)desde DI0 (en la terminal 7) hasta DI7 (en la terminal 13), designadas en el diagrama funcional simplemente como D. El voltaje de paso de salida del conversor D/A es definido por el voltaje de referencia aplicado en la terminal designada por el fabricante como -Vref (terminal 8 del componente), dividido entre 255. Por ejemplo, si el voltaje Vref, es igual a -5.0 volts, entonces el voltaje de paso será +0.0196 volt. Esta es la magnitud en la que irá incrementando la salida analógica por cada aumento de un "1" en la señal binaria que está siendo convertida. Las otras terminales tienen funciones similares a las ya descritas para el conversor ADC0804. Es indudable que las aplicaciones de los circuitos lógicos van en aumento así como la proliferación de "cajas negras" cada vez más complejas capaces de

llevar a cabo funciones cada vez más y más sofisticadas. Y podremos esperar más sorpresas en los años venideros.

View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF