Hola de nuevo. Hoy empezamos la segunda parte de diseño de nuestro procesador. En la primera parte nos dedicamos a la especificación funcional del mismo. Primero vimos las especificaciones funcionales globales y luego la descripción estructural basada en un diagrama que tenía cinco bloques y las interconexiones entre estos bloques. Los cinco bloques fueron descritos mediante la función o algoritmo que cada uno de ellos ejecuta o debe llevar a cabo. Ahora, en esta segunda parte de nuestro diseño cada bloque debe ser implementado mediante componentes digitales como puertas lógicas, multiplexores, biestables y otros. Además, a cada bloque le asociaremos su correspondiente código VHDL. El primer bloque que vamos a implementar es el de selección de entrada. Esta descripción algorítmica que tenemos abajo a la izquierda es la especificación funcional de este bloque. Obsérvese que se trata de un circuito combinacional donde la salida to reg depende única y exclusivamente de las ocho entradas de los puertos de entrada, ocho entradas de datos. Y de la entrada result, que recordemos venía del bloque de recursos de cálculo. El funcionamiento de este bloque depende y está controlado por la instrucción instruction. Y observemos, que de todas las instrucciones posibles, las únicas que afectan a este bloque son la assign value, la data input y la operation. Mientras que para el resto de, de instrucciones este bloque no tiene que hacer nada, dejamos la salida a no importa qué valor. Por lo tanto, para este bloque definimos dos señales de control de forma que tomarán los valores indicados en esta tabla. Definimos dos señales de control bajo el nombre input control, cuyos valores serán cero cero cuando se trate de la instrucción assign value, cero uno cuando se trate de una instrucción data input, uno cero cuando se trate de una instrucción operation y en cualquier otro caso los valores son indeterminados, indefinidos. No nos afectan. Entonces, con la definición de estas señales de control que hemos hecho en esta tabla de aquí, la especificación funcional del bloque se verá ligeramente modificada. Ahora las entradas de nuestro bloque son el índice j, índice incluido en la propia instrucción. Y que define cuál de los puertos de entradas debe conectarse a la salida to reg. El valor constante A, que también viene incluido dentro de la propia instrucción. Y las dos señales de control input control que estaban definidas en esta tabla que tenemos aquí. Además de estas señales están los puertos de entrada desde el IN0 hasta el IN7 y, por último, el resultado que viene de una operación realizada por los recursos de cálculo. Con esta nueva definición de las entradas salidas de nuestro bloque, la especificación modificada sería esta que tenemos aquí a la derecha. Vemos que antes teníamos un case instruction y ahora tenemos un case input control. Cuando las dos señales de input control sean, tengan el valor cero cero, lo que conectamos a la salida to reg es el valor de la constante A incluida en la propia instrucción. Cuando esas dos señales de control tengan el valor cero uno lo que conectamos a la salida to reg es el puerto de entrada indicado por la, por el índice j que venía especificado en la propia instrucción. Y cuando esas dos señales tomen el valor uno cero lo que se conecta a la salida del bloque es el resultado que provenía de nuestro bloque de recursos de cálculo. Y en cualquier otro caso, es decir cuando sea uno uno, no importa cuál sea el valor que tome la, la salida del bloque y por lo tanto lo conectamos a don't care. Veamos ahora una implementación directa de este bloque, y que es la que se muestra en la figura que tenemos aquí a nuestra izquierda. Se trata de una implementación directa mediante multiplexores. Tenemos un multiplexor, este de aquí, con cuatro datos de entrada y que está controlado por las dos señales de control del input control. Su salida, eh, se conecta a la salida to reg, to reg de nuestro bloque. De forma que este multiplexor controla quién se conecta a la salida to reg en cada al instante de tiempo. De esta forma, quien se conectará a esta salida será el valor A cuando input control tome los valores cero cero. Se conectará a uno de los puertos de entrada que vendría por este, por esta señal que tenemos aquí. cuando input control tome el valor cero uno o se conectará a result cuando input control tome el valor uno cero, o a cualquier otro valor, en nuestro caso ese cualquier otro valor lo hemos puesto a cero cuando input control tome el valor uno uno. La selección del puerto de entrada se hace con otro multiplexor, este que tenemos aquí, de ocho entradas de datos donde conectamos los ocho puertos de entrada desde el IN0 al IN7. Y una señal de control que es el índice j incluido en la propia, instrucción y que necesitará, este índice necesitará de tres bits para poder decodificar entre los ocho puertos de entrada cuál de ellos es el que se acaba conectando a la salida de este multiplexor. Ahora, después de haber hecho esta implementación directa basada en multiplexores vamos a ver cómo se puede describir mediante VHDL. En primer lugar hemos definido un package y un paquete dentro del cual hemos declarado una constante m y le hemos dado el valor de ocho, siendo este valor el número de bits de nuestro procesador. Esto lo hacemos para que la descripción de nuestro procesador sea un poco más general, un poco más genérica. Hemos hecho un procesador que almacena y procesa datos de ocho bits. Sin embargo, si todo nuestro procesador lo definimos en función de esta constante m, solo cambiando el valor de dicha constante podremos pasar de un procesador de ocho bits, por ejemplo, a un procesador de 16 bits solo cambiando el valor de esta constante. Obviamente, para que esto funcione en distintas partes de nuestro procesador tendremos que dar definiciones de buses, de número de bits de los buses, o número de bits de los registros en función de esta constante m. Y eso lo iremos viendo a lo largo de las distintas descripciones VHDL que, que haremos a partir de ahora. Otra opción para hacer estas descripciones genéricas es el uso de lo que en VHDL se llama parámetros genéricos y utilizando esas definiciones de parámetros genéricos tanto en la declaración de las entidades, que veremos a continuación, como en las instanciaciones o referencias a dichas entidades. Aquí hemos optado por una opción más general y más sencilla, como es la de la constante m. Después de hacer visibles, tanto paquete estándar del i e cubo 1164, standard logic 1164, como el paquete que acabamos de definir aquí arriba vamos a pasar a declarar la entidad de nuestro bloque de selección de entrada. Dicha declaración, es esta que tenemos aquí, fija el nombre del bloque y declara todos sus puertos de entrada salida. Aquí vemos los ocho puertos de entrada de nuestro procesador, del IN0 al IN7, definidos como vectores de m bits. Dos entradas que son la A y el result que son entradas también de m bits el índice j que es una entrada de tres bits, la entrada input control que es una entrada de dos bits y finalmente la única salida de nuestro bloque que es la salida to reg que de nuevo es una salida de n bits. Y con esto habríamos acabado con la declaración de nuestra entidad para el bloque selección de entrada input selection. Ahora pasemos a ver cómo definimos la arquitectura. Hemos definido una arquitectura que hemos llamado structure y la hemos asociado a la entidad que acabamos de definir, a input selection. En esta arquitectura declaramos una señal selected port especifica de esta arquitectura y que es esta señal interna que nos conecta la salida de un multiplexor a una de las entradas de datos del siguiente, es la salida selected port. A continuación en este begin empieza la definición de la arquitectura y esta arquitectura en la que tenemos que reflejar estos dos multiplexores empezamos describiendo este primer multiplexor que es el multiplexor que tenemos aquí arriba, este primer multiplexor se define mediante un proceso que es este de aquí, que es sensible a todas estas entradas, sensible al índice j y a cualquier cambio en los puertos de entrada y el proceso sencillamente es un case donde se pregunta por el índice j y cuando j es cero cero cero lo que se conecta a la salida, al selected port es el puerto de entrada cero. Cuando es cero cero uno se conecta a la salida del puerto uno y así sucesivamente hasta el puerto seis. En cualquier otro caso you obviamente solo queda el siete y conectamos al puerto de salida el siete. Y con esto habríamos acabado de describir el proceso que nos define a este primer multiplexor que teníamos aquí arriba. Este segundo multiplexor lo describimos también mediante un proceso, que es este de aquí, donde vemos que es un proceso sensible a todas las entradas de este multiplexor, desde la entrada de control y de las correspondientes entradas de datos. Vemos que en función del valor que tenga esta entrada de control, input control, cuando sea cero cero lo que se conecta a la salida es la constante que nos venía por esta entrada A, cuando sea cero uno lo que conectamos es el puerto que habíamos seleccionado con el multiplexor de arriba y cuando es uno cero lo que conectamos es el resultado que nos viene del bloque de recursos de cálculo. Y en cualquier otro caso hemos decidido que la salida no nos importaba que valor tenía pero habíamos decidido que le conectábamos cero. Luego esto es lo que hacemos aquí, conectar la constante cero. Y con esto habríamos completado la descripción VHDL del bloque de selección de entrada. El segundo bloque combinacional es el de recursos de cálculo. Su descripción funcional es muy simple y es esta que vemos aquí, si la entrada de control f es igual a cero entonces el resultado debe almacenar el resultado de sumar los dos operandos de entrada, es decir la suma de left in más right in. En caso contrario, es decir si f es igual a uno entonces el resultado es el resultado de la diferencia de left in menos right in. Recordemos que f es una información que viene en la propia instrucción de operation. El circuito correspondiente para realizar todas estas funciones sería un sumador restador y podría implementarse utilizando los métodos de los componentes que you habríamos descrito en la lección uno de la semana cuatro. Esta función es un circuito combinacional donde el resultado es función única y exclusivamente de cuál sea la función f indicada en la instrucción operation y el valor en ese momento de las entradas left in y right in. Si vamos a ver el modelo VHDL, en primer lugar identificamos y hacemos visibles las distintas librerías que necesitamos, las del i e cubo, tanto la 1164 como las dedicadas a definir operaciones aritméticas con números sin signo, y también nuestro propio package. A continuación una vez hemos hecho visibles estas librerías declaramos la entidad asociada a este bloque. El bloque se llama computation resources y tiene estos puertos de entrada salida. El left in y right in que son vectores de m bits de entrada, la f que nos indica la función que es una señal de un solo bit, y el result que es la señal de salida que de nuevo es un vector de m bits. Y con esto habríamos completado la descripción de la entidad de nuestros recursos de cálculo. Y si vemos una posible arquitectura que hemos llamado behavior asociada a esta entidad, observemos que al utilizar los citados paquetes aritméticos del i e cubo, la descripción de dicha arquitectura es muy simple y se basa en un único proceso donde con una simple instrucción if then else reproducimos de forma casi directa la especificación funcional que habíamos visto antes. De hecho las herramientas de síntesis que traducen estas descripciones de VHDL a circuitos, reconocen las definiciones incluidas en los paquetes aritméticos del i e cubo y en este caso este if then else se convertiría en una instanciación a un sumador restador o una generación de una serie de puertas que acabarían materializando dichos sumador restador y donde la función de suma o resta se definiría en función de esta f que tenemos aquí. Y con esto cerraríamos el bloque de recursos de cálculo para el que hemos visto cual seria el modelo VHDL correspondiente. Y como resumen de esta lección diremos que hemos avanzado en la implementación de dos bloques combinacionales, el de selección de entrada y el de recursos de cálculo generando no solo una implementación directa de los mismos sino también sus correspondientes modelos VHDL. Y con esto cerramos esta sesión.