Hola. En esta lección y en las dos siguientes nos dedicaremos a la implementación de módulos secuenciales que en nuestro procesador son los bloques de selección de salida, output selection, banco de registros, register bank y el bloque go to. El primer bloque secuencial que implementaremos será el de selección de salida o output selection. Esta de aquí, su especificación funcional y you habíamos comentado en sesiones anteriores que los puertos de salida OUT0 a OUT7 son salidas registradas, lo que significa que si el valor de un puerto de salida no se actualiza mediante la instrucción de tipo data output o bien output value, entonces dicho puerto mantiene dicho valor que tenía antes. Luego se trata un circuito con memoria y por lo tanto es un circuito secuencial. El funcionamiento de este bloque depende de la instrucción en curso de ejecución. Y las dos instrucciones que pueden afectar al funcionamiento de este bloque son data output y output value. Luego vamos a definir dos señales, out en y out sel para facilitar el control de este bloque. Out en significa output enable o habilitación de salida y out sel es output selección o selección del dato que vamos a enviar a los puertos de salida. Luego out en será igual a uno cuando la instrucción en curso sea o bien data output o bien output value. Y será igual a cero en cualquier otro caso, para cualquier otro tipo de instrucción. En el caso de out sel, out sel será igual a uno cuando la instrucción en curso sea data output y será a igual a cero cuando la instrucción en curso sea output value. Recordemos que output value significaba que íbamos a sacar saber un puerto de salida el contenido de alguno de los registro del banco de registros y output value significa que vamos a enviar algunos de los puertos de salida el valor de una constante que viene en la propia instrucción. Y en cualquier otro caso el valor de out sel es irrelevante porque las otras instrucciones no afectan a los puertos de salida. Ahora con la definición de señales de control que acabamos de hacer y que está replicada en esta tabla de aquí arriba, la especificación funcional, las entradas salidas de nuestro bloque han cambiado. Aquí tenemos nuestro bloque con las nuevas entradas salidas y esta es la especificación funcional. Las entradas del bloque ahora son las señales de control out en y out sel, el índice i que nos indica el puerto de salida al cual queremos enviar la información que venga de o bien de reg o bien de A, la propia constante A y el índice i es información que está en la propia instrucción y finalmente la señal reg que viene del banco de registros. Como salidas tenemos los ocho puertos de salida. Luego el modelo modificado de especificación es este que tenemos aquí abajo donde cuando la combinación de las entradas de control out en y out sel toma el valor uno uno, lo que sale hacia el puerto de salida indicado por el índice i es el valor que nos entraba por la entrada reg que venía del banco de registros. control toman el valor uno cero lo que sacamos hacia el puerto de salida seleccionado por el índice i es el valor de la constante A que teníamos en la propia instrucción. Y en cualquier otro caso es, lo que marcamos aquí abajo, en cualquier otro caso no hay que hacer ninguna acción, lo que significa que dejamos los puertos de salida sin cambiar, se quedan con los mismos valores que you tenían. Y aquí tenemos una implementación directa de este bloque de selección de salida. Esta implementación utiliza un decodificador de direcciones que en función del índice i selecciona el puerto de salida que debe ser actualizado, entre el cero y el siete, un conjunto de puertas AND que activan o desactivan las salidas del decodificador de direcciones, activan o desactivan en función de la señal de control output enable. Aquí tenemos ocho registros que son los ocho registros correspondientes a los ocho puertos de salida con sus correspondientes señales de habilitación que son las que vienen, son estas ocho señales que vienen del sistema de decodificación de direcciones. Y finalmente un multiplexor de dos entradas de datos que sirve para determinar cuál es la información que se debe guardar en el puerto de salida, o bien la que viene de un registro del banco de registros o bien la constante que viene de la propia instrucción. Esta selección se realiza en función de la otra señal de control, el output sel. Según el valor de output sel conectaremos al puerto seleccionado, enviaremos la información de la constante A o bien la información proveniente del banco de registros. Veamos ahora cómo podemos describir esta implementación directa que hemos visto de este módulo de selección de salida, cómo la podemos describir en VHDL. En primer lugar hacemos visibles tanto las librerías del i e cubo como nuestro paquete de parámetros que you hemos definido anteriormente. Y a continuación pasamos a declarar la entidad, el nombre será output selection y cuyos puertos son estos que tenemos aquí y que se corresponden con esta caja negra con entradas salidas. Vemos que tenemos dos entradas A y reg que son entradas de m bits, que tenemos out output enable y out output selection que son entradas de un bit, el índice i que es un vector de tres bits y después los ocho puertos de salida declarados como vectores también de m bits cada uno de ellos. También hay una señal de reloj clk que tenemos aquí y que no está representada ni en el símbolo de nuestro bloque ni en la descripción de la implementación directa del mismo, pero que es necesaria para sincronizar el funcionamiento de estos registros que hay en los puertos de salida. Hemos definido una arquitectura a la que hemos llamado structure asociada a esta entidad que acabamos de ver y a la que habíamos llamado output selection. Y dentro de esta arquitectura se definen un conjunto de señales propias e internas a esta arquitectura. Estas señales son el DEC OUT que es un conjunto de ocho señales de un bit, y que corresponde a las ocho salidas de nuestro decodificador de direcciones. Otra señal a la que hemos llamado EN que es otro vector de ocho señales de un bit y que corresponde a las ocho señales de habilitación que tenemos al otro lado como resultado de este conjunto de puertas AND. Y finalmente la señal to ports que es una señal de m bits y que conecta la salida del multiplexor que selecciona la información a transmitir al puerto de salida esta señal que se conecta al multiplexor con los distintos puertos de salida. A esa señal la hemos llamado to ports. Después de esta declaración de señales internas y propias de esta arquitectura, empieza el cuerpo propiamente dicho de la arquitectura que estará formado por cuatro procesos. Esos cuatro procesos van a definir distintas partes de este circuito que tenemos aquí a la derecha y sus interconexiones. El primer proceso es el que hemos llamado decoder y es un proceso para describir el decodificador de direcciones. Es un proceso sensible al valor de la entrada y lo que significa que cada vez que haya un cambio en el valor de y va a evaluarse este proceso. Y el proceso lo que hace es mirar cuál es el valor de y, y si ese valor es cero cero cero, es decir cero lo que se hace es poner a uno, habilitar la salida cero la salida cero de nuestro decodificador de direcciones. Cuando este valor de y esté en cero uno, lo que se necesita es la salida uno. Una única salida se habilita y el resto como podemos ver se quedan a cero en todos los casos. Y así sucesivamente hasta que y valga seis, en el que habilitamos la salida seis y por último el resto de casos solo puede ser el siete, habilitaríamos la salida siete. Y con esto cerraríamos, acabaríamos el proceso que describe nuestro decodificador de direcciones. El segundo proceso, este que tenemos aquí le hemos puesto la etiqueta and gate, es un proceso que depende o que es sensible a los cambios en la señal DEC OUT y en la señal out en. El proceso lo que se hace, dentro del proceso lo que se hace es un loop donde una variable que hemos definido aquí como entera, la hacemos seguir una serie de valores que van del cero al siete y para cada uno de esos valores computamos, calculamos el valor de la salida de y, del en de y, es decir, del enable cero, del uno y así hasta el siete. ¿Cómo lo calculamos? Con un producto lógico entre el valor equivalente de la salida de nuestro decodificador de direcciones y la señal de control out en. Cuando ambos son uno, la señal en de la y correspondiente tomará el valor uno. El tercer proceso describe el multiplexor de entrada de datos que tenemos aquí. Es un proceso sensible a la señal de control out sel, a la señal A y a la señal reg, que son las tres entradas de nuestro multiplexor. Si la señal de control out sel es igual a cero, lo que tenemos aquí lo que se conecta a la salida to ports, esta salida de aquí, es el valor de A que venía de la propia instrucción. En cambio si out sel es igual a uno, es decir cuando no es cero a to ports se conecta la entrada reg. Y con esto you tenemos descrito este multiplexor de aquí. El cuarto y último proceso describe los registros de salida. Este es el único proceso sensible a la señal clk que you hemos comentado anteriormente y que no está representada en el circuito de la izquierda. Sensible a una señal clk significa que el proceso se ejecutará cada vez que en esta señal haya un cambio de cero a uno o de uno a cero. En cambio dentro del proceso lo primero que hacemos es preguntar por una condición que es esta condición que tenemos aquí, es si clk tic event y clk igual a uno significa si hay un evento en clk y después de ese evento clk toma el valor uno, esto es tanto como decir que hemos detectado un flanco de subida en la señal clk. Ha pasado del valor cero al valor uno. Y esta es la forma de preguntar. Esta es una de las expresiones típicas del VHDL, no la única pero si una de las más habituales del VHDL para representar el concepto de flanco positivo de reloj, en general flanco positivo de cualquier señal. Todo lo que hay dentro de este if son acciones que solo tendrán lugar si se detecta este flanco positivo, y esta es otra condición típica para considerar a este proceso y por lo tanto al circuito que este proceso representa como circuito secuencial. Luego cuando hay un flanco positivo en clk entonces lo que hacemos es analizar el valor del vector end y en función de cual sea el valor de en, si el valor es un uno y todos ceros, significa que tenemos que la acción de salida se quiere realizar sobre el puerto cero de salida, luego OUT0 le conectamos la señal to ports que teníamos aquí. Si en tiene el valor cero uno y el resto ceros, lo que significa que el puerto que queremos conectar es el OUT1 y así sucesivamente hasta el puerto siete. En el caso de que no haya ningún puerto habilitado, es decir en cualquier otro caso no haríamos nada. No hacer nada significa que los registros de los puertos de salida conservan el valor que you tenían anteriormente. Y como resumen sencillamente decir que hemos implementado el bloque secuencial de selección de salida output selection. Hemos hecho una implementación directa del mismo mediante multiplexores, puertas AND y registros y a su vez hemos desarrollado el correspondiente modelo VHDL de este bloque. Y aquí cerramos esta sesión. Saludos y hasta la próxima.