Sunteți pe pagina 1din 187

IMPLEMENTACIN DEL PROCESADOR ALTERIC T.G.

0421

DIEGO HERNN BELTRN VLEZ MOISS FERNANDO HERRERA BUITRAGO MARCO ANTONIO MAYOLO OBREGN

PONTIFICIA UNIVERSIDAD JAVERIANA FACULTAD DE INGENIERA CARRERA DE INGENIERA ELECTRNICA SANTAF DE BOGOT

2004 IMPLEMENTACIN DEL PROCESADOR ALTERIC T.G. 0421

DIEGO HERNN BELTRN VLEZ MOISS FERNANDO HERRERA BUITRAGO MARCO ANTONIO MAYOLO OBREGN

Informe Final

Director FRANCISCO VIVEROS MORENO Ingeniero Electrnico

PONTIFICIA UNIVERSIDAD JAVERIANA FACULTAD DE INGENIERA CARRERA DE INGENIERA ELECTRNICA SANTAF DE BOGOT

2004 PONTIFICIA UNIVERSIDAD JAVERIANA FACULTAD DE INGENIERA CARRERA DE INGENIERA ELECTRNICA

RECTOR MAGNFICO: DECANO ACADMICO: DECANO DEL MEDIO UNIVERSITARIO: DIRECTOR DE CARRERA: DIRECTOR DEL PROYECTO:

R.P. GERARDO REMOLINA S.J. Ing. ROBERTO ENRIQUE MONTOYA VILLA R.P. ANTONIO JOS SARMIENTO NOVA S.J. Ing. JUAN CARLOS GIRALDO CARVAJAL Ing. FRANCISCO F. VIVEROS MORENO

ARTICULO 23 DE LA RESOLUCIN No. 13 DE JUNIO DE 1946 "La universidad no se hace responsable de los conceptos emitidos por sus alumnos en sus proyectos de grado. Slo velar porque no se publique nada contrario al dogma y la moral catlica y porque los trabajos no contengan ataques o polmicas puramente personales. Antes bien, que se vea en ellos el anhelo de buscar la verdad y la justicia".

AGRADECIMIENTOS La culminacin exitosa de este proyecto fue posible gracias a la colaboracin de muchas personas. En primer lugar, queremos agradecer a nuestro director el Ing. Francisco Viveros quien tuvo la idea de realizar este trabajo de grado y nos supo guiar en el desarrollo de las diferentes etapas del trabajo. A nuestra asesora, la Ing. Alejandra Gonzlez por su apoyo. Al personal del Laboratorio de Ingeniera Electrnica de la universidad, especialmente a John Freddy Snchez y Carlos Gmez por su ayuda en el desarrollo del proyecto. A nuestros padres, por habernos apoyado econmica y anmicamente a lo largo de toda la carrera.

Este trabajo de grado es la culminacin de un largo camino que sin la ayuda de mis padres, mis hermanos y mis amigos no podria estar concluido, a todos ustedes gracias Diego Hernn Beltrn Vlez

Dedico este trabajo de grado a mis padres y hermanos ya que sin su apoyo habra sido imposible lograrlo Moiss Herrera

A mi familia, en especial a mis padres, abuelos y hermanos por todo su apoyo y por los buenos momentos compartidos durante todos estos aos Marco A. Mayolo Obregn

CONTENIDO INTRODUCCIN 1. CARACTERSTICAS DEL PROCESADOR CAMBIOS CON RESPECTO A PCSIM Y E-RIC 2. METODOLOGA DE TRABAJO ETAPA DE INVESTIGACIN ETAPA DE DESARROLLO ETAPA DE PRUEBAS ETAPA DE ENTREGA 3. RESULTADOS OBTENIDOS PRUEBAS PROBLEMAS 4. COSTOS COSTOS ESTIMADOS EN EL ANTEPROYECTO COSTOS REALES 5. CONCLUSIONES BIBLIOGRAFA Anexo A. Dispositivos ACEX 1K Anexo B. Cdigo AHPL del procesador Anexo C. Cambios en el cdigo AHPL Anexo D. Sintaxis de VHDL en MAX+Plus II Anexo E. Legibilidad del programa, mantenimiento y reuso de software Anexo F. Cdigo VHDL desarrollado 10 11 11 14 14 15 16 17 18 18 26 31 31 32 34 35 37 40 56 59 64 68

LISTA DE FIGURAS Figura 1. Arquitectura, unidades funcionales y seales de ALTERIC Figura 2. Inicio de la mquina de estados Figura 3. Instruccin RST Figura 4. Atencin de la interrupcin en modo 1 Figura 5. Retorno de interrupcin en modo 1 Figura 6. Direccin de la rutina de interrupcin en modo daisy Can Figura 7. Atencin de interrupcin en modo 3 Figura 8. Montaje para pruebas en protoboard 11 19 20 20 20 21 21 25

LISTA DE TABLAS Tabla 1. Programa de prueba de simulacin Tabla 2. Programa de prueba en el circuito Tabla 3. Honorarios estimados en el anteproyecto Tabla 4. Hardware y software estimado en el anteproyecto Tabla 5. Costos varios estimados en el anteproyecto Tabla 6. Costos por honorarios Tabla 7. Costos hardware y software Tabla 8. Costos varios 21 23 31 31 31 32 32 33

INTRODUCCIN IMPLEMENTACIN DEL PROCESADOR ALTERIC, consiste en la implementacin de un procesador representativo de 32 bits llamado ALTERIC, basado en el procesador RIC 1, el cual fue diseado originalmente por Frederick J. Hill y Gerald R. Peterson de la Universidad de Arizona. Retrospectivamente en los trabajos de grado relacionados con las diferentes versiones del Simulador Didctico de un Procesador PCSIM, y en E-RIC 2000, al procesador RIC se le agregaron algunas funciones y se le hicieron algunas modificaciones con el fin de presentarlo como una herramienta didctica en el rea de tcnicas digitales. ALTERIC es una implementacin de un procesador real con fines didcticos, que conserva la arquitectura principal y el conjunto de instrucciones del Simulador Didctico de un Procesador PCSIM V2. Es la segunda implementacin en hardware de un proyecto relacionado con el procesador RIC en la Pontificia Universidad Javeriana. En el ao 2000 se realiz el trabajo de grado Procesador didctico E-RIC3 Se ha implementado en el procesador ALTERIC una unidad de control de parada que permite conocer los registros internos del procesador segn instruccin del programa o por un bus de entrada. La implementacin en hardware se hizo sobre un dispositivo de lgica programable de la familia ACEX 1K de Altera, con un circuito impreso de soporte y utilizando el software MAX+Plus II se desarroll el diseo VHDL del procesador.

1 2

Representative Instructional Computer. Trabajo de grado realizado por Gerardo Boada y Javier Caldern en 2003, dirigido por el Ing. Francisco Viveros. Es la versin ms actualizada de PCSIM. 3 Trabajo de grado realizado por Diego Chacn, Oneida Mercado, Fausto Navarro y Jorge Pallares en 2000, dirigido por el Ing. Francisco Viveros.

10

1. CARACTERSTICAS DEL PROCESADOR ALTERIC es un procesador de 32 bits, no comercial, con fines didcticos, que posee la arquitectura principal y el conjunto de instrucciones del procesador RIC modificado de acuerdo a las diferentes versiones del Simulador Didctico de un Procesador PCSIM. Contrario a las versiones de PCSIM, ALTERIC es un procesador real implementado en un dispositivo lgico programable EP1K100QC208-3 de la familia ACEX 1K de Altera. Para realizar la implementacin en el dispositivo lgico programable se utiliz un lenguaje de descripcin de hardware VHDL (VHSIC4 Hardware Description Language) y el software MAX+Plus II de Altera. VHDL es un lenguaje de descripcin de hardware reconocido por la IEEE en el que se pueden describir las entradas, salidas, estructura, comportamiento y funcionamiento de sistemas electrnicos. Tambin se realiz la descripcin del hardware en lenguaje AHPL5 que es el lenguaje en el cual se haba hecho descripcin de hardware en los trabajos de PCSIM. La arquitectura, las entradas y salidas del procesador, el circuito impreso y el conjunto de instrucciones de ALTERIC se explican con detalle en ALTERIC: MANUAL DEL USUARIO que es un documento adjunto a este. Un diagrama general se presenta en la figura 1.

Figura 1. Arquitectura, unidades funcionales y seales de ALTERIC. 1.1 CAMBIOS CON RESPECTO A PCSIM Y E-RIC 1.1.1 Bus espa y Control de parada del programa El bus espa (SBUS) de ALTERIC, comparado con SBUS del procesador E-RIC, puede trabajar en tres modos diferentes, los cuales son: modo normal, instruccin y modo de parada. En E-RIC el SBUS solo trabajaba en el modo que en ALTERIC corresponde al modo normal. El bus espa y sus modos de trabajo se explican con detalle en el captulo CARACTERSTICAS DIDCTICAS de ALTERIC: MANUAL DEL USUARIO.

4 5

Very High Speed Integrated Circuits A Hardware Programming Language

11

1.1.2

Bus de pasos de entrada El bus de pasos de entrada (PBUSIN) es un bus de 7 bits que permite que el usuario detener la mquina de estados en un paso determinado (Pasos entre 0 y 102) del cdigo AHPL y activar la seal ESP para trabajar con el bus espa en modo de parada.

1.1.3

Seales asociadas con el bus espa en modo de parada Las seales ESP, Datinsb, Retor y Datok estn relacionadas con el bus espa al trabajar en modo de parada. Estas seales son exclusivas de ALTERIC.

1.1.4

Instruccin SBI Para trabajar el bus espa en modo instruccin se cre la instruccin del bus espa SBI y un nuevo registro llamado SBR (registro del bus espa).

1.1.5

SBUSSal[3:0] Es un bus de 4 bits que muestra el cdigo del registro que est siendo mostrado a travs del bus espa, este bus es de gran utilidad en los modos instruccin y parada del bus espa.

1.1.6

Instruccin RST En PCSIM y en E-RIC, al ejecutarse la instruccin RST el procesador buscaba la direccin de la primera instruccin a realizar despus del reset por software en el dato de la direccin FFFFFFh, el cual es la ltima direccin posible ya que el bus de direcciones del procesador es de 24 bits. ALTERIC para asegurar una posicin en memoria ROM 6, busca el dato de la direccin 0007FFh y este dato lo asigna al PC como direccin de la primera instruccin a realizar despus del reset por software.

1.1.7

Instrucciones IMP y EXP En PCSIM y E-RIC, al ejecutarse las instrucciones IMP y EXP el bus de direcciones tomaba las direcciones entre 000000h y 00003Fh las cuales son direcciones ocupadas por ROM, donde segn el mapa de memoria se encuentran las instrucciones a ejecutar. ALTERIC al ejecutar dichas instrucciones, pondr en el bus de direcciones, direcciones entre 000C00h y 000C3Fh. Los 6 bits menos significativos en el bus de direcciones corresponden a los bits del nmero del perifrico dado en la instruccin.

1.1.8

Seales Read y Write En PCSIM y E-RIC, estas seales se activaban con un uno lgico en sus salidas. ALTERIC activa estas seales con cero lgico en sus salidas, para hacerlas compatibles con las entradas para lectura y escritura de las memorias ROM y RAM7 que se trabajan en los laboratorios de la asignaturas Arquitectura de Procesadores I y II.

6 7

Read only memory Random access memory

12

1.1.9

Registro de Estados (SR) En PCSIM y E-RIC, el registro de estados SR se implement como un registro de 8 bits, en ALTERIC este registro se implement con 6 bits, pues los 2 bits restantes son innecesarios.

1.1.10 Distribucin de los bits en los registros En PCSIM y E-RIC todos los registros y buses (exceptuando el PBUS) tenan el bit 0 como su bit ms significativo. En ALTERIC, solamente el registro de instrucciones IR conserva dicha distribucin de bits dentro del registro. Los otros registros y todos los buses tienen al bit 0 como su bit menos significativo. 1.1.11 Atencin y retorno de las interrupciones En PCSIM y E-RIC la mayora de los registros se guardaban en la pila en el momento de atender una interrupcin. ALTERIC solamente guarda en la pila el contenido de los registros SR y PC. 1.1.12 Cambios en el cdigo AHPL Se pens en basar el cdigo AHPL de ALTERIC en el cdigo AHPL de la ltima versin de PCSIM, pero se opt por emplear el cdigo AHPL de E-RIC que en s es un procesador real y no un simulador. Debido a los cambios anteriormente mencionados, fue necesario aumentar y corregir algunos pasos en el cdigo AHPL para la implementacin del bus espa como instruccin y el control de parada, adems fue necesario replantear algunos pasos relacionados con la atencin y retorno de interrupciones. Para la ejecucin de algunas instrucciones, el procesador E-RIC salta al paso 148, al 150 o al 151 del cdigo AHPL para luego regresar al paso siguiente al interrumpir la secuencia. En ALTERIC estos pasos fueron reestructurados, de manera que el procesador sigue una secuencia de instrucciones consecutivas. Esto se explica con detalle en el anexo Cambios al cdigo AHPL.

13

2. METODOLOGA DE TRABAJO Segn lo planteado en el anteproyecto, para la realizacin del trabajo de grado se tendran en cuenta cuatro etapas: Investigacin, desarrollo, la etapa pruebas y revisiones y la etapa de entrega. Como el desarrollo del trabajo requera tanto de software (implementacin del procesador en cdigo VHDL) como de hardware (implementacin de ALTERIC en el dispositivo lgico programable), las tres primeras etapas del trabajo se subdividieron en dos partes: una para el desarrollo del software y otra para la implementacin en hardware. En el desarrollo del software se abord el problema con una visin de problemtica de Software 8, permitiendo que el cdigo realizado para el procesador ALTERIC sirva como punto de partida para posteriores desarrollos de procesadores didcticos. (para mayor informacin remtase al Anexo Legibilidad del programa, mantenimiento y reuso de software) 2.1 ETAPA DE INVESTIGACIN La primera parte del trabajo de grado consisti en la recopilacin de informacin acerca de los procesadores PCSIM y E-RIC, desarrollo de software, legibilidad de cdigo, reuso y mantenimiento de software, como tambin en la recopilacin de informacin sobre el dispositivo lgico programable EP1K100QC208-3. Una vez recopilada la informacin se procedi a seleccionarla y estudiarla. 2.1.1 Investigacin sobre el cdigo AHPL de PCSIM y E-RIC Se recopil informacin correspondiente al cdigo AHPL de cada uno de estos desarrollos de procesadores didcticos. Debido a que PCSIM es un procesador simulado y E-RIC un procesador real, se opt por tener en cuenta como base para el desarrollo AHPL de ALTERIC el cdigo del procesador E-RIC. 2.1.2 Investigacin sobre el lenguaje VHDL Se recopil informacin necesaria sobre el lenguaje de descripcin de hardware VHDL (estndar 1076-1993 de la IEEE) y sobre el programa MAX+Plus II de Altera, y la manera de desarrollar VHDL sobre MAX+Plus II. 2.1.3 Investigacin acerca del dispositivo lgico programable En la pgina web de Altera se consigui informacin correspondiente a la hoja de datos (data sheet) de la familia de dispositivos lgicos programables ACEX 1K, en la cual se hace una descripcin funcional de estos dispositivos. En la hoja de datos de los dispositivos ACEX 1K se encontr informacin sobre JTAG9 (estndar 1149.1 de la IEEE) y el ByteBlasterMV como opcin para realizar la configuracin del dispositivo, por lo que fue necesario consultar la hoja de datos del ByteBlasterMV. En esta hoja de datos se describe la conexin necesaria entre el puerto
8

G. Agustn,Ingeniera del software: prctica de la programacin.Addison-Wesley Iberoamericana. Wilmington, Delaware, 1991. 9 Joint Test Action Group

14

paralelo de un PC, la interfaz de programacin ByteBlasterMV y los pines en el dispositivo ACEX 1K destinados para esta funcin. La hoja de datos de los dispositivos ACEX 1K no tena informacin acerca del pinout de los dispositivos, por lo que tambin fue necesario consultar la hoja de datos del pinout de los dispositivos EP1K100. En esta hoja de datos, se lleg a saber que el nmero de pines disponibles para entrada y salida en el dispositivo EP1K100QC208-3 era de 147. 2.1.4 Investigacin acerca de OrCAD Se recopil informacin en los manuales de OrCAD acerca de los programas Layout, necesarios para el diseo del circuito impreso que contiene el dispositivo lgico EP1K100QC208-3 y la interfaz de programacin ByteBlasterMV. 2.1.5 Investigacin acerca el desarrollo del Software Se recopil informacin y metodologa de trabajo con respecto al desarrollo de software, es decir, todos los cdigos escritos que implican la implementacin del procesador ALTERIC en AHPL, VHDL y programa demostrativo para las memorias ROM. 2.2 ETAPA DE DESARROLLO Una vez recopilada y seleccionada la informacin se procedi a iniciar la implementacin del procesador en cdigo VHDL y el diseo del circuito impreso, de forma paralela. 2.2.1 Cdigo AHPL Se desarrolla el cdigo AHPL para el procesador ALTERIC Teniendo en cuenta el cdigo AHPL del procesador E-RIC, al cual se le incorporan mltiples cambios y mejoras. Para ms informacin, remtase al Anexo Cambios en el cdigo AHPL. Se procede a aplicar las recomendaciones y mejores prcticas de documentacin de software, con miras a mejorar la legibilidad del cdigo AHPL y as facilitar futuros desarrollos y cambios basados en ALTERIC. Se dedica todo un captulo en el manual del usuario "EXPLICACIN DEL CDIGO AHPL" y el cdigo AHPL en s es un Anexo de este informe. Para informacin acerca de las recomendaciones y mejores prcticas de documentacin de software, remtase al Anexo Legibilidad del programa, mantenimiento y reuso de software. 2.2.2 Implementacin del procesador en cdigo VHDL Con la informacin recolectada acerca VHDL y MAX+Plus II, se procedi a implementar el procesador por bloques (entidades), basado en el cdigo AHPL previamente desarrollado para ALTERIC. Se procede a aplicar las recomendaciones y mejores prcticas de documentacin de software, con miras a mejorar la legibilidad del cdigo VHDL y as facilitar futuros desarrollos y cambios basados en ALTERIC. El cdigo VHDL es profusamente comentado y se anexa a este informe. Para informacin acerca de las recomendaciones y mejores

15

prcticas de documentacin de software, remtase al Anexo Legibilidad del programa, mantenimiento y reuso de software. Primero se implement el bloque o entidad de la ALU10 y los bloques pertenecientes a esta tales como el sumador y los bloques utilizados en las instrucciones de rotacin y desplazamiento. Al tener listo el bloque de la ALU, se procedi a implementar el bloque de la arquitectura con sus bloques correspondientes tales como la ALU, los registros, buses y seales de control para cada uno de estos. Despus, de acuerdo con el cdigo AHPL y con las seales de control para los buses y registros del procesador, se implement la mquina de estados y sus bloques correspondientes como las funciones necesarias para cambiar de estado y las seales de control especficas para cada estado de la mquina. Al tener la arquitectura y la mquina de estados, se implement procesador como entidad general. La ltima entidad en implementarse fue la entidad llamada parada que permite que el bus espa trabaje en modo de parada. Cada uno de estos bloques o entidades se explica con detalle en el captulo ENTIDADES VHDL de ALTERIC: MANUAL DEL USUARIO. 2.2.3 Diseo del circuito impreso Con la ayuda de la herramienta Layout Plus de OrCAD Release 9.1 y con la informacin acerca de la interfaz de programacin y el pinout del EP1K100QC208-3 se dise un circuito impreso de doble capa de 19,8 cm por 12,1 cm que contiene el dispositivo lgico, la interfaz de programacin, reguladores de voltaje. Para ms informacin remtase al captulo CIRCUITO IMPRESO de ALTERIC: MANUAL DEL USUARIO. 2.3 ETAPA DE PRUEBAS 2.3.1 Pruebas hechas en simulacin Una vez implementadas y compiladas todas las entidades del procesador en cdigo VHDL, se procedi a realizar pruebas de simulacin en MAX+Plus II. Se crearon siete programas (archivos con extensin .scf) para comprobar el funcionamiento de las instrucciones, sus modos de seleccin de posicin de memoria, los modos de interrupcin y los modos de trabajo del bus espa. Estas pruebas arrojaron resultados satisfactorios, por lo que se decidi crear un nico programa (alteric.scf) que rene la mayora de las instrucciones y sus modos de seleccin de posicin de memoria, los 3 modos de interrupcin y los 3 modos de trabajo del bus espa. Para ms informacin sobre la prueba de simulacin, remtase a la seccin Pruebas de simulacin.

2.3.2
10

Pruebas al circuito impreso

Arithmetic and Logic Unit

16

Tan pronto se complet el diseo e implementacin del circuito impreso, se procedi a configurar el dispositivo lgico programable. Para comprobar el buen funcionamiento del circuito, al PLD se le program la entidad FLAG que tiene como entradas una seal de reloj, una seal para hacer carga, una seal para borrado, un dato de un bit y una salida de un bit. La entidad FLAG se program de una manera satisfactoria. Antes de configurar ALTERIC en el PLD, se realiz el montaje en protoboard de la circuitera externa al procesador, esta incluye memorias ROM y RAM, reloj, reset y una PAL11 que realiza la lgica de seleccin de memoria. Al estar lista la circuitera externa, se programaron las ROM para que el procesador ejecutara las instrucciones NOP y HLT. Cuando se configur ALTERIC en el PLD el resultado fue el esperado. Para ms informacin remtase a la seccin Pruebas en el circuito. 2.3.3 Programacin de las memorias ROM Al comprobar que el procesador poda ser configurado en el dispositivo lgico, los programas que se haban creado como prueba en simulacin, fueron aprovechados para crear archivos .ASM con los OpCode12 apropiados para configurar las 4 memorias ROM necesarias para la implementacin en Hardware del procesador ALTERIC. Todas las pruebas arrojaron resultados satisfactorios. Como prueba final se desarroll un programa en las memorias ROM que incluye todas las instrucciones con sus modos de seleccin de posicin de memoria, los modos de funcionamiento del control de parada y bus espa y los tres modos de interrupcin. Tambin el programa desarrollado que configura las memorias ROM es documentado y realizado bajo los principios apropiados para su desarrollo, como parte importante del soporte de software requerido por el procesador didctico ALTERIC. Se procede a aplicar las recomendaciones y mejores prcticas de documentacin de software, con miras a mejorar la legibilidad del cdigo implementado en las memorias ROM y as facilitar futuros desarrollos y cambios basados en ALTERIC. Los programas desarrollados para las memorias ROM son anexadas en este informe. Para informacin acerca de las recomendaciones y mejores prcticas de documentacin de software, remtase al Anexo Legibilidad del programa, mantenimiento y reuso de software. 2.4 ETAPA DE ENTREGA Una vez superadas las etapas anteriores, se procedi a preparar la entrega para sustentacin ante el Comit de Trabajo de Grado que incluye este informe final, el manual del usuario y un documento IEEE.

3. RESULTADOS OBTENIDOS
11 12

Programmable Array Logic Operation Code

17

El objetivo general del trabajo de grado es Implementar el procesador RIC modificado de acuerdo con las diversas versiones de PCSIM en un PLD de la familia ACEX 1K de Altera. El objetivo se cumpli, pues el procesador ALTERIC pudo implementarse en el dispositivo EP1K100QC208-3 que pertenece a la familia de dispositivos lgicos programables ACEX 1K. Los objetivos especficos se cumplieron ya que ALTERIC conserva la arquitectura y el conjunto de instrucciones del procesador RIC y adems posee un bus espa que permite que los usuarios puedan conocer el contenido de uno o varios de los registros internos del procesador. ALTERIC tiene como caractersticas didcticas al bus espa, control de parada y los buses de pasos de entrada y salida, esto puede observarse en el captulo CARACTERSTICAS DIDCTICAS de ALTERIC: MANUAL DEL USUARIO. El software resultante de este trabajo sirve como fundamento para trabajos posteriores sobre procesadores didcticos, al tener desde su concepcin los conceptos de legibilidad, mantenimiento y reuso de los programas AHPL, VHDL y cdigo para las memorias ROM. 3.1 PRUEBAS 3.1.1 Pruebas de simulacin Una vez terminada la programacin en lenguaje VHDL del procesador ALTERIC, se hizo una prueba de simulacin que incluye la mayora de las instrucciones con sus modos de seleccin de posicin de memoria y los tres modos de interrupcin. El programa fue simulado en MAX+Plus II, los datos de la simulacin estn en representacin hexadecimal. El DBUS es un solo bus, pero en la simulacin se puede observar que sucede con los datos de entrada y los datos de salida del mismo. Al inicio (inicio de la mquina de estados) del programa, el procesador lee el dato de la direccin 000000h, este dato es el 00000010h, los 24 bits menos significativos de este dato son la direccin de la primera instruccin del programa. Tambin se lee el dato de la direccin 000008h, este dato es el 00001080h, los 24 bits menos significativos de este dato representan la direccin donde se implementar la pila. (Ver figura 2) La primera instruccin a ejecutar se encuentra en la direccin 000010h, el procesador lee el dato que se encuentra en dicha direccin, hace fetch de la instruccin y procede a ejecutarla. Lo mismo sucede con las instrucciones siguientes. En la direccin 000017h la instruccin a ejecutar es RST (Reset por software), el procesador debe leer el dato que se encuentra en la direccin 0007FFh, los 24 bits menos significativos de este dato (000020h) representan la direccin de la primera instruccin despus del RST. (Ver figuras 2 y 3) En la direccin 00002Fh el procesador tiene activa la bandera ie y el modo de interrupcin en modo 1, al entrar el procesador en HLT, se espera una seal de Int para atender la interrupcin. Al atender la interrupcin el contenido de algunos de los registros se guarda en la pila. Por ser interrupcin en modo 1 el procesador lee el dato que se encuentra en la direccin 000001h. Los 24 bits menos significativos de este dato (0000C0h) representan la direccin de la primera instruccin de la rutina de interrupcin. (Ver figura 4) 18

En la direccin 0000C2h la instruccin a ejecutar es RTI (retorno de interrupcin), el procesador regresa de la pila los datos de cada uno de los registros y regresa a ejecutar la instruccin que se encuentra en la direccin siguiente a la que se atendi la interrupcin, en este caso la direccin 000030h. (Ver figura 5) En la direccin 000036h el procesador tiene activa la bandera ie y el modo de interrupcin en modo daisy chain, al entrar el procesador en HLT, se espera una seal de Int para atender la interrupcin. Al atender la interrupcin el contenido de algunos de los registros se guarda en la pila. Por ser interrupcin en modo daisy chain el procesador lee un dato desde el perifrico (ver figura 6), a travs de DBUS. Los 24 bits menos significativos de este dato (0000C6h) representan la direccin de la primera instruccin de la rutina de interrupcin. En la direccin 0000CBh la instruccin a ejecutar es RTI (retorno de interrupcin), el procesador regresa de la pila los datos de cada uno de los registros y regresa a ejecutar la instruccin que se encuentra en la direccin siguiente a la que se atendi la interrupcin, en este caso la direccin 000036h. En la direccin 000046h el procesador tiene activa la bandera ie y el modo de interrupcin en modo 3, al entrar el procesador en HLT, se evala que el valor de la seal de entrada PREIN sea mayor al dato contenido (Ver figura 7) en el registro PR para atender la interrupcin. Al atender la interrupcin el contenido de algunos de los registros se guarda en la pila. Por ser interrupcin en modo 3, al estar las lneas de PREIN con el dato 5h el procesador lee el dato que se encuentra en la direccin 000005h. Los 24 bits menos significativos de este dato (0000D0h) representan la direccin de la primera instruccin de la rutina de interrupcin. En la direccin 0000D1h la instruccin a ejecutar es RTI (retorno de interrupcin), el procesador regresa de la pila los datos de cada uno de los registros y regresa a ejecutar la instruccin que se encuentra en la direccin siguiente a la que se atendi la interrupcin, en este caso la direccin 000047h.

Figura 2. Inicio de la mquina de estados

19

Figura 3. Instruccin RST

Figura 4. Atencin de la interrupcin en modo 1

Figura 5. Retorno de interrupcin en modo 1

20

Figura 6. Direccin de la rutina de interrupcin en modo daisy chain

Figura 7. Atencin de interrupcin en modo 3 Tabla 1. Programa de prueba de simulacin


Direccin HEX 000000 000001 ... 000005 ... 000008 ... 000010 000011 000012 000013 000014 000015 000016 Dato HEX 00000010 000000C0 000000D0 00001080 F032F030 C9001150 D8001156 2C800000 68001125 E5002420 E540C400 Instruccin 1 Instruccin 2 Explicacin 1 Explicacin 2

Direccin de la primera instruccin del programa es 000010h Direccin de la primera instruccin de la rutina de interrupcin en modo 1 es 0000C0h Direccin de la primera instruccin de la rutina de interrupcin en modo 3 es 0000D0h Direccin donde se implementar la pila es 001080h SBI 12 INC {(001150)} DEC {001156} MVT 800000 MVF (000025) PSH POP SBI 10 SBUS = Todos {(001150)} <-{(001150)}+1 {001156} <- {001156} - 1 AC <- FF800000h (001125) <- AC (SP-1) <- AC AC <- SP, SP <- SP+1 SBUS = Grupo 1

MVT (00) NOP

AC <- 00000000 NOP

21

000017 ... 000020 000021 000022 000023 000024 000025 000026 000027 000028 000029 00002A 00002B 00002C 00002D 00002E 00002F 000030 000031 000032 000033 000034 000035 000036 000037 ... 000045 000046 000047 ... 000050 000051 000052 000053 000054 ... 000060 000061 000062 ... 000085 000086 ... 0000A7 0000A8 0000A9 ... 0000BA ... 0000C0 0000C1 0000C2 ... 0000C6 0000C7 0000C8 0000C9

C400C4C0 F035F03C F03EF02C F02DF02E F02FF037 28000250 2440C400 29000251 2600C400 2A000251 2480C400 2B000253 24C0C400 2C800000 25002548 2581D640 D740C440 08000281 14484486 59000251 84C4954F A4403606 D780D640 C400C440 F8000045 5540D7C0 D640C440 78000008 E8000060 5440C400 7C00000D C400E440 7B000030 2C000005 5540C400 C400E5C0 C400E400 7A800020 5540C400 7A040010 7A020010 C400C440 2C000003 D44FC400 C400D680 2C0019A2 62236022 6008662C 66106424

NOP SBI 15 SBI 1E SBI 0D SBI 0F MVT (000250) MVT (RA,AC) MVT {(000251)} MVT (IX,AC) MVT {000251+IX} MVT (RB,AC) MVT {(000253)+IX} MVT (RC,AC) MVT 800000 MVT (RD,AC) MVT (RF,RA) IM1 SBC (000281) SUB (RA,IX) ADD {(000251)} ORA (RC,RD) XOR (RA,AC) IM2 NOP JMP 000045 ADD (RE,AC) SIE BRA 0008 JSR 000060 ADD (RA,AC) BSR 000D NOP BCS 0030 MVT 000005 ADD (RE,AC) NOP NOP BNC 0020 ADD (RE,AC) BVS 0010 BNV 0010 NOP MVT 000003 EXP 0F NOP MVT 0019A2 LSR 03 SHL 08 ROL 10

RST SBI 1C SBI 0C SBI 0E SBI 17 NOP NOP NOP NOP MVT (RE,IX) SIE HLT ADC (RB,RF) AND (RE,SP) CMP (IX,RF) SIE HLT

NOP SBUS = Grupo 2 SBUS = Grupo 4 SBUS = IR SBUS = SHC AC <- {000250} RA <- AC AC <- {(000251)} IX <- AC AC<- {000251+IX} RB <- AC AC <- {(000253)+IX} RC <- AC AC <- FF800000h RD <- AC RF <- RA MR <- 01b AC <- AC - {000281} RA <- RA - IX AC <- AC + {(000251)} RC <- RC RD RA <- RA AC MR <- 02b NOP PC <- 000045h RE <- RE + AC Ief <- 1 PC <- PC + 000008h (SP - 1) <- PC, PC <- 000060h RA <- RA + AC (SP - 1) <- PC, PC <- PC + 00000Dh NOP PC <- PC + 000030h AC <- 00000005h RE <- RE + AC NOP NOP PC <- PC + 000020h RE <- RE + AC PC <- PC + 000010h PC <- PC + 000010h NOP AC <- 00000003h (000C0F) <- AC NOP AC <- 000019A2h AC <- LSR (AC,3) AC <- SHL (AC,8) AC <- ROL (AC,16)

PC <- (0007FF) SBUS = Grupo 3 SBUS = IX SBUS = PR, MR SBUS = Ninguno NOP NOP NOP NOP RE <- IX Ief <- 1 HALT RB <- RB + RF + C RE <- RE SP IX - RF ? Ief <- 1 HALT

IM3 HLT

MR <- 03b HALT

NOP SEC

NOP Carry <- 1

NOP RTS CLC

NOP PC <- {SP}, SP <- SP+1 Carry <- 0

NOP

NOP

HLT

HALT

NOP RTI

NOP RTI

ASR 02 ROR 0C RRC 04

AC <- ASR (AC,2) AC <- ROR (AC,12) AC <- RRC (AC,4)

22

0000CA 0000CB ... 0000D0 0000D1 ... 000150 ... 000250 000251 ... 000253 ... 000258 000259 ... 00025B ... 000281 ... 0007FF ... ... 001080

6406F024 C400D680 D403C400 F025D680 00001155 8C0FC101 00000258 00000253 00000008 0F0000F0 000F0001 80000000 00000020

RLC 06 NOP IMP 03 SBI 05

SBI 04 RTI NOP RTI

AC <- RLC (AC,6) NOP AC <- (000C03) SBUS = AC

SBUS = SR RTI NOP RTI

Direccin de la primera instruccin despus de RST es 000020h SP

3.1.2

Pruebas en el circuito Se crearon varios programas de prueba que se grabaron en las memorias ROM, todos funcionaron de manera correcta por lo que al final se grab en las memorias ROM un programa de pruebas que reuna los programas creados con anterioridad. Este programa incluye las instrucciones con sus modos de seleccin de posicin y los tres modos de interrupcin. Tabla 2. Programa de prueba en el circuito

Direccin HEX 000000 000001 000002 000003 000004 000005 000006 000007 000008 ... 000010 000011 000012 000013 000014

Dato HEX 00000010 00000032 00000040 00000032 00000040 00000032 00000040 00000032 00001080 2C000003 68001160 2C001160 68001150 2C00000A

Instruccin 1

Instruccin 2

Explicacin 1

Explicacin 2

Direccin de la primera instruccin del programa es 000010h Direccin de la primera instruccin de la rutina de interrupcin en modo 1 es 000032h Direccin de la primera instruccin de la rutina de interrupcin en modo 3, perifrico 2 es 000040h Direccin de la primera instruccin de la rutina de interrupcin en modo 3, perifrico 3 es 000032h Direccin de la primera instruccin de la rutina de interrupcin en modo 3, perifrico 4 es 000040h Direccin de la primera instruccin de la rutina de interrupcin en modo 3, perifrico 5 es 000032h Direccin de la primera instruccin de la rutina de interrupcin en modo 3, perifrico 6 es 000040h Direccin de la primera instruccin de la rutina de interrupcin en modo 3, perifrico 7 es 000032h Direccin donde se implementar la pila es 001080h MVT 000003 MVF (001160) MVT 001160 MVF (001150) MVT 00000A AC <- 00000003h (001160)<-AC AC <- 00001160h (001150) <- AC AC <- 000000Ah

23

000015 000016 000017 000018 000019 00001A 00001B 00001C 00001D 00001E 00001F 000020 000021 000022 000023 000024 000025 000026 000027 000028 000029 00002A 00002B 00002C 00002D ... 000030 000031 000032 000033 000034 000035 000036 000037 000038 000039 00003A 00003B 00003C 00003D 00003E 00003F 000040 000041 000042 000043 000044 000045 000046 000047 000048 000049 00004A 00004B 00004C 00004D 00004E 00004F 000050

68001155 C9001150 D8001155 E5002420 E540C400 28001155 24402480 29001150 2600C400 2A001151 24C02500 2B000000 2581C400 08001155 14484486 59001150 84C4954F A4403606 62236022 60046625 66036424 6405B403 F8000030 F032C400 F800004D 5540C400 78000004 2C0FFFFE F8000054 2C0FFFFE F800005B E800003B 5540C400 7C000002 C400E400 7A800002 5540C400 C400E5C0 5540C400 7A040002 7A020002 2C0FFFFE F800005E F020F021 F022F023 F024F025 F026F027 F028F029 F02AF02B F02CF02D F02EF02F F030F035 F03CF03E F032C4C0 D640D740 C400C440 C400D780 D640C440

MVF (001155) INC {(0001150)} DEC (001155) PSH POP MVT 001155 MVT (RA,AC) MVT {(001150)} MVT (IX,AC) MVT {001151+IX} MVT (RC,AC) MVT {(000000)+IX} MVT (RF,RA) SBC (001155) SUB (RA,IX) ADD {(001150)} ORA (RC,RD) XOR (RA,AC) LSR 03 SHL 04 ROL 03 RLC 06 JMP 000030 SBI 10010 JMP 00004D ADD (RE,AC) BRA 0004 MVT 0FFFFE JMP 000054 MVT 0FFFFE JMP 00005B JSR 00003B ADD (RE,AC) BSR 0002 N OP BNC 0002 ADD (RE,AC) C400E5C0 ADD (RE,AC) BVS 0002 BNV 0002 MVT 0FFFFE JMP 00005B SBI 00000 SBI 00010 SBI 00100 SBI 00110 SBI 01000 SBI 01010 SBI 01100 SBI 01110 SBI 10000 SBI 11100 SBI 10010 SIE NOP NOP SIE

MVT (00) NOP MVT (RB,AC) NOP MVT (RD,AC) NOP ADC (RB,RF) AND (RE,SP) CMP (IX,RF) ASR 02 ROR 05 RRC 04 BIT (AC,RC) NOP

(001155) <- AC {(001150)}<-{(001150)}+ 1 (001155) <- (001155) + 1 (SP-1) <- AC AC <- SP, SP <- SP+1 AC <- 00001155h RA <- AC AC <- {(001150)} IX <- AC AC<- {001151+IX} RC <- AC AC <- {(000000)+IX} RF <- RA AC <- AC - {001155} RA <- RA - IX AC <- AC + {(001150)} RC <- RC RD RA <- RA AC AC <- LSR (AC,3) AC <- SHL (AC,4) AC <- ROL (AC,3) AC <- RLC (AC,6) PC <- 000030h SBUS = Todos PC <- 00004Dh AC <- AC - {000281} PC <- PC + 000004h AC <- 000FFFFEh PC <- 000054h AC <- 000FFFFEh PC <- 00005Bh (SP - 1) <- PC, PC <- 00003Bh RE <- RE + AC (SP - 1) <- PC, PC <- PC + 000002h NOP PC <- PC + 000002h RE <- RE + AC RTS RE <- RE + AC PC <- PC + 000002h PC <- PC + 000002h AC <- 000FFFFEh PC <- 00005Eh SBUS = MD SBUS = PC SBUS = SR SBUS = RA SBUS = RC SBUS = RE SBUS = IX SBUS = PR, MR SBUS = Grupo 1 SBUS = Grupo 3 SBUS = Todos Ief <- 1 NOP NOP Ief <- 1

AC <-0000000h NOP RB <- AC NOP RD <- AC NOP RB <- RB + RF + C RE <- RE SP IX - RF ? AC <- ASR (AC,2) AC <- ROR (AC,5) AC <- RRC (AC,4) AC RC? NOP

NOP

NOP

NOP SEC NOP NOP NOP

NOP Carry <- 1 NOP NOP NOP

SBI 00001 SBI 00011 SBI 00101 SBI 00111 SBI 01001 SBI 01011 SBI 01101 SBI 01111 SBI 10101 SBI 11110 RST IM1 HLT IM2 HLT

SBUS = MA SBUS = SP SBUS = AC SBUS = RB SBUS = RD SBUS = RF SBUS = IR SBUS = SHC SBUS = Grupo 2 SBUS = Grupo 4 PC <- (0007FF) MR <- 01b HALT MR <- 02b HALT

24

000051 000052 000053 000054 000055 000056 000057 000058 000059 00005A 00005B 00005C 00005D 00005E 00005F 000060 000061 000062 000063 000064 ... ... 0007FF

C400D7C0 D640C440 F8000052 2440C400 2C000025 D440D440 14611461 7A400001 7A20FFFC D440D680 2440C400 D401C400 F8000056 2480C400 2C000005 D440D440 14A114A1 7A400001 7A20FFFC D440D680

NOP SIE JMP 000052 MVT (RA,AC) MVT 000025 EXP 00 SUB (RA, 1) BEQ 0001 BNE FFFC EXP 00 MVT (RA,AC) IMP 01 JMP 000056 MVT (RB,AC) MVT 000005 EXP 00 SUB (RB, 1) BEQ 0001 BNE FFFC EXP 00 SP

IM3 HLT NOP EXP 00 SUB (RA, 1)

RTI NOP NOP NOP EXP 00 SUB (RB, 1)

RTI

NOP Ief <- 1 PC <- 000052h RA <- AC AC <- 00000025h (000C00) <- AC RA <- RA 00000001h PC <- PC + 000001h PC <- PC + FFFFCh (000C00) <- AC RA <- AC AC <- (000C01) PC <- 000056h RB <- AC AC <- 00000005h (000C00) <- AC RB <- RB 00000001h PC <- PC + 000001h PC <- PC + FFFFCh (000C00) <- AC

MR <- 11b HALT NOP (000C00) <- AC RA <- RA 1h

RTI NOP NOP NOP (000C00) <- AC RB <- RB 1h

RTI

Figura 8.Montaje para pruebas en protoboard

25

3.2 PROBLEMAS En las diferentes etapas del trabajo de grado se presentaron grandes dificultades que afortunadamente pudieron ser superadas a tiempo para poder cumplir con los objetivos planteados. 3.2.1 Problemas con el software Quartus II La primera dificultad fue la no consecucin de la licencia de Quartus II, lo que conllev a que la implementacin en VHDL se hiciera usando el programa MAX+Plus II. 3.2.2 Problemas en la entrega del proyecto En la poca en la cual el proyecto del trabajo deba ser presentado al Comit de Trabajo de Grado, el director del trabajo Ing. Francisco Viveros se encontraba fuera del pas y la asesora del trabajo Ing. Alejandra Gonzlez se encontraba incapacitada, lo que caus un retraso de una semana en la entrega del proyecto. 3.2.3 Problemas con los cdigos AHPL y VHDL Antes de comenzar con la programacin en VHDL, se estudiaron los cdigos AHPL de los procesadores PCSIM y E-RIC, este ltimo, que al igual que ALTERIC, tiene el mismo conjunto de instrucciones y arquitectura del RIC. Al estudiar el AHPL se eligi fundamentar el cdigo AHPL de ALTERIC con el cdigo AHPL del procesador E-RIC. Se le hizo un estudio exhaustivo al cdigo AHPL y la tabla de decodificacin de las instrucciones, para entenderlos y adaptarlos a las necesidades de ALTERIC. Se hicieron correcciones y cambios en aproximadamente el 20% de los pasos del cdigo AHPL y cambios en las instrucciones RST, IMP y EXP, adems se le aadi la instruccin SBI (Instruccin del bus espa) y los pasos del bus espa en modo de parada. En el desarrollo de software fue difcil seguir las recomendaciones para documentar el software AHPL y VHDL, ya que todos aprendimos nociones bsicas de programacin en la carrera y nunca cmo documentar como desarrollar un diseo de software. Al tener listo el cdigo AHPL se procedi a realizar la implementacin en VHDL para el procesador ALTERIC. El primer bloque o entidad que se implement fue el bloque de la ALU con dos entradas de 32 bits, una entrada de acarreo, una entrada de control de 5 bits, una salida de 32 bits y 4 salidas correspondientes a las banderas C, N, Z y Of. Por ser la ALU la unidad aritmtica y lgica del procesador, se requera implementar otras entidades como el sumador de 32 bits y las entidades que ejecutaran las instrucciones de rotacin y desplazamiento. Al realizar la unin de estas entidades en una sola, al hacer la compilacin, surgi el problema que las salidas de unas entidades eran entradas en otras y esto no lo permite el VHDL. Para corregir dicho problema, se pens en implementar estas seales como si fueran bidireccionales, al realizar la compilacin el error de las entradas y salidas fue corregido. Luego se pens en crear seales para interconectar las entidades para que as cada entidad tuviera entradas y salidas y no seales bidireccionales. Al realizar la compilacin el resultado fue an mejor, pues se ocupaban menos recursos lgicos.

26

Al tener la entidad ALU, se procedi a implementar la arquitectura que contiene la ALU, los registros y los buses internos y externos. Dentro de la arquitectura tambin se implement un control sobre cuales datos deberan tomar los registros y los buses del procesador, incluyendo al bus espa. Se tuvo cuidado con las entradas y salidas de los diferentes bloques. Al tener la arquitectura, se procedi a implementar la mquina de estados (entidad pasos) encargada de cambiar de paso o estado en la mquina y generar seales de control para cada estado. Para hacer cambio de estado se pens en implementar funciones que retornarn el valor del estado siguiente en forma de vector de 8 bits, al hacer la compilacin se generaron errores ya que las funciones nicamente retornan valores enteros, por lo que para hacer cambio de estado las funciones retornan un valor entero que luego es convertido a vector de 8 bits. En algunos pasos del AHPL las seales de control generadas, dependen de la instruccin que se ejecute o del modo de seleccin de posicin de memoria, por lo que se implementaron entidades que generan estas seales en pasos determinados del AHPL como 20, 30, 24, 20, 41, 42, 44 y 68. Al tener el procesador tres modos de interrupcin era necesario crear un bloque encargado de distinguir el modo de interrupcin y si la interrupcin deba ser atendida o no, para esto se implementaron los bloques INTLINE y COMPR. Teniendo los bloques arquitectura, mquina de estados y los bloques correspondientes a la atencin de interrupciones, se procedi a unirlos en una entidad llamada ALTERIC. En el cdigo AHPL de E-RIC en pasos como 148, 150 y 151, muchas de las instrucciones interrumpan su secuencia para saltar a alguno de estos, para luego retornar al paso siguiente al interrumpir la secuencia. Por ejemplo en la instruccin MVF despus del paso 24, el procesador saltaba al paso 148 para luego saltar al paso 25. Al hacer la prueba de simulacin esto no ocurri, por lo que se tom la decisin de no interrumpir la secuencia, as en ALTERIC la instruccin MVF del paso 24 saltara al 25 y luego al 26. Con esto se generaron ms pasos en el cdigo AHPL. Al corregir dicho error en el cdigo AHPL, se procedi a implementar la parada del procesador (dentro de la entidad pasos) en el paso especificado en PBUSIN, pero la parada no se realizaba en el paso que se quera sino en el paso siguiente, esto debido a que la comparacin se haca en el borde de subida de la seal de reloj y en ese momento la seal de PBUS an no se ha estabilizado, por lo que fue necesario crear una nueva entidad llamada parada, la cual realizaba la comparacin en el borde de bajada de reloj, generando as la seal ESP para trabajar el bus espa en modo de parada. Al tener funcionando la mquina de estados, el control de parada del bus espa y la arquitectura, se decidi cambiar la ubicacin de los bits dentro de los buses y registros. Segn el AHPL de E-RIC, todos los registros y buses (excepto PBUS) tenan el bit 0 como su bit ms significativo, en ALTERIC se tom la decisin por facilidad para el usuario que todos los buses y registros a excepcin del registro IR tuvieran el bit 0 como su bit menos significativo. El cambio se realiz satisfactoriamente. Debido a que en las memorias 28C16 y 6116 que son las generalmente usadas por los estudiantes de las asignaturas de Arquitectura de Procesadores I y II, las seales de lectura y escritura se activan con un celo lgico; se decidi hacer ese cambio en ALTERIC. Pues en E-RIC estas seales se activaban con un uno lgico. El cambio se realiz satisfactoriamente. 27

Con todos estos cambios, se realiz la compilacin y surgi un nuevo problema, por ciertos errores en el circuito impreso. Segn la hoja de datos del pinout de los dispositivos EP1K100, los pines 79 y 183 eran entradas para el reloj, por lo que en el diseo del circuito impreso la seal de reloj se envi al pin 183 y el pin 79 del dispositivo lgico fue enviado a GND, mientras que el 81 que s debi ser enviado a GND qued dispuesto como entrada o salida. Al realizar la compilacin MAX+Plus II asignaba la seal de reloj al pin 79, una seal de entrada cualquiera al pin 183. Por esto fue necesario introducir en ALTERIC una seal de entrada NC (no conexin) que siempre es cero, para asignarla al pin 79 del PLD. Con todos estos cambios, se realiz una compilacin y simulacin satisfactoria. Las actividades elaboracin del cdigo AHPL y simulaciones y pruebas al cdigo, que estaban planeadas para realizarse en doce semanas, pudieron completarse en 18 semanas. 3.2.4 Problemas en el circuito impreso Antes de disear el circuito impreso, se pens en comprar una tarjeta de desarrollo para el dispositivo EP1K100QC208-3, se hicieron cotizaciones a empresas en el exterior y la ms econmica de estas fue de aproximadamente US$300.00 lo cual no estaba en el presupuesto del trabajo de grado, por lo que se tom la decisin de realizar el diseo del circuito impreso. El primer gran inconveniente fue la poca experiencia que se tena en el manejo de la herramienta Layout de OrCAD, lo que oblig a leer los manuales de ste para as proceder a disear el circuito impreso. Al haber ledo los manuales correspondientes, se procedi al trabajo en la herramienta de Layout, la cual no contena al dispositivo EP1K100QC208-3 ni las memorias de configuracin de Altera, lo que llev a realizar el diseo de estos con sus medidas fsicas y no como componentes del Layout. Al superarse los problemas mencionados, se pudo realizar el diseo del circuito impreso en un periodo de once semanas y se procedi a generar los archivos gerber con los cuales se realizan las tarjetas impresas. Estos archivos fueron enviados por correo electrnico a las empresa Dyetron S.A. en Bogot. Dyetron sugiri aumentar en un 5% la capa del antisolder. Al realizar este cambio, se generaron unos nuevos archivos gerber los cuales se enviaron a la misma empresa, pero nuevamente hubo el inconveniente que dispositivo lgico era de montaje superficial y la separacin entre sus pines era menor a 0.2mm para lo cual tenan que hacer unos estudios y dar una respuesta en un tiempo de una a dos semanas. En caso de poder realizar la tarjeta, sta estara lista en seis semanas. Por dicha razn, los archivos gerber tambin fueron enviados a la empresa Microcircuitos LTDA en Cali, su respuesta fue satisfactoria y el circuito impreso estara listo en 12 das hbiles. Mientras en Dyetron el costo total era de $225.000.00 en Microcircuitos era de $293.000.00, pero por cuestin de tiempo se tom la decisin de hacer la tarjeta impresa en Microcircuitos LTDA quienes cumplieron con el tiempo de entrega. Cuando Dyetron respondi que s podan realizar el circuito impreso, este ya se haba mandado a hacer en la empresa Microcircuitos. Al tener la tarjeta impresa, se procedi a comprar los componentes necesarios, el dispositivo lgico fue facilitado al grupo por el Ing. Francisco Viveros, los otros 28

componentes a excepcin de los reguladores fueron adquiridos en la ciudad de Bogot. Los reguladores de voltaje LM1117DT-3.3 y LM1117DT-2.5 tuvieron que pedirse como muestras a la empresa National Semiconductor, que enva muestras de sus componentes desde su centro de operaciones en Singapur. Los reguladores tardaron 10 das en llegar de Singapur a los Estados Unidos y 15 das para llegar de los Estados Unidos a Bogot. Superado el problema de los reguladores, debido a que los reguladores, el dispositivo lgico y otros componentes eran de montaje superficial era necesario conseguir una estacin de soldadura para componentes de montaje superficial. En el Laboratorio de Ingeniera Electrnica de la universidad se tena la estacin, pero no la punta que permita hacer soldadura de montaje superficial a un dispositivo como el EP1K100QC208-3 cuya distancia entre pines es milimtrica. Adems, en caso de que el laboratorio pudiera conseguir la punta, el trabajo no sera hecho en ese mismo instante, ya que el circuito impreso entrara en la cola de trabajos del laboratorio. Para solucionar el problema de la soldadura en montaje superficial y por recomendacin del laboratorio se acudi a la empresa CEMCED LTDA, quienes son los encargados de distribuir las puntas para montaje superficial y poseen los equipos necesarios. En CEMCED fueron soldados todos los componentes del circuito impreso en dos das, con un costo de $80.000.00. Aunque en el laboratorio hubiera sido de manera gratuita, el tiempo de espera hubiera sido mayor. Adems del problema en los pines ya mencionados, surgi un problema con el pin 77, este debi haber sido conectado a la fuente de 2.5V y en la tarjeta qued dispuesto para ser entrada o salida, por esta razn se hizo una conexin puente entre la salida del regulador de 2.5V y el conector para el pin 77 en el circuito impreso. Tambin se hizo una conexin puente entre el plano de tierra del circuito impreso y el conector para el pin 81 en la tarjeta. Estos problemas podran haberse solucionado diseando una tarjeta nueva lo que hubiera implicado ms dinero y ms tiempo, por eso se opt por poner una entrada que siempre fuera un cero lgico en el pin 79 y por hacer la conexin de los pines 77 y 81 de manera manual. La actividad de diseo e implementacin del circuito impreso que estaba planeada para realizarse en siete semanas, pudo finalmente llevarse a cabo en veinte semanas. 3.2.5 Problemas en la programacin del PLD Al tener listos el cdigo VHDL del procesador y la tarjeta impresa, se procedi a programar el EP1K100QC208-3. Se quera programar la entidad FLAG utilizando el archivo de configuracin (archivo con extensin .sof) generado al momento de hacer la compilacin. Debido a que el computador asignado para el trabajo de grado, tena a Windows 2000 como sistema operativo, fue necesario instalar el hardware del ByteBlasterMV en el computador, tambin se tuvo que configurar como dispositivo que trabaja a travs del puerto paralelo. En el programador se carg el archivo generado en la primera compilacin. Para facilitar el cableado, se hizo una nueva compilacin asignando pines consecutivos para los puertos de entrada y salida de la entidad FLAG. Uno de los problemas presentados fue la no actualizacin del archivo de configuracin por parte de MAX+Plus II en el programador. Al hacer la conexin en protoboard con los pines asignados en la segunda compilacin, no se obtuvo ningn resultado. Al revisar el programador, se pudo 29

notar que este an contena el archivo de configuracin generado en la primera compilacin, por lo que fue necesario actualizarlo con el nuevo archivo correspondiente. Se realiz la programacin del PLD con el archivo de configuracin actualizado y se obtuvo el resultado esperado. Al comprobar el funcionamiento de la tarjeta, se procedi a implementar el procesador en el EP1K100QC208-3, pero hubo un problema en algunos pines asignados para el bus espa. Fue necesario asignar estos a otros pines disponibles como entrada / salida en el PLD. Al realizar este cambio se obtuvo un resultado satisfactorio. Al compilar y probar varias posibilidades de optimizacin en el manejo y asignacin recursos del dispositivo PLD ACEX 1K, la mejor es la configuracin por defecto que MAX+Plus II confiere, permitiendo un promedio de utilizacin del chip del 74%.

30

4. COSTOS 4.1 COSTOS ESTIMADOS EN EL ANTEPROYECTO Al presentar el anteproyecto al Comit de Trabajo de Grado se estimaron gastos correspondientes a honorarios, hardware y software y costos varios. En el anteproyecto se estimaba que el costo total del proyecto sera de $30.355.000.00 4.1.1 Honorarios Tabla 3. Honorarios estimados en el anteproyecto Costos personales Director Asesor Ingenieros 4.1.2 Precio hora Horas Nmero ($) Semanales 50.000.00 1 1 40.000.00 1 1 10.000.00 25 3 SUBTOTAL HONORARIOS Horas Totales 32 32 2400 Costo total ($) 1.600.000.00 1.280.000.00 24.000.000.00 26.880.000.00

Hardware y software Tabla 4. Hardware y software estimados en el anteproyecto Cantidad Descripcin 2 Alquiler computador personal 2 Alquiler Windows XP 1 Alquiler Licencia FLOATPC13 de Altera 1 PLD EP1K100QC208-314 Circuitos impresos SUBTOTAL HARDWARE Y SOFTWARE Costo aproximado ($) 1.000.000.00 300.000.00 500.000.00 75.000.00 600.000.00 2.475.000.00

4.1.3

Costos varios Tabla 5. Costos varios estimados en el anteproyecto Descripcin Papelera Fotocopias Impresiones Discos compactos Quemado de discos compactos Transporte SUBTOTAL COSTOS VARIOS Costo aproximado($) 250.000.00 100.000.00 300.000.00 20.000.00 30.000.00 300.000.00 1.000.000.00

13 14

La licencia FLOATPC permite el uso de Quartus II y MAX+Plus II en mltiples PCs. El costo aproximado se calcul con una tasa de cambio de $3.000.00 por cada dlar.

31

4.2 COSTOS REALES Los costos reales del proyecto fueron menores a los presupuestados en el anteproyecto, debido a que el trabajo de grado se realiz en menos semanas. El costo total del proyecto fue $25.361.490.00. La diferencia entre el costo total estimado en el anteproyecto y el costo total real es $4.993.510.00 4.2.1. Honorarios Tabla 6. Costos por honorarios Costos personales Director Asesor Ingenieros Precio hora Horas Nmero ($) Semanales 50.000.00 1 1 40.000.00 1 1 10.000.00 25 3 SUBTOTAL HONORARIOS Horas Totales 23 23 1725 Costo total ($) 1.150.000.00 920.000.00 17.250.000.00 19.320.000.00

Debido a que el trabajo de grado pudo realizarse en 23 semanas, es decir 9 semanas menos a las estimadas, los costos por honorarios fueron menores a los estimados en el anteproyecto, con una diferencia de $7.560.000.00 4.2.2 Hardware y software Tabla 7. Costos hardware y software Cantidad 2 2 2 2 2 1 1 1 1 2 1 1 1 1 Descripcin Alquiler computador personal Alquiler Windows 2000 Alquiler Licencia Office 2000 Alquiler Licencia MAX+Plus II 10.1 Alquiler Licencia Layout OrCAD 9.1 Alquiler Analizador lgico PM3585 Alquiler fuente de voltaje LPS-163A Alquiler multmetro digital Fluke 45 Alquiler osciloscopio digital Alquiler de direccin IP Alquiler programador de PLDs ByteBlasterMV PLD EP1K100QC208-315 Circuito impreso Soldadura para montaje superficial Componentes 1 Protoboard SUBTOTAL HARDWARE Y SOFTWARE Costo aproximado ($) 1.000.000.00 300.000.00 300.000.00 300.000.00 300.000.00 300.000.00 300.000.00 300.000.00 300.000.00 200.000.00 170.000.00 375.000.00 118.125.00 322.515.00 80.000.00 240.850.00 65.000.00 4.971.490.00

Los costos por hardware y software fueron mayores a los presupuestados en el anteproyecto, ya que en el anteproyecto no se tuvo en cuenta el alquiler del equipo de
15

El costo se calcul con una tasa de cambio de $2.500.00 por cada dlar.

32

laboratorio, la compra de un protoboard y componentes necesarios para realizar las pruebas. Tampoco se tuvo en cuenta el alquiler de la licencia para Layout. La diferencia entre estos fue de $2.496.490.00 4.2.3 Costos varios Tabla 8. Costos varios Descripcin Papelera Fotocopias Impresiones Discos compactos Quemado de discos compactos Servicios pblicos Transporte SUBTOTAL COSTOS VARIOS Costo aproximado($) 180.000.00 25.000.00 450.000.00 20.000.00 30.000.00 65.000.00 300.000.00 1.070.000.00

Los costos varios aumentaron $70.000.00 con respecto a lo presupuestado en el anteproyecto.

33

5. CONCLUSIONES Los resultados obtenidos fueron posibles en parte a trabajos de grado realizados con anterioridad y en los cuales se basa ALTERIC. As mismo, se espera que ALTERIC sea base para desarrollos posteriores, profundizando y mejorando el procesador didctico. ALTERIC es un desarrollo de hardware basado en software, el cual se presenta como herramienta de laboratorio, complemento ideal para PCSIM V y posteriores. ALTERIC es un sistema autnomo que no depende de hardware adicional para funcionar como un procesador, por lo tanto, es un procesador funcional. El uso de la tecnologa PLD libera al ingeniero de la necesidad de fabricar su propio hardware, permitiendo que el proceso de diseo se concentre en las especificaciones AHPL y VHDL, donde el diseo toma su verdadera importancia. El software MAX+Plus II de Altera es una herramienta que permite el diseo e implementacin de sistemas digitales en dispositivos lgicos programables fabricados por Altera, en este caso la implementacin se realiz con xito en un PLD EP1K100QC208-3 da la familia de dispositivos ACEX 1K. En el desarrollo de ALTERIC nos enfrentamos a la problemtica de programacin, donde los programas y cdigos son dependientes de sus desarrolladores y siempre requieren cambios perfectivos o correctivos. Los programas empricos, a veces muy eficaces, son generalmente incomprensibles para otros programadores distintos del autor. Estos programas son difcilmente modificables . Para evitar estas situaciones, es necesario crear situaciones claras y fcilmente modificables y preparar a los informticos, tcnica y psicolgicamente, para que consideren que su papel principal es tanto el de hacer evolucionar las soluciones, como el de concebir nuevas soluciones Pg.324.16 Por lo anterior ALTERIC incorpora conceptos de Legibilidad del programa, Mantenimiento17 y reuso de software 18, imprescindibles para futuros desarrollos de procesadores didcticos basados en ALTERIC.

16

G. Agustn,Ingeniera del software: prctica de la programacin.Addison-Wesley Iberoamericana. Wilmington, Delaware, 1991. 17 Frakes-Fox-Nejmeh,Software Engineering in the Unix/C Environment. Prentice-Hall, Englewood Cliffs, New Jersey, 1991. 18 P.A.V.Hall, Software Reuse and Reverse Engineering in Practice., Chapman & Hall, London, UK, 1992.

34

BIBLIOGRAFA ACEX 1K Programmable Logic Device Family (Data sheet). San Jose (California): ALTERA, 2003. 86 p. ALFARO GALEANO, Juan Vicente. Simulador didctico de un procesador PCSIM II. Santaf de Bogot, 1999, 308 p. Trabajo de grado (Ingeniero Electrnico). Pontificia Universidad Javeriana. Facultad de Ingeniera. Departamento de Electrnica. ALTAHONA DAZ, Carlos Alberto y ANGARITA FUENTES, Julin Andrs. Simulador didctico de un procesador PCSIM2000 (DMA). Santaf de Bogot, 2000, 90 p. Trabajo de grado (Ingeniero Electrnico). Pontificia Universidad Javeriana. Facultad de Ingeniera. Departamento de Electrnica. BHASKER, Jayaram. A VHDL primer. Upper Saddle River (New Jersey): Prentice Hall, 3 edicin, 1999, 373 p. BOADA VELANDIA, Gerardo Alberto y CALDERN PORRAS, Javier Leonardo. Simulador didctico de un procesador PCSIM V. Santaf de Bogot, 2003, 168 p. Trabajo de grado (Ingeniero Electrnico). Pontificia Universidad Javeriana. Facultad de Ingeniera. Departamento de Electrnica. BOLIVAR GALLO, Gustavo Adolfo y CAICEDO VARGAS, Carlos Javier. Simulador didctico de un procesador PCSIM2000 (Memoria Cache). Santaf de Bogot, 2000, 76 p. Trabajo de grado (Ingeniero Electrnico). Pontificia Universidad Javeriana. Facultad de Ingeniera. Departamento de Electrnica. ByteBlasterMV Parallel Port Download Cable (Data sheet). San Jose (California): ALTERA, 2002. 11 p. CAMARGO ORTEGA, Alfonso Hugo y GARCA MARN, Jonathan Leonardo. Simulador didctico de un procesador PCSIM2000 (Pipeline y predictor de Bifurcaciones). Santaf de Bogot, 2000, 117 p. Trabajo de grado (Ingeniero Electrnico). Pontificia Universidad Javeriana. Facultad de Ingeniera. Departamento de Electrnica. CHACN TORRES, Diego Joaqun et al. Procesador didctico E-RIC. Santaf de Bogot, 2000, 140 p. Trabajo de grado (Ingeniero Electrnico). Pontificia Universidad Javeriana. Facultad de Ingeniera. Departamento de Electrnica. FRAKES, William; FOX, Christopher y NEJMEH, Brian. Software Engineering in the UNIX/C Environment. Englewood Cliffs (New Jersey): Prentice Hall, 1991. 262p. GUERRERO, Manuel Felipe y MILLN, Mara Alexandra. Simulador didctico de un Procesador PCSIM. Santaf de Bogot, 1997, 28 p. Trabajo de grado (Ingeniero Electrnico). Pontificia Universidad Javeriana. Facultad de Ingeniera. Departamento de Electrnica. HILL, Frederick y NAVABI, Zainalabedin. User Manual for AHPL Simulator (HPSIM2)/AHPL Compiler (HPCOM). Tucson (Arizona): Engineering Experiment Station, University of Arizona, 1988.

35

HILL, Frederick y PETERSON, Gerald R. Sistemas Digitales: Organizacin y Diseo del Hardware. Mxico: Editorial Limusa Noriega Editores, 1993. 701 p. IEEE 1149.1 (JTAG) Boundary-Scan Testing, Application note 39. San Jose (California): ALTERA, 2000. 29p. MCILHENNY, Bob et al. Introduction to VHDL and MAX+Plus II. UCLA Computer Science Department [en lnea]. Los Angeles (California): 2003. Disponible desde Internet en la direccin <URL:http://www.cs.ucla.edu/classes/fall03/csM51A/l1/project/intro.htm> PACHN PARRADO, Johann Francisco y RESTREPO CSPEDES, Mnica Marina. Simulador didctico de un procesador PCSIM2000 (ALU y Diagramas de tiempo). Santaf de Bogot, 2000, 50 p. Trabajo de grado (Ingeniero Electrnico). Pontificia Universidad Javeriana. Facultad de Ingeniera. Departamento de Electrnica. PINILLA INFANTE, Edgar Andrs y VARGAS SILVA, Omar. Simulador de Sistemas Digitales Parte 1. Santaf de Bogot, 1996, 32 p. Trabajo de grado (Ingeniero Electrnico). Pontificia Universidad Javeriana. Facultad de Ingeniera. Departamento de Electrnica. ROMERO TORRES, Anamara y TREJOS CELIS, Jairo Andrs. Simulador didctico de un procesador PCSIM IV. Santaf de Bogot, 2003, 142 p. Trabajo de grado (Ingeniero Electrnico). Pontificia Universidad Javeriana. Facultad de Ingeniera. Departamento de Electrnica. P.A.V.HALL, Software Reuse and Reverse Engineering in Practice., Chapman & Hall, London, UK, 1992. G. AGUSTIN, Ingeniera del software: prctica de la programacin. Addison-Wesley Iberoamericana. Wilmington, Delaware, 1991.

36

Anexo A. Dispositivos ACEX 1K Descripcin funcional Cada dispositivo ACEX 1K contiene un arreglo embedded para implementar memorias y funciones lgicas especializadas, y un arreglo lgico para implementar lgica general.

Diagrama de bloques del dispositivo El arreglo embedded consiste en una serie de EAB19. Cuando se implementan funciones de memoria, cada EAB provee hasta 4.096 bits que pueden ser usados para crear RAM, ROM, RAM de dos puertos o funciones de pila (FIFO). Cuando se implementa lgica, cada EAB puede contribuir con un nmero de compuertas entre 100 y 600 para conformar funciones complejas, tales como multiplicadores, microcontroladores, mquinas de estados y funciones para procesamiento digital de seales (DSP). Los EAB pueden ser utilizados independientemente o ser agrupados para implementar funciones complejas.

19

Embedded Array Block

37

El arreglo lgico consiste en una serie de LAB20. Cada LAB contiene ocho elementos lgicos (LE) y una interconexin local. Un LE consiste en una LUT de cuatro entradas, un flip-flop programable y lneas internas para acarreo y para interconexin de funciones en cascada. Los ocho LE pueden ser usados para crear bloques de lgica de tamao medio como contadores de 8 bits, decodificadores de direcciones o mquinas de estado, y en combinacin dentro del LAB, para crear grandes bloques de lgica. Cada LAB representa alrededor de 96 compuertas lgicas utilizables.

LAB La interconexin de seales dentro de los dispositivos ACEX 1K se provee a travs de la estructura de enrutamiento Fast Track Interconnect la cual es una serie de canales rpidos y continuos de filas y columnas a lo largo y ancho del dispositivo. Cada pin de entrada / salida es alimentado por un elemento de entrada / salida (IOE) localizado al final de cada fila y columna de la estructura de enrutamiento. Cada IOE contiene un buffer bidireccional de entrada / salida y un flip-flop que puede ser usado como registro de entrada o salida para alimentar seales de entrada, salida o bidireccionales.

20

Logic Array Block

38

Elemento lgico Caractersticas especiales Entradas y salidas multi-voltaje que pueden manejar y ser manejadas por dispositivos con lgica de 2.5V, 3.3V o 5V Bajo consumo de potencia Permite implementar seales bidireccionales Interconexin con perifricos Operacin con una fuente interna de 2.5V Resistencias de pull-up en los pines de entrada / salida durante y despus de la configuracin Emulacin Tri-state de buses internos Habilitador de salida tri-state individual para cada pin Opcin de open-drain para cada pin de entrada / salida

Dispositivo EP1K100QC208-3 En el PLD utilizado posee las siguientes caractersticas Caractersticas del dispositivo EP1K100QC208-3 Elementos lgicos 4992 EABs 12 Pines entrada / salida 147 Filas 12 Canales por fila 312 Columnas 52 Canales por columna 24

39

Anexo B. Cdigo AHPL del procesador 0. MA 000000h ; PC 000000h; (1). 1. ADBUS = MA ; read = 0; (2). 2. ADBUS = MA ; read = 0; ___ (wait , wait) / (2 , 3). 3. ADBUS = MA ; read = 0 ; MD DBUS; read = 0; (4). 4. PC MD[23:0] ; MA 000008h; (5). 5. ADBUS = MA ; read = 0; (6). 6. ADBUS = MA ; read = 0; ___ (wait , wait) / (6 , 7). 7. ADBUS = MA ; read = 0 ; MD DBUS; read = 0; (8). 8. SP MD[23:0] ; ief 0 ; (9). 9. MA PC ; shf 0; (10). 10. ADBUS = MA ; read = 0; (11). 11. ADBUS = MA ; read = 0; ___ (wait , wait) / (11 , 12). 12. ADBUS = MA ; read = 0 ; MD DBUS ; PC INC(PC); (13). 13. IR[0:31] MD[31:0]; (14).

40

14. NOP; ___ ((IR[4] IR[0] IR[1]) (IR[2] IR[3]) , ___ ___ ___ ___ (IR[4] IR[0] IR[1]) (IR[2] IR[3]) IR[9] IR[8] , ___ ___ ___ (IR[4] IR[0] IR[1]) (IR[2] IR[3]) IR[9] IR[8] , ___ ___ ___ ___ IR[4] (IR[0] IR[1]) (IR[2] IR[3]) IR[9]) , ___ ___ ___ IR[4] (IR[0] IR[1]) (IR[2] IR[3]) IR[6] , ___ ___ IR[4] (IR[0] IR[1]) (IR[2] IR[3]) IR[6] IR[7] , ___ ___ ___ IR[4] (IR[0] IR[1]) (IR[2] IR[3]) IR[6] IR[7] IR[8] , ___ ___ ___ ___ IR[4] (IR[0] IR[1]) (IR[2] IR[3]) IR[6] IR[7] IR[8] , ___ ___ ___ ___ IR[4] (IR[0] IR[1]) (IR[2] IR[3]) (IR[6] IR[7]) , ___ ___ ___ ___ IR[4] (IR[0] IR[1]) (IR[2] IR[3]) (IR[6] IR[7]) IR[9] , ___ ___ ___ IR[4] (IR[0] IR[1]) (IR[2] IR[3]) (IR[6] IR[7]) IR[9] , ___ ___ ___ IR[4] (IR[0] IR[1]) (IR[2] IR[3]) (IR[6] IR[7]) , ___ _________ IR[4] (IR[0] IR[1]) (IR[1] IR[2]) , ___ _________ _________ IR[4] (IR[0] IR[1]) (IR[1] IR[2]) , ___ _ _ _ _ (IR[4] (IR[0] IR[1] IR[2] IR[3]) (( / (IR[7:15] (C,C,Z,Z,N,N,V,V,N V)) IR[6]) (irq ief)) , ___ _ _ _ _ (IR[4] (IR[0] IR[1] IR[2] IR[3]) (( /(IR[7:15] (C,C,Z,Z,N,N,V,V,N V))) IR[6]) ______ (irq Ief)) , _______________________________________ ___ _ _ _ _ IR[4] (IR[0] IR[1] IR[2] IR[3]) (( / (IR[7:15] (C,C,Z,Z,N,N,V,V,N V))) IR[6]) ___ IR[5] , _______________________________________ ___ _ _ _ _ IR[4] (IR[0] IR[1] IR[2] IR[3]) (( / (IR[7:15] (C,C,Z,Z,N,N,V,V,N V))) IR[6]) IR[5] , _____________________ ___ IR[4] (IR[0] IR[1] IR[2] IR[3]) IR[5] , _____________________

41

___ ___ ___ IR[4] (IR[0] IR[1] IR[2] IR[3]) IR[5] IR[7] , _____________________ ___ ___ IR[4] (IR[0] IR[1] IR[2] IR[3]) IR[5] IR[7]) / (103, 45, 100 , 46 , 47 , 57 , 89 , 56 , 58 , 59 , 64 , 69 , 43 , 41 , 70 , 9 , 40 , 35 , 15 , 20 , 16). ____ 15. MD[31:24] 8 T 0 MD[23]; (34). 16. MA MD[23:0]; (17). 17. ADBUS = MA ; read = 0; (18). 18. ADBUS = MA ; read = 0; ___ (wait , wait) / (18 , 19). 19. ADBUS = MA ; MD DBUS ; read = 0; (20).

___ 20. MA (MD[23:0] ! ADD(MD[23:0] ; IX)) * (IR[6] , IR[6]); ( / IR[1:3] , ___ IR[0] IR[1] IR[2] IR[3] , ___ ___ IR[0] IR[1] IR[2] IR[3] , _________ IR[1] IR[2]) / (21 , 22 , 23 , 27). 21. PC MA; ______ ((irq ief) , (irq ief)) / (9 , 70). 22. IR[8:31] MA[23:0] ; (35). 23. MD AC; (24). 24. ADBUS = MA ; DBUS = MD; (25). 25. ADBUS = MA ; DBUS = MD ; write = 0; (26).

42

26. ADBUS = MA ; DBUS = MD ; write = 0; ______ ___ ___ ((irq ief) wait , (irq ief) wait , wait) / (9 , 70 , 26). 27. ADBUS = MA ; read = 0; (28). 28. ADBUS = MA ; read = 0; ___ (wait , wait) / (28 , 29). 29. ADBUS = MA ; MD DBUS ; read = 0; _________ (IR[0] IR[1] , IR[0] IR[1]) / (34 , 30). ___ 30. MD (INC(MD) ! DEC(MD)) * (IR[3] , IR[3]) ; _______ zff / OBUS ; nff OBUS[31]; (31). 31. ADBUS = MA ; DBUS = MD; (32). 32. ADBUS = MA ; DBUS = MD ; write = 0; (33). 33. write = 0 ; ADBUS = MA ; DBUS = MD; ______ ___ ___ ((irq ief) wait , (irq ief) wait , wait) / (9 , 70 , 31). ________________________ ___ ___ ___ ___ ___ ___ ___ 34. ABUS = (MD ! MD) * (((IR[0] IR[1]) (IR[2] IR[3])) , ((IR[0] IR[1]) (IR[2] IR[3]))) ; ___ ___ BBUS = AC ; cin = (cff IR[3]) (IR[1] IR[3]) ; OBUS = (ADD[31:0] (ABUS ; BBUS ; cin) ! (ABUS BBUS) ! (ABUS BBUS) ! ___ ___ ___ (ABUS BBUS) ! ABUS) * ((IR[0] (IR[2] IR[3])) , (IR[0] IR[3]) , (IR[0] IR[2] ___ ___ ___ ___ IR[3]) , (IR[0] IR[2] IR[3]) , (IR[0] IR[2] IR[3])) ; _________ AC * (IR[2] IR[3]) OBUS ; ___ ___ cff * (IR[0] (IR[2] IR[3])) ADD[31] (ABUS ; BBUS ; cin) ; _______ zff / OBUS ; nff OBUS[31] ; ___ ___ _______________________ vff * (IR[0] (IR[2] IR[3])) (ABUS[31] BBUS[31] ADD[31] (ABUS ; BBUS ; cin)) _______ _______ (ABUS[31] BBUS[31] ADD[31] (ABUS ; BBUS ; cin));

43

______ ((irq ief) , (irq ief)) / (9 , 70). 35. MA DEC(SP) ; SP DEC(SP); (36). 36. MD 8 T 0 , PC; (37). 37. ADBUS = MA ; DBUS = MD; (38). 38. ADBUS = MA ; DBUS = MD ; write = 0; (39). 39. ADBUS = MA ; DBUS = MD ; write = 0; ___ (wait , wait) / (39 , 40). ____ ___ 40. ABUS = (16 T 0 , IR[16:31] ! 16 T 0 , IR[16:31] ! 8 T 0 , IR[8:31])) * (IR[0] ____ _____ IR[16] , IR[0] IR[16] , IR[0]) ; BBUS = 8 T 0 , PC ; cin = 0 ; ___ OBUS = (ABUS ! ADD[31:0] (ABUS ; BBUS ; cin)) * (IR[0] , IR[0]) ; PC OBUS[23:0]; ______ ((irq ief) , (irq ief)) / (9 , 70). 41. BBUS[23:0] = (AC[23:0] ! IX ! SP ! RA[23:0] ! RB[23:0] ! RC[23:0] ! RD[23:0] ! RE[23:0] ! ____ ____ ____ ____ ____ RF[23:0] !) * ((IR[12] IR[13] IR[14] IR[15]) , (IR[12] IR[13]) , (IR[12] IR[13]) , ____ ____ ____ ____ ____ ____ ____ ____ (IR[12] IR[13] IR[14] IR[15]) , (IR[12] IR[13] IR[14] IR[15]) , (IR[12] IR[13] ____ ____ ____ ____ ____ IR[14] IR[15]) , (IR[12] IR[13] IR[14] IR[15]) , (IR[12] IR[13] IR[14] IR[15]) , ____ ____ (IR[12] IR[13] IR[14] IR[15])) ; BBUS[31:24] = (8 T 0 ! AC[31:24] ! RA[31:24] ! RB[31:24] ! RC[31:24] ! RD[31:24] ! RE[31:24] ! RF[31:24]) * ____ ____ ____ ____ ____ ____ ____ (IR[12] , (IR[12] IR[13] IR[14] IR[15]) , (IR[12] IR[13] IR[14] IR[15]) , ____ ____ ____ ____ ____ ____ (IR[12] IR[13] IR[14] IR[15]) , (IR[12] IR[13] IR[14] IR[15]) , (IR[12] IR[13] ____ ____ ____ ____ ____ ____ IR[14] IR[15]) , (IR[12] IR[13] IR[14] IR[15]) , (IR[12] IR[13] IR[14] IR[15])); _____ ____ ABUS[31:4] = (28 T 0 ! 28 T 0) * (IR[12] , IR[12]) ; ABUS[3:0] = IR[12:15] ; 44

____ OBUS = (ABUS ! BBUS) * (IR[10] , IR[10]) ; MD OBUS; (42). ________________________ __ ___ ___ ___ ___ ___ ___ 42. ABUS = (MD ! MD) * (((IR[0] IR[1]) (IR[2] IR[3])) , ((IR[0] IR[1]) (IR[2] IR[3]))) ; ___ ___ BBUS = (AC ! 8 T 0 , IX ! 8 T 0 , SP ! RA ! RB ! RC ! RD ! RE ! RF) * ((IR[6] IR[7] ___ ___ ___ ___ ___ ___ ___ ___ IR[8] IR[9]) , (IR[6] IR[7]) , (IR[6] IR[7]) , (IR[6] IR[7] IR[8] IR[9]) , (IR[6] IR[7] ___ ___ ___ ___ ___ ___ ___ IR[8] IR[9]) , (IR[6] IR[7] IR[8] IR[9]) , (IR[6] IR[7] IR[8] IR[9]) , (IR[6] ___ ___ ___ IR[7] IR[8] IR[9]) , IR[6] IR[7] IR[8] IR[9])) ; ___ ___ cin = (cff IR[3]) (IR[1] IR[3]) ; OBUS = (ADD[31:0] (ABUS ; BBUS ; cin) ! (ABUS BBUS) ! (ABUS ___ ___ BBUS) ! (ABUS BBUS) ! ABUS) * ((IR[0] (IR[2] IR[3])) , (IR[0] IR[3]) , (IR[0] ___ ___ ___ ___ ___ IR[2] IR[3]) , (IR[0] IR[2] IR[3]) , (IR[0] IR[2] IR[3])) ; _________ ___ ___ ___ ___ AC * ((IR[2] IR[3]) IR[6] IR[7] IR[8] IR[9]) OBUS ; _________ ___ ___ ___ RA * ((IR[2] IR[3]) IR[6] IR[7] IR[8] IR[9]) OBUS ; _________ ___ ___ ___ RB * ((IR[2] IR[3]) IR[6] IR[7] IR[8] IR[9]) OBUS ; _________ ___ ___ RC * ((IR[2] IR[3]) IR[6] IR[7] IR[8] IR[9]) OBUS ; _________ ___ ___ ___ RD * ((IR[2] IR[3]) IR[6] IR[7] IR[8] IR[9]) OBUS ; _________ ___ ___ RE * ((IR[2] IR[3]) IR[6] IR[7] IR[8] IR[9]) OBUS ; _________ ___ ___ RF * ((IR[2] IR[3]) IR[6] IR[7] IR[8] IR[9]) OBUS ; ___ ___ cff * (IR[0] (IR[2] IR[3])) ADD[31] (ABUS ; BBUS ; cin) ; _______ zff / OBUS ; nff OBUS[31] ; ___ ___ ______________________ vff * (IR[0] (IR[2] IR[3])) (ABUS[31] BBUS[31] ADD[31] (ABUS ; BBUS ; cin)) ________ ________ (ABUS[31] BBUS[31] ADD[31] (ABUS ; BBUS ; cin)) ; __________ ___ (IX ! SP) * ((IR[2] IR[3]) IR[6] ((IR[7] , IR[7])) OBUS[23:0]; ______ ___ (shf (irq ief) , shf , shf (irq ief)) / (9 , 46 , 70). 45

43. SHC[4:0] IR[11:15]; (44) ___ ___ ____ 44. AC[31] (AC[31] ! AC[30] ! AC[0] ! cff ! 0 ) * ((IR[5] IR[6] IR[10]) , IR[10] , (IR[5] IR[6] ___ ___ IR[10]) , (IR[5] IR[6] IR[10]) , (IR[5] IR[6] IR[10])) ; ____ AC[30:1] (AC[31:2] ! AC[29:0]) * (IR[10] , IR[10]) ; ____ ___ AC[0] (AC[1] ! AC[31] ! cff ! 0) * (IR[10] , (IR[5] IR[6] IR[10]) , (IR[5] IR[6] ____ ___ ____ IR[10]) , (IR[5] IR[10])) ; __________ ____ cff * (IR[5] IR[6]) (AC[0] ! AC[31] ) * (IR[10] , IR[10]); SHC DEC(SHC); (101). 45. NOP; ____ ______ ____ (reset , reset (irq ief) , reset (irq ief)) / (0 , 45 , 70). 46. IR[0:15] IR[16:31] ; shf 1; ((IR[0] IR[1]) (IR[2] IR[3]), ___ ___ ___ (IR[0] IR[1]) (IR[2] IR[3]) IR[9] IR[8] , ___ ___ (IR[0] IR[1]) (IR[2] IR[3]) IR[9] IR[8] , ___ ___ ___ ((IR[0] IR[1]) (IR[2] IR[3]) IR[9] (irq ief)) , ___ ___ ___ ______ (IR[0] IR[1]) (IR[2] IR[3]) IR[9]) (irq ief)) , ___ ___ (IR[0] IR[1]) (IR[2] IR[3]) IR[6] , ___ (IR[0] IR[1]) (IR[2] IR[3]) IR[6] IR[7] , ___ ___ (IR[0] IR[1]) (IR[2] IR[3]) IR[6] IR[7] IR[8] , ___ ___ ___ (IR[0] IR[1]) (IR[2] IR[3]) IR[6] IR[7] IR[8] , ___ ___ ___ (IR[0] IR[1]) (IR[2] IR[3]) (IR[6] IR[7]) , ___ ___ ___ (IR[0] IR[1]) (IR[2] IR[3]) (IR[6] IR[7]) IR[9] , ___ ___ (IR[0] IR[1]) (IR[2] IR[3]) (IR[6] IR[7]) IR[9] , ___ ___

46

(IR[0] IR[1]) (IR[2] IR[3]) (IR[6] IR[7]) , _________ (IR[0] IR[1]) (IR[1] IR[2] , _________ __________ (IR[0] IR[1]) (IR[1] IR[2]) / (103, 45 , 100 , 70 , 9 , 47 , 57 , 89 , 56 , 58 , 59 , 64 , 69 , 43 , 41). 47. MA[23:0] 000Ch, 2 T 0 , IR[10:15]; ___ (IR[9] , IR[9]) / (52 , 48). 48. ADBUS = MA ; read = 0; (49). 49. ADBUS = MA ; read = 0 ; iorq = 1; ___ (wait , wait) / (49 , 50). 50. ADBUS = MA ; MD DBUS ; read = 0 ; iorq = 1; (51). 51. AC MD; ______ ___ (shf (irq ief) , shf , shf (irq ief)) / (9 , 46 , 70). 52. MD AC; (53). 53. ADBUS = MA ; DBUS = MD; (54). 54. ADBUS = MA ; DBUS = MD ; write = 0; (55). 55. ADBUS = MA ; DBUS = MD ; write = 0 ; iorq = 1; ______ ___ __ ___ ___ (shf (irq ief) wait , shf wait , shf (irq ief) wait , wait) / (9 , 46 , 70 , 55). 56. ief IR[9]; (102). 57. MR[1:0] IR[8:9]; ______ ___ (shf (irq ief) , shf , shf (irq ief)) / (9 , 46 , 70). 58. cff IR[9]; ______ ___ (shf (irq ief) , shf , shf (irq ief)) / (9 , 46 , 70).

47

59. SP DEC(SP) ; MA DEC(SP); (60). 60. MD AC; (61). 61. ADBUS = MA ; DBUS = MD; (62). 62. ADBUS = MA ; DBUS = MD ; write = 0; (63). 63. ADBUS = MA ; DBUS = MD ; write = 0; ______ ___ __ ___ ___ (shf (irq ief) wait , shf wait , shf (irq ief) wait , wait) / (9 , 46 , 70 , 63). 64. MA SP; (65). 65. ADBUS = MA ; read = 0; (66). 66. ADBUS = MA ; read = 0; ___ (wait , wait) / (66 , 67). 67. ADBUS = MA ; MD DBUS ; read = 0 ; SP INC(SP); (68). ___ 68. AC * IR[8] MD ; PC * IR[8] MD[23:0]; ______ __ (shf (irq ief) , shf , shf (irq ief)) / (9 , 46 , 70). 69. AC[31:24] IR[8:15]; ______ __ (shf (irq ief) , shf , shf (irq ief)) / (9 , 46 , 70). 70. SP DEC(SP) , MA DEC(SP); PR[2:0] prin2, prin1, prin0; ief 0; (71). 71. MD 8 T 0 , PC; (72). 72. ADBUS = MA ; DBUS = MD; (73). 73. ADBUS = MA ; DBUS = MD ; write = 0; (74).

48

74. ADBUS = MA ; DBUS = MD ; write = 0; ___ (wait , wait) / (74 , 75). 75. SP DEC(SP) ; MA DEC(SP); (76). 76. MD 26 T 0 , SR; (77). 77. ADBUS = MA ; DBUS = MD; (78). 78. ADBUS = MA ; DBUS = MD ; write = 0; (79). 79. ADBUS = MA ; DBUS = MD ; write = 0; ____ ___ ____ ___ ___ (MR[1] wait , MR[0] MR[1] wait , MR[0] MR[1] wait , wait) / (80 , 84 , 85 , 79). 80. ADBUS = 23 T 0 , 1 ; read = 0; (81). 81. ADBUS = 23 T 0 , 1 ; read = 0 ; iack = 1; ___ (wait , wait) / (81 , 82). 82. ADBUS = 23 T 0 , 1 ; MD DBUS ; read= 0 ; iack = 1; (83). 83. PC MD[23:0]; ______ ((irq ief) , (irq ief)) / (9 , 70). 84. iack = 1 ; MD DBUS; (83). 85. MA 28 T 0 , PR ; ief 1; iack = 1; (86). 86. ADBUS = MA ; read = 0; (87). 87. ADBUS = MA ; read = 0; ___ (wait , wait) / (87 , 88). 88. ADBUS = MA ; MD DBUS ; read = 0;

49

(83). 89. MA SP; (90). 90. ADBUS = MA ; read = 0; (91). 91. ADBUS = MA ; read = 0; ___ (wait , wait) / (91 , 92). 92. ADBUS = MA ; MD DBUS ; read = 0; (93). 93. SP INC(SP) ; MA INC(SP); (94). 94. SR MD[5:0]; (95). 95. ADBUS = MA ; read = 0; (96). 96. ADBUS = MA ; read = 0; ___ (wait , wait) / (96, 97). 97. ADBUS = MA ; MD DBUS ; read = 0; (98). 98. SP INC(SP) ; MA INC(SP); (99). 99. PC MD; ief 1; ______ ((irq ief) , (irq ief)) / (9 , 70). 100. MA 0007FFh; (1). 101. NOP. ______ ______ ______ __ ______ ( / SHC shf (irq ief) , / SHC , / SHC shf , / SHC shf (irq ief)) / (9 , 44 , 46 , 70). 102. NOP. ______ __ (shf (irq ief) , shf , shf (irq ief)) / (9 , 46 , 70).

50

103. SBR[5:0] IR[10:15]; (104). 104. NOP; _____ ______ ______ _____ ______ ______ _____ ((SBR[3] SBR[2] SBR[1] SBR[0]) (SBR[4] SBR[3] SBR[2] SBR[0]), ______ ______ (SBR[3] SBR[2] SBR[1] SBR[0]), ______ _____ (SBR[3] SBR[2] SBR[1] SBR[0]), _____ (SBR[3] SBR[2] SBR[1] SBR[0]), ______ ______ ______ _____ (SBR[4] SBR[3] SBR[2] SBR[1] SBR[0]), ______ ______ ______ _____ (SBR[4] SBR[3] SBR[2] SBR[1] SBR[0]), ______ ______ ______ (SBR[4] SBR[3] SBR[2] SBR[1] SBR[0]), ______ ______ _____ _____ (SBR[4] SBR[3] SBR[2] SBR[1] SBR[0]), ______ ______ _____ (SBR[4] SBR[3] SBR[2] SBR[1] SBR[0]), ______ ______ (SBR[4] SBR[3] SBR[2] SBR[1] SBR[0]), ______ _____ _____ _____ (SBR[4] SBR[3] SBR[2] SBR[1] SBR[0]), ______ ______ _____ (SBR[4] SBR[3] SBR[2] SBR[1] SBR[0]), ______ ______ _____ (SBR[4] SBR[3] SBR[2] SBR[1] SBR[0]), ______ ______ (SBR[4] SBR[3] SBR[2] SBR[1] SBR[0]), ______ ______ (SBR[4] SBR[3] SBR[2] SBR[1] SBR[0]), ______ (SBR[4] SBR[3] SBR[2] SBR[1] SBR[0]), _____ _____ (SBR[4] ((SBR[3] SBR[2]) (SBR[2] SBR[0]) (SBR[1] SBR[0]) (SBR[3] SBR[0]) _____ _____ (SBR[3] SBR[2] SBR[1])))/ (105,110,117,119,106,107,108,109,111,112,113,114,115,116,118,120,102). 105. SBUS = MD; ______ (SBR[4] , SBR[4]) / (106 , 102).

51

106. SBUS = 8 T 0, MA; ______ (SBR[4] , SBR[4]) / (107 , 102). 107. SBUS = 8 T 0, PC; ______ (SBR[4] , SBR[4]) / (108 , 102).

108. SBUS = 8 T 0, SP; ______ (SBR[4] , SBR[4]) / (109 , 102). 109. SBUS = 26 T 0, SR; _____________ (SBR[4] SBR[1] , SBR[4] SBR[1]) / (110 , 102). 110. SBUS = AC; ______ (SBR[4] , SBR[4]) / (111 , 102). 111. SBUS = RA; ______ (SBR[4] , SBR[4]) / (112 , 102). 112. SBUS = RB; ______ (SBR[4] , SBR[4]) / (113 , 102). 113. SBUS = RC; ______ (SBR[4] , SBR[4]) / (114 , 102). 114. SBUS = RD; ______ (SBR[4] , SBR[4]) / (115 , 102). 115. SBUS = RE; ______ (SBR[4] , SBR[4]) / (116 , 102). 116. SBUS = RF; _____________ (SBR[4] SBR[1] , SBR[4] SBR[1]) / (117 , 102). 117. SBUS = 8 T 0, IX; ______ (SBR[4] , SBR[4]) / (118 , 102).

52

118. SBUS = IR; _____________ (SBR[4] SBR[1] , SBR[4] SBR[1]) / (119 , 102). 119. SBUS = 25 T 0, PR, 2 T 0, MR; ______ (SBR[4] , SBR[4]) / (120 , 102). 120. SBUS = 27 T 0, SHC; (102). Pasos del bus espa en modo de parada 103E21. SBR[5:0] 0, Datinsb, SBUSSC[3:0]; ___ ____ ____ (retor, retor datok, retor datok) / (Paso siguiente modo normal, 103E, 104E). 104E. NOP; _____ ______ ______ _____ ______ ______ _____ ((SBR[3] SBR[2] SBR[1] SBR[0]) (SBR[4] SBR[3] SBR[2] SBR[0]), ______ ______ (SBR[3] SBR[2] SBR[1] SBR[0]), ______ _____ (SBR[3] SBR[2] SBR[1] SBR[0]), _____ (SBR[3] SBR[2] SBR[1] SBR[0]), ______ ______ ______ _____ (SBR[4] SBR[3] SBR[2] SBR[1] SBR[0]), ______ ______ ______ _____ (SBR[4] SBR[3] SBR[2] SBR[1] SBR[0]), ______ ______ ______ (SBR[4] SBR[3] SBR[2] SBR[1] SBR[0]), ______ ______ _____ _____ (SBR[4] SBR[3] SBR[2] SBR[1] SBR[0]), ______ ______ _____ (SBR[4] SBR[3] SBR[2] SBR[1] SBR[0]), ______ ______ (SBR[4] SBR[3] SBR[2] SBR[1] SBR[0]), ______ _____ _____ _____ (SBR[4] SBR[3] SBR[2] SBR[1] SBR[0]), ______ ______ _____ (SBR[4] SBR[3] SBR[2] SBR[1] SBR[0]), ______ ______ _____ (SBR[4] SBR[3] SBR[2] SBR[1] SBR[0]), ______ ______ (SBR[4] SBR[3] SBR[2] SBR[1] SBR[0]), ______ ______ (SBR[4] SBR[3] SBR[2] SBR[1] SBR[0]),
21

Para llegar al paso 103E es necesario que PBUS[6:0] = PBUSIN[6:0] en cualquiera de los pasos entre 0 y 102.

53

______ (SBR[4] SBR[3] SBR[2] SBR[1] SBR[0]), _____ _____ (SBR[4] ((SBR[3] SBR[2]) (SBR[2] SBR[0]) (SBR[1] SBR[0]) (SBR[3] SBR[0]) _____ _____ (SBR[3] SBR[2] SBR[1])))/ (105E,110E,117E,119E,106E,107E,108E,109E,111E,112E,113E,114E,115E,116E,118E,120E, 103E). 105E. SBUS = MD; ____ ______ (datok, datok SBR[4] , datok SBR[4]) / (105E, 106E , 103E). 106E. SBUS = 8 T 0, MA; ____ ______ (datok, datok SBR[4] , datok SBR[4]) / (106E, 107E , 103E). 107E. SBUS = 8 T 0, PC; ____ ______ (datok, datok SBR[4] , datok SBR[4]) / (107E, 108E , 103E). 108E. SBUS = 8 T 0, SP; ____ ______ (datok, datok SBR[4] , datok SBR[4]) / (108E, 109E , 103E). 109E. SBUS = 26 T 0, SR; ____ _____________ (datok, datok SBR[4] SBR[1] , datok SBR[4] SBR[1]) / (109E, 110E , 103E). 110E. SBUS = AC; ____ ______ (datok, datok SBR[4] , datok SBR[4]) / (110E, 111E , 103E). 111E. SBUS = RA; ____ ______ (datok, datok SBR[4] , datok SBR[4]) / (111E, 112E , 103E). 112E. SBUS = RB; ____ ______ (datok, datok SBR[4] , datok SBR[4]) / (112E, 113E , 103E). 113E. SBUS = RC; ____ ______ (datok, datok SBR[4] , datok SBR[4]) / (113E, 114E , 103E). 114E. SBUS = RD; ____ ______ (datok, datok SBR[4] , datok SBR[4]) / (114E, 115E , 103E).

54

115E. SBUS = RE; ____ ______ (datok, datok SBR[4] , datok SBR[4]) / (115E, 116E , 103E). 116E. SBUS = RF; ____ _____________ (datok, datok SBR[4] SBR[1] , datok SBR[4] SBR[1]) / (116E, 117E , 103E).

117E. SBUS = 8 T 0, IX; ____ ______ (datok, datok SBR[4] , datok SBR[4]) / (117E, 118E , 103E). 118E. SBUS = IR; ____ _____________ (datok, datok SBR[4] SBR[1] , datok SBR[4] SBR[1]) / (118E, 119E , 103E). 119E. SBUS = 25 T 0, PR, 2 T 0, MR; ____ ______ (datok, datok SBR[4] , datok SBR[4]) / (119E, 120E , 103E). 120E. SBUS = 27 T 0, SHC; ____ (datok, datok) / (120E, 103E). Para comentarios remtase al captulo EXPLICACIN DEL CDIGO AHPL de ALTERIC: MANUAL DEL USUARIO.

55

Anexo C. Cambios en el cdigo AHPL El cdigo AHPL de ALTERIC, es el cdigo AHPL del procesador E-RIC (basado en RIC y PCSIM) con algunas modificaciones tales como:

Al ejecutar la instruccin RST, PC quedar apuntando a la direccin 0007FFh y no a la FFFFFFh. Paso 146 de E-RIC y 100 de ALTERIC. Al ejecutar las instrucciones IMP y EXP, MA tomar valores entre 000C00h y 000C3Fh. En PCSIM y E-RIC, MA tomaba datos entre 000000h y 00003Fh las cuales son direcciones de ROM. Paso 44 de E-RIC y 47 de ALTERIC. El paso 148 de PCSIM y E-RIC fue reemplazado por los pasos 25, 32, 38, 54, 62, 73 y 78 de ALTERIC. El paso 150 de PCSIM y E-RIC fue reemplazado por el paso 75 de ALTERIC. El paso 151 de PCSIM y E-RIC fue reemplazado por los pasos 93 y 98 de ALTERIC. Al introducirse una nueva instruccin SBI, fue necesario incluir ms pasos al nuevo cdigo AHPL, tambin se incluyeron pasos del cdigo AHPL para el bus espa trabajando en modo de parada. Se cambi la distribucin de los bits en los buses y registros, excepto el registro IR. Los registros y buses tienen al bit 0 como su bit menos significativo. Las seales de Read y Write se activan con cero lgico.

A continuacin se muestran tablas de decodificacin de las instrucciones en el cdigo AHPL del procesador E-RIC, las tablas de decodificacin de ALTERIC se encuentran en el captulo DECODIFICACIN DE INSTRUCCIONES SEGN EL CDIGO AHPL de ALTERIC: MANUAL DEL USUARIO. Al hacer la comparacin entre las dos tablas, se podr notar que el nmero de ciclos de reloj para cada instruccin es el mismo, excepto en la atencin a interrupciones y en RTI.

Decodificacin de instrucciones de 32 bits en E-RIC.

56

MNEMNICO

MODO

INSTRUCCIONES DE 32 BITS FETCH DECODE 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14

EXECUTE

ADC

ADD

SBC

SUB

AND

ORA

XOR

MVT

BIT

CMP

INC

DEC

Directo Indirecto Indizado Indizado Indirecto Inmediato Directo Indirecto Indizado Indizado Indirecto Inmediato Directo Indirecto Indizado Indizado Indirecto Inmediato Directo Indirecto Indizado Indizado Indirecto Inmediato Directo Indirecto Indizado Indizado Indirecto Inmediato Directo Indirecto Indizado Indizado Indirecto Inmediato Directo Indirecto Indizado Indizado Indirecto Inmediato Directo Indirecto Indizado Indizado Indirecto Inmediato Directo Indirecto Indizado Indizado Indirecto Inmediato Directo Indirecto Indizado Indizado Indirecto Inmediato Directo Indirecto Indizado Indizado Indirecto Directo Indirecto Indizado Indizado Indirecto

20,26-28,32 16-20,26-28,32 20,26-28,32 16-20,26-28,32 15,32 20,26-28,32 16-20,26-28,32 20,26-28,32 16-20,26-28,32 15,32 20,26-28,32 16-20,26-28,32 20,26-28,32 16-20,26-28,32 15,32 20,26-28,32 16-20,26-28,32 20,26-28,32 16-20,26-28,32 15,32 20,26-28,32 16-20,26-28,32 20,26-28,32 16-20,26-28,32 15,32 20,26-28,32 16-20,26-28,32 20,26-28,32 16-20,26-28,32 15,32 20,26-28,32 16-20,26-28,32 20,26-28,32 16-20,26-28,32 15,32 20,26-28,32 16-20,26-28,32 20,26-28,32 16-20,26-28,32 15,32 20,26-28,32 16-20,26-28,32 20,26-28,32 16-20,26-28,32 15,32 20,26-28,32 16-20,26-28,32 20,26-28,32 16-20,26-28,32 15,32 20,26-30,148,31 16-20,26-30,148,31 20,26-30,148,31 16-20,26-30,148,31 20,26-30,148,31 19-20,26-30,148,31 20,26-30,148,31 19-20,26-30,148,31

CICLOS DE RELOJ 11 15 11 15 8 11 15 11 15 8 11 15 11 15 8 11 15 11 15 8 11 15 11 15 8 11 15 11 15 8 11 15 11 15 8 11 15 11 15 8 11 15 11 15 8 11 15 11 15 8 14 18 14 18 14 18 14 18

57

MVF

JMP

JSR

BSR BRA BEQ BNE BCS BNC BVS BNV BGT BLT BLE BGE

Directo Indirecto Indizado Indizado Indirecto Directo Indirecto Indizado Indizado Indirecto Directo Indirecto Indizado Indizado Indirecto nico nico nico nico nico nico nico nico nico nico nico nico

9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13

14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14

20,23-24,148,25 16-20,23-24,148,25 20,23-24,148,25 16-20,23-24,148,25 20-21 16-21 20-21 16-21 20,22,33-35,148,36-37 16-20,22,33-35,148,36-37 20,22,33-35,148,36-37 16-20,22,33-35,148,36-37 33-35,148,36-37 37 37 37 37 37 37 37 37 37 37 37

11 15 11 15 8 12 8 12 14 18 14 18 12 7 7 7 7 7 7 7 7 7 7 7

Decodificacin de instrucciones de 16 bits en E-RIC


MNEMNICO ADC ADD SBC SUB AND ORA XOR BIT CMP MVT ASR LSR RLC ROL ROR RRC SHL MODO Registro Fuente Inmediato Registro Fuente Inmediato Registro Fuente Inmediato Registro Fuente Inmediato Registro Fuente Inmediato Registro Fuente Inmediato Registro Fuente Inmediato Registro Fuente Inmediato Registro Fuente Inmediato Registro Fuente Inmediato nico nico nico nico nico nico nico INSTRUCCIONES DE 16 BITS FETCH DECODE 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 14 o 43 14 o 43 14 o 43 14 o 43 14 o 43 14 o 43 14 o 43 14 o 43 14 o 43 14 o 43 14 o 43 14 o 43 14 o 43 14 o 43 14 o 43 14 o 43 14 o 43 14 o 43 14 o 43 14 o 43 14 o 43 14 o 43 14 o 43 14 o 43 14 o 43 14 o 43 14 o 43 EXECUTE CICLOS DE RELOJ 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 + 2N22 7 + 2N 7 + 2N 7 + 2N 7 + 2N 7 + 2N 7 + 2N

38-39 38-39 38-39 38-39 38-39 38-39 38-39 38-39 38-39 38-39 38-39 38-39 38-39 38-39 38-39 38-39 38-39 38-39 38-39 38-39 40-41,147 40-41,147 40-41,147 40-41,147 40-41,147 40-41,147 40-41,147

22

N es el nmero de corrimientos o desplazamientos.

58

PSH POP RTS CLC SEC MSB IMP EXP CIE SIE HLT NOP RST IM1 IM2 IM3 INT MOD 1

nico nico nico nico nico nico nico nico nico nico nico nico nico nico nico nico nico

9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13 9 13

14 o 43 14 o 43 14 o 43 14 o 43 14 o 43 14 o 43 14 o 43 14 o 43 14 o 43 14 o 43 14 o 43 14 o 43 14 o 43 14 o 43 14 o 43 14 o 43 14 o 43

INT MOD 2

nico

9 13

14 o 43

INT MOD 3

nico

9 13

14 o 43

RTI

nico

9 13

14 o 43

55-57,148,58 59-63 59-63 54 54 64 44-48 44,49-50,148,51 52,149 52,149 42 43 146 53 53 53 65-67,148,68,150,69-70,148, 71,150,72-73,148,74,150, 75-76,148,77,150,78-79,148, 80,150,81-82,148,83,150, 84-85,148,86,150,87-88,148, 89,150,90-91,148,92,150, 93-94,148,95-99 65-67,148,68,150,69-70,148, 71,150,72-73,148,74,150, 75-76,148,77,150,78-79,148, 80,150,81-82,148,83,150, 84-85,148,86,150,87-88,148, 89,150,90-91,148,92,150, 93-94,148,95,100,99 65-67,148,68,150,69-70,148, 71,150,72-73,148,74,150, 75-76,148,77,150,78-79,148, 80,150,81-82,148,83,150, 84-85,148,86,150,87-88,148, 89,150,90-91,148,92,150, 93-94,148,95,101-104,99 105-108,151,109-112,151, 113-116,151,117-120,151, 121-124,151,125-128,151, 129-132,151,133-136,151, 137-140,151,141-145

11 11 11 7 7 7 11 11 8 8 7 7 7 7 7 7 60

58

61

56

59

Anexo D. Sintaxis de VHDL en MAX+Plus II El lenguaje de descripcin de hardware utilizado para implementar el procesador ALTERIC es el lenguaje VHDL (VHSIC Hardware Description Language). Los bloques bsicos para un diseo VHDL son las entidades (ENTITY) y la arquitectura (ARCHITECTURE). Para implementar el procesador ALTERIC, se crearon 36 entidades (archivos con extensin .vhd), que se explican con detalle en el captulo CDIGO VHDL de ALTERIC: MANUAL DEL USUARIO. Lo primero que se debe hacer en cada uno de los archivos es llamar a las libreras de la IEEE y la librera lgica y aritmtica library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; La sintaxis utilizada en MAX+Plus II para crear una entidad es:
ENTITY __entity_name IS GENERIC(__parameter_name : string := __default_value; __parameter_name : integer:= __default_value); PORT( __input_name, __input_name __input_vector_name __bidir_name, __bidir_name __output_name, __output_name END __entity_name; : IN : IN : INOUT : OUT STD_LOGIC; STD_LOGIC_VECTOR(__high downto __low); STD_LOGIC; STD_LOGIC);

La declaracin de una entidad, describe solamente los puertos de entrada y salida del diseo. El nivel ms alto de cualquier diseo en VHDL es la declaracin de una entidad. En MAX+Plus II el archivo .vhd debe tener el mismo nombre de la entidad. La relacin interna entre entradas y salidas no se especifica en esta instancia. La declaracin de la entidad ADDER32 es: ENTITY ADDER32 IS port ( A32,B32 : in std_logic_vector (31 downto 0); Cin32 : in std_logic; Resultado32 : out std_logic_vector (31 downto 0); Cout32 : out std_logic ); END ADDER32; 60

Al haber llamado las libreras y declarado la entidad, se procede a declarar la arquitectura de la entidad. La plantilla general para una arquitectura es: ARCHITECTURE a OF __entity_name IS SIGNAL __signal_name : STD_LOGIC; SIGNAL __signal_name : STD_LOGIC; BEGIN -- Process Statement -- Concurrent Procedure Call -- Concurrent Signal Assignment -- Conditional Signal Assignment -- Selected Signal Assignment -- Component Instantiation Statement -- Generate Statement END a; Las relaciones entre entradas y salidas, se describen en la arquitectura, existen tres formas distintas para declarar una arquitectura, estas son:

Arquitectura de flujo de datos: Todas las asignaciones ocurren de manera simultnea en el diseo, y generalmente describen el flujo de datos desde las entradas hacia las salidas. Los valores se le asignan a las seales, usando el operador "<=".

En la entidad ADDER5 se describe una arquitectura de este tipo: ARCHITECTURE Combinatorio OF ADDER5 IS SIGNAL P,G,C:std_logic_vector(4 downto 0); BEGIN U1: for i in 0 to 4 generate P(i)<=A(i) XOR B(i); G(i)<=A(I) AND B(I); END GENERATE; U2: Resultado(0)<=P(0) XOR Cin; C(0) <=((A(0) OR B(0)) AND CIN) OR G(0); U3: for j in 1 to 4 generate C(j)<=G(j) OR (C(j-1) AND (A(j) OR B(j))); Resultado(j)<=P(j) XOR C(j-1); END GENERATE; U4: 61

Cout<=C(4); END Combinatorio;

Arquitectura de descripcin estructural: Las asignaciones se hacen mapeando (Port Map) seales a los componentes definidos en la arquitectura.

En la entidad DECSHC se describe una arquitectura de este tipo:

ARCHITECTURE functional OF DECSHC IS Component ADDER5 port ( A,B Cin Resultado Cout end Component; : in std_logic_vector (4 downto 0); : in std_logic; : out std_logic_vector (4 downto 0); : out std_logic );

signal Resta :std_logic_vector (4 downto 0); Signal cout,cin : std_logic; BEGIN Resta (4 downto 0) <= "11111"; cin <= '0'; ADDER5_DECSHC: ADDER5 PORT MAP (SHCD, Resta,cin , Resultado, Cout); END functional; Dentro de la arquitectura de DECSHC, se hace un llamado al componente ADDER5, se crean unas seales Resta y Cin para interconectar los bloques y el mapeo o conexin de estas seales al componente se hace a travs de Port Map.

Arquitectura de descripcin de comportamientos: Permite la conversin de algoritmos secuenciales a cdigo VHDL. La palabra process statement es parte esencial de este tipo de arquitectura. Como tambin la lista de seales que activan el proceso cada vez que su valor cambia.

Esta arquitectura es usada principalmente en mquinas de estados, donde un dispositivo tiene una memoria interna que determina la salida del mismo. Una entrada de reloj determina el tiempo en el que el estado del dispositivo cambia. Esto puede hacerse por borde de subida o de bajada de la seal de reloj. En la entidad PARADA se describe una arquitectura de este tipo: ARCHITECTURE Funcional OF PARADA is BEGIN

62

PROCESS (clk) BEGIN IF (clk'EVENT and clk = '0') then IF (reset = '1') THEN ESP <= '0; ELSE IF (ESP = '0') THEN IF (PASBUS >= "1100111") THEN ESP <= '0'; ELSE IF ((PASBUS) = (PBUSIN)) THEN ESP <= '1'; ELSE ESP <= '0'; END IF; END IF; ELSE IF (PASBUS = "1100111") THEN IF (retor = '1') THEN ESP <= '0'; ELSE ESP <= '1'; END IF; ELSE ESP <= '1'; END IF; END IF; END IF; END IF; END PROCESS; END ARCHITECTURE funcional; Se puede observar que un archivo .vhd en MAX+Plus II debe contener, llamado a libreras, declaracin de la entidad y declaracin de la arquitectura. El cdigo completo del archivo REGISTER32.VHD es: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; Entity Register32 is port ( DatoIN Carga clk qOut End Register32; : in std_logic_vector (31 downto 0); : in std_logic; : in std_logic; : out std_logic_vector (31 downto 0));

architecture Combinatorio of Register32 is BEGIN 63

Process (clk,Carga,DatoIN) Begin If (clk'Event and clk='0') then if (Carga='1') then qOut <= DatoIN; end if; end if; End Process; END Combinatorio; Anexo E. Legibilidad del programa, mantenimiento y reuso de software. Problemtica de la programacin 23 Los programas son dependientes de sus desarrolladores y requieren cambios, por lo tanto, desde el diseo mismo se debe pensar en el mantenimiento del software, como manera de facilitar las futuras adiciones de funcionalidades, adaptaciones y correcciones que se realicen sobre los diferentes componentes del cdigo fuente. Los programas empricos, a veces muy eficaces, son generalmente incomprensibles para otros programadores distintos del autor. Estos programas son difcilmente modificables . Para evitar estas situaciones, es necesario crear situaciones claras y fcilmente modificables y preparar a los informticos, tcnica y psicolgicamente, para que consideren que su papel principal es tanto el de hacer evolucionar las soluciones, como el de concebir nuevas soluciones pgina 324. Definicin de conceptos: Legibilidad del programa (Program Readability)24 Por legibilidad del programa se entiende el hacer el cdigo ms legible, entendible, porttil y robusto. Es una de las buenas prcticas de programacin: generar cdigo de calidad. Legibilidad se define como el grado en que el lector puede fcil y rpidamente entender el cdigo fuente. Cuando el cdigo es legible, es fcil de entender lo que el programador realiz, el cmo y el porqu. La legibilidad del programa es importante durante la fase de desarrollo y en la fase de mantenimiento (en la fase en que el software est en funcionamiento), porque es ledo el cdigo varias veces, por diferentes personas, y es susceptible de cambios, ya sean correctivos o de mejoras. La legibilidad del programa se puede llevar a cabo en dos partes: Documentacin interna: Cdigo auto-documentable (Self documenting code)
23

G. Agustn,Ingeniera del software: prctica de la programacin.Addison-Wesley Iberoamericana. Wilmington, Delaware, 1991. 24 Frakes, Fox y Nejmeh,Software Engineering in the Unix/C Environment. Prentice-Hall, Englewood Cliffs, New Jersey, 1991.

64

Es el ideal de auto-documentacin, donde el mismo software compilador comenta lo que realiza el cdigo, pero lo nico que puede hacer el programador actualmente es procurar documentar de una manera apropiada los diversos componentes del cdigo que ha creado. Algunas buenas prcticas de programacin: Uso de nombres adecuados: Cada variable, funcin etc., debe expresar en su nombre informacin adecuada acerca del origen, funcin, rol, relacin, etc., de s misma. Esto implica nombres relativamente largos, no sencillamente una letra del alfabeto. Tambin aplica para los nombres de los archivos. (ejemplo: aa.asm vs. Parte_Alta_Alta_ROM_ALTERIC.asm) Escoger las estructuras adecuadas en el flujo del programa: Todas las estructuras (while, for, case, switch, if then, etc.) tienen una funcionalidad especial y la adecuada seleccin reduce la posibilidad de confusin. Estructura escrita el programa (Display of program structure) Es el manejo de los espacios y los tabuladores en la estructura del programa escrito, permitiendo una mayor legibilidad de los caminos de ejecucin, de manera que se pueden identificar grupos funcionales del programa y sus relaciones. Las reglas ms importantes son: - Tabular sentencias del mismo nivel a la misma columna. Ejemplo A,B : in std_logic_vector (31 downto 0); CTRALU : in std_logic_vector (4 downto 0); - Tabular subsentencias anidadas con respecto a la sentencia principal. - Separar verticalmente las sentencias de manera que quedan conformadas como un bloque de cdigo. Manejo de brackets y tabulacin segn el estilo PASCAL. Aunque existen varios estilos en el manejo de brackets, se escoge este por considerarlo ms sencillo de entender y de mayor uso que los dems estilos. Ejemplo: PROCESS (PREIN,PREG) BEGIN IF (PREIN > PREG) THEN { ATINT <= '1'; PRD <= PREIN; } ELSE { ATINT <= '0'; PRD <= PREG; } 65

END IF; END PROCESS; Incorporacin de comentarios en el cdigo fuente: Como su nombre lo indica, son pequeos textos explicativos al margen del cdigo que simplifican el entendimiento del programa. Se utilizan enunciativos antes de la lnea a comentar explicativos van anidados y despus de la lnea comentada. Ejemplo: -- Declaracin de salidas ATINT : out std_logic; -- 1 Si la interrupcin debe ser atendida. Otro punto de inters que se comenta en el cdigo es el historial de modificaciones y de versiones. En este caso, La versin de este cdigo es ALTERIC. Los comentarios deben contener el objetivo del programa, el plan general de los objetivos, el rol del cdigo, razones por las cuales se requiere el cdigo, etc. Es decir, lo pertinente que apoye el entendimiento del porqu del cdigo escrito. Se utiliza un encabezado general y renglones con comentarios, separando prrafos grupos de lneas de cdigo que realizan una misma funcin. El encabezado explica la relacin con los dems mdulos del programa, la fecha de creacin, modificacin, explicacin de su funcin. Ejemplo: --************************************************************************ --* ALTERIC * --* PUJ TG 0421 * --* Diego Beltrn, Moiss Herrera ,Marco Mayolo * --* * --* file name: Alu.vhd * --* created: 1-09-2004 * --* last modified: 12-10-2004 * --* * --* Abstract: * --* Unidad aritmtica y lgica del procesador ALTERIC. * --* Realiza las operaciones aritmticas y lgicas. * --* Se declaran puertos de entradas y salidas * --* seales de conexin de bloques * --* * --* Componentes a los que llama: sumador.vhd * --* lsr.vhd * --* asr.vhd * --* shll.vhd * --* rorl.vhd * --* roll.vhd * --* rrcl.vhd * --* rlcl.vhd * 66

--* * --************************************************************************ Documentacin externa: Sirve como un soporte externo al cdigo, a su entendimiento y el porqu de las relaciones entre procedimientos. En nuestro caso, en la relacin entre AHPL y VHDL, y el cmo se relacionan. Tambin da soporte a procesos complementarios a la implementacin del cdigo: por ejemplo, el plasmarlo en hardware y comprobar su correcto funcionamiento. Esto se logra por medio de Notas de Implementacin. En nuestro caso, las notas de implementacin son el manual DEL USUARIO y los anexos del informe final y el artculo IEEE. Mantenimiento de software (Software Maintenance) Se refiere a todos las adaptaciones, mejoras , correcciones, ampliaciones, que sufre un programa durante su vida til. El como hacer y manejar cambios en el software. Mantenimiento se refiere a un amplio campo de afectacin de la vida til del software. Por tanto, dejamos de lado lo referente a costos: costo del cambio y costo del mantenimiento. Nos centramos en el mantenimiento perfectivo, entendido como toda aquella mejora ampliacin de la funcionalidad del software, con miras a futuras expansiones de este cdigo en Trabajos de grado posteriores a ALTERIC, y nos esforzamos para que el mantenimiento correctivo (referente a errores del cdigo implementado) sea nulo. Reuso de cdigo 25 Nos enfocamos en facilitar el reuso del cdigo, entendido como el uso literal del cdigo AHPL, VHDL y programa de las memorias ROM del procesador ALTERIC y con algunos pequeos cambios ser utilizado en otros proyectos, de manera que sirva como base de futuros trabajos en el diseo de procesadores didcticos. Conceptos como aplicabilidad (entindase como el cdigo de ALTERIC pertinente al siguiente diseo de procesador didctico), generalidad (entendido como que ALTERIC cubre gran parte de los requerimientos del siguiente procesador didctico) y totalidad (ALTERIC es consistente con las futuras necesidades de desarrollos de procesadores didcticos), permitirn el uso del trabajo involucrado en el desarrollo de ALTERIC en el siguiente paso de desarrollo de procesadores didcticos.

25

P.A.V.Hall, Software Reuse and Reverse Engineering in Practice., Chapman & Hall, London, UK, 1992.

67

Anexo F. Cdigo VHDL desarrollado Entidad ALTERIC


--******************************************************************************* --* ALTERIC * --* PUJ TG 0421 * --* Diego Beltrn, Moiss Herrera ,Marco Mayolo * --* * --* file name: Alteric.vhd * --* created: 1-09-2004 * --* last modified: 12-10-2004 * --* * --* Abstract: * --* Unidad que llama los diferentes componentes de control del * --* procesador y de arquitectura. * --* Se declara puertos de entradas y salidas * --* seales de conexin de bloques * --* se declara las entradas de la mquina de estados * --* se declara las entradas del bus espa * --* se declara comparador de prioridades * --* se declara lnea de interrupcin * --* * --* * --* Componentes a los que llama: pasos.vhd * --* parada.vhd * --* arqt.vhd * --* compr.vhd * --* intline.vhd * --* * --* * --******************************************************************************* -- Carga las libreras library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; -- Representa el procesador ALTERIC con todas sus -- entradas y salidas. Esta basado en los bloques ARQT y PASOS. Entity ALTERIC is --Aqu se declaran los puertos de entrada y salida al procesador. Port ( -- RELOJ Clk :in std_logic; -- ATENCION DE INTERRUPCIONES PRIN :in std_logic_vector (2 downto 0); -- Corresponde a las lneas de interrupcin

68

-- Irq 1 a 3 en el modo 3. -- Lnea de Interrupcin para los modos 1 y 2. INT -- SEALES DE CONTROL Reset SWait Read Write IOReq IAck --Paso en el que se desea parar PBUSIN -- BUSES DE DATOS Y DIRECCIONES ADBus -- Bus de datos. DBus :in std_logic; :in std_logic; :in std_logic; :Out std_logic; :Out std_logic; :Out std_logic; :Out std_logic;

:in std_logic_vector (6 downto 0); :out std_logic_vector (23 downto 0); :inout std_logic_vector (31 downto 0);

-- SBUS y SBUSSC SBUSSC :in std_logic_vector (3 downto 0); -- Especifica que registro escribe sobre el SBUS Datinsb :in std_logic; -- 0: Se quiere ver un nico registro (Modo parada) -- 1: Se quiere ver un grupo de registros (Modo parada) -- Seal no conexin NC :in std_logic;

-- Seal para retornar de modo de parada a modo normal retor :in std_logic;

datok :in std_logic; -- 1: Deja de mostrar el registro, pasa al siguiente (Modo parada) -- 0: Muestra el registro permanentemente SBUS :out std_logic_vector (31 downto 0); -- Bus que muestra el contenido de los registros internos. -- Cual es el registro que se muestra en el bus espa SBUSSal :out std_logic_vector (3 downto 0); ESP -- 1: Modo parada -- 0: Modo normal :out std_logic;

-- Bus que muestra los pasos de la secuencia de control. PBUS :out std_logic_vector (6 downto 0)); End ALTERIC; Architecture Modular of ALTERIC is -- BLOQUE ARQ (Arquitectura del Sistema)

69

Component ARQT Port ( Clk CargaMA CargaIR CargaMD CargaPC CargaAC CargaIX CargaSP CargaRA CargaRB CargaRC CargaRD CargaRE CargaRF CargaPR CargaMR CargaSHC CargaSB CFR CFL OfFR OfFL ZFR ZFL NFR NFL ShFR ShFL IeFR IeFL MADC MDDC SRFC SHCDC PRDC CTRALU ABUSDC BBUSDC ADBUSDC DBUSDC SBUSDC SBUSOut SBUSSC SBRCtr Datinsb NC PRIN ADBus DBus SBUS Dato_IR Dato_SHC Dato_PR Dato_SR Dato_MR Dato_SBR End Component; -- BLOQUE PASOS (Maquina de estados, cdigo AHPL)

:in std_logic; :in std_logic; :in std_logic; :in std_logic; :in std_logic; :in std_logic; :in std_logic; :in std_logic; :in std_logic; :in std_logic; :in std_logic; :in std_logic; :in std_logic; :in std_logic; :in std_logic; :in std_logic; :in std_logic; :in std_logic; :in std_logic; :in std_logic; :in std_logic; :in std_logic; :in std_logic; :in std_logic; :in std_logic; :in std_logic; :in std_logic; :in std_logic; :in std_logic; :in std_logic; :in std_logic; :in std_logic; :in std_logic_vector (1 downto 0); :in std_logic; :in std_logic_vector (1 downto 0); :in std_logic_vector (4 downto 0); :in std_logic_vector (3 downto 0); :in std_logic_vector (3 downto 0); :in std_logic_vector (1 downto 0); :in std_logic; :in std_logic_vector (3 downto 0); :out std_logic_vector (3 downto 0); :in std_logic_vector (3 downto 0); :in std_logic; :in std_logic; :in std_logic; :in std_logic_vector (2 downto 0); :out std_logic_vector (23 downto 0); :inout std_logic_vector (31 downto 0); :out std_logic_vector (31 downto 0); :out std_logic_vector (0 to 25); :out std_logic_vector (4 downto 0); :out std_logic_vector (2 downto 0); :out std_logic_vector (5 downto 0); :out std_logic_vector (1 downto 0); :out std_logic_vector (5 downto 0));

70

Component PASOS PORT( clk PBUSIN swait, reset, irq IR SR MR SHC SBR SBUSSC SBusCt retor datok LOADS CARGASBR FLAGSC REGDC SBRCONT CALU AyBBUSDC ADyDBUSDC PBUS ESP IORQ, IACK, READ, WRITE : IN std_logic; : IN std_logic_vector (6 DOWNTO 0); : IN std_logic; : IN std_logic_vector (0 TO 25); : IN std_logic_vector (5 DOWNTO 0); : IN std_logic_vector (1 DOWNTO 0); : IN std_logic_vector (4 DOWNTO 0); : IN std_logic_vector (5 downto 0); : IN std_logic_vector (3 DOWNTO 0); : OUT std_logic_vector (3 downto 0); : IN std_logic; : IN std_logic; : OUT std_logic_vector (15 DOWNTO 0); : OUT std_logic; : OUT std_logic_vector (11 DOWNTO 0); : OUT std_logic_vector (7 DOWNTO 0); : OUT std_logic; : OUT std_logic_vector (4 DOWNTO 0); : OUT std_logic_vector (7 DOWNTO 0); : OUT std_logic_vector (3 DOWNTO 0); : OUT std_logic_vector (6 DOWNTO 0); : IN std_logic; : OUT std_logic);

END Component; -- Genera la seal ESP Component PARADA port( clk retor reset PBUSIN PASBUS ESP End Component; -- Verifica el modo de interrupcin de acuerdo con MR Component INTLINE port ( Int INTM3 MR INTOK End Component; -- Verifica que la interrupcin en modo 3 deba ser atendida Component COMPR port ( PREIN PREG ATINT PRD End Component; -- SEALES DE INTERCONEXION DE BLOQUES Signal Signal Signal Signal Signal Signal Signal IR SR MR SHC SBR PASBUS PABUS : std_logic_vector (0 TO 25); : std_logic_vector (5 DOWNTO 0); : std_logic_vector (1 DOWNTO 0); : std_logic_vector (4 DOWNTO 0); : std_logic_vector (5 downto 0); : std_logic_vector (6 downto 0); : std_logic_vector (6 downto 0);

: in std_logic; : in std_logic; : in std_logic; : in std_logic_vector (6 downto 0); : in std_logic_vector (6 downto 0); : inout std_logic);

: in std_logic; : in std_logic; : in std_logic_vector (1 downto 0); : Out std_logic);

: in std_logic_vector (2 downto 0); : in std_logic_vector (2 downto 0); : out std_logic; : Out std_logic_vector (2 downto 0));

71

Signal Signal Signal Signal Signal Signal Signal Signal Signal Signal Signal Signal Signal Signal Signal Signal Signal Signal Begin

LOADS CARGSBR CARGARSBR FLAGSC REGDC SBRCON SBRCONTR CALU AyBBUSDC ADyDBUSDC SBusCtr SBUSDC IRQReal PR PRMax AMayB SPY SPY2

: std_logic_vector (15 DOWNTO 0); : std_logic; : std_logic; : std_logic_vector (11 DOWNTO 0); : std_logic_vector (7 DOWNTO 0); : std_logic; : std_logic; : std_logic_vector (4 DOWNTO 0); : std_logic_vector (7 DOWNTO 0); : std_logic_vector (3 DOWNTO 0); : std_logic_vector (3 downto 0); : std_logic_vector (3 downto 0); : std_logic; : std_logic_vector (2 downto 0 ); : std_logic_vector (2 Downto 0 ); : std_logic; : std_logic; : std_logic;

--Se declaran las entradas y salidas de la mquina de estados Maquina_de_Estados: PASOS Port Map (Clk, PBUSIN, Swait, Reset, IrqReal, IR, SR(5 downto 0), MR, SHC, SBR, SBUSSC, SBusCtr (3 downto 0), retor, datok, LOADS, CARGARSBR, FLAGSC, REGDC, SBRCON, CALU, AyBBUSDC, ADyDBUSDC, PABUS, SPY2, IOReq,IAck, Read, Write ); (Clk, retor, reset, PBUSIN (6 downto 0), PASBUS (6 downto 0), SPY);

Modo_Bus_Espia: PARADA Port Map Arquitectura: ARQT Port Map (Clk, LOADS(15), LOADS(14), LOADS(13), LOADS(12), LOADS(11), LOADS(10), LOADS(9), LOADS(8), LOADS(7), LOADS(6), LOADS(5), LOADS(4), LOADS(3), LOADS(2), LOADS(1), LOADS(0), CARGSBR, FLAGSC(11), FLAGSC(10), FLAGSC(9), FLAGSC(8), FLAGSC(7), FLAGSC(6), FLAGSC(5), FLAGSC(4), FLAGSC(3), FLAGSC(2), FLAGSC(1), FLAGSC(0), REGDC(6), REGDC(5), REGDC (4 downto 3), REGDC(2), REGDC(1 downto 0), CALU, AyBBUSDC ( 7 downto 4), AyBBUSDC (3 downto 0), ADyDBUSDC(2 downto 1), ADyDBUSDC (0), SBUSDC (3 downto 0), SBUSSal, SBUSSC,SBRCONTR, Datinsb, NC, PRMax, ADBus, DBus, SBus, IR, SHC, PR, SR, MR, SBR);

Comparador_de_Prioridades: COMPR Port Map Senal_INT: INTLINE Port Map PASBUS (6 downto 0) PBUS (6 downto 0) SBUSDC (3 downto 0) (PRIN, PR, AmayB, PRMax); (Int, AMayB, MR, IrqReal); <= PABUS (6 downto 0); <= PABUS (6 downto 0); <= SBusCtr (3 downto 0);

72

CARGSBR SBRCONTR SPY2 ESP End Modular;

<= CARGARSBR; <= SBRCON; <= SPY; <= SPY;

Entidad COMPR
--******************************************************************************* --* ALTERIC * --* PUJ TG 0421 * --* Diego Beltrn, Moiss Herrera ,Marco Mayolo * --* * --* file name: Compr.vhd * --* created: 1-09-2004 * --* last modified: 12-10-2004 * --* * --* Abstract: * --* Identifica si se el valor de las lneas PREIN, es mayor al * --* dato del registro PR, para atender la interrupcin * --* en modo 3. Se definen las entradas y salidas * --* * --* * --* Componentes a los que llama: ninguno * --* * --* * --******************************************************************************* library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; Entity COMPR is port (PREIN -- lneas Externas. PREG -- Contenido de PR. : in std_logic_vector (2 downto 0); : in std_logic_vector (2 downto 0);

ATINT : out std_logic; -- 1 Si la interrupcin debe ser atendida. PRD -- Entrada al registro PR. End COMPR; architecture Combinatorio of COMPR is BEGIN PROCESS (PREIN,PREG) BEGIN IF (PREIN > PREG) THEN -- Si las lneas de entrada es mayor al dato del reg. PR ATINT <= '1'; -- Se atiende la interrupcin : Out std_logic_vector (2 downto 0));

73

PRD <= PREIN; -- El registro PR toma el valor de las lneas de entrada ELSE ATINT <= '0'; -- No se atiende la interrupcin PRD <= PREG; -- El registro PR conserva su valor END IF; END PROCESS; END Combinatorio;

Entidad INTLINE
--******************************************************************************* --* ALTERIC * --* PUJ TG 0421 * --* Diego Beltrn, Moiss Herrera ,Marco Mayolo * --* * --* file name: Intline.vhd * --* created: 1-09-2004 * --* last modified: 12-10-2004 * --* * --* Abstract: * --* Identifica si se atiende la lnea INT, o las entradas de PREIN * --* dependiendo del modo de interrupcin. * --* Se definen las entradas y salidas * --* * --* * --* Componentes a los que llama: ninguno * --* * --* * --******************************************************************************* library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; Entity INTLINE is port ( Int : in std_logic; -- lnea de interrupcin para modos 1 y 2. INTM3 : in std_logic; -- interrupcin de mayor prioridad en modo 3. MR : in std_logic_vector (1 downto 0); -- Modo de Interrupcin. INTOK : Out std_logic); -- Hay una interrupcin. End INTLINE; architecture Combinatorio of INTLINE is BEGIN Process (MR,Int, INTM3) Begin Case MR is -- Modo 3

74

When "11"

=> INTOK <= INTM3;

-- Modos 1 y 2 When Others => INTOK <= Int; End Case; End Process; END Combinatorio;

Entidad PASOS
--******************************************************************************* --* PASOS (CODIGO AHPL) * --* PUJ TG 0421 * --* Diego Beltrn, Moiss Herrera ,Marco Mayolo * --* * --* file name: Pasos.vhd * --* created: 1-09-2004 * --* last modified: 6-11-2004 * --* * --* Abstract: * --* Maquina de estados del procesador ALTERIC, dependiendo de* --* el paso en el cdigo AHPL, genera unas seales de control * --* para cargar los registros y las banderas del SR * --* Se declara puertos de entradas y salidas * --* seales de conexin de bloques * --* se declara las entradas de la mquina de estados * --* se declara las entradas del bus espa * --* * --* * --* * --* * --* Componentes a los que llama: funciones.vhd * --* paso20.vhd * --* paso30.vhd * --* paso34.vhd * --* paso40.vhd * --* paso41.vhd * --* paso42.vhd * --* paso44.vhd * --* paso68.vhd * --* * --* * --******************************************************************************* -- Carga las libreras LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE ieee.std_logic_arith.ALL; ENTITY PASOS IS PORT (clk -- Seal de reloj : IN std_logic;

PBUSIN : IN std_logic_vector (6 DOWNTO 0); -- Paso en el que el usuario desea parar swait, reset, irq IR : IN std_logic; : IN std_logic_vector (0 TO 25);

75

-- Registros utilizados en las funciones -- para hacer cambio de estado. SR : IN std_logic_vector (5 DOWNTO 0); MR : IN std_logic_vector (1 DOWNTO 0); SHC : IN std_logic_vector (4 DOWNTO 0); SBR : IN std_logic_vector (5 downto 0); SBUSSC : IN std_logic_vector (3 downto 0); -- Seal de seleccin para el bus espa SBusCt -- Control para el bus espa retor datok LOADS -- Control para cargar los registros CARGASBR -- Control para cargar el reg. del bus espa : OUT std_logic_vector (3 downto 0);

: IN std_logic; : IN std_logic; : OUT std_logic_vector (15 DOWNTO 0); : OUT std_logic;

FLAGSC : OUT std_logic_vector (11 DOWNTO 0); -- Control para poner en 1 o 0 las banderas del SR REGDC : OUT std_logic_vector (7 DOWNTO 0); -- Controla la manera en que los registros toman datos SBRCONT : OUT std_logic; -- Controla la manera en que el reg. del bus espa toma datos CALU -- Control para la ALU AyBBUSDC -- Control para los buses ABUS y BBUS ADyDBUSDC -- Control para los buses DBUS y ADBUS PBUS -- Paso del cdigo AHPL ESP -- Modo de funcionamiento del bus espa IORQ, IACK, READ, WRITE END ENTITY PASOS; --------------IR: SR: DESCRIPCION DE LAS ENTRADAS Registro de instrucciones Registro de estados SR(0): C SR(1): Z SR(2): N SR(3): V SR4: shf SR(5): ief Registro de modos de interrupcin Registro de corrimientos Registro del bus espa Pin de reloj de entrada Pin de solicitud de interrupciones : OUT std_logic_vector (4 DOWNTO 0); : OUT std_logic_vector (7 DOWNTO 0); : OUT std_logic_vector (3 DOWNTO 0); : OUT std_logic_vector (6 DOWNTO 0); : IN std_logic; : OUT std_logic);

MR: SHC: SBR: clk: irq:

76

---

reset: Pin de reset Control: Registro de pasos de la secuencia de control.

ARCHITECTURE secuencial OF PASOS IS Component Paso20 port ( IR6 CALU AyBBUSDC End Component; Component Paso30 port ( IR3 CALU End Component; Component Paso34 port ( IR0A3 LOADS CALU FLAGSC End Component; Component Paso40 port ( IR0 IR16 CALU AyBBUSDC End Component; Component Paso41 port ( IR10 IR12A15 CALU AyBBUSDC End Component; Component Paso42 port ( IR2A3 IR6A9 LOADS AyBBUSDC End Component; Component Paso44 port ( IR5A6 IR10 CALU FLAGSC End Component; Component Paso68 port ( IR8 LOADS End Component; CONSTANT num_pasos : in std_logic; : out std_logic_vector (4 downto 0); : out std_logic_vector (7 downto 0));

: in std_logic; : out std_logic_vector (4 downto 0));

: in std_logic_vector (0 to 3); : out std_logic_vector (15 downto 0); : out std_logic_vector (4 downto 0); : out std_logic_vector (11 downto 0));

: in std_logic; : in std_logic; : out std_logic_vector (4 downto 0); : out std_logic_vector (7 downto 0));

: in std_logic; : in std_logic_vector (0 to 3); : out std_logic_vector (4 downto 0); : out std_logic_vector (7 downto 0));

: in std_logic_vector (0 to 1); : in std_logic_vector (0 to 3); : out std_logic_vector (15 downto 0); : out std_logic_vector (7 downto 0));

: in std_logic_vector (0 to 1); : in std_logic; : out std_logic_vector (4 downto 0); : out std_logic_vector (11 downto 0));

: in std_logic; : out std_logic_vector (15 downto 0)); : integer := 7;

-- SEALES PARA CONECTAR COMPONENTES SIGNAL CALU20, CALU30, CALU34, CALU40, CALU41, CALU44 SIGNAL LOADS34, LOADS42, LOADS68 SIGNAL FLAGSC34, FLAGSC44 : std_logic_vector (4 downto 0); : std_logic_vector (15 downto 0); : std_logic_vector (11 downto 0);

77

SIGNAL AyBBUSDC20, AyBBUSDC40, AyBBUSDC41, AyBBUSDC42 USE WORK.FUNCIONES.ALL; BEGIN -- Cableado de los componentes necesarios --En el paso 20 verifica si el modo es directo o indizado

: std_logic_vector (7 downto 0);

Modos_directo_indizado: Paso20 Port Map (IR(6),CALU20,AyBBUSDC20); --En el paso 30 verifica si la instruccin a realizar es INC o DEC INC_DEC: Paso30 Port Map (IR(3),CALU30); --En el paso 34 se ejecutan las instrucciones aritmticas y lgicas de 32 bits Arit_Log_32Bits: Paso34 Port Map (IR(0 to 3), LOADS34, CALU34, FLAGSC34); --En el paso 40 ejecuta las instrucciones de saltos Saltos: Paso40 Port Map (IR(0), IR(16), CALU40, AyBBUSDC40); --En el paso 41 verifica el modo de las instrucciones aritmticas y lgicas de 16 bits Modos_16Bits: Paso41 Port Map (IR(10), IR(12 to 15), CALU41, AyBBUSDC41); --En el paso 42 ejecuta las instrucciones aritmticas y lgicas de 16 bits Arit_Log_16Bits: Paso42 Port Map (IR(2 to 3), IR(6 to 9), LOADS42, AyBBUSDC42); --En el paso 44 ejecuta las instrucciones de rotacin y desplazamiento Rotac_Desp: Paso44 Port Map (IR(5 to 6), IR(10), CALU44, FLAGSC44); --En el paso 68 verifica si la instruccin a ejecutar es POP o RTS POP_RTS: Paso68 Port Map (IR(8), LOADS68); PROCESS (clk) VARIABLE Siguiente : integer := 0; -- Variable que toma el valor del paso siguiente VARIABLE Paso : integer := 0; -- Variable que toma el valor del paso actual VARIABLE estad : integer := 103; -- Variable que toma el valor del paso actual (Modo de parada) VARIABLE Siguiente1 : STD_LOGIC_VECTOR (7 DOWNTO 0); -- Variables utilizadas por la maquina de estados VARIABLE BEGIN IF (clk'EVENT and clk = '1') THEN --Borde de subida de reloj IF (reset = '1') THEN Siguiente2 : STD_LOGIC_VECTOR (7 DOWNTO 0);

78

-- Si hay reset, vuelve al paso 0 del cdigo AHPL Siguiente := 0; estad := 103; Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); Siguiente2 := (CONV_STD_LOGIC_VECTOR (estad,8)); READ <= '1'; WRITE <= '1'; ELSE IF (ESP = '0') THEN -- El bus espa trabaja en modo normal CASE Siguiente1 IS --Paso 0 del AHPL WHEN x"00" => Paso := Siguiente; Siguiente := Siguiente + 1; Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); -Palabras de control de -- los registros y la ALu CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"FFFF"; --Control de carga de registros. FLAGSC <= X"AAA"; --Control del registro SR. REGDC <= X"02"; --Control de cargas especiales. CALU <= "11001"; --Controla las operaciones de la ALU. AyBBUSDC <= X"00"; --Controla los buses internos (ABUS, BBUS). ADyDBUSDC <= X"0"; --Controla los buses externos (ADBUS, DBUS). IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= Conv_Std_Logic_vector(Paso, num_pasos); --Pasos 1,5,10,17,27,48,65,86,90,95 WHEN X"01" |X"05" | X"0A" | X"11" | X"1B" | X"30" |X"41" | X"56" | X"5A" | X"5F" => Paso := Siguiente; Siguiente := Siguiente + 1; Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"0000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"6"; IORQ <= '0'; IACK <= '0'; READ <= '0'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Pasos 2,6,11,18,66,87,91,136,96 WHEN X"02" | X"06" | X"0B" | X"12" | X"1C" | X"42" | X"57" | X"5B" | X"60" =>

79

Paso := Siguiente; Siguiente := FWait (Siguiente, swait); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"0000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"6"; IORQ <= '0'; IACK <= '0'; READ <= '0'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Pasos 3,7,19 WHEN X"03" | X"07" | X"13" => Paso := Siguiente; Siguiente := Siguiente + 1; Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"2000"; FLAGSC <= X"000"; REGDC <= X"20"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"6"; IORQ <= '0'; IACK <= '0'; READ <= '0'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 4 WHEN X"04" => Paso := Siguiente; Siguiente := Siguiente + 1; Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"9000"; FLAGSC <= X"000"; REGDC <= X"40"; CALU <= "10101"; AyBBUSDC <= X"20"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 8 WHEN X"08" => Paso := Siguiente; Siguiente := Siguiente + 1; Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0';

80

SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"0200"; FLAGSC <= X"002"; REGDC <= X"00"; CALU <= "10101"; AyBBUSDC <= X"20"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 9 WHEN X"09" => Paso := Siguiente; Siguiente := Siguiente + 1; Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"8000"; FLAGSC <= X"008"; REGDC <= X"00"; CALU <= "10110"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 12 WHEN X"0C" => Paso := Siguiente; Siguiente := Siguiente + 1; Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"3000"; FLAGSC <= X"000"; REGDC <= X"20"; CALU <= "00111"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"6"; IORQ <= '0'; IACK <= '0'; READ <= '0'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 13 WHEN X"0D" => Paso := Siguiente; Siguiente := Siguiente + 1; Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"4000"; FLAGSC <= X"000";

81

REGDC CALU AyBBUSDC ADyDBUSDC IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <=

<= X"00"; <= "10101"; <= X"20"; <= X"0";

(Conv_Std_Logic_vector(Paso, num_pasos));

--Paso 14 WHEN X"0E" => Paso := Siguiente; Siguiente := FPaso14 (IR(0 to 6),IR(7 to 15),SR, irq); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"0000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 15 WHEN X"0F" => Paso := Siguiente; Siguiente := 34; Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"2000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "10101"; AyBBUSDC <= X"50"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 16 WHEN X"10" => Paso := Siguiente; Siguiente := Siguiente + 1; Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"8000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "10101";

82

AyBBUSDC <= X"20"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 20 WHEN X"14" => Paso := Siguiente; Siguiente := FPaso20 (IR (0 to 3)); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"8000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= CALU20; AyBBUSDC <= AyBBUSDC20; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 21 WHEN X"15" => Paso := Siguiente; Siguiente := FChFetInt (irq, SR(5)); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"1000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "10101"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 22 WHEN X"16" => Paso := Siguiente; Siguiente := 35; Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"4000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "10101"; AyBBUSDC <= X"D0"; -- Antes era 00 ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0';

83

READ WRITE PBUS

<= '1'; <= '1'; <= (Conv_Std_Logic_vector(Paso, num_pasos));

--Pasos 23,52,60 WHEN X"17" | X"34" | X"3C" => Paso := Siguiente; Siguiente := Siguiente + 1; Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"2000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "10110"; AyBBUSDC <= X"02"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Pasos 24,31,37,53,61,72,77 WHEN X"18" | X"1F" | X"25" | X"35" | X"3D" | X"48" | X"4D" => Paso := Siguiente; Siguiente := Siguiente + 1; Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"0000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"7"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Pasos 25,32,38,54,62,73,78,88 WHEN X"19" | X"20" | X"26" | X"36" | X"3E" | X"49" | X"4E" =>-Paso := Siguiente; Siguiente := Siguiente +1; Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"0000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"7"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '0'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos));

84

--Pasos 26,33 WHEN X"1A" | X"21" => Paso := Siguiente; Siguiente := FChFetIntWait (irq, SR(5), Swait, Siguiente); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"0000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"7"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '0'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 29 WHEN X"1D" => Paso := Siguiente; Siguiente := FPaso29 (IR (0 to 1), Siguiente); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"2000"; FLAGSC <= X"000"; REGDC <= X"20"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"6"; IORQ <= '0'; IACK <= '0'; READ <= '0'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 30 WHEN X"1E" => Paso := Siguiente; Siguiente := Siguiente + 1; Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"2000"; FLAGSC <= X"050"; REGDC <= X"00"; CALU <= CALU30; AyBBUSDC <= X"20"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 34 WHEN X"22" => Paso := Siguiente; Siguiente := FChFetInt (irq, SR(5));

85

Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= LOADS34; FLAGSC <= FLAGSC34; REGDC <= X"00"; CALU <= CALU34; AyBBUSDC <= X"22"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Pasos 35,59 WHEN X"23" | X"3B" => Paso := Siguiente; Siguiente := Siguiente + 1; Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"8200"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "01001"; AyBBUSDC <= X"01"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Pasos 36,71 WHEN X"24" | X"47" => Paso := Siguiente; Siguiente := Siguiente + 1; Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"2000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "10110"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 39 WHEN X"27" => Paso := Siguiente; Siguiente := FWait (Siguiente, swait); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC;

86

LOADS <= X"0000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"7"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '0'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 40 WHEN X"28"=> Paso := Siguiente; Siguiente := FChFetInt (irq, SR(5)); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"1000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= CALU40; AyBBUSDC <= AyBBUSDC40; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 41 WHEN X"29" => Paso := Siguiente; Siguiente := Siguiente + 1; Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"2000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= CALU41; AyBBUSDC <= AyBBUSDC41; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 42 WHEN X"2A" => Paso := Siguiente; Siguiente := FChIns16 (SR(4), irq, SR(5)); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= LOADS42; FLAGSC <= FLAGSC34; REGDC <= X"00"; CALU <= CALU34;

87

AyBBUSDC <= AyBBUSDC42; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 43 WHEN X"2B" => Paso := Siguiente; Siguiente := Siguiente + 1; Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"0001"; FLAGSC <= X"000"; REGDC <= X"04"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 44 WHEN X"2C" => Paso := Siguiente; Siguiente := 101; Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"0801"; FLAGSC <= FLAGSC44; REGDC <= X"00"; CALU <= CALU44; AyBBUSDC <= X"02"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 45 WHEN X"2D" => Paso := Siguiente; Siguiente := FPaso45 (reset, irq, SR(5)); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"0000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0';

88

READ WRITE PBUS

<= '1'; <= '1'; <= (Conv_Std_Logic_vector(Paso, num_pasos));

--Paso 46 WHEN X"2E" => Paso := Siguiente; Siguiente := FPaso46 (IR(16 to 19), IR(22 to 25), irq, SR(5)); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"4000"; FLAGSC <= X"00C"; REGDC <= X"00"; CALU <= "10101"; AyBBUSDC <= X"60"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 47 WHEN X"2F" => Paso := Siguiente; Siguiente := FPaso47 (IR(9)); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"8000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "10101"; AyBBUSDC <= X"70"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 49 WHEN X"31" => Paso := Siguiente; Siguiente := FWait (Siguiente, swait); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"0000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"6"; IORQ <= '1'; IACK <= '0'; READ <= '0'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 50

89

WHEN X"32" => Paso := Siguiente; Siguiente := Siguiente + 1; Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"2000"; FLAGSC <= X"000"; REGDC <= X"20"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"6"; IORQ <= '1'; IACK <= '0'; READ <= '0'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 51 WHEN X"33" => Paso := Siguiente; Siguiente := FChIns16 (SR(4), irq, SR(5)); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"0800"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "10101"; AyBBUSDC <= X"20"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 55 WHEN X"37" => Paso := Siguiente; Siguiente := FChFetIntWait16 (Siguiente, SR(4), irq, SR(5), swait); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"0000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"7"; IORQ <= '1'; IACK <= '0'; READ <= '1'; WRITE <= '0'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 56 WHEN X"38" => Paso := Siguiente; Siguiente := 102; Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8));

90

CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"0000"; FLAGSC <= X"001"; REGDC <= X"18"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 57 WHEN X"39"=> Paso := Siguiente; Siguiente := FChIns16 (SR(4), irq, SR(5)); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"0002"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 58 WHEN X"3A" => Paso := Siguiente; Siguiente := FChIns16 (SR(4), irq, SR(5)); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"0000"; FLAGSC <= X"400"; REGDC <= X"18"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 63 WHEN X"3F" => Paso := Siguiente; Siguiente := FChFetIntWait16 (Siguiente, SR(4), irq, SR(5), swait); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"0000";

91

FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"7"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '0'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Pasos 64,89 WHEN X"40" | X"59" => Paso := Siguiente; Siguiente := Siguiente + 1; Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"8000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "10110"; AyBBUSDC <= X"01"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 67 WHEN X"43" => Paso := Siguiente; Siguiente := Siguiente + 1; Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"2200"; FLAGSC <= X"000"; REGDC <= X"20"; CALU <= "00111"; AyBBUSDC <= X"01"; ADyDBUSDC <= X"6"; IORQ <= '0'; IACK <= '0'; READ <= '0'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 68 WHEN X"44" => Paso := Siguiente; Siguiente := FChIns16 (SR(4), irq, SR(5)); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= LOADS68; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "10101";

92

AyBBUSDC <= X"20"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 69 WHEN X"45" => Paso := Siguiente; Siguiente := FChIns16 (SR(4), irq, SR(5)); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"0800"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "10110"; AyBBUSDC <= X"0C"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 70 WHEN X"46" => Paso := Siguiente; Siguiente := Siguiente + 1; Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"8204"; FLAGSC <= X"002"; REGDC <= X"03"; CALU <= "01001"; AyBBUSDC <= X"01"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 74 WHEN X"4A" => Paso := Siguiente; Siguiente := FWait (Siguiente, swait); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"0000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"7"; IORQ <= '0'; IACK <= '0';

93

READ WRITE PBUS

<= '1'; <= '0'; <= (Conv_Std_Logic_vector(Paso, num_pasos));

--Paso 75 WHEN X"4B" => Paso := Siguiente; Siguiente := Siguiente + 1; Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"8200"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "01001"; AyBBUSDC <= X"01"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 76 WHEN X"4C" => Paso := Siguiente; Siguiente := Siguiente + 1; Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"2000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "10110"; AyBBUSDC <= X"0A"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 79 WHEN X"4F"=> Paso := Siguiente; Siguiente := FPaso79 (MR, swait); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"0000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"7"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '0'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos));

94

--Paso 80 WHEN X"50" => Paso := Siguiente; Siguiente := Siguiente + 1; Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"0000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"4"; IORQ <= '0'; IACK <= '0'; READ <= '0'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 81 WHEN X"51" => Paso := Siguiente; Siguiente := FWait (Siguiente, swait); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"0000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"4"; IORQ <= '0'; IACK <= '1'; READ <= '0'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 82 WHEN X"52" => Paso := Siguiente; Siguiente := Siguiente + 1; Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"2000"; FLAGSC <= X"000"; REGDC <= X"20"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"4"; IORQ <= '0'; IACK <= '1'; READ <= '0'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 83 WHEN X"53" => Paso := Siguiente; Siguiente := FChFetInt (irq, SR(5));

95

Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"1000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "10101"; AyBBUSDC <= X"20"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 84 WHEN X"54" => Paso := Siguiente; Siguiente := 83; Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"2000"; FLAGSC <= X"000"; REGDC <= X"20"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '1'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 85 WHEN X"55" => Paso := Siguiente; Siguiente := Siguiente + 1; Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"8000"; FLAGSC <= X"001"; REGDC <= "00001000"; CALU <= "10110"; AyBBUSDC <= X"0B"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '1'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 88 WHEN X"58" => Paso := Siguiente; Siguiente := 83; Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC;

96

LOADS <= X"2000"; FLAGSC <= X"000"; REGDC <= X"20"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"6"; IORQ <= '0'; IACK <= '0'; READ <= '0'; WRITE <= '1'; PBUS <=(Conv_Std_Logic_vector(Paso, num_pasos)); --Pasos 92,97 WHEN X"5C" | X"61" => Paso := Siguiente; Siguiente := Siguiente + 1; Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"2000"; FLAGSC <= X"000"; REGDC <= X"20"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"6"; IORQ <= '0'; IACK <= '0'; READ <= '0'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Pasos 93,98 WHEN X"5D" | X"62" => Paso := Siguiente; Siguiente := Siguiente + 1; Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"8200"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00111"; AyBBUSDC <= X"01"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 94 WHEN X"5E" => Paso := Siguiente; Siguiente := Siguiente + 1; Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"0000"; FLAGSC <= X"555"; REGDC <= X"10"; CALU <= "10101";

97

AyBBUSDC <= X"20"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos));

--Paso 99 WHEN X"63" => Paso := Siguiente; Siguiente := FChFetInt (irq, SR(5)); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"1000"; FLAGSC <= X"001"; REGDC <= "00001000"; CALU <= "10101"; AyBBUSDC <= X"20"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 100 WHEN X"64" => Paso := Siguiente; Siguiente := 1; Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"8000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "10111"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 101 WHEN X"65" => Paso := Siguiente; Siguiente := FChRotDes (SHC, SR(4), irq, SR(5)); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"0000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00000";

98

AyBBUSDC <= X"00"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos));

--Paso 102 WHEN X"66" => Paso := Siguiente; Siguiente := FChIns16 (SR(4), irq, SR(5)); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"0000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 103 WHEN X"67" => Paso := Siguiente; Siguiente := 104; Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '1'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"0000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 104 WHEN X"68" => Paso := Siguiente; Siguiente := FEspDec (SBR(5 downto 0)); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"0000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00000";

99

AyBBUSDC <= X"00"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos));

--Paso 105 WHEN X"69" => Paso := Siguiente; Siguiente := FEspiauno (Siguiente, SBR (4)); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= "0000"; LOADS <= X"0000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 106 WHEN X"6A" => Paso := Siguiente; Siguiente := FEspiauno (Siguiente, SBR (4)); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= "0001"; LOADS <= X"0000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 107 WHEN X"6B" => Paso := Siguiente; Siguiente := FEspiauno (Siguiente, SBR (4)); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= "0010"; LOADS <= X"0000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00000";

100

AyBBUSDC <= X"00"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos));

--Paso 108 WHEN X"6C" => Paso := Siguiente; Siguiente := FEspiauno (Siguiente, SBR (4)); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= "0011"; LOADS <= X"0000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 109 WHEN X"6D" => Paso := Siguiente; Siguiente := FEspiados (Siguiente, SBR (4), SBR (1)); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= "0100"; LOADS <= X"0000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 110 WHEN X"6E" => Paso := Siguiente; Siguiente := FEspiauno (Siguiente, SBR (4)); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= "0101"; LOADS <= X"0000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00000";

101

AyBBUSDC <= X"00"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos));

--Paso 111 WHEN X"6F" => Paso := Siguiente; Siguiente := FEspiauno (Siguiente, SBR (4)); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= "0110"; LOADS <= X"0000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 112 WHEN X"70" => Paso := Siguiente; Siguiente := FEspiauno (Siguiente, SBR (4)); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= "0111"; LOADS <= X"0000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 113 WHEN X"71" => Paso := Siguiente; Siguiente := FEspiauno (Siguiente, SBR (4)); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= "1000"; LOADS <= X"0000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00000";

102

AyBBUSDC <= X"00"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos));

--Paso 114 WHEN X"72" => Paso := Siguiente; Siguiente := FEspiauno (Siguiente, SBR (4)); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= "1001"; LOADS <= X"0000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 115 WHEN X"73" => Paso := Siguiente; Siguiente := FEspiauno (Siguiente, SBR (4)); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= "1010"; LOADS <= X"0000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 116 WHEN X"74" => Paso := Siguiente; Siguiente := FEspiados (Siguiente, SBR (4), SBR (1)); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= "1011"; LOADS <= X"0000"; FLAGSC <= X"000"; REGDC <= X"00";

103

CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos));

--Paso 117 WHEN X"75" => Paso := Siguiente; Siguiente := FEspiauno (Siguiente, SBR (4)); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= "1100"; LOADS <= X"0000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 118 WHEN X"76" => Paso := Siguiente; Siguiente := FEspiados (Siguiente, SBR (4), SBR (1)); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= "1101"; LOADS <= X"0000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 119 WHEN X"77" => Paso := Siguiente; Siguiente := FEspiauno (Siguiente, SBR (4)); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= "1110"; LOADS <= X"0000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00000";

104

AyBBUSDC <= X"00"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos));

--Paso 120 WHEN X"78" => Paso := Siguiente; Siguiente := 102; Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= "1111"; LOADS <= X"0000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <=(Conv_Std_Logic_vector(Paso, num_pasos)); --En otros casos, la maquina se reinicia WHEN OTHERS => Paso := Siguiente; Siguiente := 0; estad := 103; Siguiente1 := (CONV_STD_LOGIC_VECTOR (Siguiente,8)); Siguiente2 := (CONV_STD_LOGIC_VECTOR (estad,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"0000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); END CASE; ELSE --Bus espa en modo de parada CASE Siguiente2 IS --Paso 103E WHEN X"67" => Paso := estad; estad := FPaso103E(retor,datok); Siguiente2 := (CONV_STD_LOGIC_VECTOR (estad,8));

105

CARGASBR <= '1'; SBRCONT <= '1'; SBusCt <= SBUSSC; LOADS <= X"0000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 104E WHEN X"68" => Paso := estad; estad := FEspDec (SBR(5 downto 0)); Siguiente2 := (CONV_STD_LOGIC_VECTOR (Estad,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= SBUSSC; LOADS <= X"0000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 105E WHEN X"69" => Paso := Estad; Estad := FEspiaunop (Estad, SBR (4)); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Estad,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= "0000"; LOADS <= X"0000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 106E WHEN X"6A" => Paso := Estad; Estad := FEspiaunop (Estad, SBR (4)); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Estad,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= "0001"; LOADS <= X"0000";

106

FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 107E WHEN X"6B" => Paso := Estad; Estad := FEspiaunop (Estad, SBR (4)); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Estad,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= "0010"; LOADS <= X"0000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 108E WHEN X"6C" => Paso := Estad; Estad := FEspiaunop (Estad, SBR (4)); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Estad,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= "0011"; LOADS <= X"0000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 109E WHEN X"6D" => Paso := Estad; Estad := FEspiadosp (Estad, SBR (4), SBR (1)); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Estad,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= "0100"; LOADS <= X"0000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00000";

107

AyBBUSDC <= X"00"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 110E WHEN X"6E" => Paso := Estad; Estad := FEspiaunop (Estad, SBR (4)); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Estad,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= "0101"; LOADS <= X"0000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 111E WHEN X"6F" => Paso := Estad; Estad := FEspiaunop (Estad, SBR (4)); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Estad,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= "0110"; LOADS <= X"0000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 112E WHEN X"70" => Paso := Estad; Estad := FEspiaunop (Estad, SBR (4)); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Estad,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= "0111"; LOADS <= X"0000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0';

108

READ WRITE PBUS

<= '1'; <= '1'; <= (Conv_Std_Logic_vector(Paso, num_pasos));

--Paso 113E WHEN X"71" => Paso := Estad; Estad := FEspiaunop (Estad, SBR (4)); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Estad,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= "1000"; LOADS <= X"0000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 114E WHEN X"72" => Paso := Estad; Estad := FEspiaunop (Estad, SBR (4)); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Estad,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= "1001"; LOADS <= X"0000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 115E WHEN X"73" => Paso := Estad; Estad := FEspiaunop (Estad, SBR (4)); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Estad,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= "1010"; LOADS <= X"0000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos));

109

--Paso 116E WHEN X"74" => Paso := Estad; Estad := FEspiadosp (Estad, SBR (4), SBR (1)); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Estad,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= "1011"; LOADS <= X"0000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 117E WHEN X"75" => Paso := Estad; Estad := FEspiaunop (Estad, SBR (4)); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Estad,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= "1100"; LOADS <= X"0000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 118E WHEN X"76" => Paso := Estad; Estad := FEspiadosp (Estad, SBR (4), SBR (1)); Siguiente1 := (CONV_STD_LOGIC_VECTOR (Estad,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= "1101"; LOADS <= X"0000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 119E WHEN X"77" => Paso := Estad; Estad := FEspiaunop (Estad, SBR (4));

110

Siguiente1 := (CONV_STD_LOGIC_VECTOR (Estad,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= "1110"; LOADS <= X"0000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --Paso 120E WHEN X"78" => Paso := estad; estad := FPaso120 (datok); Siguiente2 := (CONV_STD_LOGIC_VECTOR (estad,8)); CARGASBR <= '0'; SBRCONT <= '0'; SBusCt <= "1111"; LOADS <= X"0000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); --En otro caso pasa al 103E WHEN OTHERS => Paso := 103; estad := FPaso103E (retor,datok); Siguiente2 := (CONV_STD_LOGIC_VECTOR (estad,8)); CARGASBR <= '1'; SBRCONT <= '1'; SBusCt <= SBUSSC; LOADS <= X"0000"; FLAGSC <= X"000"; REGDC <= X"00"; CALU <= "00000"; AyBBUSDC <= X"00"; ADyDBUSDC <= X"0"; IORQ <= '0'; IACK <= '0'; READ <= '1'; WRITE <= '1'; PBUS <= (Conv_Std_Logic_vector(Paso, num_pasos)); END CASE; END IF; END IF; END IF; END PROCESS; END ARCHITECTURE secuencial;

111

Entidad PARADA
--******************************************************************************* --* ALTERIC * --* PUJ TG 0421 * --* Diego Beltrn, Moiss Herrera ,Marco Mayolo * --* * --* file name: Parada.vhd * --* created: 1-09-2004 * --* last modified: 12-10-2004 * --* * --* Abstract: * --* Unidad que genera la seal ESP, que hace que el procesador * --* pare en el paso del cdigo AHPL que el usuario desee. * --* Se declara puertos de entradas y salidas * --* * --* * --* Componentes a los que llama: ninguno * --* * --* * --******************************************************************************* LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE ieee.std_logic_arith.ALL; --Esta entidad controla al bus espa para que trabaje en modo --de parada (ESP = '1) o en modo normal (ESP = '0') ENTITY PARADA IS PORT (clk : IN std_logic; retor : IN std_logic; -- En el paso 103E, 1 para retornar al modo normal reset PBUSIN --Paso en el que el usuario desea parar PASBUS --Pasos del cdigo AHPL : IN std_logic; : IN std_logic_vector (6 DOWNTO 0); : IN std_logic_vector (6 DOWNTO 0);

ESP : INOUT std_logic); --Seal que indica si se esta trabajando --en modo normal (0) o de parada (1) END ENTITY PARADA; ARCHITECTURE Funcional OF PARADA is BEGIN PROCESS (clk) BEGIN

112

IF (clk'EVENT and clk = '0') THEN --Borde de bajada del reloj IF (reset = '1') THEN -- Si hay reset, el procesador vuelve a trabajar en modo normal. ESP <= '0'; ELSE IF (ESP = '0') THEN -- Si se esta trabajando en modo normal IF (PASBUS >= "1100111") THEN -- Si el paso es mayor o igual al 103 -- Sigue trabajo en modo normal, no acepta la parada ESP <= '0'; ELSE -- Si el paso es menor a 103 IF ((PASBUS) = (PBUSIN)) THEN -- Compara el paso del AHPL con el paso deseado por el usuario ESP <= '1'; -- Si son iguales hace parada ELSE ESP <= '0'; -- Si no, sigue trabajando en modo normal END IF; END IF; ELSE -- Si se esta trabajando en modo de parada IF (PASBUS = "1100111") THEN -- Si es el paso 103 IF (retor = '1') THEN -- Seal de retor activa ESP <= '0'; -- Regresa al modo normal de trabajo ELSE -- Seal de retor inactiva ESP <= '1'; -- Sigue en modo de parada END IF; ELSE -- Si no es el paso 103 ESP <= '1'; -- Sigue en modo de parada END IF; END IF; END IF; END IF; END PROCESS; END ARCHITECTURE funcional;

113

Entidad FUNCIONES
--******************************************************************************* --* ALTERIC * --* PUJ TG 0421 * --* Diego Beltrn, Moiss Herrera ,Marco Mayolo * --* * --* file name: Funciones.vhd * --* created: 1-09-2004 * --* last modified: 6-11-2004 * --* * --* Abstract: * --* Funciones combinatorias necesarias para cambiar de estado * --* paso en el cdigo AHPL del procesador. * --* Se definen las funciones * --* * --* Componentes a los que llama: ninguno * --* * --* * --******************************************************************************* LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE ieee.Std_logic_arith.ALL; PACKAGE FUNCIONES IS --DEFINICION DE FUNCIONES FUNCTION FWait (cont : integer; swait : std_logic) RETURN integer; FUNCTION FPaso46 (IR: std_logic_vector(16 TO 19); IR1: std_logic_vector(22 TO 25); irq, ief : std_logic) RETURN integer; FUNCTION FChIns16 (shf, irq, ief: std_logic) RETURN integer; FUNCTION FPaso29 (IR : std_logic_vector(0 TO 1); cont : integer) RETURN integer; FUNCTION FPaso14 (IR : std_logic_vector(0 TO 6); IR1 : std_logic_vector(7 TO 15); SR : std_logic_vector(5 DOWNTO 0); irq : std_logic) RETURN integer; FUNCTION FPaso20 (IR : std_logic_vector(0 TO 3)) RETURN integer; FUNCTION FChFetInt (irq, ief: std_logic) RETURN integer; FUNCTION FChFetIntWait (irq, ief, Swait: std_logic; cont : integer) RETURN integer; FUNCTION FChRotDes (SHC: std_logic_vector(4 DOWNTO 0); shf,irq,ief: std_logic) RETURN integer; FUNCTION FPaso45 (reset, irq, ief : std_logic) RETURN integer; FUNCTION FChFetIntWait16 (cont: integer; shf,irq,ief,swait: std_logic) RETURN integer; FUNCTION FPaso47 (IR: std_logic) RETURN integer; FUNCTION FPaso79 (MR: std_logic_vector(1 DOWNTO 0); swait: std_logic) RETURN integer; FUNCTION FEspiauno (cont: integer; SBR4: std_logic) RETURN integer; FUNCTION FEspiaunop (cont: integer; datok,SBR4: std_logic) RETURN integer; FUNCTION FEspiados (cont: integer; SBR4,SBR1: std_logic) RETURN integer; FUNCTION FEspiadosp (cont: integer; datok,SBR4,SBR1: std_logic) RETURN integer; FUNCTION FPaso120 (datok: std_logic) RETURN integer; FUNCTION FEspDec (SBR : std_logic_vector (5 downto 0)) RETURN integer; FUNCTION FPaso103E (retor,datok: std_logic) RETURN integer; END PACKAGE FUNCIONES;

114

--INICIO DE LAS FUNCIONES PACKAGE BODY FUNCIONES IS --FUNCION WAIT -Si la seal wait est activa el procesador permanece -en el mismo estado, si esta inactiva pasa al siguiente -estado.

FUNCTION FWait (cont : integer; swait : std_logic) RETURN integer IS VARIABLE temp : integer; BEGIN IF (swait = '1') THEN temp := cont; -- Al mismo estado. ELSE temp := cont + 1; -- Al siguiente estado. END IF; RETURN temp; END FUNCTION FWait; --FUNCION PASO 46 -Realiza la decodificacin de la segunda instruccin -de 16 bits. Paso 46 del cdigo AHPL FUNCTION FPaso46 (IR : std_logic_vector(16 TO 19); IR1 : std_logic_vector(22 TO 25); irq, ief : std_logic) RETURN integer IS VARIABLE temp : integer; BEGIN IF ((IR(16) AND IR(17)) = '1') THEN IF ((IR(18) AND IR(19)) = '1') THEN temp := (103); --SBI ELSIF ((NOT IR(18) AND NOT IR(19)) = '1') THEN IF (IR1(25) = '1') THEN IF (IR1(24) = '1') THEN temp := (100); -- RST. ELSE temp := (45); -- HALT. END IF; ELSE IF((irq AND ief) = '1') THEN temp := (70); --Va a atender interrupcin, luego de una instruccin NOP. ELSE temp := (9); --Va a realizar el siguiente fetch, luego de una instruccin NOP. END IF; END IF; ELSIF ((NOT IR(18) AND IR(19)) = '1') THEN IF (IR1(22) = '1') THEN

115

IF (IR1(23) = '1') THEN temp := (57); --IM1, IM2, IM3. ELSE IF (IR1(24) = '1') THEN temp := (89); --RTI. ELSE temp := (56); --CIE, SIE. END IF; END IF; ELSE temp := (47); --IMP, EXP. END IF; ELSIF ((IR(18) AND NOT IR(19)) = '1') THEN IF (IR1(22) = '1') THEN IF (IR1(23) = '0') THEN temp := (69); --MSB. END IF; ELSE IF (IR1(23) = '1') THEN IF (IR1(25) = '1') THEN temp := (64); --POP, RTS. ELSE temp := (59); --PSH. END IF; ELSE temp := (58); --CLC, SEC. END IF; END IF; END IF; ELSIF((IR(16) AND IR(17)) = '0') THEN IF((IR(17) AND IR(18)) = '1') THEN temp := (43); --SHIFT, ROTATE. ELSE temp := (41); --ADD, ADC, SUB, SBC, AND, ORA, XOR, CMP, BIT, MVT (16 BITS). END IF; END IF; RETURN temp; END FPaso46; --FUNCION CHEQUEO INSTRUCCIONES DE 16 BITS -- Final de la ejecucin de la instruccin de 16 bits -- del primer campo del IR. FUNCTION FChIns16 (shf, irq, ief : std_logic) RETURN integer IS VARIABLE BEGIN temp : integer;

116

IF (shf = '1') THEN IF ((irq AND ief) = '1') THEN temp := (70); --Va a atender interrupcin. ELSE temp := (9); --Va a realizar el siguiente fetch. END IF; ELSE temp := (46); --Va a ejecutar la segunda instruccin de 16 bits. END IF; RETURN temp; END FChIns16; --FUNCION PASO 29 -- Decodificacin para diferenciar operaciones con -- direccionamiento directo, indizado, indirecto o -- indirecto indizado. FUNCTION FPaso29 (IR: std_logic_vector(0 TO 1); cont : integer) RETURN integer IS VARIABLE BEGIN IF ((IR(0) AND IR(1)) = '1') THEN temp := (30); --INC, DEC. ELSE temp := (34); --ADD, ADC, SUB, SBC, AND, ORA, XOR, CMP, BIT, MVT (32 BITS). END IF; RETURN temp; END FPaso29; --FUNCION PASO 14 -Decodificacin luego del fetch. -FUNCTION FPaso14 (IR: std_logic_vector(0 TO 6); IR1: std_logic_vector(7 TO 15); SR : std_logic_vector(5 DOWNTO 0); irq : std_logic) RETURN integer IS --RED COMBINATORIA DE LA INSTRUCCION BRANCH VARIABLE VARIABLE VARIABLE VARIABLE VARIABLE VARIABLE T_1 : std_logic := (IR1(7) AND SR(1)); T_2 : std_logic := (IR1(8) AND NOT SR(1)); T_3 : std_logic := (IR1(9) AND SR(0)); T_4 : std_logic := (IR1(10) AND NOT SR(0)); T_5 : std_logic := (IR1(11) AND SR(3)); T_6 : std_logic := (IR1(12) AND NOT SR(3)); temp : integer;

117

VARIABLE VARIABLE VARIABLE VARIABLE VARIABLE BEGIN

T_7 : std_logic := (IR1(13) AND SR(2)); T_8 : std_logic := (IR1(14) AND NOT SR(2)); T_9 : std_logic := (IR1(15) AND (SR(3) XOR SR(2))); OR2 : std_logic := ((T_1 OR T_2 OR T_3 OR T_4 OR T_5 OR T_6 OR T_7 OR T_8 OR T_9) XOR IR(6)); temp : integer;

IF(IR(4) = '1') THEN IF ((NOT IR(0) AND IR(1) AND IR(2) AND IR(3)) = '1') THEN IF (OR2 = '0') THEN

IF (IR(5) = '1') THEN temp := (35); --BSR. ELSE temp := (40); --BRA, BEQ, BNE, BCS, BNC, BVS, BNV, BGT, BLE, BGE. END IF; ELSE IF ((irq AND SR(5)) = '1') THEN temp := (70); --Va a atender interrupcin. ELSE temp := (9); --Va a realizar el siguiente fetch. END IF; END IF; ELSE IF (IR(5) = '1') THEN temp := (15); --Direccionamiento inmediato (Operaciones de 32 bits). ELSE IF (IR1(7) = '1') THEN temp := (16); --Direccionamiento indirecto o indirecto indizado (operaciones de 32 bits). ELSE temp := (20); --Direccionamiento directo o indizado (operaciones de 32 bits). END IF; END IF; END IF; ELSE IF ((IR(0) AND IR(1)) = '1') THEN IF ((IR(2) AND IR(3)) = '1') THEN temp := 103; --SBI ELSIF ((NOT IR(2) AND NOT IR(3)) = '1') THEN IF (IR1(9) = '1') THEN IF (IR1(8) = '1') THEN temp := 100; --RST ELSE temp := 45; -- HLT

118

END IF; ELSE temp := (46); --Va a ejecutar el segundo campo del IR, luego de una instruccin NOP. END IF; ELSIF ((NOT IR(2) AND IR(3)) = '1') THEN IF (IR(6) = '1') THEN IF (IR1(7) = '1') THEN temp := (57); --IM1, IM2, IM3. ELSE IF (IR1(8) = '1') THEN temp := (89); --RTI. ELSE temp := (56); --CIE, SIE END IF; END IF; ELSE temp := (47); --IMP, EXP. END IF; ELSIF ((IR(2) AND NOT IR(3)) = '1') THEN IF (IR(6) = '1') THEN IF (IR1(7) = '0') THEN temp := (69); --MSB. END IF; ELSE IF (IR1(7) = '1') THEN IF (IR1(9) = '1') THEN temp := (64); --POP, RTS. ELSE temp := (59); --PSH. END IF; ELSE temp := (58); --CLC, SEC. END IF; END IF; END IF; ELSE IF ((IR(1) AND IR(2)) = '1') THEN temp := (43); -- SHIFT, ROTATE. ELSE temp := (41); --ADD, ADC, SUB, SBC, AND, ORA, XOR, CMP, BIT, MVT (16 BITS). END IF; END IF; END IF;

119

RETURN temp; END FPaso14;

--FUNCION PASO 20 -- Decodificacin de la instruccin con -- direccionamiento directo, indizado, indirecto o -- indirecto indizado. FUNCTION FPaso20 (IR: std_logic_vector(0 TO 3)) RETURN integer IS VARIABLE BEGIN IF (IR(1) AND IR(2)) = '1' THEN IF (IR(3) = '1') THEN temp := (21); --JMP. ELSE IF (IR(0) = '1') THEN temp := (22); --JSR. ELSE temp := (23); --MVF. END IF; END IF; ELSE temp := (27); --ADD, ADC, SUB, SBC, AND, ORA, XOR, CMP, BIT, MVT, INC, DEC, (32 BITS). END IF; RETURN temp; END FPaso20; --FUNCION REVISIN FINAL INSTRUCCIONES DE 32 BITS -- Final de la ejecucin de las instrucciones de 32 -- bits. FUNCTION FChFetInt (irq, ief : std_logic) RETURN integer IS VARIABLE BEGIN IF ((irq AND ief) = '1') THEN temp := (70); --Va a atender interrupcin. ELSE temp := (9); temp : integer; temp : integer;

120

--Va a realizar el siguiente fetch. END IF; RETURN temp; END FChFetInt; --FUNCION REVISIN FINAL INSTRUCCIONES DE 32 BITS / WAIT -- Final de la ejecucin de la instruccin de 32 -- bits, analizando seal de wait. FUNCTION FChFetIntWait (irq, ief, Swait : std_logic; cont : integer) RETURN integer IS VARIABLE BEGIN IF (swait = '1') THEN temp := cont; --Al mismo integer (seal de wait activa). ELSE IF ((irq AND ief) = '1') then temp := (70); --Va a atender interrupcin. ELSE temp := (9); --Va a realizar el siguiente fetch. END IF; END IF; RETURN temp; END FChFetIntWait; --FUNCION ROTACION Y DESPLAZAMIENTO -Ejecucin de los corrimientos. FUNCTION FChRotDes (SHC: std_logic_vector(4 DOWNTO 0); shf, irq, ief : std_logic) RETURN integer IS VARIABLE VARIABLE BEGIN IF (OR1 = '1') THEN temp := (44); --Verifica la finalizacin de los corrimientos. ELSE IF (shf = '1') THEN IF ((irq AND ief) = '1') THEN temp := (70); --Va a atender interrupcin. ELSE temp := (9); --Va a realizar el siguiente fetch. END IF; ELSE temp := (46); --Va a ejecutar la segunda instruccin de 16 bits. END IF; OR1 temp : integer; : std_logic := (SHC(0) OR SHC(1) OR SHC(2) OR SHC(3) OR SHC(4)) ; temp : integer;

121

END IF; RETURN temp; END FChRotDes; --FUNCION PASO 45 -Ejecucin del HALT

FUNCTION FPaso45 (reset, irq, ief : std_logic) RETURN integer IS VARIABLE BEGIN IF (reset = '1') THEN temp := (0); --RESET por hardware. ELSE IF ((irq AND ief) = '1') THEN temp := (70); --Va a atender interrupcin. ELSE temp := (45); --Sigue en estado HALT. END IF; END IF; RETURN temp; END FPaso45; -FUNCION CHEQUEO INSTRUCCIONES DE 16 BITS / WAIT -- Final de la ejecucin de la instruccin de 16 bits -- del primer o segundo campo del IR, analizando seal -de wait. FUNCTION FChFetIntWait16 (cont: integer; shf,irq,ief,swait: std_logic) RETURN integer IS VARIABLE BEGIN IF (swait = '1') THEN temp := cont; -- Al mismo estado (seal de wait activa). ELSE IF (shf = '1') THEN IF ((irq AND ief) = '1') THEN temp := (70); --Va a atender interrupcin. ELSE temp := (9); --Va a realizar el siguiente fetch. END IF; ELSE temp := (46); --Va a ejecutar la segunda instruccin de 16 bits. temp : integer; temp : integer;

122

END IF; END IF; RETURN temp; END FChFetIntWait16;

--FUNCION PASO 47 -Decodificacin de la instruccin IMP o EXP FUNCTION FPaso47 (IR: std_logic) RETURN integer IS VARIABLE BEGIN IF (IR='1') THEN temp := (52); --EXP ELSE temp := (48); --IMP END IF; RETURN temp; END FPaso47; --FUNCION PASO 79 -Decodificacin de los modos de interrupcin FUNCTION FPaso79 (MR: std_logic_vector(1 DOWNTO 0); swait: std_logic) RETURN integer IS VARIABLE BEGIN IF (swait = '1') THEN temp := (79); --Al mismo estado (seal de wait activa). ELSE IF (MR(0) = '1') THEN IF (MR(1) = '1') THEN temp := (85); --Modo 3. ELSE temp := (80); --modo 1. END IF; ELSE temp := (84); --Modo Daisy chain. END IF; END IF; temp : integer; temp : integer;

123

RETURN temp; END FPaso79;

--FUNCION ESPIA UNO -- Verifica que el bus espa muestre un registro o un -- grupo de registros de acuerdo a lo deseado por el -usuario. (instruccin) FUNCTION FEspiauno (cont: integer; SBR4: std_logic) RETURN integer IS VARIABLE BEGIN IF (SBR4 = '0') THEN -- Si se quiere ver un registro temp := (102); ELSE temp := cont +1; END IF; RETURN temp; END FEspiauno; --FUNCION ESPIA UNO P -- Verifica que el bus espa muestre un registro o un -- grupo de registros de acuerdo a lo deseado por el -usuario. (Parada) FUNCTION FEspiaunop (cont: integer; datok, SBR4: std_logic) RETURN integer IS VARIABLE BEGIN IF (datok = '0') THEN temp := cont; ELSE IF (SBR4 = '0') THEN -- Si se quiere ver un registro temp := (103); -- Vuelve a recibir datos del usuario ELSE temp := cont +1; END IF; END IF; RETURN temp; END FEspiaunop; --FUNCION ESPIA DOS -- Verifica que el bus espa muestre un registro o un -- grupo de registros de acuerdo a lo deseado por el temp : integer; temp : integer;

124

--

usuario. (instruccin)

FUNCTION FEspiados (cont: integer; SBR4,SBR1: std_logic) RETURN integer IS VARIABLE BEGIN IF ((SBR4 AND SBR1) = '1') THEN --Para ver todos los registros temp := cont + 1; ELSE temp := (102); END IF; RETURN temp; END FEspiados; --FUNCION ESPIA DOS P -- Verifica que el bus espa muestre un registro o un -- grupo de registros de acuerdo a lo deseado por el -usuario. (Parada) FUNCTION FEspiadosp (cont: integer; datok,SBR4,SBR1: std_logic) RETURN integer IS VARIABLE BEGIN IF (datok = '0') THEN --El usuario verifica el dato temp := cont; ELSE IF ((SBR4 AND SBR1) = '1') THEN --Ver todos los registros temp := cont + 1; ELSE temp := (103); END IF; END IF; RETURN temp; END FEspiadosp; --FUNCION PASO 120 E -- Al mostrar el ultimo registro en el bus espa, -- trabajando en modo de parada, el procesador vuelve -- al paso 103. FUNCTION FPaso120 (datok: std_logic) RETURN integer IS VARIABLE BEGIN IF (datok = '0') THEN --El usuario verifica el dato temp := (120); ELSE temp := (103); temp : integer; temp : integer; temp : integer;

125

END IF; RETURN temp; END FPaso120; --FUNCION DECODIFICACION SBR -- Realiza la descodificacin de los datos del SBR -- Registro del Bus espa, para mostrar los registros -deseados por el usuario. FUNCTION FEspDec (SBR : std_logic_vector (5 downto 0)) RETURN integer IS VARIABLE BEGIN IF (((NOT (SBR(3) OR SBR(2) OR SBR(1) OR SBR(0))) OR (SBR(4) AND (NOT (SBR(3) OR SBR(2) OR SBR(0))))) = '1') THEN temp := (105); ELSIF (((NOT (SBR(3))) AND SBR(2) AND (NOT (SBR(1))) AND SBR(0)) = '1') THEN temp := (110); ELSIF ((SBR(3) AND SBR(2) AND (NOT (SBR(1))) AND (NOT (SBR(0)))) = '1') THEN temp := (117); ELSIF ((SBR(3) AND SBR(2) AND SBR(1) AND (NOT (SBR(0)))) = '1') THEN temp := (119); ELSIF (((NOT (SBR(3) OR SBR(4) OR SBR(2) OR SBR(1))) AND SBR(0)) = '1') THEN temp := (106); ELSIF (((NOT (SBR(3) OR SBR(4) OR SBR(2) OR SBR(0))) AND SBR(1)) = '1') THEN temp := (107); ELSIF (((NOT (SBR(3) OR SBR(4))) AND SBR(1) AND (NOT (SBR(2))) AND SBR(0)) = '1') THEN temp := (108); ELSIF (((NOT (SBR(3))) AND (SBR (2)) AND (NOT (SBR(1))) AND (NOT (SBR(4))) AND (NOT (SBR(0)))) = '1') THEN temp := (109); ELSIF (((NOT (SBR(3))) AND (NOT (SBR(4))) AND SBR(2) AND (NOT (SBR(0))) AND SBR(1)) = '1') THEN temp := (111); ELSIF ((SBR(0) AND SBR(2) AND SBR(1) AND (NOT (SBR(4))) AND (NOT (SBR(3)))) = '1') THEN temp := (112); ELSIF (((NOT (SBR(4) OR SBR(2) OR SBR(1) OR SBR(0))) AND SBR(3)) = '1') THEN temp := (113); ELSIF (((NOT (SBR(2))) AND (NOT (SBR(4))) AND SBR(3) AND (NOT (SBR(1))) AND SBR(0)) = '1') THEN temp := (114); ELSIF (((NOT (SBR(2))) AND (NOT (SBR(4))) AND SBR(3) AND (NOT (SBR(0))) AND SBR(1)) = '1') THEN temp := (115); ELSIF ((SBR(3) AND (NOT (SBR(4))) AND SBR(0) AND SBR(1) AND (NOT (SBR(2)))) = '1') THEN temp := (116); ELSIF ((SBR(3) AND (NOT (SBR(4))) AND SBR(2) AND SBR(0) AND (NOT (SBR(1)))) = '1') THEN temp := (118); temp : integer;

126

ELSIF ((SBR(3) AND (NOT (SBR(4))) AND SBR(2) AND SBR(1) AND SBR(0)) = '1') THEN temp := (120); ELSE IF ((SBR(5)) = '1') THEN temp := (102); ELSE temp := (103); END IF; END IF; RETURN temp; END FEspDec; --FUNCION PASO 103 E -- Al hacer una parada en el procesador, verifica que -- el usuario quiera volver al modo normal o seguir -cargando datos en el bus espa. FUNCTION FPaso103E (retor,datok: std_logic) RETURN integer IS VARIABLE BEGIN IF (retor = '1') THEN temp := (103); ELSE IF (datok = '1') THEN temp := (104); ELSE temp := (103); END IF; END IF; RETURN temp; END FPaso103E; temp : integer;

--FIN DE LAS FUNCIONES END PACKAGE BODY FUNCIONES;

127

Entidad FLAG
--******************************************************************************* --* ALTERIC * --* PUJ TG 0421 * --* Diego Beltrn, Moiss Herrera ,Marco Mayolo * --* * --* file name: Flag.vhd * --* created: 3-09-2004 * --* last modified: 12-10-2004 * --* * --* Abstract: * --* Entidad que sirve para implementar las banderas del SR * --* * --* Se declara puertos de entradas y salidas * --* * --* * --* Componentes a los que llama: Ninguno * --* * --******************************************************************************* library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; Entity FLAG is port ( DatoIN Reset Carga clk qOut : in std_logic; : in std_logic; : in std_logic; : in std_logic; : out std_logic);

END FLAG; architecture Combinatorio of FLAG is BEGIN Process (clk,Carga,DatoIN) BEGIN IF clk'Event and clk='0' THEN IF Carga='1' and Reset='0' THEN -- Carga qOut <= DatoIN; ELSIF Carga='0' and Reset='1' THEN -- Reset qOut <= '0'; ELSIF Carga='1' and Reset='1' THEN -- Set

128

qOut <= '1'; END IF; END IF; END Process; END Combinatorio;

Entidad REGISTER2
--******************************************************************************* --* ALTERIC * --* PUJ TG 0421 * --* Diego Beltrn, Moiss Herrera ,Marco Mayolo * --* * --* file name: register2.vhd * --* created: 3-09-2004 * --* last modified: 12-10-2004 * --* * --* Abstract: * --* Se declara un registro para implementar registros de 2 bits * --* * --* Se declara puertos de entradas y salidas * --* * --* * --* Componentes a los que llama: Ninguno * --* * --******************************************************************************* --llamado a libreras library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; -- Register2 es un Registro de 2 bits Entity Register2 is DatoIN Carga clk -- Puertos de entrada qOut -- puerto de salida End Register2; -- declaracin de arquitectura de register2 architecture Combinatorio of Register2 is BEGIN Process (clk,Carga,DatoIN) BEGIN IF clk'Event and clk='0' THEN port ( : in std_logic_vector (1 downto 0); : in std_logic; : in std_logic; : out std_logic_vector (1 downto 0));

129

IF Carga='1' THEN qOut <= DatoIN; END IF; END IF; END Process; END Combinatorio;

Entidad REGISTER3
--******************************************************************************* --* ALTERIC * --* PUJ TG 0421 * --* Diego Beltrn, Moiss Herrera ,Marco Mayolo * --* * --* file name: register3.vhd * --* created: 3-09-2004 * --* last modified: 12-10-2004 * --* * --* Abstract: * --* Se declara un registro para implementar registros de 3 bits * --* * --* Se declara puertos de entradas y salidas * --* * --* * --* Componentes a los que llama: Ninguno * --* * --******************************************************************************* --llamado a libreras library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; -- Register3 es un Registro de 3 bits Entity Register3 is DatoIN Carga clk -- Puertos de entrada qOut -- puerto de salida End Register3; -- declaracin de arquitectura de register3 architecture Combinatorio of Register3 is BEGIN Process (clk,Carga,DatoIN) BEGIN IF clk'Event and clk='0' THEN port ( : in std_logic_vector (2 downto 0); : in std_logic; : in std_logic; : out std_logic_vector (2 downto 0));

130

IF Carga='1' THEN qOut <= DatoIN; END IF; END IF; END Process; END Combinatorio;

Entidad REGISTER5
--******************************************************************************* --* ALTERIC * --* PUJ TG 0421 * --* Diego Beltrn, Moiss Herrera ,Marco Mayolo * --* * --* file name: register5.vhd * --* created: 3-09-2004 * --* last modified: 12-10-2004 * --* * --* Abstract: * --* Se declara un registro para implementar registros de 5 bits * --* * --* Se declara puertos de entradas y salidas * --* * --* * --* Componentes a los que llama: Ninguno * --* * --******************************************************************************* --llamado a libreras library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; -- Register5 es un Registro de 5 bits Entity Register5 is DatoIN Carga clk -- Puertos de entrada qOut -- puerto de salida End Register5; -- declaracin de arquitectura de register5 architecture Combinatorio of Register5 is BEGIN Process (clk,Carga,DatoIN) BEGIN IF clk'Event and clk='0' THEN port ( : in std_logic_vector (4 downto 0); : in std_logic; : in std_logic; : out std_logic_vector (4 downto 0));

131

IF Carga='1' THEN qOut <= DatoIN; END IF; END IF; END Process; END Combinatorio;

Entidad REGISTER6
--******************************************************************************* --* ALTERIC * --* PUJ TG 0421 * --* Diego Beltrn, Moiss Herrera ,Marco Mayolo * --* * --* file name: register6.vhd * --* created: 3-09-2004 * --* last modified: 12-10-2004 * --* * --* Abstract: * --* Se declara un registro para implementar registros de 6 bits * --* * --* Se declara puertos de entradas y salidas * --* * --* * --* Componentes a los que llama: Ninguno * --* * --******************************************************************************* --llamado a libreras library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; -- Register6 es un Registro de 6 bits Entity Register6 is DatoIN Carga clk -- Puertos de entrada qOut -- puerto de salida End Register6; -- declaracin de arquitectura de register6 architecture Combinatorio of Register6 is BEGIN Process (clk,Carga,DatoIN) BEGIN IF clk'Event and clk='0' THEN port ( : in std_logic_vector (5 downto 0); : in std_logic; : in std_logic; : out std_logic_vector (5 downto 0));

132

IF Carga='1' THEN qOut <= DatoIN; END IF; END IF; END Process; END Combinatorio;

Entidad REGISTER24
--******************************************************************************* --* ALTERIC * --* PUJ TG 0421 * --* Diego Beltrn, Moiss Herrera ,Marco Mayolo * --* * --* file name: register24.vhd * --* created: 3-09-2004 * --* last modified: 12-10-2004 * --* * --* Abstract: * --* Se declara un registro para implementar registros de 24 bits * --* * --* Se declara puertos de entradas y salidas * --* * --* * --* Componentes a los que llama: Ninguno * --* * --******************************************************************************* --llamado a libreras library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; -- Register24 es un Registro de 24 bits Entity Register24 is DatoIN Carga clk -- Puertos de entrada qOut -- puerto de salida End Register24; -- declaracin de arquitectura de register24 architecture Combinatorio of Register24 is BEGIN Process (clk,Carga,DatoIN) BEGIN IF clk'Event and clk='0' THEN port ( : in std_logic_vector (23 downto 0); : in std_logic; : in std_logic; : out std_logic_vector (23 downto 0));

133

IF Carga='1' THEN qOut <= DatoIN; END IF; END IF; END Process; END Combinatorio;

Entidad REGISTER32
--******************************************************************************* --* ALTERIC * --* PUJ TG 0421 * --* Diego Beltrn, Moiss Herrera ,Marco Mayolo * --* * --* file name: register32.vhd * --* created: 3-09-2004 * --* last modified: 12-10-2004 * --* * --* Abstract: * --* Se declara un registro para implementar registros de 32 bits * --* * --* Se declara puertos de entradas y salidas * --* * --* * --* Componentes a los que llama: Ninguno * --* * --******************************************************************************* --llamado a libreras library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; -- Register32 es un Registro de 32 bits Entity Register32 is DatoIN Carga clk -- Puertos de entrada qOut -- puerto de salida End Register32; -- declaracin de arquitectura de register32 architecture Combinatorio of Register32 is BEGIN Process (clk,Carga,DatoIN) BEGIN IF clk'Event and clk='0' THEN port ( : in std_logic_vector (31 downto 0); : in std_logic; : in std_logic; : out std_logic_vector (31 downto 0));

134

IF Carga='1' THEN qOut <= DatoIN; END IF; END IF; END Process; END Combinatorio;

Entidad ADDER5
--******************************************************************************* --* ALTERIC * --* PUJ TG 0421 * --* Diego Beltrn, Moiss Herrera ,Marco Mayolo * --* * --* file name: adder5.vhd * --* created: 1-09-2004 * --* last modified: 12-10-2004 * --* * --* Abstract: * --* Sumador con carry look ahead de 5 bits. Se utiliza para * --* implementar la entidad decshc.vhd, encargada de hacer * --* el decremento del registro SHC. * --* Se declara puertos de entradas y salidas * --* * --* Componentes a los que llama: ninguno * --* * --******************************************************************************* library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; entity ADDER5 is port (A,B Cin Resultado Cout end ADDER5; : in std_logic_vector (4 downto 0); : in std_logic; : out std_logic_vector (4 downto 0); : out std_logic );

architecture Combinatorio of ADDER5 is signal P,G,C:std_logic_vector(4 downto 0); begin U1: for i in 0 to 4 generate P(i) <= A(i) XOR B(i); G(i) <= A(I) AND B(I); end generate; U2: Resultado(0) <= P(0) XOR Cin; C(0) <= ((A(0) OR B(0)) AND CIN) OR G(0); U3: for j in 1 to 4 generate C(j) <= G(j) OR (C(j-1) AND (A(j) OR B(j))); Resultado(j) <= P(j) XOR C(j-1);

135

end generate; U4: Cout <= C(4); end Combinatorio;

Entidad ADDER8
--******************************************************************************* --* ALTERIC * --* PUJ TG 0421 * --* Diego Beltrn, Moiss Herrera ,Marco Mayolo * --* * --* file name: adder8.vhd * --* created: 1-09-2004 * --* last modified: 12-10-2004 * --* * --* Abstract: * --* Sumador con carry look ahead de 8 bits. Se utiliza para * --* implementar la entidad adder32.vhd * --* Se declara puertos de entradas y salidas * --* * --* Componentes a los que llama: ninguno * --* * --******************************************************************************* library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; entity ADDER8 is port (A,B Cin Resultado Cout end ADDER8; : in std_logic_vector (7 downto 0); : in std_logic; : out std_logic_vector (7 downto 0); : out std_logic );

architecture Combinatorio of ADDER8 is signal P,G,C:std_logic_vector(7 downto 0); begin U1: for i in 0 to 7 generate P(i) <= A(i) XOR B(i); G(i) <= A(I) AND B(I); end generate; U2: Resultado(0) <= P(0) XOR Cin; C(0) <= ((A(0) OR B(0)) AND CIN) OR G(0); U3: for j in 1 to 7 generate C(j) <= G(j) OR (C(j-1) AND (A(j) OR B(j))); Resultado(j) <= P(j) XOR C(j-1); end generate;

136

U4: Cout <= C(7); end Combinatorio;

Entidad ADDER32
--******************************************************************************* --* ALTERIC * --* PUJ TG 0421 * --* Diego Beltrn, Moiss Herrera ,Marco Mayolo * --* * --* file name: adder32.vhd * --* created: 1-09-2004 * --* last modified: 12-10-2004 * --* * --* Abstract: * --* Sumador con carry look ahead de 32 bits. Se utiliza para * --* implementar el sumador de 32 bits de la ALU. * --* Se declara puertos de entradas y salidas * --* * --* Componentes a los que llama: adder8.vhd * --* * --******************************************************************************* library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; --Adder 32 esta implementado con 4 sumadores de 8 bits entity ADDER32 is port (A32,B32 Cin32 Resultado32 Cout32 end ADDER32; architecture Combinatorio of ADDER32 is component ADDER8 port (A,B Cin Resultado Cout end component; signal CInt, CInt1, Cint2 : std_logic; BEGIN Bits_7_0: ADDER8 Port Map (A32(7 downto 0), B32(7 downto 0), Cin32, Resultado32(7 downto 0), CInt); Bits_15_8: : in std_logic_vector (7 downto 0); : in std_logic; : out std_logic_vector (7 downto 0); : out std_logic ); : in std_logic_vector (31 downto 0); : in std_logic; : out std_logic_vector (31 downto 0); : out std_logic );

137

ADDER8 Port Map (A32(15 downto 8), B32(15 downto 8), Cint, Resultado32(15 downto 8), CInt1); Bits_23_16: ADDER8 Port Map (A32(23 downto 16), B32(23 downto 16), CInt1, Resultado32(23 downto 16), CInt2); Bits_31_24: ADDER8 Port Map (A32(31 downto 24), B32(31 downto 24), CInt2, Resultado32(31 downto 24), Cout32); END Combinatorio;

Entidad DECSHC
--******************************************************************************* --* ALTERIC * --* PUJ TG 0421 * --* Diego Beltrn, Moiss Herrera ,Marco Mayolo * --* * --* file name: decshc.vhd * --* created: 1-09-2004 * --* last modified: 12-10-2004 * --* * --* Abstract: * --* Unidad que se encarga de hacer el decremento del registro * --* SHC en las instrucciones de rotacin y desplazamiento. * --* Se declara puertos de entradas y salidas * --* * --* Componentes a los que llama: adder5.vhd * --* * --******************************************************************************* library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; entity DECSHC is port (SHCD Resultado end DECSHC; Architecture functional of DECSHC is Component ADDER5 port ( A,B Cin Resultado Cout : in std_logic_vector (4 downto 0); : in std_logic; : out std_logic_vector (4 downto 0); : out std_logic ); : in std_logic_vector (4 downto 0); -- Datos en el registro SHC : out std_logic_vector (4 downto 0)); -- Dato decrementado

end Component; signal Resta :std_logic_vector (4 downto 0);

Signal cout,cin : std_logic; BEGIN Resta (4 downto 0) <= "11111"; cin <= '0';

138

ADDER5_DECSHC: ADDER5 port map (SHCD, Resta,cin , Resultado, Cout); END functional;

Entidad ASR
--******************************************************************************* --* ALTERIC * --* PUJ TG 0421 * --* Diego Beltrn, Moiss Herrera ,Marco Mayolo * --* * --* file name: Asr.vhd * --* created: 1-09-2004 * --* last modified: 12-10-2004 * --* * --* Abstract: * --* Entidad encargada de realizar corrimientos aritmticos a la * --* derecha. Ejecuta la instruccin ASR. * --* Se declara puertos de entradas y salidas * --* * --* Componentes a los que llama: ninguno * --* * --******************************************************************************* library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; Entity ASR is port (ACREG Resultado Cout End ASR; architecture Combinatorio of ASR is BEGIN Cout Resultado(31) <= ACREG(0); <= ACREG(31); : in std_logic_vector (31 downto 0); : out std_logic_vector (31 downto 0); : out std_logic);

S1: for i in 0 to 30 generate Resultado(i)<=ACREG(i+1); end generate; END Combinatorio;

139

Entidad LSR
--******************************************************************************* --* ALTERIC * --* PUJ TG 0421 * --* Diego Beltrn, Moiss Herrera ,Marco Mayolo * --* * --* file name: Lsr.vhd * --* created: 1-09-2004 * --* last modified: 12-10-2004 * --* * --* Abstract: * --* Entidad encargada de realizar corrimientos lgicos a la * --* derecha. Ejecuta la instruccin LSR. * --* Se declara puertos de entradas y salidas * --* * --* Componentes a los que llama: ninguno * --* * --******************************************************************************* library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; Entity LSR is port (ACREG Resultado Cout End LSR; architecture Combinatorio of LSR is BEGIN Cout <= ACREG(0); Resultado(31) <= '0'; S1: for i in 0 to 30 generate Resultado(i) <= ACREG(i+1); end generate; END Combinatorio; : in std_logic_vector (31 downto 0); : out std_logic_vector (31 downto 0); : out std_logic);

140

Entidad RLCL
--******************************************************************************* --* ALTERIC * --* PUJ TG 0421 * --* Diego Beltrn, Moiss Herrera ,Marco Mayolo * --* * --* file name: Rlcl.vhd * --* created: 1-09-2004 * --* last modified: 12-10-2004 * --* * --* Abstract: * --* Entidad encargada de realizar rotaciones con carry hacia la * --* izquierda. Ejecuta la instruccin RLC. * --* Se declara puertos de entradas y salidas * --* * --* Componentes a los que llama: ninguno * --* * --******************************************************************************* library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; Entity RLCL is port (ACREG Cin Resultado Cout End RLCL; : in std_logic_vector (31 downto 0); : in std_logic; : out std_logic_vector (31 downto 0); : out std_logic);

architecture Combinatorio of RLCL is BEGIN Cout <= ACREG(31); Resultado(0) <= Cin; S1: FOR i in 1 to 31 generate Resultado(i)<=ACREG(i-1); END generate; END Combinatorio;

141

Entidad ROLL
--******************************************************************************* --* ALTERIC * --* PUJ TG 0421 * --* Diego Beltrn, Moiss Herrera ,Marco Mayolo * --* * --* file name: Roll.vhd * --* created: 1-09-2004 * --* last modified: 12-10-2004 * --* * --* Abstract: * --* Entidad encargada de realizar rotaciones sin carry hacia la * --* izquierda. Ejecuta la instruccin ROL. * --* Se declara puertos de entradas y salidas * --* * --* Componentes a los que llama: ninguno * --* * --******************************************************************************* library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; Entity ROLL is port (ACREG Resultado End ROLL; : in std_logic_vector (31 downto 0); : out std_logic_vector (31 downto 0));

architecture Combinatorio of ROLL is BEGIN Resultado(0) <= ACREG(31); S1: FOR i in 1 to 31 generate Resultado(i)<=ACREG(i-1); END generate; END Combinatorio;

142

Entidad RORL
--******************************************************************************* --* ALTERIC * --* PUJ TG 0421 * --* Diego Beltrn, Moiss Herrera ,Marco Mayolo * --* * --* file name: Rorl.vhd * --* created: 1-09-2004 * --* last modified: 12-10-2004 * --* * --* Abstract: * --* Entidad encargada de realizar rotaciones sin carry hacia la * --* derecha. Ejecuta la instruccin ROR. * --* Se declara puertos de entradas y salidas * --* * --* Componentes a los que llama: ninguno * --* * --******************************************************************************* library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; Entity RORL is port (ACREG Resultado End RORL; : in std_logic_vector (31 downto 0); : out std_logic_vector (31 downto 0));

architecture Combinatorio of RORL is BEGIN Resultado(31) <= ACREG(0); S1: FOR i in 0 to 30 generate Resultado(i)<=ACREG(i+1); END generate; END Combinatorio;

143

Entidad RRCL
--******************************************************************************* --* ALTERIC * --* PUJ TG 0421 * --* Diego Beltrn, Moiss Herrera ,Marco Mayolo * --* * --* file name: Rrcl.vhd * --* created: 1-09-2004 * --* last modified: 12-10-2004 * --* * --* Abstract: * --* Entidad encargada de realizar rotaciones con carry hacia la * --* derecha. Ejecuta la instruccin RRC. * --* Se declara puertos de entradas y salidas * --* * --* Componentes a los que llama: ninguno * --* * --******************************************************************************* library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; Entity RRCL is port (ACREG Cin Resultado Cout End RRCL; architecture Combinatorio of RRCL is BEGIN Cout <= ACREG(0); Resultado(31) <= Cin; S1: FOR i in 0 to 30 generate Resultado(i)<=ACREG(i+1); END generate; END Combinatorio; : in std_logic_vector (31 downto 0); : in std_logic; : out std_logic_vector (31 downto 0); : out std_logic);

144

Entidad SHLL
--******************************************************************************* --* ALTERIC * --* PUJ TG 0421 * --* Diego Beltrn, Moiss Herrera ,Marco Mayolo * --* * --* file name: Shll.vhd * --* created: 1-09-2004 * --* last modified: 12-10-2004 * --* * --* Abstract: * --* Entidad encargada de realizar corrimientos aritmticos a la * --* izquierda. Ejecuta la instruccin SHL. * --* Se declara puertos de entradas y salidas * --* * --* Componentes a los que llama: ninguno * --* * --******************************************************************************* library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; Entity SHLL is port (ACREG Resultado Cout End SHLL; : in std_logic_vector (31 downto 0); : out std_logic_vector (31 downto 0); : out std_logic);

architecture Combinatorio of SHLL is BEGIN Cout <= ACREG(31); Resultado(0) <= '0'; S1: FOR i in 1 to 31 generate Resultado(i) <= ACREG(i-1); END generate; END Combinatorio;

145

Entidad SUMADOR
--******************************************************************************* --* ALTERIC * --* PUJ TG 0421 * --* Diego Beltrn, Moiss Herrera ,Marco Mayolo * --* * --* file name: Sumador.vhd * --* created: 1-09-2004 * --* last modified: 12-10-2004 * --* * --* Abstract: * --* Sumador de 32 bits, es el sumador interno de la unidad * --* aritmtica y lgica ALU. * --* Se declara puertos de entradas y salidas * --* seales de conexin de bloques * --* * --* Componentes a los que llama: adder32.vhd * --* sumin.vhd * --* * --******************************************************************************* library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; entity SUMADOR is Port ( A,B : in std_logic_vector (31 downto 0); --Entradas al SUMADOR, Salidas de SUMIN CTRALU --Control : in std_logic_vector (4 downto 0);

Cin : in std_logic; --Carry de entrada Resultado : out std_logic_vector (31 downto 0); --Salida del SUMADOR Cout --Carry de salida end SUMADOR; Architecture Funcional of SUMADOR is -- Sumador de carry look ahead de 32 bits Component ADDER32 port ( A32,B32 Cin32 Resultado32 Cout32 end Component; : in std_logic_vector (31 downto 0); : in std_logic; : out std_logic_vector (31 downto 0); : out std_logic ); : out std_logic);

146

-- Modifica las entradas del sumador dependiendo la operacin a realizar Component SUMIN Port ( B,A CTRALU Cin SalidaA,SalidaB Cout end Component; -- SEALES DE CONEXION DE BLOQUES Signal CSelB Signal SalidaB Signal SalidaA Signal EntradaA, EntradaB Signal Centrada, CTemp Signal STemp BEGIN ADDER32_SUMADOR: ADDER32 Port Map (EntradaA, EntradaB, CEntrada, STemp, CTemp); SUMIN_SUMADOR: SUMIN Port Map (B,A, CTRALU (4 downto 0), Cin, SalidaA,SalidaB, CSelb); EntradaA EntradaB CEntrada Resultado Cout END Funcional; <= SalidaA; <= SalidaB; <= CSelB; <= STemp; <= CTemp; : std_logic; : std_logic_vector (31 downto 0); : std_logic_vector (31 downto 0); : std_logic_vector (31 downto 0); : std_logic; : std_logic_vector (31 downto 0); : in std_logic_vector (31 downto 0); : in std_logic_vector (4 downto 0); : in std_logic; : out std_logic_vector (31 downto 0); : out std_logic);

Entidad SUMIN
--******************************************************************************* --* ALTERIC * --* PUJ TG 0421 * --* Diego Beltrn, Moiss Herrera ,Marco Mayolo * --* * --* file name: Sumin.vhd * --* created: 1-09-2004 * --* last modified: 12-10-2004 * --* * --* Abstract: * --* Modifica las entradas del sumador interno de la unidad * --* aritmtica y lgica ALU, dependiendo de la operacin * --* a realizar. Se declara puertos de entradas y salidas * --* seales de conexin de bloques * --* * --* Componentes a los que llama: ninguno * --* * --******************************************************************************* library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; entity SUMIN is Port (B,A : in std_logic_vector (31 downto 0); -- ABUS, BBUS

147

CTRALU -- Control Cin

: in std_logic_vector (4 downto 0); : in std_logic; -- Bandera de carry (Entrada)

SalidaA,SalidaB : out std_logic_vector (31 downto 0); -- Salidas de SUMIN, Entradas al sumador Cout end SUMIN; Architecture Funcional of SUMIN is -- Seales de salida Signal SumaB Signal Carryin Signal MenosB Signal Car Signal XInc Signal XDec Signal SumaA Signal MenosA Signal NoCarry BEGIN SumaB SumaA Carryin NoCarry MenosB MenosA Car XInc(0) <= B; <= A; <= Cin; <= '0'; <= NOT B; <= NOT A; <= '1'; <= '1'; : std_logic_vector (31 downto 0); : std_logic; : std_logic_vector (31 downto 0); : std_logic; : std_logic_vector (31 downto 0); : std_logic_vector (31 downto 0); : std_logic_vector (31 downto 0); : std_logic_vector (31 downto 0); : std_logic; : out std_logic); -- Bandera de carry (Salida)

InicInc: For i In 1 to 31 Generate XInc(i) end Generate; InicDec: For i In 0 to 31 Generate XDec(i) end Generate; PROCESS (B,CTRALU,Cin) BEGIN

<= '0';

<= '1';

CASE CTRALU IS -- La funcin de este Case es conectar a la salida -- los operandos, dependiendo de la operacin -- que se especifique en el byte de control. Es la -- descripcin de un Multiplexor de Salidas. -- ADC WHEN "00000" => SalidaB Cout <= SumaB; <= Carryin;

148

SalidaA -- ADD WHEN "00001" => SalidaB Cout SalidaA -- SUB (A-B) WHEN "00010" => SalidaB Cout SalidaA -- SUB (B-A) WHEN "00011" => SalidaB Cout SalidaA -- SBC (A-B) WHEN "00100" => SalidaB Cout SalidaA -- SBC (B-A) WHEN "00101" => SalidaB Cout SalidaA -- INC A WHEN "00110" => SalidaB Cout SalidaA -- INC B WHEN "00111" => SalidaB Cout SalidaA -- DEC A WHEN "01000" => SalidaB Cout SalidaA -- DEC B WHEN "01001" => SalidaB Cout SalidaA -- casos no posibles, error WHEN OTHERS => SalidaA Cout SalidaB END CASE;

<= SumaA;

<= SumaB; <= NoCarry; <= SumaA;

<= MenosB; <= Car; <= SumaA;

<= SumaB; <= Car; <= MenosA;

<= MenosB; <= Carryin; <= SumaA;

<= SumaB; <= Carryin; <= MenosA;

<= XInc; <= NoCarry; <= SumaA;

<= SumaB; <= NoCarry; <= XInc;

<= XDec; <= NoCarry; <= SumaA;

<= SumaB; <= NoCarry; <= XDec;

<= "00000000000000000000000000000000"; <= '0'; <= "00000000000000000000000000000000";

149

END PROCESS; END Funcional;

Entidad ALU
--******************************************************************************* --* ALTERIC * --* PUJ TG 0421 * --* Diego Beltrn, Moiss Herrera ,Marco Mayolo * --* * --* file name: Alu.vhd * --* created: 1-09-2004 * --* last modified: 12-10-2004 * --* * --* Abstract: * --* Unidad aritmtica y lgica del procesador ALTERIC. Realiza * --* las operaciones aritmticas y lgicas. * --* Se declaran puertos de entradas y salidas * --* seales de conexin de bloques * --* * --* Componentes a los que llama: sumador.vhd * --* lsr.vhd * --* asr.vhd * --* shll.vhd * --* rorl.vhd * --* roll.vhd * --* rrcl.vhd * --* rlcl.vhd * --* * --******************************************************************************* library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; -- Se declara la entidad ALU entity ALU is -- ABUS y BBUS Port (A,B -- Control CTRALU

: in std_logic_vector (31 downto 0); : in std_logic_vector (4 downto 0);

-- Bandera de carry Cin : in std_logic; -- OBUS Salida -- Banderas Cout,Ofw,Z,N end ALU; Architecture Funcional of ALU is : out std_logic_vector (31 downto 0); : out std_logic);

150

-- A continuacin se declaran todos los componentes que -- hacen parte de la ALU. Component SUMADOR Port (A,B CTRALU Cin Resultado Cout : in std_logic_vector (31 downto 0); : in std_logic_vector (4 downto 0); : in std_logic; : out std_logic_vector (31 downto 0); : out std_logic);

end Component; Component LSR port End Component; Component ASR port End Component; Component SHLL port End Component; Component RORL port End Component; Component RRCL port (ACREG Cin Resultado Cout : in std_logic_vector (31 downto 0); : in std_logic; : out std_logic_vector (31 downto 0); : out std_logic); (ACREG Resultado : in std_logic_vector (31 downto 0); : out std_logic_vector (31 downto 0)); (ACREG Resultado Cout : in std_logic_vector (31 downto 0); : out std_logic_vector (31 downto 0); : out std_logic); (ACREG Resultado Cout : in std_logic_vector (31 downto 0); : out std_logic_vector (31 downto 0); : out std_logic); (ACREG Resultado Cout : in std_logic_vector (31 downto 0); : out std_logic_vector (31 downto 0); : out std_logic);

End Component; Component RLCL port (ACREG Cin Resultado Cout : in std_logic_vector (31 downto 0); : in std_logic; : out std_logic_vector (31 downto 0); : out std_logic);

End Component; Component ROLL port (ACREG Resultado End Component; : in std_logic_vector (31 downto 0); : out std_logic_vector (31 downto 0));

-- En esta seccin se declaran las seales que representan -- la salida de cada uno de los componentes. Signal Zero : std_logic;

151

Signal ResultadoSumador Signal OfSuma Signal OfSubAB Signal OfSubBA Signal OfIncA Signal OfIncB Signal OfDecA Signal OfDecB Signal CarrySumador Signal ResultadoLsr Signal CarryLsr Signal ResultadoAsr Signal CarryAsr Signal ResultadoShl Signal CarryShl Signal ResultadoRor Signal ResultadoRrc Signal CarryRrc Signal ResultadoRlc Signal CarryRlc Signal ResultadoRol Signal Result BEGIN

: std_logic_vector (31 downto 0); : std_logic; : std_logic; : std_logic; : std_logic; : std_logic; : std_logic; : std_logic; : std_logic; : std_logic_vector (31 downto 0); : std_logic; : std_logic_vector (31 downto 0); : std_logic; : std_logic_vector (31 downto 0); : std_logic; : std_logic_vector (31 downto 0); : std_logic_vector (31 downto 0); : std_logic; : std_logic_vector (31 downto 0); : std_logic; : std_logic_vector (31 downto 0); : std_logic_vector (31 downto 0);

-- En esta seccin se conectan todos los puertos de los componentes, -- tanto las entradas como las seales de salida. Sumador_ALU: SUMADOR Port Map (A,B,CTRALU,Cin,ResultadoSumador,CarrySumador); LSR_ALU: LSR ASR_ALU: ASR SHL_ALU: SHLL Port Map (B,ResultadoShl,CarryShl); ROR_ALU: RORL RRC_ALU: RRCL RLC_ALU: RLCL Port Map (B,Cin,ResultadoRlc,CarryRlc); Port Map (B,Cin,ResultadoRrc,CarryRrc); Port Map (B,ResultadoRor); Port Map (B,ResultadoAsr,CarryAsr); Port Map (B,ResultadoLsr,CarryLsr);

ROL_ALU: ROLL Port Map (B,ResultadoRol);

OfSuma <= ( A(31) AND B(31) AND (NOT ResultadoSumador(31))) OR ( (NOT A(31)) AND (NOT B(31)) AND ResultadoSumador(31)); --Hay overflow en la suma cuando los operandos tienen el mismo

152

--signo y el resultado un signo diferente. OfSubAB <= ( A(31) AND (NOT B(31)) AND (NOT ResultadoSumador(31))) OR ( (NOT A(31)) AND B(31) AND ResultadoSumador(31)); --Hay overflow en la resta cuando el minuendo y el sustraendo tienen --signos diferentes y el signo del resultado es igual al signo del --sustraendo OfSubBA <= ( B(31) AND (NOT A(31)) AND (NOT ResultadoSumador(31))) OR ( (NOT B(31)) AND A(31) AND ResultadoSumador(31)); OfIncA <= (NOT A(31)) AND A(30) AND A(29) AND A(28)AND A(27) AND A(26) AND A(25) AND A(24)AND A(23) A(22) AND A(21) AND A(20) AND A(19)AND A(18) AND A(17) AND A(16) AND A(15)AND A(14) AND A(13) AND A(12) AND A(11) AND A(10)AND A(9) AND A(8) AND A(7) AND A(6) AND A(5) AND A(4) AND A(3) AND A(2) AND A(1) AND A(0); --Hay overflow en el incremento, si el dato --es 7FFFFFFFh OfIncB <= (NOT B(31)) AND B(30) AND B(29) AND B(28)AND B(27) AND B(26) AND B(25) AND B(24)AND B(23) AND B(22) AND B(21) AND B(20) AND B(19)AND B(18) AND B(17) AND B(16) AND B(15)AND B(14) AND B(13) AND B(12) AND B(11) AND B(10)AND B(9) AND B(8) AND B(7) AND B(6) AND B(5) AND B(4) AND B(3) AND B(2) AND B(1) AND B(0); OfDecA <= NOT (NOT A(31) OR A(30) OR A(29) OR A(28) OR A(27) OR A(26) OR A(25) OR A(24) OR A(23) OR A(22) OR A(21) OR A(20) OR A(19) OR A(18) OR A(17) OR A(16) OR A(15) OR A(14) OR A(13) OR A(12) OR A(11) OR A(10) OR A(9) Or A(8) OR A(7) Or A(6) OR A(5) OR A(4) OR A(3) OR A(2) OR A(1) OR A(0)); --Hay overflow en el decremento, si el dato --es 80000000h OfDecB <= NOT (NOT B(31) OR B(30) OR B(29) OR B(28) OR B(27) OR B(26) OR B(25) OR B(24) OR B(23) OR B(22) OR B(21) OR B(20) OR B(19) OR B(18) OR B(17) OR B(16) OR B(15) OR B(14) OR B(13) OR B(12) OR B(11) OR B(10) OR B(9) Or B(8) OR B(7) Or B(6) OR B(5) OR B(4) OR B(3) OR B(2) OR B(1) OR B(0)); Zero <= NOT (Result(31) OR Result(30) OR Result(29) OR Result(28)OR Result(27) OR Result(26) OR Result(25) OR Result(24)OR Result(23) OR Result(22) OR Result(21) OR Result(20)OR Result(19) OR Result(18) OR Result(17) OR Result(16)OR Result(15) OR Result(14) OR Result(13) OR Result(12)OR Result(11) OR Result(10) OR Result(9) OR Result(8)OR Result(7) OR Result(6) OR Result(5) OR Result(4)OR Result(3) OR Result(2) OR Result(1) OR Result(0)); --La bandera Z toma el valor de '1', cuando el resultado --de la operacin es igual a 00000000h AND

PROCESS (A,B,CTRALU,Cin) BEGIN CASE CTRALU IS -- La funcin de este Case es conectar a la salida -- el componente deseado, dependiendo de la operacin -- que se especifique en el byte de control. Es la -- descripcin de un Multiplexor de Salidas. -- ADC WHEN "00000" => Result Cout Ofw N Z <= ResultadoSumador; <= CarrySumador; <= Ofsuma; <= ResultadoSumador(31); <= Zero;

153

-- ADD WHEN "00001" => Result Cout Ofw N Z <= ResultadoSumador; <= CarrySumador; <= OfSuma; <= ResultadoSumador(31); <= Zero;

-- SUB (A-B) WHEN "00010" => Result Cout Ofw N Z -- SUB (B-A) WHEN "00011" => Result Cout Ofw N Z -- SBC (A-B) WHEN "00100" => Result Cout Ofw N Z -- SBC (B-A) WHEN "00101" => Result Cout Ofw N Z -- INC A WHEN "00110" => Result Cout Ofw N Z -- INC B WHEN "00111" => Result Cout Ofw N Z -- DEC A WHEN "01000" => Result <= ResultadoSumador; Cout <= CarrySumador; <= ResultadoSumador; <= CarrySumador; <= OfIncB; <= ResultadoSumador(31); <= Zero; <= ResultadoSumador; <= CarrySumador; <= OfIncA; <= ResultadoSumador(31); <= Zero; <= ResultadoSumador; <= CarrySumador; <= OfSubBA; <= ResultadoSumador(31); <= Zero; <= ResultadoSumador; <= CarrySumador; <= OfSubab; <= ResultadoSumador(31); <= Zero; <= ResultadoSumador; <= CarrySumador; <= OfSubba; <= ResultadoSumador(31); <= Zero; <= ResultadoSumador; <= CarrySumador; <= OfSubab; <= ResultadoSumador(31); <= Zero;

154

Ofw N Z -- DEC B WHEN "01001" => Result Cout Ofw N Z -- AND WHEN "01010" => Result Cout Ofw N Z -- ORA WHEN "01011" => Result Cout Ofw N Z -- XOR WHEN "01100" => Result Cout Ofw N Z -- CMP WHEN "01101" => Result Cout Ofw N Z -- LSR WHEN "01110" => Result Cout Ofw N Z -- ASR WHEN "01111" => Result Cout Ofw N Z -- SHL WHEN "10000" =>

<= OfDeca; <= ResultadoSumador(31); <= Zero;

<= ResultadoSumador; <= CarrySumador; <= OfDecb; <= ResultadoSumador(31); <= Zero;

<= A AND B; <= '0'; <= '0'; <= A(31) AND B(31); <= Zero; <= A OR B; <= '0'; <= '0'; <= A(31) OR B(31); <= Zero;

<= A XOR B; <= '0'; <= '0'; <= A(31) XOR B(31); <= Zero;

<= NOT B; <= '0'; <= '0'; <= NOT B(31); <= Zero;

<= ResultadoLsr; <= CarryLsr; <= '0'; <= ResultadoLsr(31); <= Zero;

<= ResultadoAsr; <= CarryAsr; <= '0'; <= ResultadoAsr(31); <= Zero;

Result <= ResultadoShl; Cout <= CarryShl;

155

Ofw N Z -- ROR WHEN "10001" => Result Cout Ofw N Z -- RRC WHEN "10010" => Result Cout Ofw N Z -- RLC WHEN "10011" => Result Cout Ofw N Z -- ROL WHEN "10100" => Result Cout Ofw N Z -- A WHEN "10101" => Result Cout Ofw N Z -- B WHEN "10110" => Result Cout Ofw N Z -- Igual a "0007FF" RST por software WHEN "10111" => Result Cout Ofw N Z -- Igual a "000...1000" WHEN "11000" => Result Cout Ofw N

<= '0'; <= ResultadoShl(31); <= Zero;

<= ResultadoRor; <= '0'; <= '0'; <= ResultadoRor(31); <= Zero;

<= ResultadoRrc; <= CarryRrc; <= '0'; <= ResultadoRrc(31); <= Zero;

<= ResultadoRlc; <= CarryRlc; <= '0'; <= ResultadoRlc(31); <= Zero; <= ResultadoRol; <= '0'; <= '0'; <= ResultadoRol(31); <= Zero;

<= A; <= '0'; <= '0'; <= A(31); <= Zero;

<= B; <= '0'; <= '0'; <= B(31); <= Zero; <= "00000000000000000000011111111111"; <= '0'; <= '0'; <= '0'; <= Zero;

<= "00000000000000000000000000001000"; <= '0'; <= '0'; <= '0';

156

Z -- Igual a "000...0" WHEN OTHERS => Result Cout Ofw N Z END CASE; END PROCESS; Salida <= Result; END Funcional;

<= Zero; <= "00000000000000000000000000000000"; <= '0'; <= '0'; <= '0'; <= Zero;

Entidad ARQT
--******************************************************************************* --* ALTERIC * --* PUJ TG 0421 * --* Diego Beltrn, Moiss Herrera ,Marco Mayolo * --* * --* file name: arqt.vhd * --* created: 2-09-2004 * --* last modified: 12-10-2004 * --* * --* Abstract: * --* ARQT representa la arquitectura principal del procesador * --* Se declara puertos de entradas y salidas * --* seales de conexin de bloques * --* * --* * --* Componentes a los que llama: alu.vhd * --* flag.vhd * --* reg2.vhd * --* reg3.vhd * --* reg5.vhd * --* reg6.vhd * --* reg24.vhd * --* reg32.vhd * --* decshc.vhd * --* * --******************************************************************************* -- carga de libreras library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; -- definicin de arqt Entity ARQT is Port ( -- seal de RELOJ Clk :in std_logic;

-- SEALES DE CARGA DE LOS REGISTROS CargaMA :in std_logic; CargaIR :in std_logic; CargaMD :in std_logic; CargaPC :in std_logic; CargaAC :in std_logic; CargaIX :in std_logic; CargaSP :in std_logic; CargaRA :in std_logic; CargaRB :in std_logic;

157

CargaRC CargaRD CargaRE CargaRF CargaPR CargaMR CargaSHC CargaSB

:in std_logic; :in std_logic; :in std_logic; :in std_logic; :in std_logic; :in std_logic; :in std_logic; :in std_logic;

-- SEALES DEL STATUS REGISTER -- Para todas las banderas (C, Z, Of, N, Sh & Ie), para -- realizar cualquier modificacin es necesario usar las seales -- Reset y Load de forma exclusiva (Reset=1 Load=0, Reset=0 Load=1). CFR CFL OfFR OfFL ZFR ZFL NFR NFL ShFR ShFL IeFR IeFL :in std_logic; :in std_logic; :in std_logic; :in std_logic; :in std_logic; :in std_logic; :in std_logic; :in std_logic; :in std_logic; :in std_logic; :in std_logic; :in std_logic;

-- SEALES DE ORIGEN DE LOS DATOS MADC -- MADC 0: Lee el OBUS. -1: Lee un "8". :in std_logic;

MDDC :in std_logic; -- MDDC 0: Lee desde el OBUS. -1: Lee desde el DBUS. SRFC :in std_logic_vector (1 downto 0); -- SRFC 00: Lee desde las banderas de la ALU. -11: lee desde IR (9) -XX: Lee desde el ABUS. SHCDC :in std_logic; -- SHCDC 0: Lee el decremento de IR(11:15). -1: Lee el decremento de SHC. PRDC :in std_logic_vector (1 downto 0); -- PRDC 00: Lee desde el OBUS. -11: Lee desde las lneas IRQ (PRIN). -XX: Lee "000".

158

-- ALU CTRALU :in std_logic_vector (4 downto 0); -- Indica a la ALU la operacin que -- debe realizar entre el ABUS y el -- BBUS. El resultado sale por el OBUS. -- Control DE BUSES ABUSDC :in std_logic_vector (3 downto 0); -- Especifica que registro escribe sobre -- sobre el ABUS. BBUSDC :in std_logic_vector (3 downto 0); -- Especifica que registro escribe sobre -- sobre el BBUS. ADBUSDC :in std_logic_vector (1 downto 0); -- ADBUSDC 00: Escribe en el ADBUS el dato contenido -en el registro MA. -11: Escribe "0000...1" -XX: Salida de Alta Impedancia. DBUSDC :in std_logic; -- DBUSDC 1: Escribe en el DBUS el dato contenido -en el registro MD. -0: Alta impedancia o Lectura. SBUSDC :in std_logic_vector (3 downto 0); -- Especifica que registro escribe sobre -- sobre el SBUS. SBUSOut :out std_logic_vector (3 downto 0); -- Muestra al usuario que registro se esta -- mostrando en el bus espa. SBUSSC :in std_logic_vector (3 downto 0); -- Bus para seleccionar el registro que se -- desea ver en el bus espa. Datos externos. SBRCtr :in std_logic; -- 0: Carga el SBR como instruccin. -- 1: Carga el SBR con datos del usuario. Datinsb :in std_logic; -- 0: Se desea ver un nico registro en el bus espa. -- 1: Se desea ver un grupo de registros. NC :in std_logic;

-- DATOS DE ENTRADA PRIN :in std_logic_vector (2 downto 0); -- Corresponde a las lneas de interrupcin -- Irq 1 a 3.

159

-- BUSES DE DATOS Y DIRECCIONES ADBus :out std_logic_vector (23 downto 0); -- Bus de direcciones. DBus :inout std_logic_vector (31 downto 0); -- Bus de datos. SBUS :out std_logic_vector (31 downto 0); -- Bus que muestra el contenido de los -- registros internos. (Bus espa) -- CONTENIDO DE LOS REGISTROS VISIBLES A LAS FUNCIONES DE CONTROL Dato_IR Dato_SHC Dato_PR Dato_SR Dato_MR Dato_SBR End ARQT; -- declaracin de arquitectura Architecture functional of ARQT is -- entradas y salidas Component FLAG port ( DatoIN Reset Carga clk qOut : in std_logic; : in std_logic; : in std_logic; : in std_logic; : out std_logic); :out std_logic_vector (0 to 25); :out std_logic_vector (4 downto 0); :out std_logic_vector (2 downto 0); :out std_logic_vector (5 downto 0); :out std_logic_vector (1 downto 0); :out std_logic_vector (5 downto 0));

End Component; Component Register24 port ( DatoIN Carga clk qOut : in std_logic_vector (23 downto 0); : in std_logic; : in std_logic; : out std_logic_vector (23 downto 0));

End Component; Component Register32 port ( DatoIN Carga clk qOut : in std_logic_vector (31 downto 0); : in std_logic; : in std_logic; : out std_logic_vector (31 downto 0));

End Component; Component Register3 port ( DatoIN Carga clk qOut : in std_logic_vector (2 downto 0); : in std_logic; : in std_logic; : out std_logic_vector (2 downto 0));

End Component; Component Register2 port ( DatoIN : in std_logic_vector (1 downto 0);

160

Carga clk qOut End component; Component Register5 port ( DatoIN Carga clk qOut End Component; Component Register6 port ( DatoIN Carga clk qOut

: in std_logic; : in std_logic; : out std_logic_vector (1 downto 0));

: in std_logic_vector (4 downto 0); : in std_logic; : in std_logic; : out std_logic_vector (4 downto 0));

: in std_logic_vector (5 downto 0); : in std_logic; : in std_logic; : out std_logic_vector (5 downto 0));

End Component; Component ALU Port (A,B CTRALU Cin Salida Cout,Ofw,Z,N : in std_logic_vector (31 downto 0); : in std_logic_vector (4 downto 0); : in std_logic; : out std_logic_vector (31 downto 0); : out std_logic);

end Component; Component DECSHC port end Component; --SEALES PARA CONECTAR BLOQUES Signal MAqOut, MADatoIN Signal IRqOut Signal MDDatoIN,MDqOut Signal PCqOut Signal ACqOut Signal IXqOut Signal SPqOut Signal RAqOut Signal RBqOut Signal RCqOut Signal RDqOut Signal RFqOut Signal REqOut Signal SBRDatoIN, SBRqOut Signal CFDatoIN,CFDatoINTmp,CFqOut Signal OfFDatoIN,OfFDatoINTmp,OfFqOut Signal ZFDatoIN,ZFDatoINTmp,ZFqOut Signal NFDatoIN,NFDatoINTmp,NFqOut Signal IeFDatoIN,IeFqOut Signal ShFDatoIN,ShFqOut Signal SHCDatoIN,SHCqOut Signal Abus Signal Bbus Signal OBus Signal PRDatoIN,PRqOut : std_logic_vector (23 downto 0); : std_logic_vector (31 downto 0); : std_logic_vector (31 downto 0); : std_logic_vector (23 downto 0); : std_logic_vector (31 downto 0); : std_logic_vector (23 downto 0); : std_logic_vector (23 downto 0); : std_logic_vector (31 downto 0); : std_logic_vector (31 downto 0); : std_logic_vector (31 downto 0); : std_logic_vector (31 downto 0); : std_logic_vector (31 downto 0); : std_logic_vector (31 downto 0); : std_logic_vector (5 downto 0); : std_logic; : std_logic; : std_logic; : std_logic; : std_logic; : std_logic; : std_logic_vector (4 downto 0); : std_logic_vector (31 downto 0); : std_logic_vector (31 downto 0); : std_logic_vector (31 downto 0); : std_logic_vector (2 downto 0); ( SHCD Resultado : in std_logic_vector (4 downto 0); : out std_logic_vector (4 downto 0));

161

Signal MRqOut Signal ResultadoDec5 Signal ADBusTmp

: std_logic_vector (1 downto 0); : std_logic_vector (4 downto 0); : std_logic_vector (23 downto 0);

BEGIN -- CONEXION DE LOS REGISTROS MA: Register24 Port map (MADatoIN,CargaMA,Clk, MAqOut); IR: Register32 Port map (OBus,CargaIR,Clk, IRqOut); MD: Register32 Port map (MDDatoIN,CargaMD,Clk, MDqOut); PC: Register24 Port map (OBUS(23 downto 0),CargaPC,Clk, PCqOut); AC: Register32 Port map (Obus,CargaAC,Clk, ACqOut); IX: Register24 Port map (OBus(23 downto 0),CargaIX,Clk, IXqOut); SP: Register24 Port map (OBus(23 downto 0),CargaSP,Clk, SPqOut); RA: Register32 Port map (Obus,CargaRA,Clk, RAqOut); RB: Register32 Port map (OBus,CargaRB,Clk, RBqOut); RC: Register32 Port map (Obus,CargaRC,Clk, RCqOut); RD: Register32 Port map (Obus,CargaRD,Clk, RDqOut); RE: Register32 Port map (OBus,CargaRE,Clk, REqOut); RF: Register32 Port map (Obus,CargaRF,Clk, RFqOut); SBR: Register6 Port map (SBRDatoIN, CargaSB, Clk, SBRqOut); ElCarry: FLAG Port Map (CFDatoIN, CFR, CFL, clk, CFqOut ); Overflow: FLAG Port Map (OfFDatoIN, OfFR, OfFL, clk, OfFqOut );

162

Zero: FLAG Port Map (ZFDatoIN, ZFR, ZFL, clk, ZFqOut ); Negativo: FLAG Port Map (NFDatoIN, NFR, NFL, clk, NFqOut ); Ie: FLAG Port Map (IeFDatoIN, IeFR, IeFL, clk, IeFqOut ); Sh: FLAG Port Map (ShFDatoIN, ShFR, ShFL, clk, ShFqOut ); PR: Register3 Port map (PRDatoIN,CargaPR,Clk, PRqOut); MR: Register2 Port map (IRqOut(23 downto 22),CargaMR,Clk, MRqOut); SHC: Register5 Port map (SHCDatoIN,CargaSHC,Clk, SHCqOut); ALU_ARQT: ALU Port map (ABus, BBus, CTRALU, CFqOut, OBus, CFDatoINTmp, OfFDatoINTmp, ZFDatoINTmp, NFDatoINTmp); DECSHC_ARQT: DECSHC Port map (SHCqOut, ResultadoDec5); -- COMPORTAMIENTO DE LOS BUSES ABUS, BBUS, ADBUS, DBUS Y SBUS --CONTROL PARA EL BUS INTERNO ABUS ABusDataIs: PROCESS (Clk, ABUSDC) BEGIN CASE ABUSDC is --MA WHEN "0000" => Abus(23 downto 0) <= MAqOut; Abus (31 downto 24) <= "00000000"; --IR WHEN "0001" => Abus <= IRqOut; --MD WHEN "0010" => Abus <= MDqOut; --PR WHEN "0011" => Abus (2 downto 0) <= PRqOut; Abus (31 downto 3) <= "00000000000000000000000000000"; --Status Register WHEN "0100" =>

163

Abus (31 downto 8) <= "000000000000000000000000"; Abus (0) <= ZFqOut; Abus (1) <= CFqOut; Abus (2) <= OfFqOut; Abus (3) <= NFqOut; Abus (4) <= ShFqOut; Abus (5) <= IeFqOut; Abus (7 downto 6) <= "00" ; -- 24 bits menos significativos de MD (PASO 15) -- con extensin de signo. WHEN "0101" => Abus (23 downto 0) <= MDqOut (23 downto 0); Abus (24) <= MDqOut (23); Abus (25) <= MDqOut (23); Abus (26) <= MDqOut (23); Abus (27) <= MDqOut (23); Abus (28) <= MDqOut (23); Abus (29) <= MDqOut (23); Abus (30) <= MDqOut (23); Abus (31) <= MDqOut (23); -- Corrimiento de 16 bits en el registro IR (PASO 46) WHEN "0110" => Abus (31 downto 16) <= IRqOut (15 downto 0); Abus (15 downto 0) <= IRqOut (15 downto 0); -- Justifica los bits 10 a 15 del IR WHEN "0111" => (PASO 47)

Abus (31 downto 6) <= "00000000000000000000110000"; Abus (5 downto 0) <= IRqOut (21 downto 16); -- Justifica los bits 16 al 31 del IR y completa con ceros (PASO 40) WHEN "1000" => Abus (31 downto 16) <= "0000000000000000"; Abus (15 downto 0) <= IRqOut (15 downto 0); -- Justifica los bits 16 al 31 del IR y completa con unos (PASO 40) WHEN "1001" => Abus (31 downto 16) <= "1111111111111111"; Abus (15 downto 0) <= IRqOut (15 downto 0); -- Justifica los bits 8 al 31 del IR y completa con ceros (PASO 40) WHEN "1010" => Abus (31 downto 24) <= "00000000"; Abus (23 downto 0) <= IRqOut (23 downto 0); -- Justifica los bits 12 al 15 del IR y completa con ceros (PASO 41) WHEN "1011" => Abus (31 downto 4) <= "0000000000000000000000000000"; Abus (3 downto 0) <= IRqOut (19 downto 16); -- Justifica los bits 12 al 15 del IR y completa con ceros (PASO 41) WHEN "1100" => Abus (31 downto 4) <= "1111111111111111111111111111";

164

Abus (3 downto 0) <= IRqOut (19 downto 16); -- LOS 8 BITS MAS SIGNIFICATIVOS DEL IR Y MA (PASO 22) WHEN "1101" => Abus (31 downto 24) <= IRqOut(31 downto 24); Abus (23 downto 0) <= MAqOut; WHEN OTHERS => Abus <= "00000000000000000000000000000000"; END CASE; END PROCESS; --CONTROL DEL BUS INTERNO BBUS BBusDataIs: PROCESS (Clk, BBUSDC) BEGIN CASE BBUSDC is --PC WHEN "0000" => Bbus (23 downto 0) <= PCqOut; Bbus (31 downto 24) <= "00000000"; --SP WHEN "0001" => Bbus (23 downto 0) <= SPqOut; BBus (31 downto 24) <= "00000000"; --AC WHEN "0010" => Bbus <= ACqOut; --IX WHEN "0011" => Bbus (23 downto 0) <= IXqOut; Bbus (31 downto 24) <= "00000000"; --RA WHEN "0100" => Bbus <= RAqOut; --RB WHEN "0101" => Bbus <= RBqOut; --RC WHEN "0110" => Bbus <= RCqOut;

165

--RD WHEN "0111" => Bbus <= RDqOut; --RE WHEN "1000" => Bbus <= REqOut; --RF WHEN "1001" => Bbus <= RFqOut; --SR WHEN "1010" => Bbus(1) <= CFqOut; Bbus(3) <= NFqOut; Bbus(0) <= ZFqOut; Bbus(2) <= OfFqOut; Bbus(4) <= ShFqOut; Bbus(5) <= IeFqOut; Bbus(31 downto 6) <= "00000000000000000000000000"; --PR WHEN "1011" => Bbus (2 downto 0) <= PRqOut; Bbus (31 downto 3) <= "00000000000000000000000000000"; -WHEN "1100" => Bbus (31 downto 24) <= IRqOut (23 downto 16); Bbus (23 downto 0) <= ACqOut (23 downto 0); WHEN OTHERS => Bbus <="00000000000000000000000000000000"; END CASE; END PROCESS; --CONTROL DEL BUS EXTERNO ADBUS ADBusDataIs: PROCESS (Clk, ADBUSDC) BEGIN CASE ADBUSDC is -- Escritura WHEN "11" => ADBusTmp <= MAqOut; -- Nada WHEN "00" =>

166

ADBusTmp <= "ZZZZZZZZZZZZZZZZZZZZZZZZ"; -- Escribe un 1 WHEN OTHERS => ADBusTmp <= "000000000000000000000001"; END CASE; END PROCESS; ADBus (23 downto 0) <= ADBusTmp (23 downto 0); --CONTROL DEL BUS EXTERNO DBUS DBusDataIs: PROCESS (Clk, DBUSDC) BEGIN CASE DBUSDC is -- Escritura WHEN '1' => DBus <= MDqOut; -- Lectura WHEN OTHERS => DBus <= "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"; END CASE; END PROCESS; SBusOut <= SBUSDC; --CONTROL DEL BUS ESPIA EN MODO NORMAL SBusDataIs: PROCESS (Clk, SBUSDC) BEGIN CASE SBUSDC is --MD WHEN "0000" => SBUS(31 downto 0) <= MDqOut (31 downto 0); --MA WHEN "0001" => SBUS(23 downto 0) <= MAqOut (23 downto 0); SBUS(31 downto 24) <= "00000000"; --PC WHEN "0010" =>

167

SBUS(23 downto 0) <= PCqOut (23 downto 0); SBUS(31 downto 24) <= "00000000"; --SP WHEN "0011" => SBUS(23 downto 0) <= SPqOut (23 downto 0); SBUS(31 downto 24) <= "00000000"; --SR WHEN "0100" => SBus(0) <= ZFqOut; SBus(1) <= CFqOut; SBus(2) <= OfFqOut; SBus(3) <= NFqOut; SBus(4) <= ShFqOut; SBus(5) <= IeFqOut; SBus(31 downto 6) <= "00000000000000000000000000"; --AC WHEN "0101" => SBUS(31 downto 0) <= ACqOut (31 downto 0); --RA WHEN "0110" => SBUS(31 downto 0) <= RAqOut (31 downto 0); --RB WHEN "0111" => SBUS(31 downto 0) <= RBqOut (31 downto 0); --RC WHEN "1000" => SBUS(31 downto 0) <= RCqOut (31 downto 0); --RD WHEN "1001" => SBUS(31 downto 0) <= RDqOut (31 downto 0); --RE WHEN "1010" => SBUS(31 downto 0) <= REqOut (31 downto 0); --RF WHEN "1011" => SBUS(31 downto 0) <= RFqOut (31 downto 0); --IX WHEN "1100" => SBUS(23 downto 0) <= IXqOut (23 downto 0); SBUS(31 downto 24) <= "00000000";

168

--IR WHEN "1101" => SBUS(31 downto 0) <= IRqOut (31 downto 0); --MR y PR WHEN "1110" => SBus(1 downto 0) <= MRqOut; SBus(3 downto 2) <= "00"; SBus(6 downto 4) <= PRqOut; SBus(31 downto 7 ) <= "0000000000000000000000000"; --SHC WHEN "1111" => SBus(4 downto 0) <= SHCqOut; SBus(31 downto 5 ) <= "000000000000000000000000000"; WHEN OTHERS => SBus <= "00000000000000000000000000000000"; END CASE; END PROCESS; -- FORMA DE CARGAR LOS DATOS --CONTROL PARA CARGA DE DATOS EN EL REGISTRO DEL BUS ESPIA SBRDataIs: PROCESS (Clk, SBRCtr) BEGIN CASE SBRCtr is --SI ES UNA INSTRUCCION --TOMA DATOS DEL IR WHEN '0'=> SBRDatoIN (5 downto 0) <= IRqOut (21 downto 16); --SI ES POR PARADA --LEE DATOS EXTERNOS WHEN OTHERS => SBRDatoIN (5) <= NC; --ESTE DATO ES UN '0' LOGICO SBRDatoIN (4) <= Datinsb; -- SI ES '0' SE QUIERE VER UN UNICO REGISTRO -- SI ES '1' SE QUIERE VER UN GRUPO O TODOS LOS REGISTROS SBRDatoIN (3 downto 0) <= SBUSSC (3 downto 0); --DATOS DE ENTRADA END CASE; END PROCESS; MADataIs:

169

PROCESS BEGIN

(clk, MADC) CASE MADC is --LEE DEL OBUS WHEN '0'=> MADatoIN <= OBus (23 downto 0); --LEE UN 8 WHEN OTHERS => MADatoIN <= "000000000000000000001000"; END CASE;

END PROCESS; SHCDataIs: PROCESS BEGIN CASE SHCDC is --LEE DEL IR LA DISTANCIA DEL CORRIMIENTO WHEN '1'=> SHCDatoIN <= IRqOut (20 downto 16); --LEE DE LA SALIDA DE LA ENTIDAD QUE DECREMENTA (SCH-1) WHEN OTHERS => SHCDatoIN <= ResultadoDec5; END CASE; END PROCESS; MDDataIs: PROCESS BEGIN CASE MDDC is -- Lectura desde OBUS WHEN '0'=> MDDatoIN <= Obus; -- Lectura desde DBUS WHEN OTHERS => MDDatoIN (31 downto 0) <= DBus (31 downto 0); END CASE; END PROCESS; (clk, MDDC) (clk, SHCDC)

170

PRDataIs: PROCESS BEGIN CASE PRDC is -- Lee desde las lneas externas WHEN "11"=> PRDatoIN <= PRIN (2 downto 0); -- Lee desde el OBUS WHEN "00"=> PRDatoIN <= OBus (2 downto 0); -- Inicializacin WHEN OTHERS => PRDatoIN <= "000"; END CASE; END PROCESS; --CONTROL DE DATOS PARA LAS BANDERAS DEL SR SRFlagsAre: PROCESS (Clk, SRFC) BEGIN CASE SRFC is --Desde la ALU WHEN "00"=> ZFDatoIN <=ZFDatoINTmp; CFDatoIN <=CFDatoINTmp; OfFDatoIN <=OfFDatoINTmp; NFDatoIN <=NFDatoINTmp; ShFDatoIN <= '0'; IeFDatoIN <= '0'; --Desde la ALU WHEN "01"=> ZFDatoIN <=ZFDatoINTmp; CFDatoIN <=CFDatoINTmp; OfFDatoIN <=OfFDatoINTmp; NFDatoIN <=NFDatoINTmp; ShFDatoIN <= '0'; IeFDatoIN <= '1'; --desde el IR WHEN "11"=> ZFDatoIN <=ZFDatoINTmp; CFDatoIN <=IrqOut (22); OfFDatoIN <=OfFDatoINTmp; NFDatoIN <=NFDatoINTmp; ShFDatoIN <= '0'; (clk, PRDC)

171

IeFDatoIN <= IrqOut (22); --Desde el ABus WHEN OTHERS => ZFDatoIN <= ABus(0); CFDatoIN <= ABus(1); OfFDatoIN <= ABus(2); NFDatoIN <= ABus(3); ShFDatoIN <= ABus(4); IeFDatoIN <= ABus(5); END CASE; END PROCESS; -- SEALES PARA LAS FUNCIONES Dato_SBR (5 downto 0) Dato_IR(0 to 25) Dato_SHC(4 downto 0) Dato_PR(2 downto 0) Dato_MR(1 downto 0) Dato_SR(0) Dato_SR(1) Dato_SR(2) Dato_SR(3) Dato_SR(4) Dato_SR(5) END Functional; <= SBRqOut (5 downto 0); <= IRqOut (31 downto 6); <= SHCqOut(4 downto 0); <= PRqOut(2 downto 0); <= MRqOut(1 downto 0); <= ZFqOut; <= CFqOut; <= OfFqOut; <= NFqOut; <= ShFqOut; <= IeFqOut;

Entidad PASO20
--******************************************************************************* --* ALTERIC * --* PUJ TG 0421 * --* Diego Beltrn, Moiss Herrera ,Marco Mayolo * --* * --* file name: Paso20.vhd * --* created: 1-09-2004 * --* last modified: 12-10-2004 * --* * --* Abstract: * --* Entidad encargada de generar las seales para controlar * --* la ALU,los buses ABUS y BBUS en el paso 20 del cdigo AHPL* --* En este paso se verifica que el modo sea directo o indizado. * --* Se definen las entradas y salidas * --* * --* * --* Componentes a los que llama: ninguno * --* * --* * --******************************************************************************* library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; Entity Paso20 is port (IR6 -- IR(6) CALU : in std_logic; : out std_logic_vector (4 downto 0);

172

-- Control para la ALU AyBBUSDC : out std_logic_vector (7 downto 0)); -- Control para los buses ABUS y BBUS End Paso20; architecture Condicional of Paso20 is

BEGIN PROCESS (IR6) BEGIN CASE IR6 IS -- MODO DIRECTO WHEN '0' => CALU <= "10101"; -- OBUS = ABUS AyBBUSDC <= X"20"; -- ABUS = MD, BBUS= PC -- MODO INDIZADO WHEN OTHERS => CALU <= "00001"; -- OBUS = ADD (ABUS, BBUS) = ADD (MD,IX) AyBBUSDC <= X"23"; -- ABUS = MD, BBUS= IX END CASE; END PROCESS; END Condicional;

Entidad PASO30
--******************************************************************************* --* ALTERIC * --* PUJ TG 0421 * --* Diego Beltrn, Moiss Herrera ,Marco Mayolo * --* * --* file name: Paso30.vhd * --* created: 1-09-2004 * --* last modified: 12-10-2004 * --* * --* Abstract: * --* Entidad encargada de generar las seales para controlar la ALU, * --* en el paso 30 del cdigo AHPL. En este paso se verifica que la * --* instruccin a ejecutar sea INC o DEC. * --* Se definen las entradas y salidas * --* * --* * --* Componentes a los que llama: ninguno * --* * --* * --******************************************************************************* library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all;

173

Entity Paso30 is port (IR3 : in std_logic; -- IR(3) CALU : out std_logic_vector (4 downto 0)); -- Control para la ALU End Paso30; architecture Condicional of Paso30 is BEGIN PROCESS (IR3) BEGIN CASE IR3 IS -- INC WHEN '0' => CALU <= "00110";

-- DEC WHEN OTHERS => CALU END CASE; END PROCESS; END Condicional; <= "01000";

Entidad PASO34
--******************************************************************************* --* ALTERIC * --* PUJ TG 0421 * --* Diego Beltrn, Moiss Herrera ,Marco Mayolo * --* * --* file name: Paso34.vhd * --* created: 1-09-2004 * --* last modified: 12-10-2004 * --* * --* Abstract: * --* Entidad encargada de generar las seales para controlar la ALU, * --* las banderas del SR y la carga de los registros en el paso 34 * --* del cdigo AHPL. En este paso se ejecutan las instrucciones * --* aritmticas y lgicas de 32 bits. * --* Se definen las entradas y salidas * --* * --* * --* Componentes a los que llama: ninguno * --* * --* * --******************************************************************************* library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; ENTITY Paso34 is

174

port

(IR0A3 : in std_logic_vector (0 to 3); -- Opcode de la instruccin LOADS : out std_logic_vector (15 downto 0); -- Control de carga de los registros CALU : out std_logic_vector (4 downto 0); -- Control para la ALU FLAGSC : out std_logic_vector (11 downto 0)); -- Control para las banderas del SR

END Paso34; architecture Condicional of Paso34 is BEGIN PROCESS (IR0A3) BEGIN CASE IR0A3 IS -- SBC WHEN "0000" => CALU <= "00101"; FLAGSC <= X"550"; LOADS <= X"0800"; -- SUB WHEN "0001" => CALU <= "00011"; FLAGSC <= X"550"; LOADS <= X"0800"; -- ADC WHEN "0100" => CALU <= "00000"; FLAGSC <= X"550"; LOADS <= X"0800"; -- ADD WHEN "0101" => CALU <= "00001"; FLAGSC <= X"550"; LOADS <= X"0800"; -- ORA WHEN "1000" => CALU <= "01011"; FLAGSC <= X"050"; LOADS <= X"0800"; -- AND WHEN "1001" =>

175

CALU <= "01010"; FLAGSC <= X"050"; LOADS <= X"0800"; -- XOR WHEN "1010" => CALU <= "01100"; FLAGSC <= X"050"; LOADS <= X"0800"; -- MVT WHEN "0010" => CALU <= "10101"; FLAGSC <= X"050"; LOADS <= X"0800"; -- BIT (Se hace con una AND) WHEN "1011" => CALU <= "01010"; FLAGSC <= X"050"; LOADS <= X"0000"; -- No guarda el resultado en ningn registro -- CMP (Se hace con una resta SUB) WHEN "0011" => CALU <= "00011"; FLAGSC <= X"550"; LOADS <= X"0000"; -- No guarda el resultado en ningn registro

-- Error (No se hace ninguna operacin) WHEN Others => CALU <= "00000"; FLAGSC <= X"000"; LOADS <= X"0000"; END CASE; END PROCESS; END Condicional;

176

Entidad PASO40
--******************************************************************************* --* ALTERIC * --* PUJ TG 0421 * --* Diego Beltrn, Moiss Herrera ,Marco Mayolo * --* * --* file name: Paso40.vhd * --* created: 1-09-2004 * --* last modified: 12-10-2004 * --* * --* Abstract: * --* Entidad encargada de generar las seales para controlar la ALU, * --* los buses ABUS y BBUS en el paso 40 del cdigo AHPL. En este * --* paso se ejecutan los saltos a subrutina. * --* Se definen las entradas y salidas * --* * --* * --* Componentes a los que llama: ninguno * --* * --* * --******************************************************************************* library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; -- Esta Entidad determina las condiciones posibles -- en el paso 40 del AHPL. Ejecuta saltos a subrutina. ENTITY Paso40 is port (IR0 : in std_logic; -- IR (0) IR16 : in std_logic; -- IR (16) Signo del corrimiento CALU : out std_logic_vector (4 downto 0); -- Control para la ALU AyBBUSDC : out std_logic_vector (7 downto 0)); -- Control para los buses ABUS y BBUS END Paso40; architecture Condicional of Paso40 is Signal IR BEGIN IR (0) <= IR0; : std_logic_vector (0 to 1);

177

IR (1) <= IR16; PROCESS (IR) BEGIN CASE IR IS -- BRA + WHEN "00" => CALU <= "00001"; AyBBUSDC <= X"80"; -- BRA WHEN "01" => CALU <= "00001"; AyBBUSDC <= X"90"; -- JSR WHEN Others => CALU <= "10101"; AyBBUSDC <= X"A0"; END CASE; END PROCESS; END Condicional;

Entidad PASO41
--******************************************************************************* --* ALTERIC * --* PUJ TG 0421 * --* Diego Beltrn, Moiss Herrera ,Marco Mayolo * --* * --* file name: Paso41.vhd * --* created: 1-09-2004 * --* last modified: 12-10-2004 * --* * --* Abstract: * --* Entidad encargada de generar las seales para controlar la ALU, * --* los buses ABUS y BBUS en el paso 41 del cdigo AHPL. En este * --* paso se verifica selecciona el modo para operar instrucciones * --* aritmticas y lgicas de 16 bits. * --* Se definen las entradas y salidas * --* * --* * --* Componentes a los que llama: ninguno * --* * --* * --******************************************************************************* library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; Entity Paso41 is port (IR10 : in std_logic; -- Modo de seleccin de posicin

178

IR12A15 -- AD2

: in std_logic_vector (0 to 3);

CALU : out std_logic_vector (4 downto 0); -- Control para la ALU AyBBUSDC : out std_logic_vector (7 downto 0)); -- Control para los buses ABUS y BBUS End Paso41; architecture Condicional of Paso41 is BEGIN PROCESS (IR12A15) BEGIN CASE IR12A15 IS -- BBUS=AC WHEN "0000" => AyBBUSDC(3 downto 0) -- BBUS=RA WHEN "0001" => AyBBUSDC(3 downto 0) -- BBUS=RB WHEN "0010" => AyBBUSDC(3 downto 0) -- BBUS=RC WHEN "0011" => AyBBUSDC(3 downto 0) -- BBUS=RD WHEN "0100" => AyBBUSDC(3 downto 0) -- BBUS=RE WHEN "0101" => AyBBUSDC(3 downto 0) -- BBUS=RF WHEN "0110" => AyBBUSDC(3 downto 0) -- BBUS=IX <= "1001"; <= "1000"; <= "0111"; <= "0110"; <= "0101"; <= "0100"; <= "0010";

179

WHEN "1000" => AyBBUSDC(3 downto 0) -- BBUS=SP WHEN "1111" => AyBBUSDC(3 downto 0) -- BBUS=AC (Caso de Error) WHEN Others => AyBBUSDC(3 downto 0) END CASE; END PROCESS; <= "0010"; <= "0001"; <= "0011";

PROCESS (IR12A15(0)) -- IR(12) Signo del operando BEGIN CASE IR12A15(0) IS -- ABUS=000000..IR(12:15) Operando positivo WHEN '0' => AyBBUSDC(7 downto 4) <= "1011";

-- ABUS=111111..IR(12:15) Operando negativo WHEN Others => AyBBUSDC(7 downto 4) END CASE; END Process; <= "1100";

PROCESS (IR10) -- IR(10) Modo de posicin de memoria BEGIN CASE IR10 IS -- OBUS=ABUS, AD2 es un operando de 4 bits WHEN '1' => CALU <= "10101";

-- OBUS=BBUS, AD2 es el registro fuente WHEN Others => CALU <= "10110";

180

END CASE; END PROCESS; END Condicional;

Entidad PASO42
--******************************************************************************* --* ALTERIC * --* PUJ TG 0421 * --* Diego Beltrn, Moiss Herrera ,Marco Mayolo * --* * --* file name: Paso42.vhd * --* created: 1-09-2004 * --* last modified: 12-10-2004 * --* * --* Abstract: * --* Entidad encargada de generar las seales para controlar los * --* buses ABUS y BBUS y la carga de los registros, en el paso 42 * --* del cdigo AHPL. En este paso se ejecutan las instrucciones * --* aritmticas y lgicas de 16 bits. * --* Se definen las entradas y salidas * --* * --* * --* Componentes a los que llama: ninguno * --* * --* * --******************************************************************************* library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; Entity Paso42 is port (IR2A3 -IR6A9 -- AD1 : in std_ulogic_vector (0 to 1); : in std_ulogic_vector (0 to 3);

LOADS : out std_ulogic_vector (15 downto 0); -- Control para cargar los registros AyBBUSDC : out std_ulogic_vector (7 downto 0)); -- Control para los buses ABUS y BBUS END Paso42; architecture Condicional of Paso42 is

Signal LOADSTemp Signal Verdadero BEGIN

: std_ulogic_vector (15 downto 0); : std_ulogic;

181

PROCESS (IR6A9) BEGIN CASE IR6A9 IS -- BBUS=AC y ACLoad=1 WHEN "0000" => AyBBUSDC(3 downto 0) LOADSTemp -- BBUS=RA y RALoad=1 WHEN "0001" => AyBBUSDC(3 downto 0) LOADSTemp -- BBUS=RB y ... WHEN "0010" => AyBBUSDC(3 downto 0) LOADSTemp -- BBUS=RC ... WHEN "0011" => AyBBUSDC(3 downto 0) LOADSTemp -- BBUS=RD ... WHEN "0100" => AyBBUSDC(3 downto 0) LOADSTemp -- BBUS=RE ... WHEN "0101" => AyBBUSDC(3 downto 0) LOADSTemp -- BBUS=RF ... WHEN "0110" => AyBBUSDC(3 downto 0) LOADSTemp -- BBUS=IX ... WHEN "1000" => AyBBUSDC(3 downto 0) LOADSTemp -- BBUS=SP ... <= "0011"; <= X"0400"; <= "1001"; <= X"0008"; <= "1000"; <= X"0010"; <= "0111"; <= X"0020"; <= "0110"; <= X"0040"; <= "0101"; <= X"0080"; <= "0100"; <= X"0100"; <= "0010"; <= X"0800";

182

WHEN "1111" => AyBBUSDC(3 downto 0) LOADSTemp <= "0001"; <= X"0200";

-- BBUS=AC (Caso de Error) WHEN Others => AyBBUSDC(3 downto 0) LOADSTemp END CASE; END PROCESS; AyBBUSDC(7 downto 4) <="0010"; -- El otro operando es MD Verdadero <= NOT (IR2A3(0) AND IR2A3(1)); PROCESS (Verdadero) BEGIN CASE Verdadero IS WHEN '1' => LOADS <= LOADSTEMP; -- Cualquier operacin WHEN OTHERS => LOADS <= X"0000"; -- BIT o CMP END CASE; END PROCESS; END Condicional; <= "0010"; <= X"0800";

Entidad PASO44
--******************************************************************************* --* ALTERIC * --* PUJ TG 0421 * --* Diego Beltrn, Moiss Herrera ,Marco Mayolo * --* * --* file name: Paso44.vhd * --* created: 1-09-2004 * --* last modified: 12-10-2004 * --* * --* Abstract: * --* Entidad encargada de generar las seales para controlar la ALU * --* y las banderas del SR en el paso 44 del cdigo AHPL. En este * --* paso se ejecutan las instrucciones de rotacin y desplazamiento * --* Se definen las entradas y salidas * --* * --* * --* Componentes a los que llama: ninguno * --* * --* *

183

--******************************************************************************* library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; -- Esta Entidad determina las condiciones posibles -- en el paso 44 del AHPL. Ejecuta instrucciones de -- rotacin y desplazamiento. ENTITY Paso44 is port (IR5A6 : in std_logic_vector (0 to 1); -- Tipo de instruccin IR10 -- Direccin CALU FLAGSC END Paso44; architecture Condicional of Paso44 is Signal IR BEGIN IR(0 to 1) <= IR5A6; IR(2) PROCESS (IR) BEGIN CASE IR IS -- LSR WHEN "011" => CALU <= "01110"; FLAGSC <= X"400"; -- ASR WHEN "001" => CALU <= "01111"; FLAGSC <= X"400"; -- SHL WHEN "010" => CALU <= "10000"; FLAGSC <= X"400"; -- SHL Tambin WHEN "000" => <= IR10; : std_logic_vector (0 to 2); : in std_logic; : out std_logic_vector (4 downto 0); : out std_logic_vector (11 downto 0));

184

CALU <= "10000"; FLAGSC <= X"400"; -- ROR WHEN "111" => CALU <= "10001"; FLAGSC <= X"000"; -- RRC WHEN "101" => CALU <= "10010"; FLAGSC <= X"400";

-- ROL WHEN "110" => CALU <= "10100"; FLAGSC <= X"000";

-- RLC WHEN "100" => CALU <= "10011"; FLAGSC <= X"400";

-- Error (No se hace ninguna operacin) WHEN Others => CALU <= "10110"; FLAGSC <= X"000"; END CASE; END PROCESS; END Condicional;

185

Entidad PASO68
--******************************************************************************* --* ALTERIC * --* PUJ TG 0421 * --* Diego Beltrn, Moiss Herrera ,Marco Mayolo * --* * --* file name: Paso68.vhd * --* created: 1-09-2004 * --* last modified: 12-10-2004 * --* * --* Abstract: * --* Entidad encargada de generar las seales para controlar la carga * --* de los registros en el paso 68 del cdigo AHPL. En este paso se * --* verifica si la instruccin a ejecutar es POP o RTS. * --* Se definen las entradas y salidas * --* * --* * --* Componentes a los que llama: ninguno * --* * --* * --******************************************************************************* library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; ENTITY Paso68 is port (IR8 -- IR (8) LOADS END Paso68; architecture Condicional of Paso68 is BEGIN PROCESS (IR8) BEGIN CASE IR8 IS -- AC<=MD POP WHEN '0' => LOADS <= X"0800"; -- PC<=MD RTS WHEN Others => : in std_logic; : out std_logic_vector (15 downto 0));

186

LOADS <= X"1000"; END CASE; END PROCESS; END Condicional;

187

S-ar putea să vă placă și