1.- SISTEMAS DIGITALES Y REPRESENTACIÓN DE LA INFORMACIÓN 1.1 Introducción El término digital se deriva de la forma en que los ordenadores realizan las operaciones: contando dígitos. Durante muchos años, las aplicaciones de la electrónica digital se limitaba a los sistemas informáticos. Hoy en día, la tecnología digital tiene aplicación en prácticamente todas las áreas. 1.1.1 Magnitudes analógicas y digitales Una magnitud analógica es aquella que toma valores continuos. Por ejemplo, la temperatura varía dentro de un rango continuo de valores. A lo largo del día, la temperatura no varía de 20ºC a 25ºC de forma instantánea sino que alcanza todos los infinitos valores que hay en ese intervalo. Uno de los problemas que tenemos es que cualquier “ruido” (interferencia), hace que los datos sean poco fiables. Otros inconvenientes: - Almacenar - Procesar - Transmisión Una magnitud digital es aquella que toma un conjunto de valores discretos (finitos). Por ejemplo, podríamos ir tomando la temperatura cada 5 minutos. 1.1.2 Dígitos binarios, niveles lógicos y formas de onda digital La electrónica digital utiliza sistemas y circuitos en los que sólo existen dos estados posibles: Alto (HIGH) y Bajo (LOW). Estos estados se pueden representar de diferentes formas: - niveles de tensión (el más habitual) - niveles de corriente - interruptores abiertos o cerrados - lámparas encendidas o apagadas - … Dígitos binarios El sistema de numeración de dos estados se denomina binario, y los dos dígitos que emplea son el 0 y el 1. Un dígito binario se denomina bit. Si asociamos el estado Alto=1 y Bajo=0 estamos trabajando con lógica positiva que es la que utilizaremos a lo largo del curso. 1 Los grupos de bits, llamados códigos, se utilizan para representar: - números - símbolos - caracteres alfabéticos - instrucciones - cualquier otro tipo de información Niveles lógicos Las tensiones que se utilizan para representar los 1´s y los 0´s reciben el nombre de niveles lógicos. Como hemos dicho antes, a lo largo de este curso vamos a trabajar con lógica positiva, es decir, asociamos el estado Alto con el 1 y el Bajo con el 0. Decíamos también que los estados se pueden representar de diferentes formas, pero el más habitual y el que usaremos en este curso es el de asociarlo a niveles de tensión. Supongamos entonces que el 1 lógico equivale a 5V (depende también de la familia que estemos usando), y el 0 lógico equivale a 0V. Esto sería el caso ideal, ya que en la práctica, el tipo de circuito, las interferencias, … hacen que el 1 lógico se asigne a un intervalo de tensión que puede ir desde 2V a 5V, y el 0 lógico se asigne a un intervalo de tensión que puede ir desde 0V a 0,8V. En este curso vamos a considerar sólo el caso ideal: 1 = 5V y 0 = 0V. Formas de onda digital Las señales digitales consisten en niveles de tensión que varían entre los estados alto y bajo. Se denomina impulso positivo cuando la tensión pasa de su estado a nivel bajo hasta el nivel alto, y luego retorna al nivel bajo. 1 0 Se denomina impulso negativo cuando la tensión pasa de su estado a nivel alto hasta el nivel bajo, y luego retorna al nivel alto. 1 0 La mayoría de las señales que podemos encontrar en los sistemas digitales se componen de series de impulsos (algunas veces llamados también trenes de impulsos) y pueden clasificarse en periódicas y no periódicas. Un tren de impulsos periódico es aquel que se repite a intervalos de tiempo fijos, este intervalo de tiempo fijo se denomina periodo (T). La frecuencia (f) es la velocidad a la que se repite (f = 1/T) y se mide en hertzios (Hz). T1 T2 T3 Periodo = T1 = T2 = T3 = … 2 Un tren de impulsos no periódico es aquel que no se repite a intervalos de tiempo fijos, y puede estar compuesto por impulsos de distintos anchos y/o impulsos que tienen intervalos diferentes de tiempo entre ellos. No periódico La información binaria que manejan los sistemas digitales se transmite a través de trenes de impulsos que representan secuencias de bits. En muchos sistemas digitales, todas las señales se sincronizan con una señal de tiempo denominada reloj. El reloj es una señal periódica en la que su periodo equivale a la duración del bit. Cronograma o diagrama de tiempos es una gráfica de ondas digitales que muestra como van variando las ondas a través del tiempo. reloj A 1 0 1 0 B 1 1 0 0 0 1 1 1 En el primer intervalo de tiempo, tanto A como B valen 1. En el siguiente, B mantiene su valor pero A pasa a valer 0. En el siguiente, A vuelve a valer 1 y B pasa a valer 0, … Cronograma 1.1.3 Operaciones lógicas básicas En su forma más simple, la lógica es la parte del razonamiento humano que nos dice que una determinada proposición es cierta si se cumplen ciertas condiciones. Las proposiciones pueden ser clasificadas como ciertas o como falsas, por lo que pueden aplicarse a los circuitos digitales, ya que estos se caracterizan por sus dos estados. El término lógico se aplica a los circuitos digitales que se utilizan para implementar funciones lógicas. Podemos considerar 4 operaciones lógicas básicas: NOT, AND, OR y la OR EXCLUSIVA. Los circuitos que realizan estas operaciones se denominan puertas lógicas. Las líneas conectadas a la izquierda de la puerta son las entradas, y la que está a la derecha es la salida. Tanto las entradas como la salida sólo pueden tener dos valores: HIGH (1, verdadero, …) o LOW (0, falso, …) NOT (inversor) 1 entrada y 1 salida Entrada Salida 0 1 1 0 3 AND (Y) n entradas y 1 salida Entrada 0 0 1 1 OR (O) n entradas y 1 salida 0 1 0 1 Entrada 0 0 1 1 OR EXCLUSIVA n entradas y 1 salida 0 1 0 1 Salida La salida sólo es 1 cuando todas las entradas lo son 0 0 0 1 Salida La salida es 1 cuando alguna de las entradas lo es 0 1 1 1 La salida es 1 cuando hay un número impar de 1´s en la entrada Entrada 0 0 1 1 0 1 0 1 Salida 0 1 1 0 1.1.4 Funciones lógicas básicas Las puertas básicas pueden combinarse para formar circuitos lógicos más complejos que se empleen en la elaboración de sistemas digitales completos, como por ejemplo podríamos destacar entre otros: - Comparadores - Codificadores/ Decodificadores - Multiplexores/ Demultiplexores - Conversión de código - Funciones de almacenamiento o Biestables o Registros o Memorias - Contadores - Funciones aritméticas o Sumador o Restador o Multiplicador o Divisor 4 1.2 Sistemas de numeración Todos estamos familiarizados con el sistema de numeración decimal porque usamos los números decimales cada día. El sistema binario es simplemente otra forma de representar magnitudes. Este sistema es menos complicado que el sistema decimal ya que sólo tiene dos dígitos. El sistema decimal con sus diez dígitos es un sistema en base 10, el sistema binario con sus dos dígitos es un sistema en base 2. Los dos dígitos binarios (bits) son 1 y 0. Además de estos dos sistemas de numeración también estudiaremos otros dos que nos van a ser muy útiles, el sistema de numeración octal (base 8) y el hexadecimal (base 16). 1.2.1 Tipos de datos y representación Como es fácil construir circuitos digitales que reconozcan y manipulen sólo 0´s y 1´s , nuestro objetivo en el diseño de sistemas es realizar todas las operaciones usando únicamente estos dos dígitos. En consecuencia, todos los números y datos de un computador tienen que representarse en esta forma binaria. Los datos que podemos encontrar en un sistema digital se pueden clasificar en 3 categorías generales que incluyen: 1. Números que se usan en operaciones aritméticas. 2. Letras del alfabeto que se usan en procesamiento de datos. 3. Una serie de símbolos discretos para diversos usos. Estos tres tipos de datos se representan en computadores en código binario. 1.2.2 Sistemas de numeración. Conversión entre bases. Los sistemas de numeración que estudiaremos en esta sección tienen una estructura de pesos, es decir que un mismo dígito tiene diferentes valores dependiendo la posición que ocupe. Sistema decimal Aunque ya estamos muy familiarizados con este sistema de numeración, nos interesa comprender su estructura de pesos, lo que nos ayudará a entender a los otros sistemas de numeración. Este sistema utiliza diez dígitos (base 10) desde el 0 hasta el 9. Puede expresar cantidades hasta 9 antes de quedarse sin dígitos. Si se desea expresar una cantidad mayor, se usan dos o más dígitos, y la posición de cada uno de ellos dentro del número le dice la magnitud que representa. 105 = 1x102 + 0x101 + 5x100 = 100 + 0 + 5 Peso = 10i, donde i es la posición que ocupa el dígito. 5 Los pesos para los números enteros son potencias positivas de diez que aumentan de derecha a izquierda, comenzando por 100 = 1. Para números fraccionarios, los pesos son potencias negativas de diez que aumentan de izquierda a derecha, comenzando por 10-1 = 0,1. … 102 101 100, 10-1 10-2 10-3 … coma fraccionaria El valor de un número decimal es la suma de los dígitos después de haber multiplicado cada dígito por su peso (como vimos en el ejemplo del 105). Sistema binario También es un sistema con pesos, donde lo único que varía respecto al decimal es su base. Para contar en binario se hace igual que en decimal con la única diferencia que ahora sólo contamos con dos dígitos (bits), el 0 y el 1. Si se quiere expresar una cantidad mayor hemos de ir añadiendo dígitos. Decimal Binario Para aprender a contar en binario hay que observar 0 0 como contamos en el sistema decimal. Empezamos en 0 y contamos hasta 9 1 1 antes de quedarnos sin dígitos. 2 10 Luego comenzamos con otra posición 3 11 de dígitos (a la izquierda) y 4 100 contamos desde 10 hasta 99. 5 101 Es necesaria otra posición para contar desde 100 hasta 999. Y así 6 110 sucesivamente. 7 111 En binario es similar: 8 1000 Con un solo bit contamos de 0 a 1. 9 1001 Necesitamos otro bit a la izquierda 10 1010 para contar de 2 a 3. Con el tercer bit podemos contar de 11 1011 4 a 7. 12 1100 Con el cuarto, de 8 a 15. Y así 13 1101 sucesivamente. 14 1110 15 1111 … … El bit más a la derecha es el bit menos significativo: LSB (Least Significant Bit) y tiene un peso de 20 = 1. Los pesos de los respectivos bits crecen de derecha a izquierda según las potencias de 2. … 23 22 21 20 El bit más a la izquierda es el bit más significativo: MSB (Most Significant Bit) y su peso depende del tamaño del número binario. 6 Los números con parte fraccionaria también se pueden representar en binario con pesos que van desde 2-1 hasta 2-n, donde n es el número de bits a partir de la coma fraccionaria. … 22 21 20, 2-1 2-2 2-3 … = … 4 2 1, 0,5 0,25 0,125 0,0625 … coma fraccionaria 2-1 = 0,5 2-2 = 0,25 2-3 = 0,125 2-4 = 0,0625 2-5 = 0,03125 2-6 = 0,015625 … Conversión binario a decimal: Recordar: n-1 ∑ ai 2i i= -m 1010011100(2 = 29 + 27 + 24 + 23 + 22 = 512 + 128 + 16 + 8 + 4 = 660(10 1001.101(2 = 23 + 20, 2-1 + 2-3 = 8 + 1, 0,5 + 0,125 = 9,625(10 Conversión decimal a binario: Existen principalmente dos métodos: - Suma de pesos - Divisiones sucesivas Suma de pesos: - Al número se le resta la mayor potencia de 2 que no lo sobrepase. - Sucesivamente, se irá restando a lo que nos quede las potencias de 2 hasta llegar a 0. - Se asignará un 1 al peso de las potencias de 2 que hemos utilizado. 9,625(10 = 1001,101(2 Parte entera 9 -8 -> 23 1 -1 -> 20 0 Parte fraccionaria 0,625 -0,5 -> 2-1 0,125 -0,125 -> 2-3 0 En este caso, la parte fraccionaria ha sido exacta pero en la mayoría de los casos esto no ocurre, por lo que tendremos que poner un límite al número de bits que queramos aproximar al igual que ocurre en el sistema decimal. 7 Divisiones sucesivas: Parte entera: - El número se divide por dos. - Sucesivamente se irán dividiendo los cocientes por dos hasta que el resto sea 0 o 1. - El último cociente será el MSB. El resto de bits lo formarán todos los restos que hemos ido obteniendo, siendo el LSB el primer resto obtenido. 9 2 LSB 1 4 2 0 2 2 0 1 MSB Parte fraccionaria: - El número se multiplica por dos. La parte que queda como entera se extrae como bit. Éste será el MSB. - Sucesivamente se irá multiplicando la parte fraccionaria por dos hasta que ésta sea 0 o se llegue al límite de bits. 0,625 x 2 = 1,25 -> 1 (MSB) 0,25 x 2 = 0,5 -> 0 0,5 x 2 = 1,0 -> 1 (LSB) Otro ejemplo: 25,7187(10. Limitar la parte fraccionaria a 6 bits 25,7187(10 = 11001,101101(2 Parte entera Parte fraccionaria 25 0,7187 4 -0,5 -> 2-1 -16 -> 2 9 0,2187 3 -8 -> 2 -0,125 -> 2-3 1 0,0937 0 -0,0625 -> 2-4 -1 -> 2 0 0,0312 -0,015625 -> 2-6 0,015575 25 2 LSB 1 12 2 0 6 2 0 3 2 1 1 MSB 0,7187 x 2 = 1,4374 -> 1 (MSB) 0,4374 x 2 = 0,8748 -> 0 0,8748 x 2 = 1,7496 -> 1 0,7496 x 2 = 1,4992 -> 1 0,4992 x 2 = 0,9984 -> 0 0,9984 x 2 = 1,9968 -> 1 8 Sistemas octal y hexadecimal Los números binarios largos son difíciles de leer y escribir ya que es fácil omitir o transponer un bit. Puesto que los computadores sólo entienden los 1´s y los 0´s, es necesario emplear estos dígitos cuando se programa en lenguaje máquina. Si, por ejemplo, tenemos que escribir una instrucción de 60 bits existe una probabilidad alta de equivocarnos, así que trabajaremos con otro sistema más sencillo. Una posibilidad sería trabajar en decimal y luego pasarlo a binario, pero hemos visto que la conversión no es directa, así que buscaremos algún sistema donde la conversión sea directa. Solución: Utilizar los sistemas octal y hexadecimal, que al ser potencias de 2, la conversión es muy sencilla. - El sistema octal necesita 8 dígitos (base 8): 0, 1, 2, 3, 4, 5, 6 y 7. - El sistema hexadecimal necesita 16 dígitos (base 16): 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E y F. Conversión binario a octal: Se agrupan los bits de 3 en 3, ya que 8 = 23 668(10 = 1010011100(2 = 1234(8 1 2 3 4 Conversión binario a hexadecimal: Se agrupan los bits de 4 en 4, ya que 16 = 24 668(10 = 1010011100(2 = 29C(16 2 9 C La equivalencia sería: DECIMAL 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 BINARIO 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 10000 OCTAL 0 1 2 3 4 5 6 7 10 11 12 13 14 15 16 17 20 HEXADECIMAL 0 1 2 3 4 5 6 7 8 9 A B C D E F 10 Conversión octal, hexadecimal a binario: Se realiza el proceso inverso, es decir, vamos sustituyendo cada dígito por sus correspondientes bits (3 en octal y 4 en hexadecimal). 9 Conversión octal, hexadecimal a decimal: Es equivalente a como lo hacíamos en binario. Lo único que cambia es la base. Tener en cuenta también en hexadecimal que A equivale a 10, …, y F a 15. n-1 ∑ ai 2i i= -m 1234(8 = 1x83 + 2x82 + 3x81 + 4x80 = 1x512 + 2x64 + 3x8 + 4x1 = 668(10 29C(16 = 2x162 + 9x161 + Cx160 = 2x256 + 9x16 + 12x1 = 668(10 Conversión decimal a octal y hexadecimal: La suma de pesos sólo sirve en binario porque cada peso se multiplica por 1. Por lo tanto utilizaremos: - Divisiones sucesivas. - Conversión a binario y de aquí a octal o hexadecimal. 72541(10 = 11B5D(16 72541 16 13 4533 16 5 283 16 11 17 16 1 1 1.3 Aritmética Binaria La aritmética binaria es un procedimiento sencillo ya que utiliza técnicas que se aplican a los números decimales. Para entender los sistemas digitales se deben conocer los principios básicos de la suma, resta, multiplicación y división binarias. Suma binaria Las cuatro reglas básicas para sumar dígitos binarios son: 0 + 0 = 0 Suma 0 y acarreo (“me llevo”) 0 0 + 1 = 1 Suma 1 y acarreo (“me llevo”) 0 1 + 0 = 1 Suma 1 y acarreo (“me llevo”) 0 1 + 1 = 10 Suma 0 y acarreo (“me llevo”) 1 Observar que las tres primeras dan como resultado un único bit. En la última, la suma de 1 + 1 = 2 (en binario 10) produce que el resultado no se pueda representar con un único bit. Como ocurre en el sistema decimal cuando el resultado de la 10 suma es mayor que 9, por ejemplo 7 + 5 = 12, lo que hacemos es poner 2 y “nos llevamos” (acarreo) 1 para la siguiente suma parcial. Cuando existe acarreo, se produce una situación en la que hay que sumar tres bits: 1 + 0 + 0 = 1 Suma 1 y acarreo (“me llevo”) 0 1 + 0 + 1 = 10 Suma 0 y acarreo (“me llevo”) 1 1 + 1 + 0 = 10 Suma 0 y acarreo (“me llevo”) 1 1 + 1 + 1 = 11 Suma 1 y acarreo (“me llevo”) 1 1 0 1 0 1 1 0, 1 1 0 1 1 1 0 1 1, 0 1 1 0 0 1 0 0 1 0,0 0 -> 86,75 -> 59,25 -> 146,00 Resta binaria Las cuatro reglas básicas para restar dígitos binarios son: 0-0=0 1-1=0 1-0=1 0 - 1 = 1 y nos llevamos 1 Como ocurre en el sistema decimal, cuando el sustraendo es mayor que el minuendo, el resultado de la resta es la distancia entre los dos (en el caso binario siempre es 1) y nos llevamos 1. Este 1 se suma al sustraendo de la siguiente resta parcial. 1 0 1 0 1 1 0, 1 1 -> 86,75 - 0 1 1 1 0 1 1, 0 1 -> 59,25 0 0 1 1 0 1 1, 1 0 -> 27,50 0 -1 0 => -1 0 1 0 Minuendo Sustraendo P-1 0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 1 Diferencia P 0 0 1 1 1 1 0 1 1 0 0 0 0 0 1 1 Multiplicación binaria Las cuatro reglas básicas para multiplicar dígitos binarios son: 0x0=0 0x1=0 1x0=0 1x1=1 Se realiza igual que en el sistema decimal con la ventaja de que sólo tenemos 1´s y 0´s. Se realizan productos parciales, desplazando cada producto una posición a la izquierda y luego se suman dichos productos. 11 1 0 1 1 -> 11 1 0 0 1 -> 9 1 0 1 1 -> 99 1011 1 1 0 0 0 1 1 -> 143(8 -> 64 + 4x8 + 3 = 99(10 División binaria Utiliza el mismo método que el sistema decimal: multiplicación y resta. 1 0 0 0 1 1 110 110 101 001011 110 101 1.4 35 / 6 = 5 y de resto 5 Representación de los números binarios con signo A partir de ahora, consideramos que el formato de almacenamiento de los números dentro de un ordenador tiene un tamaño fijo. Supongamos 8 bits. Para la representación de los números binarios con signo, estudiaremos tres posibilidades: - Signo y magnitud - Complemento a 1 - Complemento a 2 1.4.1 Signo y magnitud Los números positivos y negativos se representan de la misma forma, pero cambiando su signo, que es el bit de más a la izquierda (MSB). Si estamos considerando números de 8 bits, tendremos 1 bit para el signo y 7 para la magnitud. - Magnitud: indica el valor del número - Signo: indica si el número es positivo o negativo o Positivo: MSB = 0 o Negativo MSB = 1 Con 8 bits ( 1 para el signo y 7 para la magnitud => 27-1 = 127) podremos representar en decimal desde el –127 hasta el 127) 1 1111111 01111111 Signo Magnitud -> -127 -> 127 12 Conversión a decimal: La magnitud es la misma que en los números positivos por tanto, se calcula exactamente igual (utilizando únicamente la mantisa) y se le cambia el signo. 1 0 0 1 1 0 0 1 = -(24 + 23 + 20) = -( 16 + 8 + 1) = -25 Operaciones aritméticas Suma/resta: Se ha de comparar tanto el signo, como la magnitud de los operandos. Mismo signo: se suman las magnitudes y se le pone el signo de los operandos. Diferente signo: se resta siempre a la magnitud mayor, la más pequeña, y al resultado se le pone el signo de la magnitud mayor. 24 – 25 = -1 00011000 - 10011001 = 10000001 10011001 00011000 10000001 -> -25 -> 24 -> -1 Multiplicación/división: Se multiplican o dividen las magnitudes al igual que se hacía con los números positivos, y si los operandos tenían: Mismo signo: el resultado es positivo. Diferente signo: el resultado es negativo. Inconvenientes de esta representación: - Necesita operación de resta. - Es un sistema muy lento, ya que requiere comparar signos y magnitudes. 1.4.2 Complemento a 1 Los números positivos se representan de la misma forma que los positivos de signo y magnitud. Los números negativos se representan mediante el complemento a 1 del número positivo. Complemento a 1: cambiar los 1´s por 0´s y los 0´s por 1´s. 0 0 0 1 1 0 0 1 -> 25 1 1 1 0 0 1 1 0 -> -25 Con 8 bits podremos representar en decimal desde el –127 hasta el 127) 1 0 0 0 0 0 0 0 -> -127 0 1 1 1 1 1 1 1 -> 127 13 El 0 se puede representar de dos formas diferentes: 0 0 0 0 0 0 0 0 -> 0 11111111 -> - 0 = 0 000 -> 001 -> 010 -> 011 -> 100 -> 101 -> 110 -> 111 -> 0 1 2 3 -3 -2 -1 0 Conversión a decimal: Los números positivos se convierten igual que hasta ahora. Los números negativos (MSB = 1): - Se asigna valor negativo al peso del MSB - El resto de bits, se calculan tal y como lo hemos hecho anteriormente. - Al resultado se le suma 1. 1 1 1 0 0 1 1 0 = -27 + 26 + 25 + 22 + 21 + 1 = -128 + 64 + 32 + 4 + 2 + 1 = -25 Operaciones aritméticas Suma/resta: Tiene la ventaja que nos ahorramos la operación de resta, ya que para restar es suficiente con sumarle el complemento a 1 del número a restar. 24 – 25 = -1 00011000 - 11100110 = 11111110 00011000 11100110 11111110 -> 24 -> -25 -> -1 Esto es correcto porque la magnitud del número negativo es mayor que la del positivo, pero si fuera al revés, o sumáramos dos números negativos, se nos produciría “carry” (acarreo), es decir que de la última suma parcial (la de los dos bits MSB) “nos llevamos 1”. Este 1 se lo tenemos que sumar al resultado de la suma para obtener el resultado final. 25 – 24 = 1 00011001 - 11100111 = 00000000+1=00000001 00011001 1 11001 11 100000000 1 carry 00000001 -> 25 -> -24 1 14 -4 + (–4) = -8 11111011 + 11111011 = 11110110+1=11110111 11111011 11111011 111110110 1 carry 11110111 -> -> -4 -4 -8 Inconvenientes de esta representación: - El 0 se puede representar con dos valores diferentes. - En ciertas operaciones tenemos que sumarle el carry para obtener el resultado final. Lo que se suele utilizar es el complemento a 2. 1.4.3 Complemento a 2 Los números positivos se representan de la misma forma que los positivos de signo y magnitud. Los números negativos se representan mediante el complemento a 2 del número positivo. Complemento a 2: Complemento a 1 + 1. 0 0 0 1 1 0 0 1 -> 25 1 1 1 0 0 1 1 0 -> complemento a 1 1 1 1 1 0 0 1 1 1 -> -25 Método alternativo para hallar el complemento a 2: - Se empieza por el bit de más a la derecha (LSB) y vamos recorriendo hacia la izquierda, dejándolos como están hasta que encontremos el primer 1 (incluido). - A partir de aquí se hace el complemento a 1 del resto. 0 1 0 1 0 0 -> 20 1 0 1 0 1 1 complemento a 1 1 1 0 1 1 0 0 -> -20 101100 Con 8 bits podremos representar en decimal desde el –128 hasta el 127) 1 0 0 0 0 0 0 0 -> -128 0 1 1 1 1 1 1 1 -> 127 Conversión a decimal: Los números positivos se convierten igual que hasta ahora. 15 Los números negativos (MSB = 1): - Se asigna valor negativo al peso del MSB - El resto de bits, se calculan tal y como lo hemos hecho anteriormente. 1 1 1 0 0 1 1 1 = -27 + 26 + 25 + 22 + 21 + 20 = -128 + 64 + 32 + 4 + 2 + 1 = -25 Operaciones aritméticas Antes de hablar de las operaciones aritméticas en complemento a 2, aclararemos dos conceptos que se nos van a producir en ellas (también se producen en las otras formas de representación): - Overflow (desbordamiento): Se puede producir cuando al operar con dos números, sobrepasamos la capacidad de lo que podemos almacenar. En nuestro caso (8 bits) si el resultado es > 127 o < 128. En el caso de la suma, sólo puede pasar con números del mismo signo. En este caso el resultado es de signo contrario a los operandos y por tanto, incorrecto. - Carry (acarreo): Se puede producir cuando alguno de los operandos (o los dos), son negativos. El hecho de representar los números en complemento a 2 hace que el resultado tenga 1 bit más de lo que podemos almacenar (9 en nuestro caso). Esto no es un error y sencillamente despreciamos este bit de acarreo. Resta: La resta se realiza mediante la suma del complemento a 2 del número que queremos restar: a – b = a + (-b) por tanto, le sumamos a “a” el complemento a 2 de “b”. Suma: - Ambos positivos: No se puede producir carry pero sí overflow. 01111101 -> 125 00111010 -> 58 10110111 183 overflow: la suma de dos números positivos nos da como resultado uno negativo. Esto es debido a que rebasamos la capacidad máxima que es 127. Resultado incorrecto. - Ambos negativos: Se produce carry. Se puede producir overflow. 11111011 -> -5 11111010 -> -6 111110101 -> -11 carry: El resultado tiene 1 bit más que se descarta. El resultado es correcto. 10000011 -> -125 11000110 -> -58 101001001 -183 En este caso, además del carry, se produce overflow por lo que el resultado es incorrecto. 16 - Signo contrario: No se produce overflow. Se puede producir carry si la magnitud del número positivo es mayor que la del negativo. 00111001 11100011 100011100 00011101 11000111 11100100 -> 57 -> -29 -> 28 -> 29 -> -57 -> -28 Se produce carry pero no overflow. Resultado correcto. No se produce carry ni overflow. Resultado correcto. Producto: Hay muchas formas de realizarlo que estudiaremos más adelante, así que asumiremos que miramos el signo de los operandos para decidir el resultado final. Si algún operando es negativo, se le hace el complemento a 2 para pasarlo a positivo. Se realiza el producto, y si el resultado era negativo se halla el complemento a 2. Cociente: Se suele realizar mediante restas (sumas del complemento a 2) sucesivas. 1.5 Códigos con pesos De hecho, todos los sistemas estudiados hasta ahora: decimal, binario, octal y hexadecimal son códigos con pesos, donde la posición de cada dígito tiene un peso igual a la base elevada a la posición que ocupa. Hemos visto que es muy fácil la conversión de binario a octal o hexadecimal o viceversa. Sin embargo, no lo es tanto si queremos hacer la conversión a decimal al cual estamos más acostumbrados, por ello podemos utilizar un sistema de fácil conversión al decimal, el BCD: Binary Coded Decimal. BCD: El código decimal binario es un código que permite expresar cada uno de los dígitos decimales con un código binario. En el BCD, existen diferentes códigos, de los cuales el más utilizado es el 8421, llamado así porque utiliza 4 dígitos para representar los números decimales y el peso que se asigna a cada uno de ellos es precisamente 8, 4, 2, 1 = 23, 22, 21, 20 A partir de ahora, nos referiremos siempre a este código por lo que tanto dará nombrarlo como BCD o como 8421. Con 4 dígitos se pueden representar 16 números: 0000 .. 1111 pero el código 8421 sólo utiliza 10 (0 .. 9), del 0000 al 1001 17 Decimal 0 1 2 3 4 5 6 7 8 9 8421 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 Para convertir a BCD un número decimal, basta con reemplazar cada dígito por los correspondientes 4 bits. La operación contraria nos serviría para la conversión de BCD a decimal. 35 2469 00110101 0010010001101001 Representación de los números en BCD con signo Para la representación de los números en BCD con signo, estudiaremos dos posibilidades: - Signo y magnitud - Complemento a 10 Signo y magnitud: - El signo se representa en una cadena de 4 bits. - No nos interesa porque implica realizar la operación de resta. Complemento a 10: - Restar al número, la potencia de 10 correspondiente. - Tiene que tener también un bit de signo. 0011110001001 789 1000 1 0 0 1 0 0 0 0 1 0 0 0 1 -789 -789 signo 211 Operaciones aritméticas Suma: Se realiza la suma binaria pero agrupando los bits de 4 en 4: - Si el resultado de esta suma de 4 bits es igual o menor a 1001 (9) el resultado es válido. - Si el resultado es mayor, o si genera un acarreo, se le suma 0110 (6) al resultado. Si en esta segunda suma se genera un acarreo, se le suma al grupo de 4 bits siguiente 18 00100011 00010101 00111000 23 15 38 1001 0100 1101 0110 00010011 9 4 13 1001 1001 00010010 0110 00011000 9 9 18 00010110 00010101 00101011 0110 00110001 16 15 31 Las 2 sumas parciales: 3+5 y 2+1, dan un resultado < 9 y además no generan acarreo. La suma de 9+4 da un resultado > 9 (1001) por tanto, le sumamos 6 (0110). Esta segunda suma produce un acarreo que se le suma al grupo de 4 bits siguiente (0000). La suma de 9+9 da un resultado parcial < 9, en este caso 0010 (2), pero produce un acarreo, por tanto hay que sumarle 6 (0110). La suma parcial 6+5 produce un resultado > 9, por lo que hay que sumarle 6 (0110). Esta segunda suma produce a su vez un acarreo que se le suma al segundo grupo de bits 01100111 01010011 10111010 01100110 000100100000 67 53 120 Las 2 sumas parciales: 6+5 y 7+3 dan resultados > 9, por lo que les sumamos 6. Las segundas sumas producen a su vez un acarreo que se le suma al siguiente grupo de 4 bits. 01101001 00111001 10100010 01100110 000100001000 69 39 108 La suma 9+9 produce acarreo, por lo que hay que sumarle 6. La suma 6+3 no es > 9 ni produce acarreo. Sin embargo, al sumarle el acarreo de los otros 4 bits, nos da como resultado 10 > 9, por lo que también hay que sumarle 6. Resta: Se realiza la suma del complemento a 10 del número a restar. 0011110001001 789 1 0 1 1 0 0 1 0 0 0 0 0 1 -359 -> 641 1 110111001010 430 011001100110 carry 10010000110000 19 Multiplicación/División: No los estudiaremos pero se pueden realizar mediante sumas o restas sucesivas. 1.6 Códigos alfanuméricos Para la comunicación, no sólo se necesitan números sino también letras y otros símbolos. Los códigos alfanuméricos representan números y caracteres alfabéticos. Aunque la mayoría de estos códigos también representan otros caracteres tales como símbolos y distintas instrucciones necesarias para la transferencia de información. Como mínimo un código alfanumérico debe representar los diez dígitos decimales y las 26 (27 en España) letras del alfabeto => 36 elementos. 25 = 32 -> necesitamos 6 bits 26 = 64, por lo que 28 (64 – 36) elementos no se utilizan. Pero siempre hacen falta otros símbolos: punto, coma, interrogante, ... ASCII: American Standard Code for Information Interchange. Código alfanumérico universalmente aceptado, que se usa en la mayoría de las computadoras y equipos electrónicos. La mayor parte de los teclados se estandarizan de acuerdo con el código ASCII, y cuando se pulsa una letra, un número o un comando de control, es el código ASCII el que se introduce en el ordenador. El código ASCII dispone de 128 caracteres que se representan mediante un código binario de 7 bits, aunque realmente son 8 con MSB = 0.: - Los primeros 32 caracteres son comandos no gráficos (no se imprimen ni salen por pantalla) y son de control (CR, ESC, ...) Decimal: 0 .. 31 binario: 00000000 .. 00011111 hexadecimal: 00 .. 1F - Los demás caracteres son símbolos gráficos que pueden imprimirse o mostrase por pantalla, e incluyen las letras del alfabeto (mayúsculas y minúsculas), los diez dígitos decimales, los signos de puntuación, y otros símbolos comúnmente utilizados. Decimal: 32 .. 127 binario: 00100000 .. 01111111 hexadecimal: 20 .. 7F ASCII extendido: Además de los 128 caracteres ASCII estándar, existen otros 128 caracteres adicionales (MSB = 1) que fueron adoptados por IBM para utilizar en sus PC´s. Debido a la popularidad del PC, estos caracteres especiales se han extendido a otras aplicaciones, convirtiéndose en un estándar no oficial. Los nuevos caracteres que van en decimal desde 128 a 255 o en hexadecimal de la 20 a FF, están formados por: - Caracteres alfabéticos no ingleses (ñ, ...) - Símbolos no ingleses 20 1.7 Letras griegas Símbolos matemáticos (±, ÷, ...) Caracteres para gráficos Caracteres gráficos de barras Caracteres sombreados Códigos detectores y correctores de error En un sistema digital, la información se transmite mediante 0´s y 1´s, que equivale a subidas y bajadas de tensión. Estas señales eléctricas se pueden ver alteradas a causa de fallos físicos (subidas de tensión , ruidos, ...), por lo que se producen diferencias entre los datos transmitidos y los recibidos. Para entender los códigos de detección de error es importante conocer el concepto de distancia, también denominado comúnmente como distancia de Hamming: nº de dígitos (bits) que hay que cambiar para obtener otra combinación de ese código. Este concepto ahora no es trivial ya que estamos acostumbrados a trabajar con códigos consecutivos, es decir que cualquier modificación de 1 bit (distancia 1) nos da otra combinación de ese código. Códigos de detección de errores: es aquel que tiene la propiedad de que ciertos errores pueden transformar palabras del código en palabras que no lo son. Para detectar un error de 1 bit es necesario que como mínimo, la distancia sea 2 => añadir 1 bit => nº palabras código = nº palabras que no lo son. Por ejemplo, supongamos un código de 3 bits formado por 4 palabras: 000 011 100 110 Enviamos la 100, pero el error en 1 solo bit puede hacer que nos llegue la 000 o la 110, que también son palabras del código y por tanto, no nos daremos cuenta que se ha producido un error en la transmisión. Sin embargo, si cambiamos en el código la 100 por la 101, la distancia entre las palabras del código es 2 (hay que modificar 2 bits para obtener otra palabra de ese mismo código). Con esto vemos que podemos detectar que se ha producido un error en 1 bit (o en tres), pero si el error es en dos, obtendremos otra palabra de ese código y por tanto, no detectaremos el error. El ejemplo anterior tiene el inconveniente de conocer todas las palabras del código. Método de paridad para la detección de errores. 21 Muchos sistemas emplean 1 bit de paridad como medio para la detección de errores de 1 bit. Cualquier grupo de bits contiene un número par o impar de 1´s. Un bit de paridad se añade al grupo de bits para hacer que el número total de 1´s sea siempre par (paridad par), o impar (paridad impar). Un determinado sistema puede trabajar con paridad par o impar, pero no con ambas. Paridad par: nº de 1´s par Paridad impar: nº de 1´s impar bit de paridad par bit de paridad impar 00000 10001 10010 00011 10000 00001 00010 10011 Como la distancia es 1, sólo podemos detectar errores en un nº impar de bits. Se suele utilizar en ASCII. Códigos de corrección de errores: Para corregir un error en 1 bit, se necesita más de 1 bit de paridad ya que éste sólo puede indicar si la cadena es correcta o incorrecta. Necesitaremos log2n bits extra. Es decir, para transmitir una cadena de 1 bit necesitaremos 21 bit extra. Para transmitir una cadena de dos bits, necesitaremos 22, … Vamos a transmitir una cadena de 1 bit o sea , el 1 o el 0. 0 -> representado por 000 (2 bits extra) 1 -> representado por 111 (2 bits extra) Tomaremos como 0, todas aquellas combinaciones que tengan más 0´s que 1´s. Lo mismo ocurrirá con el 1. 000, 001, 010, 100 -> 0 011, 101, 110, 111 -> 1 Aún así vemos que si se modifican 2 bits tomaremos un resultado incorrecto. Mientras mayor fiabilidad queramos, mayor nº de bits extra necesitaremos. Otra solución es utilizar el código de Hamming. Código Hamming de corrección de errores. El código utiliza un nº de bits de paridad (dependiendo del nº de bits de información), localizados en determinadas posiciones del grupo del código. Número de bits de paridad 22