Hola, puesto que es mi primera intervención en esta edición del curso online de diseño de sistemas digitales, me voy a presentar muy brevemente. Mi nombre es Lluís Terés y trabajo como investigador en el Instituto de Microelectrónica de Barcelona que pertenece al Consejo Superior de Investigaciones Científicas. Allí, actualmente soy el responsable del grupo de Diseño de Circuitos y Sistemas Integrados. También soy profesor asociado de la Universidad Autónoma de Barcelona, vinculado al Departamento de Microelectrónica y Sistemas Electrónicos. Y es como tal que participo en este curso. Bien, a lo largo de este curso y a modo de proyecto de fondo vamos a diseñar un procesador extremadamente sencillo. Y esta, en esta primera semana, lo que introduciremos es el concepto básico de procesador y a su vez daremos una primera especificación de nuestro procesador particular. En primer lugar, recuperaremos los ejemplos de sistemas digitales descritos ya en la primera lección de esta semana. El primero de estos ejemplos fue un controlador de temperatura, descrito mediante este algoritmo que tenemos aquí. El segundo de estos ejemplos fue un cronómetro que también describimos de forma algorítmica con este código que mostramos aquí. ya vimos, en la lección uno, que a cada uno de estos algoritmos les podíamos asociar un sistema digital específico. Este sistema que tenemos aquí era el que habíamos asociado o desarrollado o planteado para el controlador de temperaturas. Mientras que este otro era el sistema digital correspondiente al cronómetro. Veamos ahora como en relación con el diseño e implementación de estos sistemas hay distintas opciones, entre las que el diseñador deberá escoger la más adecuada en función de parámetros como pueden ser el coste, la precisión o el tamaño del sistema final, entre otros. La primera opción, como comentábamos en la transferencia anterior, es asociar a cada algoritmo un sistema completamente nuevo y específico, que realiza estrictamente las funciones de dicho algoritmo, pero que no puede ejecutar o realizar ninguna otra función o algoritmo diferente. De alguna manera, este concepto de desarrollar sistemas digitales específicos constituye el objetivo principal de este curso. Sin embargo, ambos algoritmos, los que hemos visto en las transferencias anteriores, tienen algunas características comunes que trataremos de analizar y aprovechar para ver si podemos desarrollar un sistema genérico que pueda materializar ambos algoritmos. La primera característica común es que ambos algoritmos están formados por instrucciones que se ejecutan secuencialmente como se menciona aquí. Por ejemplo, en el caso de un controlador de temperatura, al que corresponde este algoritmo, supongamos que la instrucción ejecutada en el instante "n" es esta que tenemos aquí y que hemos puesto aquí ejecutándose en el instante n. En ese instante la instrucción es una instrucción condicional que si se cumple una determinada condición, haremos una acción en concreto y si se cumple otra condición habrá otra acción. Esta es una instrucción. La instrucción siguiente sería la siguiente en secuencia que es este wait for diez segundos. y es la que ejecutaríamos en el tiempo "n + 1". A continuación, en el tiempo "n + 2", dado que estamos dentro un bucle, aquí teníamos un bucle, volveríamos a empezar y en el "n + 2" volveríamos a encontrar esta misma instrucción que habíamos visto en el tiempo n. Y en el "n + 3" se volvería, en el "n + 3" se volvería a repetir el "wait for 10 segundos". Estamos en un bucle, pero la ejecución de las instrucciones se produce de forma secuencial. Luego esta es una primera característica común, que ambos algoritmos, y en general todos los algoritmos, están formados por instrucciones que se ejecutan secuencialmente. Otra característica común, es que en algunos momentos se producen saltos o bifurcaciones que rompen con el flujo de ejecución secuencial de nuestros algoritmos. Por ejemplo, la primera instrucción del algoritmo de control de temperaturas, hay una bifurcación en la instrucción condicional que tenemos aquí. En función de esta condición tendremos que realizar una determinada acción o tendremos que ir a preguntar por la condición siguiente. Otro ejemplo, es el bucle while o mientras del segundo algoritmo, de este de aquí que era el cronómetro. Las instrucciones que hay dentro del bucle, estas instrucciones que tenemos aquí, de hecho hay una sola instrucción, sólo se ejecutará si la condición, ésta que tenemos aquí se cumple, es decir, si stop es igual "off" o si no se ha activado el stop. Luego estamos en un trozo de algoritmo que necesita bifurcaciones condicionales en este caso. La tercera característica común es que ambos algoritmos incluyen instrucciones para leer valores de entrada o para generar o escribir valores de salida. Veamos algunos ejemplos. En el primer algoritmo para poder ejecutar la primera instrucción, esta que tenemos aquí, que la hemos reproducido aquí, es necesario leer el valor actual de temperatura sobre la entrada o sobre la señal "temp" y el valor actual de la posición del selector de temperatura sobre la entrada en la señal "pos". Una vez leídos estos valores, podemos evaluar esta condición y tomar una decisión en consecuencia. Es decisión, puede ser la de poner a "on" la señal onoff y esto sería equivalente a escribir sobre una señal de salida, que actuará sobre nuestra caldera de calefacción, escribir un determinado valor, en este caso "on". Por lo tanto, aquí hemos leído señales del exterior y aquí escribimos señales que van hacia el exterior. Y esto era correspondiente al algoritmo de control de temperatura. Si nos fijamos en el algoritmo correspondiente al cronómetro, vemos que aquí también hay una condición, que para evaluarla necesitamos saber qué valor tiene la señal de entrada stop. Por lo tanto, tenemos que leer del exterior el valor de esa señal para después evaluar esta condición. Igualmente aquí tenemos esta otra, esta otra sentencia del del cronómetro, donde vemos que hay una función que actualiza una señal tiempo, un valor de tiempo lo actualizamos y el valor actualizado del tiempo lo volvemos a dejar dentro de la propia señal o elemento de memoria "time". Ese, perdón, esa señal, es una señal de salida que tiene que ir hacia el exterior porque es la que queremos ver fuera en el exterior del cronómetro. Esto significa que aquí estamos escribiendo sobre una señal o un puerto de salida. Por lo tanto, leer valores de entrada a nuestro sistema o escribir valores de salida es otra característica común de todos los algoritmos o de la mayor parte de los algoritmos. Finalmente, hay algunas instrucciones que nos permiten realizar cálculos. En el primer algoritmo, necesitamos poder hacer cálculos de este estilo. En general, en este caso restas para poder evaluar la condición que tenemos aquí o la condición que tenemos aquí abajo. Mientras que en el segundo algoritmo, hay por ejemplo esta función de actualizar tiempo, que básicamente lo que requerirá es un sumador para incrementar el valor de time. Luego y como conclusión, el hecho de que diferentes sistemas digitales pueden ser definidos o descritos por algoritmos con algunas características comunes, sugiere otra forma de implementarlos. En lugar de diseñar e implementar un nuevo circuito para cada nuevo algoritmo o sistema a desarrollar, podríamos desarrollar un sistema genérico que incluyera puertos de entrada/salida, puertos de entrada, puertos de salida, para leer y escribir, leer datos del exterior y escribir datos hacia el exterior. Puertos de entrada como son el IN0, IN1... IN2 o puertos de salida como OUT0, OUT1,OUT2 y así sucesivamente. Elementos de memoria internos para almacenar datos: ya sean datos que vienen del exterior, que hemos leído por los puertos de entrada, datos resultantes de realizar operaciones o datos que almacenamos internamente para poderlos después enviar hacia puertos de salida. Y finalmente necesitamos también recursos de cómputo que nos permiten realizar operaciones, tipo suma, resta, comparación, multiplicación, o cosas de este estilo. Además de todo ello, necesitaremos que nuestro sistema genérico sea capaz de interpretar instrucciones como el hecho de enviar el valor de una constante a una determinada, a un determinado elemento de memoria interno o llevar el valor que hay en una entrada externa. Aquí teníamos las entradas externas. Llevarlo adentro de un elemento de memoria interno, o bien enviar cosas hacia, información hacia los puertos de salida. Aquí tenemos como el contenido de un elemento de memoria interno va al puerto de salida o el valor de una constante, lo enviamos al puerto de salida. Los puertos de salida son los que nos conectan, los que nos permiten enviar o escribir información hacia el exterior. También necesitamos poder ejecutar funciones ya sean aritméticas, lógicas o racionales etc, que estén disponibles en el sistema. Una función f que utiliza los valores de dos variables almacenadas dentro del sistema, de 2 elementos de memoria Xj, Xk, realiza la operación f entre esos dos valores y el resultado lo deja en otro elemento de memoria que es Xi. Y por último necesitamos poder ser capaces de realizar instrucciones de control de flujo de ejecución tipo bifurcación o salto como son el go to N, salto incondicional a ejecutar la instrucción que está en la posición N, o el número de instrucción N, o salto condicional, bifurcación condicional si se cumple la condición. La próxima instrucción a ejecutar será la instrucción de número N, ¿de acuerdo? Estas son los distintos tipos de instrucciones. Por lo tanto nuestro sistema digital genérico recibe instrucciones desde el exterior, ya veremos más adelante de donde vienen tales instrucciones, interpreta y ejecuta tales instrucciones y genera, como resultado de esa interpretación y ejecución de las instrucciones, genera dos tipos de información. Los resultados de esa instrucción, que ya pueden ser almacenados en elementos de memoria internos, pueden ser enviados hacia un puerto de salida o leídos de un puerto de entrada, y además de esos resultados lo que se generan son condiciones. ¿Qué son las condiciones? Bueno, las condiciones son por ejemplo indicaciones del estilo: "si el contenido de un determinado elemento de memoria es igual a cero", "si es menor que cero", es decir negativo o "si es mayor que cero", es decir positivo. O si dos elementos, un elemento Xi es igual a un elemento Xj, o bien otro tipo de condición. Estas condiciones o indicadores se envían hacia el exterior para que se puedan tomar decisiones en función de tales indicadores. Bien, con esto cerramos la lección y veamos un poco el resumen de lo visto en esta lección. Lo que hemos presentado es otra forma de implementar sistemas digitales mediante sistemas genéricos pre diseñados. En lugar de diseñar sistemas totalmente a medida de un determinado algoritmo, lo que hacemos es utilizar un sistema genérico pre-diseñado. A dicho sistema genérico le llamaremos procesador y el procesador, lo que hace es, recibe, recibe elementos de entrada, ¿de acuerdo? Recibe elementos de entrada, puede transmitir elementos hacia la salida, hacia el exterior, almacena datos internos, hemos visto que teníamos elementos de memoria internos y tiene una serie de recursos de cálculo que le permiten realizar transformaciones sobre la información. Y este es nuestro sistema genérico. Nuestro sistema genérico es capaz de interpretar una serie de instrucciones, interpreta y ejecuta instrucciones utilizando todos estos recursos de almacenamiento, de cálculo de entrada o de salida y como resultado de ejecución de esas instrucciones obtiene unos determinados datos de resultado y unas determinadas condiciones que van hacia el exterior. Entonces para cada algoritmo concreto, es decir tenemos un algoritmo, debemos generar una lista de instrucciones. De instrucciones de esas que hemos visto hace un momento. A estas instrucciones las llamaremos programa. Y esa lista de instrucciones o este programa es el que materializará este algoritmo cuando esas instrucciones de ese programa sean interpretadas por nuestro sistema genérico. Y esta es la forma como un algoritmo o sistema específico, puede materializarse mediante un sistema genérico que también hemos llamado, o llamaremos procesador. Y esto es todo por hoy, muchas gracias y hasta la próxima.