Está en la página 1de 186

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:

R.P. GERARDO REMOLINA S.J.

DECANO ACADMICO:

Ing. ROBERTO ENRIQUE MONTOYA VILLA

DECANO DEL MEDIO UNIVERSITARIO:

R.P. ANTONIO JOS SARMIENTO NOVA S.J.

DIRECTOR DE CARRERA:

Ing. JUAN CARLOS GIRALDO CARVAJAL

DIRECTOR DEL PROYECTO:

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

10

1. CARACTERSTICAS DEL PROCESADOR

11

1.1 CAMBIOS CON RESPECTO A PCSIM Y E-RIC

11

2. METODOLOGA DE TRABAJO

14

2.1
2.2
2.3
2.4

ETAPA DE INVESTIGACIN
ETAPA DE DESARROLLO
ETAPA DE PRUEBAS
ETAPA DE ENTREGA

14
15
16
17

3. RESULTADOS OBTENIDOS

18

3.1 PRUEBAS
3.2 PROBLEMAS

18
26

4. COSTOS

31

4.1 COSTOS ESTIMADOS EN EL ANTEPROYECTO


4.2 COSTOS REALES

31
32

5. CONCLUSIONES

34

BIBLIOGRAFA

35

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

37
40
56
59
64
68

LISTA DE FIGURAS

Figura 1. Arquitectura, unidades funcionales y seales de ALTERIC

11

Figura 2. Inicio de la mquina de estados

19

Figura 3. Instruccin RST

20

Figura 4. Atencin de la interrupcin en modo 1

20

Figura 5. Retorno de interrupcin en modo 1

20

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

21

Figura 7. Atencin de interrupcin en modo 3

21

Figura 8. Montaje para pruebas en protoboard

25

LISTA DE TABLAS

Tabla 1. Programa de prueba de simulacin

21

Tabla 2. Programa de prueba en el circuito

23

Tabla 3. Honorarios estimados en el anteproyecto

31

Tabla 4. Hardware y software estimado en el anteproyecto

31

Tabla 5. Costos varios estimados en el anteproyecto

31

Tabla 6. Costos por honorarios

32

Tabla 7. Costos hardware y software

32

Tabla 8. Costos varios

33

INTRODUCCIN
IMPLEMENTACIN DEL PROCESADOR ALTERIC, consiste en la implementacin de un
1
procesador representativo de 32 bits llamado ALTERIC, basado en el procesador RIC , 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
2
PCSIM V . 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
3
grado Procesador didctico E-RIC
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.

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.
2

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
4
hardware VHDL (VHSIC 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
5
electrnicos. Tambin se realiz la descripcin del hardware en lenguaje AHPL 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
6
es de 24 bits. ALTERIC para asegurar una posicin en memoria ROM , 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
7
entradas para lectura y escritura de las memorias ROM y RAM 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.
8

En el desarrollo del software se abord el problema con una visin de problemtica de Software ,
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.
9

En la hoja de datos de los dispositivos ACEX 1K se encontr informacin sobre JTAG


(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

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.
10

Primero se implement el bloque o entidad de la ALU 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.

10

Arithmetic and Logic Unit

16

2.3.2

Pruebas al circuito impreso


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
11
PAL 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
12
crear archivos .ASM con los OpCode 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.

11
12

Programmable Array Logic


Operation Code

17

3. RESULTADOS OBTENIDOS
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

18

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)
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

Instruccin 1

Instruccin 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

000000D0

Direccin de la primera instruccin de la rutina de interrupcin en modo 3 es 0000D0h

00001080

Direccin donde se implementar la pila es 001080h

F032F030
C9001150
D8001156
2C800000
68001125
E5002420
E540C400

SBI 12
INC {(001150)}
DEC {001156}
MVT 800000
MVF (000025)
PSH
POP

SBI 10

MVT (00)
NOP

21

Explicacin 1

SBUS = Todos
{(001150)} <-{(001150)}+1
{001156} <- {001156} - 1
AC <- FF800000h
(001125) <- AC
(SP-1) <- AC
AC <- SP, SP <- SP+1

Explicacin 2

SBUS = Grupo 1

AC <- 00000000
NOP

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

C400C4C0

NOP

RST

NOP

PC <- (0007FF)

F035F03C
F03EF02C
F02DF02E
F02FF037
28000250
2440C400
29000251
2600C400
2A000251
2480C400
2B000253
24C0C400
2C800000
25002548
2581D640
D740C440
08000281
14484486
59000251
84C4954F
A4403606
D780D640
C400C440
F8000045

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

SBI 1C
SBI 0C
SBI 0E
SBI 17

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

SBUS = Grupo 3
SBUS = IX
SBUS = PR, MR
SBUS = Ninguno

5540D7C0
D640C440
78000008

ADD (RE,AC)
SIE
BRA 0008

IM3
HLT

RE <- RE + AC
Ief <- 1
PC <- PC + 000008h

MR <- 03b
HALT

E8000060

JSR 000060

000051
000052

5440C400
7C00000D

ADD (RA,AC)
BSR 000D

NOP

000053
000054
...
000060
000061
000062

C400E440
7B000030

NOP
BCS 0030

SEC

2C000005
5540C400
C400E5C0

MVT 000005
ADD (RE,AC)
NOP

C400E400
7A800020

NOP
BNC 0020

CLC

NOP
PC <- PC + 000020h

Carry <- 0

5540C400
7A040010
7A020010

ADD (RE,AC)
BVS 0010
BNV 0010

NOP

RE <- RE + AC
PC <- PC + 000010h
PC <- PC + 000010h

NOP

C400C440

NOP

HLT

NOP

HALT

2C000003
D44FC400
C400D680

MVT 000003
EXP 0F
NOP

NOP
RTI

AC <- 00000003h
(000C0F) <- AC
NOP

NOP
RTI

2C0019A2
62236022
6008662C
66106424

MVT 0019A2
LSR 03
SHL 08
ROL 10

ASR 02
ROR 0C
RRC 04

AC <- 000019A2h
AC <- LSR (AC,3)
AC <- SHL (AC,8)
AC <- ROL (AC,16)

AC <- ASR (AC,2)


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

...
000085
000086
...
0000A7
0000A8
0000A9
...
0000BA
...
0000C0
0000C1
0000C2
...
0000C6
0000C7
0000C8
0000C9

NOP
NOP
NOP
NOP
MVT (RE,IX)
SIE
HLT
ADC (RB,RF)
AND (RE,SP)
CMP (IX,RF)
SIE
HLT

(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
RTS

22

NOP
NOP
NOP
NOP
RE <- IX
Ief <- 1
HALT
RB <- RB + RF + C
RE <- RE
IX - RF ?
Ief <- 1
HALT

SP

NOP

Carry <- 1

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

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

3.1.2

6406F024
C400D680

RLC 06
NOP

SBI 04
RTI

AC <- RLC (AC,6)


NOP

SBUS = SR
RTI

D403C400
F025D680

IMP 03
SBI 05

NOP
RTI

AC <- (000C03)
SBUS = AC

NOP
RTI

00001155
8C0FC101
00000258
00000253
00000008
0F0000F0
000F0001
80000000
00000020

Direccin de la primera instruccin despus de RST es 000020h

SP

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

Dato
HEX
00000010
00000032
00000040

Instruccin 1

Instruccin 2

Explicacin 1

000003

00000032

000004

00000040

000005

00000032

000006

00000040

000007

00000032

000008
...
000010
000011
000012
000013
000014

00001080

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

2C000003
68001160
2C001160
68001150
2C00000A

MVT 000003
MVF (001160)
MVT 001160
MVF (001150)
MVT 00000A

AC <- 00000003h
(001160)<-AC
AC <- 00001160h
(001150) <- AC
AC <- 000000Ah

23

Explicacin 2

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

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

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

5540C400
78000004
2C0FFFFE
F8000054
2C0FFFFE
F800005B
E800003B

ADD (RE,AC)
BRA 0004
MVT 0FFFFE
JMP 000054
MVT 0FFFFE
JMP 00005B
JSR 00003B

NOP

000037
000038

5540C400
7C000002

ADD (RE,AC)
BSR 0002

NOP

000039
00003A
00003B
00003C
00003D
00003E
00003F
000040
000041
000042
000043
000044
000045
000046
000047
000048
000049
00004A
00004B
00004C
00004D
00004E
00004F
000050

C400E400
7A800002
5540C400
C400E5C0
5540C400
7A040002
7A020002
2C0FFFFE
F800005E
F020F021
F022F023
F024F025
F026F027
F028F029
F02AF02B
F02CF02D
F02EF02F
F030F035
F03CF03E
F032C4C0
D640D740
C400C440
C400D780
D640C440

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

SEC

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

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

24

(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

Carry <- 1
NOP
NOP
NOP

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

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

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

SP

Figura 8.Montaje para pruebas en protoboard

25

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

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

RTI

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
13
1 Alquiler Licencia FLOATPC
de
Altera
14
1 PLD EP1K100QC208-3
Circuitos impresos
SUBTOTAL HARDWARE Y SOFTWARE

4.1.3

Costo aproximado ($)


1.000.000.00
300.000.00
500.000.00
75.000.00
600.000.00
2.475.000.00

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

La licencia FLOATPC permite el uso de Quartus II y MAX+Plus II en mltiples PCs.

14

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
15
PLD EP1K100QC208-3
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
16
soluciones Pg.324.

Por lo anterior ALTERIC incorpora conceptos de Legibilidad del programa, Mantenimiento y


18
reuso de software , imprescindibles para futuros desarrollos de procesadores didcticos
basados en ALTERIC.

17

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


19

El arreglo embedded consiste en una serie de EAB . 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

20

El arreglo lgico consiste en una serie de LAB . 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).

14. NOP;
40

___
((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] ,
_____________________
___
___ ___
IR[4] (IR[0] IR[1] IR[2] IR[3]) IR[5] IR[7] ,
41

_____________________
___
___
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).
26. ADBUS = MA ; DBUS = MD ; write = 0;
______ ___
___
((irq ief) wait , (irq ief) wait , wait) / (9 , 70 , 26).
42

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));
______
((irq ief) , (irq ief)) / (9 , 70).

43

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] ;
____
OBUS = (ABUS ! BBUS) * (IR[10] , IR[10]) ;
MD OBUS;
(42).
44

________________________
__
___
___
___
___ ___
___
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).
43. SHC[4:0] IR[11:15];
(44)

45

___
___ ____
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] ,
___
___
(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]) /

46

(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).
59. SP DEC(SP) ; MA DEC(SP);
(60).
60. MD AC;
(61).

47

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).
74. ADBUS = MA ; DBUS = MD ; write = 0;
___
(wait , wait) / (74 , 75).
75. SP DEC(SP) ; MA DEC(SP);
(76).

48

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;
(83).
89. MA SP;
(90).
90. ADBUS = MA ; read = 0;
(91).

49

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).
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]),

50

______
______
(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).
106. SBUS = 8 T 0, MA;
______
(SBR[4] , SBR[4]) / (107 , 102).
107. SBUS = 8 T 0, PC;
______
(SBR[4] , SBR[4]) / (108 , 102).

51

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).
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).

52

Pasos del bus espa en modo de parada


103E . SBR[5:0] 0, Datinsb, SBUSSC[3:0];
___
____ ____
(retor, retor datok, retor datok) / (Paso siguiente modo normal, 103E, 104E).
21

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]),
______
(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).

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

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).
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).

54

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.

MNEMNICO

ADC

ADD

MODO

INSTRUCCIONES DE 32 BITS
FETCH
DECODE

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

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

56

EXECUTE

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

CICLOS DE
RELOJ
11
15
11
15
8
11
15
11
15
8

SBC

SUB

AND

ORA

XOR

MVT

BIT

CMP

INC

DEC

MVF

JMP

JSR

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
Directo
Indirecto
Indizado
Indizado Indirecto
Directo
Indirecto
Indizado
Indizado Indirecto
Directo
Indirecto
Indizado
Indizado Indirecto

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
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
14
14

57

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
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

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
11
15
11
15
8
12
8
12
14
18
14
18

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

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

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

33-35,148,36-37
37
37
37
37
37
37
37
37
37
37
37

12
7
7
7
7
7
7
7
7
7
7
7

Decodificacin de instrucciones de 16 bits en E-RIC


MNEMNICO

MODO

ADC

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
nico
nico
nico
nico
nico
nico
nico
nico
nico
nico
nico
nico
nico

ADD
SBC
SUB
AND
ORA
XOR
BIT
CMP
MVT
ASR
LSR
RLC
ROL
ROR
RRC
SHL
PSH
POP
RTS
CLC
SEC
MSB
IMP
EXP
CIE
SIE
HLT
NOP
RST
22

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
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
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

N es el nmero de corrimientos o desplazamientos.

58

EXECUTE

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
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

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
11
11
11
7
7
7
11
11
8
8
7
7
7

IM1
IM2
IM3
INT MOD 1

nico
nico
nico
nico

9 13
9 13
9 13
9 13

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

59

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

7
7
7
60

58

61

56

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;
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
60

-- 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:
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:

61

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
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

62

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
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;

63

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)
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.
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

(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;
}
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:

65

-- 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
*
--*
*
--************************************************************************
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.

66

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.
25

Reuso de cdigo
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
-- Irq 1 a 3 en el modo 3.
-- Lnea de Interrupcin para los modos 1 y 2.
INT

:in std_logic;

-- SEALES DE CONTROL
Reset
SWait
Read
Write
IOReq
IAck

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

68

--Paso en el que se desea parar


PBUSIN

:in std_logic_vector (6 downto 0);

-- BUSES DE DATOS Y DIRECCIONES


ADBus

:out std_logic_vector (23 downto 0);

-- Bus de datos.
DBus

: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)
Component ARQT
Port (
Clk
CargaMA
CargaIR
CargaMD
CargaPC
CargaAC
CargaIX
CargaSP
CargaRA
CargaRB

: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;

69

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

: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));

End Component;

-- BLOQUE PASOS (Maquina de estados, cdigo AHPL)


Component PASOS
PORT(

clk
PBUSIN
swait, reset, irq
IR
SR
MR
SHC
SBR
SBUSSC
SBusCt

: 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);

70

retor
datok
LOADS
CARGASBR
FLAGSC
REGDC
SBRCONT
CALU
AyBBUSDC
ADyDBUSDC
PBUS
ESP
IORQ, IACK, READ, WRITE

: 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;

: 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);

-- Verifica el modo de interrupcin de acuerdo con MR


Component INTLINE
port ( Int
INTM3
MR
INTOK
End Component;

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

-- Verifica que la interrupcin en modo 3 deba ser atendida


Component COMPR
port ( PREIN
PREG
ATINT
PRD
End Component;

: in std_logic_vector (2 downto 0);


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

-- SEALES DE INTERCONEXION DE BLOQUES


Signal
Signal
Signal
Signal
Signal
Signal
Signal
Signal
Signal
Signal
Signal
Signal
Signal
Signal
Signal
Signal
Signal
Signal
Signal

IR
SR
MR
SHC
SBR
PASBUS
PABUS
LOADS
CARGSBR
CARGARSBR
FLAGSC
REGDC
SBRCON
SBRCONTR
CALU
AyBBUSDC
ADyDBUSDC
SBusCtr
SBUSDC

: 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);
: 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);

71

Signal
Signal
Signal
Signal
Signal
Signal

IRQReal
PR
PRMax
AMayB
SPY
SPY2

: std_logic;
: std_logic_vector (2 downto 0 );
: std_logic_vector (2 Downto 0 );
: std_logic;
: std_logic;
: std_logic;

Begin

--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 );

Modo_Bus_Espia:
PARADA Port Map

(Clk, retor, reset, PBUSIN (6 downto 0), PASBUS (6 downto 0), SPY);

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

(PRIN, PR, AmayB, PRMax);

Senal_INT:
INTLINE Port Map

(Int, AMayB, MR, IrqReal);

PASBUS (6 downto 0)

<= PABUS (6 downto 0);

PBUS (6 downto 0)

<= PABUS (6 downto 0);

SBUSDC (3 downto 0)

<= SBusCtr (3 downto 0);

CARGSBR

<= CARGARSBR;

SBRCONTR

<= SBRCON;

SPY2

<= SPY;

ESP

<= SPY;

End Modular;

72

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.

: in std_logic_vector (2 downto 0);

PREG
-- Contenido de PR.

: in std_logic_vector (2 downto 0);

ATINT
: out std_logic;
-- 1 Si la interrupcin debe ser atendida.
PRD
-- Entrada al registro PR.

: Out std_logic_vector (2 downto 0));

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
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;

73

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
When "11"

=>
INTOK <= INTM3;

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

74

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

: IN std_logic;

IR
: IN std_logic_vector (0 TO 25);
-- 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

: OUT std_logic_vector (3 downto 0);

75

-- Control para el bus espa


retor
datok

: IN std_logic;
: IN std_logic;

LOADS
-- Control para cargar los registros

: OUT std_logic_vector (15 DOWNTO 0);

CARGASBR
-- Control para cargar el reg. del bus espa

: 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

: OUT std_logic_vector (4 DOWNTO 0);

AyBBUSDC
-- Control para los buses ABUS y BBUS

: OUT std_logic_vector (7 DOWNTO 0);

ADyDBUSDC
-- Control para los buses DBUS y ADBUS

: OUT std_logic_vector (3 DOWNTO 0);

PBUS
-- Paso del cdigo AHPL

: OUT std_logic_vector (6 DOWNTO 0);

ESP
-- Modo de funcionamiento del bus espa
IORQ, IACK, READ, WRITE

: IN std_logic;
: OUT std_logic);

END ENTITY PASOS;


-----------------

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
MR:
Registro de modos de interrupcin
SHC:
Registro de corrimientos
SBR:
Registro del bus espa
clk:
Pin de reloj de entrada
irq:
Pin de solicitud de interrupciones
reset:
Pin de reset
Control: Registro de pasos de la secuencia de control.
IR:
SR:

ARCHITECTURE secuencial OF PASOS IS


Component Paso20
port (
IR6
CALU
AyBBUSDC
End Component;

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

76

Component Paso30
port (
IR3
CALU
End Component;

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

Component Paso34
port (
IR0A3
LOADS
CALU
FLAGSC
End Component;

: 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));

Component Paso40
port (
IR0
IR16
CALU
AyBBUSDC
End Component;

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

Component Paso41
port (
IR10
IR12A15
CALU
AyBBUSDC
End Component;

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

Component Paso42
port (
IR2A3
IR6A9
LOADS
AyBBUSDC
End Component;

: 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));

Component Paso44
port (
IR5A6
IR10
CALU
FLAGSC
End Component;

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

Component Paso68
port (
IR8
LOADS
End Component;

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

CONSTANT num_pasos

: integer := 7;

-- SEALES PARA CONECTAR COMPONENTES


SIGNAL
SIGNAL
SIGNAL
SIGNAL

CALU20, CALU30, CALU34, CALU40, CALU41, CALU44


LOADS34, LOADS42, LOADS68
FLAGSC34, FLAGSC44
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

77

: std_logic_vector (4 downto 0);


: std_logic_vector (15 downto 0);
: std_logic_vector (11 downto 0);
: 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

Siguiente2

: STD_LOGIC_VECTOR (7 DOWNTO 0);

BEGIN
IF (clk'EVENT and clk = '1') THEN
--Borde de subida de reloj
IF (reset = '1') THEN
-- 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

78

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" =>
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";

79

IORQ
IACK
READ
WRITE
PBUS

<= '0';
<= '0';
<= '0';
<= '1';
<=

(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';
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';

80

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";
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));

81

--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";
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));

82

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';
READ
<= '1';
WRITE <= '1';
PBUS
<= (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;

83

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));
--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";

84

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));
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';

85

READ
WRITE
PBUS

<= '1';
<= '1';
<= (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;
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));

86

--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;
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;

87

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';
READ
<= '1';
WRITE <= '1';
PBUS
<= (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;

88

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
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";

89

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));
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';

90

WRITE
PBUS

<= '1';
<= (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";
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));

91

--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";
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));

92

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';
READ
<= '1';
WRITE <= '0';
PBUS
<= (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;

93

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));
--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";

94

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));
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';

95

READ
WRITE
PBUS

<= '1';
<= '1';
<= (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;
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));

96

--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";
AyBBUSDC
<= X"20";
ADyDBUSDC
<= X"0";
IORQ
<= '0';
IACK
<= '0';
READ
<= '1';
WRITE <= '1';
PBUS
<= (Conv_Std_Logic_vector(Paso, num_pasos));

97

--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";
AyBBUSDC
<= X"00";
ADyDBUSDC
<= X"0";
IORQ
<= '0';
IACK
<= '0';
READ
<= '1';
WRITE <= '1';
PBUS
<= (Conv_Std_Logic_vector(Paso, num_pasos));

98

--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";
AyBBUSDC
<= X"00";
ADyDBUSDC
<= X"0";
IORQ
<= '0';
IACK
<= '0';
READ
<= '1';
WRITE <= '1';
PBUS
<= (Conv_Std_Logic_vector(Paso, num_pasos));

99

--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";
AyBBUSDC
<= X"00";
ADyDBUSDC
<= X"0";
IORQ
<= '0';
IACK
<= '0';
READ
<= '1';
WRITE <= '1';
PBUS
<= (Conv_Std_Logic_vector(Paso, num_pasos));

100

--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";
AyBBUSDC
<= X"00";
ADyDBUSDC
<= X"0";
IORQ
<= '0';
IACK
<= '0';
READ
<= '1';
WRITE <= '1';
PBUS
<= (Conv_Std_Logic_vector(Paso, num_pasos));

101

--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";
AyBBUSDC
<= X"00";
ADyDBUSDC
<= X"0";
IORQ
<= '0';
IACK
<= '0';
READ
<= '1';
WRITE <= '1';
PBUS
<= (Conv_Std_Logic_vector(Paso, num_pasos));

102

--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";
CALU
<= "00000";
AyBBUSDC
<= X"00";
ADyDBUSDC
<= X"0";
IORQ
<= '0';
IACK
<= '0';
READ
<= '1';
WRITE <= '1';
PBUS
<= (Conv_Std_Logic_vector(Paso, num_pasos));

103

--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";
AyBBUSDC
<= X"00";
ADyDBUSDC
<= X"0";
IORQ
<= '0';
IACK
<= '0';
READ
<= '1';
WRITE <= '1';
PBUS
<= (Conv_Std_Logic_vector(Paso, num_pasos));

104

--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));
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';

105

WRITE
PBUS

<= '1';
<= (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";
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));

106

--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";
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));

107

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';
READ
<= '1';
WRITE <= '1';
PBUS
<= (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";

108

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));
--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";

109

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));
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';

110

READ
WRITE
PBUS

<= '1';
<= '1';
<= (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

: IN std_logic;
: IN std_logic_vector (6 DOWNTO 0);

PASBUS
--Pasos del cdigo AHPL

: 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
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

112

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;
--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.

114

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
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;

115

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

temp : integer;

BEGIN
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.

116

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

temp : integer;

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
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));
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;

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

117

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
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

118

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;
RETURN temp;
END FPaso14;

119

--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

temp : integer;

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

temp : integer;

BEGIN
IF ((irq AND ief) = '1') THEN
temp := (70);
--Va a atender interrupcin.
ELSE
temp := (9);
--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.

120

FUNCTION FChFetIntWait (irq, ief, Swait : std_logic; cont : integer) RETURN integer IS
VARIABLE

temp : integer;

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

OR1

temp : integer;
: std_logic := (SHC(0) OR SHC(1) OR SHC(2) OR SHC(3) OR SHC(4)) ;

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;
END IF;
RETURN temp;
END FChRotDes;
--FUNCION PASO 45
-Ejecucin del HALT

121

FUNCTION FPaso45 (reset, irq, ief : std_logic) RETURN integer IS


VARIABLE

temp : integer;

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

temp : integer;

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.
END IF;
END IF;
RETURN temp;
END FChFetIntWait16;

122

--FUNCION PASO 47
-Decodificacin de la instruccin IMP o EXP

FUNCTION FPaso47 (IR: std_logic) RETURN integer IS


VARIABLE

temp : integer;

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

temp : integer;

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;
RETURN temp;
END FPaso79;

123

--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

temp : integer;

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

temp : integer;

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
-usuario. (instruccin)
FUNCTION FEspiados (cont: integer; SBR4,SBR1: std_logic) RETURN integer IS
VARIABLE

temp : integer;

BEGIN
IF ((SBR4 AND SBR1) = '1') THEN
--Para ver todos los registros
temp := cont + 1;

124

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

temp : integer;

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

temp : integer;

BEGIN
IF (datok = '0') THEN
--El usuario verifica el dato
temp := (120);
ELSE
temp := (103);
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.

125

FUNCTION FEspDec (SBR : std_logic_vector (5 downto 0)) RETURN integer IS


VARIABLE

temp : integer;

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);
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;

126

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

temp : integer;

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;

--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
qOut <= '1';
END IF;
END IF;
END Process;
END Combinatorio;

128

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
port (

DatoIN
Carga
clk
-- Puertos de entrada

: in std_logic_vector (1 downto 0);


: in std_logic;
: in std_logic;

qOut
-- puerto de salida

: out std_logic_vector (1 downto 0));

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
IF Carga='1' THEN
qOut <= DatoIN;
END IF;
END IF;
END Process;
END Combinatorio;

129

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
port (

DatoIN
Carga
clk
-- Puertos de entrada

: in std_logic_vector (2 downto 0);


: in std_logic;
: in std_logic;

qOut
-- puerto de salida

: out std_logic_vector (2 downto 0));

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
IF Carga='1' THEN
qOut <= DatoIN;
END IF;
END IF;
END Process;
END Combinatorio;

130

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
port (

DatoIN
Carga
clk
-- Puertos de entrada

: in std_logic_vector (4 downto 0);


: in std_logic;
: in std_logic;

qOut
-- puerto de salida

: out std_logic_vector (4 downto 0));

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
IF Carga='1' THEN
qOut <= DatoIN;
END IF;
END IF;
END Process;
END Combinatorio;

131

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
port (

DatoIN
Carga
clk
-- Puertos de entrada

: in std_logic_vector (5 downto 0);


: in std_logic;
: in std_logic;

qOut
-- puerto de salida

: out std_logic_vector (5 downto 0));

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
IF Carga='1' THEN
qOut <= DatoIN;
END IF;
END IF;
END Process;
END Combinatorio;

132

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
port (

DatoIN
Carga
clk
-- Puertos de entrada

: in std_logic_vector (23 downto 0);


: in std_logic;
: in std_logic;

qOut
-- puerto de salida

: out std_logic_vector (23 downto 0));

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
IF Carga='1' THEN
qOut <= DatoIN;
END IF;
END IF;
END Process;
END Combinatorio;

133

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
port (

DatoIN
Carga
clk
-- Puertos de entrada

: in std_logic_vector (31 downto 0);


: in std_logic;
: in std_logic;

qOut
-- puerto de salida

: out std_logic_vector (31 downto 0));

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
IF Carga='1' THEN
qOut <= DatoIN;
END IF;
END IF;
END Process;
END Combinatorio;

134

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);
end generate;
U4:
Cout <= C(4);
end Combinatorio;

135

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;
U4:
Cout <= C(7);
end Combinatorio;

136

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

: in std_logic_vector (31 downto 0);


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

end ADDER32;
architecture Combinatorio of ADDER32 is
component ADDER8
port (A,B
Cin
Resultado
Cout

: in std_logic_vector (7 downto 0);


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

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:
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;

137

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

: in std_logic_vector (4 downto 0);


-- Datos en el registro SHC
: out std_logic_vector (4 downto 0));
-- Dato decrementado

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 );

end Component;
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;

138

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

: in std_logic_vector (31 downto 0);


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

End ASR;
architecture Combinatorio of ASR is
BEGIN
Cout
Resultado(31)

<= ACREG(0);
<= ACREG(31);

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

: in std_logic_vector (31 downto 0);


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

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;

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

: in std_logic_vector (31 downto 0);


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

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;

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

: out std_logic);

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 );

-- Modifica las entradas del sumador dependiendo la operacin a realizar


Component SUMIN
Port (
B,A
CTRALU
Cin
SalidaA,SalidaB
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;

146

-- SEALES DE CONEXION DE BLOQUES


Signal CSelB
Signal SalidaB
Signal SalidaA
Signal EntradaA, EntradaB
Signal Centrada, CTemp
Signal STemp

: 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);

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

<= SalidaA;
<= SalidaB;
<= CSelB;
<= STemp;
<= CTemp;

END Funcional;

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

CTRALU

: in std_logic_vector (4 downto 0);


-- Control

Cin

: in std_logic;
-- Bandera de carry (Entrada)

SalidaA,SalidaB
: out std_logic_vector (31 downto 0);
-- Salidas de SUMIN, Entradas al sumador
Cout

: out std_logic);
-- Bandera de carry (Salida)

147

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

: 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;

BEGIN
SumaB
SumaA
Carryin
NoCarry
MenosB
MenosA
Car
XInc(0)

<= B;
<= A;
<= Cin;
<= '0';
<= NOT B;
<= NOT A;
<= '1';
<= '1';

InicInc:
For i In 1 to 31 Generate
XInc(i)
end Generate;
InicDec:
For i In 0 to 31 Generate
XDec(i)
end Generate;

<= '0';

<= '1';

PROCESS (B,CTRALU,Cin)
BEGIN
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
SalidaA

<= SumaB;
<= Carryin;
<= SumaA;

SalidaB
Cout
SalidaA

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

SalidaB
Cout

<= MenosB;
<= Car;

-- ADD
WHEN "00001" =>

-- SUB (A-B)
WHEN "00010" =>

148

SalidaA

<= SumaA;

-- SUB (B-A)
WHEN "00011" =>
SalidaB
Cout
SalidaA

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

-- SBC (A-B)
WHEN "00100" =>
SalidaB
Cout
SalidaA

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

-- SBC (B-A)
WHEN "00101" =>
SalidaB
Cout
SalidaA

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

-- INC A
WHEN "00110" =>
SalidaB
Cout
SalidaA

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

-- INC B
WHEN "00111" =>
SalidaB
Cout
SalidaA

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

-- DEC A
WHEN "01000" =>
SalidaB
Cout
SalidaA

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

-- DEC B
WHEN "01001" =>
SalidaB
Cout
SalidaA

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

-- casos no posibles, error


WHEN OTHERS =>
SalidaA
Cout
SalidaB

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

END CASE;
END PROCESS;
END Funcional;

149

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

: out std_logic_vector (31 downto 0);

-- Banderas
Cout,Ofw,Z,N

: out std_logic);

end ALU;
Architecture Funcional of ALU is
-- 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;

150

Component LSR
port

(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);

(ACREG
Resultado

: in std_logic_vector (31 downto 0);


: out std_logic_vector (31 downto 0));

(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
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 ASR
port

End Component;
Component SHLL
port

End Component;
Component RORL
port
End Component;
Component RRCL
port

End Component;
Component RLCL
port

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
Signal ResultadoSumador
Signal OfSuma
Signal OfSubAB
Signal OfSubBA
Signal OfIncA
Signal OfIncB
Signal OfDecA
Signal OfDecB
Signal CarrySumador
Signal ResultadoLsr
Signal CarryLsr
Signal ResultadoAsr

: std_logic;
: 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);

151

Signal CarryAsr
Signal ResultadoShl
Signal CarryShl
Signal ResultadoRor
Signal ResultadoRrc
Signal CarryRrc
Signal ResultadoRlc
Signal CarryRlc
Signal ResultadoRol
Signal Result

: 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);

BEGIN
-- 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

Port Map (B,ResultadoLsr,CarryLsr);

ASR_ALU:
ASR

Port Map (B,ResultadoAsr,CarryAsr);

SHL_ALU:
SHLL Port Map (B,ResultadoShl,CarryShl);
ROR_ALU:
RORL

Port Map (B,ResultadoRor);

RRC_ALU:
RRCL

Port Map (B,Cin,ResultadoRrc,CarryRrc);

RLC_ALU:
RLCL

Port Map (B,Cin,ResultadoRlc,CarryRlc);

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
--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));

152

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

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;

Result
Cout
Ofw
N
Z

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

-- ADD
WHEN "00001" =>

153

AND

-- SUB (A-B)
WHEN "00010" =>
Result
Cout
Ofw
N
Z

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

Result
Cout
Ofw
N
Z

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

Result
Cout
Ofw
N
Z

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

Result
Cout
Ofw
N
Z

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

Result
Cout
Ofw
N
Z

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

Result
Cout
Ofw
N
Z

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

Result
Cout
Ofw
N
Z

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

Result
Cout
Ofw
N
Z

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

-- SUB (B-A)
WHEN "00011" =>

-- SBC (A-B)
WHEN "00100" =>

-- SBC (B-A)
WHEN "00101" =>

-- INC A
WHEN "00110" =>

-- INC B
WHEN "00111" =>

-- DEC A
WHEN "01000" =>

-- DEC B
WHEN "01001" =>

154

-- AND
WHEN "01010" =>
Result
Cout
Ofw
N
Z

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

Result
Cout
Ofw
N
Z

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

Result
Cout
Ofw
N
Z

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

Result
Cout
Ofw
N
Z

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

Result
Cout
Ofw
N
Z

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

Result
Cout
Ofw
N
Z

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

Result
Cout
Ofw
N
Z

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

Result
Cout
Ofw
N
Z

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

-- ORA
WHEN "01011" =>

-- XOR
WHEN "01100" =>

-- CMP
WHEN "01101" =>

-- LSR
WHEN "01110" =>

-- ASR
WHEN "01111" =>

-- SHL
WHEN "10000" =>

-- ROR
WHEN "10001" =>

155

-- RRC
WHEN "10010" =>
Result
Cout
Ofw
N
Z

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

Result
Cout
Ofw
N
Z

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

Result
Cout
Ofw
N
Z

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

Result
Cout
Ofw
N
Z

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

Result
Cout
Ofw
N
Z
-- Igual a "0007FF" RST por software
WHEN "10111" =>
Result
Cout
Ofw
N
Z

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

-- RLC
WHEN "10011" =>

-- ROL
WHEN "10100" =>

-- A
WHEN "10101" =>

-- B
WHEN "10110" =>

<= "00000000000000000000011111111111";
<= '0';
<= '0';
<= '0';
<= Zero;

-- Igual a "000...1000"
WHEN "11000" =>
Result
Cout
Ofw
N
Z

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

Result
Cout
Ofw
N
Z

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

-- Igual a "000...0"
WHEN OTHERS =>

END CASE;
END PROCESS;
Salida <= Result;
END Funcional;

156

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;
CargaRC
:in std_logic;
CargaRD
:in std_logic;
CargaRE
:in std_logic;
CargaRF
:in std_logic;
CargaPR
:in std_logic;
CargaMR
:in std_logic;
CargaSHC
:in std_logic;
CargaSB
:in std_logic;

157

-- 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

:in std_logic;
:in std_logic;

OfFR
OfFL

:in std_logic;
:in std_logic;

ZFR
ZFL

:in std_logic;
:in std_logic;

NFR
NFL

:in std_logic;
:in std_logic;

ShFR
ShFL

:in std_logic;
:in std_logic;

IeFR
IeFL

: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".

-- 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

158

-- 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.

-- 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)

159

-- CONTENIDO DE LOS REGISTROS VISIBLES A LAS FUNCIONES DE CONTROL


Dato_IR
Dato_SHC
Dato_PR
Dato_SR
Dato_MR
Dato_SBR

: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 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);

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
Carga
clk
qOut

: in std_logic_vector (1 downto 0);


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

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

: in std_logic_vector (4 downto 0);


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

160

Component Register6
port

( DatoIN
Carga
clk
qOut

: in std_logic_vector (5 downto 0);


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

(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 ALU
Port

end Component;
Component DECSHC
port

( SHCD
Resultado

: in std_logic_vector (4 downto 0);


: out std_logic_vector (4 downto 0));

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
Signal MRqOut
Signal ResultadoDec5
Signal ADBusTmp

: 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);
: std_logic_vector (1 downto 0);
: std_logic_vector (4 downto 0);
: std_logic_vector (23 downto 0);

161

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 );
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 );

162

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" =>
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
-- con extensin de signo.

(PASO 15)

163

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";
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";

164

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;
--RD
WHEN "0111" =>
Bbus <= RDqOut;
--RE
WHEN "1000" =>
Bbus <= REqOut;

165

--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" =>
ADBusTmp <= "ZZZZZZZZZZZZZZZZZZZZZZZZ";
-- Escribe un 1
WHEN OTHERS =>
ADBusTmp <= "000000000000000000000001";
END CASE;
END PROCESS;

166

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" =>
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";

167

--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";
--IR
WHEN "1101" =>
SBUS(31 downto 0) <= IRqOut (31 downto 0);
--MR y PR
WHEN "1110" =>
SBus(1 downto 0)
SBus(3 downto 2)
SBus(6 downto 4)

<= MRqOut;
<= "00";
<= PRqOut;

168

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:
PROCESS

(clk, MADC)

BEGIN
CASE MADC is
--LEE DEL OBUS
WHEN '0'=>
MADatoIN <= OBus (23 downto 0);

169

--LEE UN 8
WHEN OTHERS =>
MADatoIN <= "000000000000000000001000";
END CASE;
END PROCESS;

SHCDataIs:
PROCESS

(clk, SHCDC)

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

(clk, MDDC)

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;

PRDataIs:
PROCESS

(clk, PRDC)

BEGIN
CASE PRDC is
-- Lee desde las lneas externas
WHEN "11"=>

170

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';
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);

171

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)

<= 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;

END Functional;

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)

: in std_logic;

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 Paso20;
architecture Condicional of Paso20 is

172

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;

Entity Paso30 is
port (IR3 : in std_logic;
-- IR(3)
CALU : out std_logic_vector (4 downto 0));
-- Control para la ALU
End Paso30;

173

architecture Condicional of Paso30 is


BEGIN
PROCESS (IR3)
BEGIN
CASE IR3 IS
-- INC
WHEN '0' =>
CALU

<= "00110";

-- DEC
WHEN OTHERS =>
CALU

<= "01000";

END CASE;
END PROCESS;
END Condicional;

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
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

174

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" =>
CALU
<= "01010";
FLAGSC <= X"050";
LOADS <= X"0800";

-- XOR
WHEN "1010" =>
CALU
<= "01100";
FLAGSC <= X"050";

175

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

: std_logic_vector (0 to 1);

BEGIN
IR (0) <= IR0;
IR (1) <= IR16;

PROCESS (IR)
BEGIN
CASE IR IS
-- BRA +
WHEN "00" =>

177

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
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;

178

architecture Condicional of Paso41 is

BEGIN
PROCESS (IR12A15)
BEGIN
CASE IR12A15 IS
-- BBUS=AC
WHEN "0000" =>
AyBBUSDC(3 downto 0)

<= "0010";

-- BBUS=RA
WHEN "0001" =>
AyBBUSDC(3 downto 0)

<= "0100";

-- BBUS=RB
WHEN "0010" =>
AyBBUSDC(3 downto 0)

<= "0101";

-- BBUS=RC
WHEN "0011" =>
AyBBUSDC(3 downto 0)

<= "0110";

-- BBUS=RD
WHEN "0100" =>
AyBBUSDC(3 downto 0)

<= "0111";

-- BBUS=RE
WHEN "0101" =>
AyBBUSDC(3 downto 0)

<= "1000";

-- BBUS=RF
WHEN "0110" =>
AyBBUSDC(3 downto 0)

<= "1001";

-- BBUS=IX
WHEN "1000" =>
AyBBUSDC(3 downto 0)

<= "0011";

-- BBUS=SP
WHEN "1111" =>
AyBBUSDC(3 downto 0)

179

<= "0001";

-- BBUS=AC (Caso de Error)


WHEN Others =>
AyBBUSDC(3 downto 0)

<= "0010";

END CASE;
END PROCESS;

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)

<= "1100";

END CASE;
END Process;

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";

END CASE;
END PROCESS;
END Condicional;

180

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

: std_ulogic_vector (15 downto 0);


: std_ulogic;

BEGIN
PROCESS (IR6A9)
BEGIN
CASE IR6A9 IS

-- BBUS=AC y ACLoad=1
WHEN "0000" =>
AyBBUSDC(3 downto 0)

181

<= "0010";

LOADSTemp

<= X"0800";

-- BBUS=RA y RALoad=1
WHEN "0001" =>
AyBBUSDC(3 downto 0)
LOADSTemp

<= "0100";
<= X"0100";

-- BBUS=RB y ...
WHEN "0010" =>
AyBBUSDC(3 downto 0)
LOADSTemp

<= "0101";
<= X"0080";

-- BBUS=RC ...
WHEN "0011" =>
AyBBUSDC(3 downto 0)
LOADSTemp

<= "0110";
<= X"0040";

-- BBUS=RD ...
WHEN "0100" =>
AyBBUSDC(3 downto 0)
LOADSTemp

<= "0111";
<= X"0020";

-- BBUS=RE ...
WHEN "0101" =>
AyBBUSDC(3 downto 0)
LOADSTemp

<= "1000";
<= X"0010";

-- BBUS=RF ...
WHEN "0110" =>
AyBBUSDC(3 downto 0)
LOADSTemp

<= "1001";
<= X"0008";

-- BBUS=IX ...
WHEN "1000" =>
AyBBUSDC(3 downto 0)
LOADSTemp

<= "0011";
<= X"0400";

-- BBUS=SP ...
WHEN "1111" =>
AyBBUSDC(3 downto 0)
LOADSTemp

<= "0001";
<= X"0200";

-- BBUS=AC (Caso de Error)


WHEN Others =>
AyBBUSDC(3 downto 0)

182

<= "0010";

LOADSTemp

<= X"0800";

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;

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
*
--*
*
--*
*
--*******************************************************************************
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.

183

ENTITY Paso44 is
port

(IR5A6
: in std_logic_vector (0 to 1);
-- Tipo de instruccin
IR10
-- Direccin

: in std_logic;

CALU

: out std_logic_vector (4 downto 0);

FLAGSC

: out std_logic_vector (11 downto 0));

END Paso44;

architecture Condicional of Paso44 is


Signal IR

: std_logic_vector (0 to 2);

BEGIN
IR(0 to 1) <= IR5A6;
IR(2)

<= IR10;

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" =>
CALU
<= "10000";
FLAGSC <= X"400";

-- ROR
WHEN "111" =>
CALU
<= "10001";
FLAGSC <= X"000";

184

-- 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)

: in std_logic;

LOADS

: out std_logic_vector (15 downto 0));

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 =>
LOADS <= X"1000";
END CASE;
END PROCESS;
END Condicional;

186

También podría gustarte