Story Transcript
SISTEMAS ELECTRÓNICOS DIGITALES E.T.S.I. TELECOMUNICACIÓN UNIVERSIDAD DE VALLADOLID Examen ordinario: 14 de febrero de 2003.
Problema 1 Hemos visto e implementado, en la parte práctica de la asignatura, cómo podíamos realizar divisiones de números enteros a partir de restas sucesivas. El algoritmo que utilizábamos era el siguiente: 1. contador =0 2. Si numerador≥denorminador entonces: • numerador=numerador-denominador • contador=contador+1 • Ir al paso paso 2 3. Cociente=contador, Resto=numerador Este algoritmo no es eficiente. Como ejemplo de ello, supongamos que trabajamos con números de 64 bits y queremos dividir FFFF FFFF FFFF FFFFh entre 1h. ¿Cuál es el tiempo aproximado que tardaría en realizar esta operación un circuito que implemente este algoritmo a una frecuencia de 3GHz? (suponer que cada operación del algoritmo anterior necesita un único ciclo de reloj) 2 Pretendemos realizar una división en binario de forma “similar” a como aprendimos en la escuela a realizar divisiones en base decimal, pero ahora en binario, trabajando con números de 8 bits. Vamos a recordar que es incluso más sencillo dividir en binario que dividir en decimal. Supongamos que tenemos como dividendo dnd=115d=01110011b y como divisor dsor=2d=00000010b. El resultado es coc=57d=0111001b con resto rst=1d=00000001b. La división en binario sería: 01110011 00000010 10 00111001 11 10 10 10 0011 10 R1 Vamos a ver detalladamente como realizamos este proceso para poder deducir el algoritmo que seguiremos: •
•
•
Primeramente seleccionamos el bit más significativo del dividendo y como este bit es menor que el divisor, asignamos un cero al cociente. Deberíamos ahora restar a este bit 0×dsor pero no nos es necesario porque es restar 0.
01110011 00000010 0 Seleccionamos el segundo bit más significativo del dividendo, pero este y el anterior siguen siendo menor que el divisor, por lo que asignamos otro cero. 01110011 00000010 00 Si seleccionamos un tercer bit más significativo del dividendo, ya tenemos un número mayor o igual que el divisor, por lo que asignamos un 1 al cociente y restamos a los bits seleccionados el divisor multiplicado por 1 que es lo mismo que restar el divisor. 01110011 00000010 00
01110011 00000010 001
01110011 00000010 10 001 01
Página 1 de 5
•
•
•
•
•
A este resultado de la resta le añadimos el cuarto bit más significativo del dividendo. Como tenemos un número mayor o igual que el divisor asignamos un 1 al cociente y restamos el divisor.
01110011 00000010 10 001 011
01110011 00000010 10 0011 011
01110011 00000010 10 0011 011 10 01 A este resultado de la resta le añadimos el quinto bit más significativo del dividendo. Como tenemos un número mayor o igual que el divisor asignamos un 1 al cociente y restamos el divisor. 01110011 00000010 10 0011 011 10 010
01110011 00000010 10 00111 011 10 010
01110011 00000010 10 00111 011 10 010 10 00 A este resultado de la resta le añadimos el sexto bit más significativo del dividendo. Como tenemos un número menor que el divisor asignamos un 0 al cociente y restaríamos 0×dsor pero no nos es necesario porque es restar 0. 01110011 00000010 01110011 00000010 10 10 00111 001110 011 011 10 10 010 010 10 10 000 000 A este resultado de la resta le añadimos el septimo bit más significativo del dividendo. Como tenemos un número menor que el divisor asignamos un 0 al cociente y restaríamos 0×dsor pero no nos es necesario porque es restar cero. 01110011 00000010 01110011 00000010 10 10 001110 0011100 011 011 10 10 010 010 10 10 0001 0001 Y para finalizar, a este resultado de la resta le añadimos el octavo bit más significativo del dividendo. Como tenemos un número mayor o igual que el divisor asignamos un 1 al cociente y restamos el divisor. Este es nuestro último paso y el resultado de la resta será el resto de la división.
01110011 00000010 10 0011100 011 10 010 10 00011
01110011 00000010 10 00111001 011 10 010 10 00011
01110011 00000010 10 00111001 011 10 010 10 00011 10 R 01
Página 2 de 5
Pretendemos diseñar un circuito electrónico digital de propósito específico, que realice divisiones enteras de números binarios de 8 bits siguiendo este procedimiento. La estructura del diseño será: entradas dividendo
divisor
Vcc inicio UNIDAD DE PROCESO (aquitectura de 3 buses)
UNIDAD DE CONTROL (pla) clk
resto
cociente
salidas La Unidad de Control la implementaremos con una PLA. La Unidad de Proceso tendrá una arquitectura de 3 buses. Realizaremos el diseño en varios pasos:
A Primeramente diseñaremos una ALU (Unidad Aritmética Lógica) con la siguiente estructura, A
B
8
N Z
8
ALU
F0 F1
8
Y y capaz de realizar las siguientes operaciones: •
Y=A+B cuando las señales de control son F1F0=00.
•
Y=A-B cuando las señales de control son F1F0=01.
•
Y=despIZQ(A,B) cuando las señales de control son F1F0=10.
• Y=despDER(A,B) cuando las señales de control son F1F0=11. donde N es una señal que se pone a uno cuando el valor de Y es 00h, y N es una señal que se pone a 1 cuando el resultado de la resta es negativo. De esta forma, para evaluar condicionales, sumaremos o restaremos para evaluar la comparación, y en función del resultado saltaremos a una u otra etapa-ciclo. El resultado de las funciones despDER y despIZQ en función de sus operandos se muestra a continuación:
(b 6 , b 5 , b 4 , b 3 , b 2 , b 1 , b 0 , a 7 ) = despIZQ[(b 7 , b 6 , b 5 , b 4 , b 3 , b 2 , b 1 , b 0 ), (a 7 , a 6 , a 5 , a 4 , a 3 , a 2 , a 1 , a 0 )] (b 0 , a 7 , a 6 , a 5 , a 4 , a 3 , a 2 , a 1 ) = despDER[(b 7 , b 6 , b 5 , b 4 , b 3 , b 2 , b 1 , b 0 ), (a 7 , a 6 , a 5 , a 4 , a 3 , a 2 , a 1 , a 0 )]
No podemos realizar operaciones del tipo Y=A, pero esto lo conseguiremos asignando la función suma a la ALU y mientras un argumento es cualquier registro, el otro es cero. Con esto conseguiremos mover el contenido de un registro a otro. En este apartado se pide diseñar esta ALU a nivel de puertas lógicas. Si se desea, se pueden diseñar bloques más simples y agrupar estos para construir la ALU (en EWB creábamos los subcircuitos y posteriormente con ellos los circuitos más complejos). De cualquier forma, debe quedar claramente especificado como se construiría esta ALU mediante puertas lógicas. 19
B Implementar el algoritmo de la división en cualquier lenguaje de alto nivel utilizando operaciones realizables por la ALU anterior. Las condiciones incluidas en el algoritmo también deberán poder ser realizadas por la ALU anterior. Se debe tener en cuenta la señal inicio, para que la forma de proceder a la hora de realizar la división, sea la siguiente: Manteniendo los datos de entrada estables se acciona el interruptor inicio para que se realice la división. Cuando se ha realizado la división, está quedará estable a la salida. Para proceder a efectuar una nueva división será necesario desactivar el interruptor y volver a activarle. Si mientras se está realizando la
Página 3 de 5
división, se desactiva el interruptor, el programa vuelve a la posición de partida sin finalizar la división. 7
C Descomponer el algoritmo en etapas, aislando los diferentes esquemas de cálculo que intervienen en el funcionamiento global del sistema. Los saltos incondicionales se materializarán en función de la etapa siguiente, y los condicionales en función de la condición aplicada y la etapa siguiente. 7 D Partiendo de la tabla del algoritmo en etapas, realizar la tabla del programa de control, donde descomponemos el algoritmo en ciclos de reloj. 6 E Unidad de Proceso. Se dibujará la Unidad de proceso y se asignarán las señales de control.
7
F Unidad de Control. Primeramente se calculará la tabla completa. Posteriormente se dibujará el esquema general del circuito, y finalmente se detallará la forma concreta del circuito (con implementar la mitad de la tabla anterior es suficiente). 12
Página 4 de 5
Problema 2 Diseñar un contador de impulsos producidos por un pulsador. Este contador comenzará mostrando el valor 1 en un display de 7 segmentos, y a cada pulsación aumentará en uno hasta llegar al valor máximo 6, volviendo de nuevo a 1 después de una nueva pulsación. Es decir, seguirá la secuencia 1,2,3,4,5,6,1,2,3,4,5,6,1,2,3,… Para cerrar el abanico de soluciones a este problema, se imponen las siguientes restricciones: • Para generar la señal de reloj se utilizará un oscilador externo RC con R=10K y C=220pf que consiguen una frecuencia de oscilación (oscilador externo) de 80KHz. • El display de 7 segmentos será del tipo cátodo común. • El pulsador que accione el contador será NC (normalmente cerrado). Queremos que cuando esté sin pulsar, la patita de entrada del PIC reciba un 1, y cuando está pulsado, reciba un 0. • El número avanzará en el momento de soltar el pulsador (no en el momento que se pulsa). • Cuando sea necesario temporizar, se hará con el TIMER y se utilizará el divisor de frecuencia 1:2. Se aconseja realizar este programa de la forma más sencilla posible, sin importar que se tengan que repetir un conjunto de líneas de código muy similares seis veces. Se pide: A Diseño del circuito electrónico. B Organigrama.
5
2
C Listado del programa en ensamblador MPASM.
9
D Una vez hecho esto se monta el circuito y se comprueba que hay veces en las que el contador avanza más de una unidad. Esto es debido a los rebotes que se producen en los contactos metálicos de los interruptores. Incluir una subrutina de retardo de 20ms, y las llamadas necesarias a ésta en el programa anterior, para evitar estos rebotes. Esta subrutina de retardo se ayudará del TIMER para conseguir esta temporización, asignando el divisor de frecuencia 1:2. (En este caso, se pide únicamente el listado del programa en ensamblador MPASM). 17 NOTA: En caso de que el alumno no haya realizado el apartado anterior, para puntuar algo en este apartado, puede realizar un programa que haga parpadear un led conectado a RB0, con un semiperiodo de 20ms (tiempo_de_encendido=tiempo_de_apagado =20ms). E El PIC16F84A no dispone de ninguna instrucción capaz de generar números aleatorios, pero con ligeras modificaciones al programa anterior, podemos realizar un programa que sí los genere. Este programa se puede basar en lo siguiente: • •
• •
Cuando no presionamos el pulsador, se estará ofreciendo un número concreto (entre 1 y 6) en el display, y el programa está detenido en dos líneas que miran constantemente el estado del pulsador. Cuando se presiona el pulsador, el display va ofreciendo consecutivamente los números 1,2,3,4,5,6,1,2,3…hasta que deja de pulsarse, momento en el que se quedará mostrando el último número mostrado en display. Trabajando a una frecuencia elevada, en una décima de segundo, el PIC es capaz de ejecutar muchas instrucciones, y así conseguimos el número aleatorio. En este caso no es necesario que tengamos en cuenta los rebotes, ya que estos afectarán por igual a cualquier tirada. Por otra parte, es muy importante para garantizar la equiprobabilidad, que los estados por los que pasa el display cuando está pulsado sean equidistantes en tiempo. Para conseguir esto, será necesario introducir estratégicamente instrucciones nop.
Modificar ligeramente el primer programa para conseguir generar un número aleatorio equiprobable entre 1 y 6. 7
Página 5 de 5