Documentos de Académico
Documentos de Profesional
Documentos de Cultura
T.G. 0421
Informe Final
Director
FRANCISCO VIVEROS MORENO
Ingeniero Electrnico
RECTOR MAGNFICO:
DECANO ACADMICO:
DIRECTOR DE CARRERA:
"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.
CONTENIDO
INTRODUCCIN
10
11
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
31
32
5. CONCLUSIONES
34
BIBLIOGRAFA
35
37
40
56
59
64
68
LISTA DE FIGURAS
11
19
20
20
20
21
21
25
LISTA DE TABLAS
21
23
31
31
31
32
32
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.
10
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.
4
5
11
1.1.2
1.1.3
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
1.1.8
6
7
12
1.1.9
13
2. METODOLOGA DE TRABAJO
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
2.1.2
2.1.3
14
2.1.5
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
15
10
16
2.3.2
2.3.3
11
12
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.
20
Dato
HEX
00000010
000000C0
Instruccin 1
Instruccin 2
000000D0
00001080
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)
...
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
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
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
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
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
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
3.2.2
3.2.3
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
28
29
30
4. COSTOS
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
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
Costos varios
Tabla 5. Costos varios estimados en el anteproyecto
Descripcin
Papelera
Fotocopias
Impresiones
Discos compactos
Quemado de discos compactos
Transporte
SUBTOTAL COSTOS VARIOS
Costo aproximado($)
250.000.00
100.000.00
300.000.00
20.000.00
30.000.00
300.000.00
1.000.000.00
13
14
El costo aproximado se calcul con una tasa de cambio de $3.000.00 por cada dlar.
31
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
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
El costo se calcul con una tasa de cambio de $2.500.00 por cada dlar.
32
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
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 sistema autnomo que no depende de hardware adicional para funcionar como
un procesador, por lo tanto, es un procesador funcional.
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.
17
16
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
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.
19
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
20
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
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
43
________________________
__
___
___
___
___ ___
___
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
47
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
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
52
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
54
Para comentarios remtase al captulo EXPLICACIN DEL CDIGO AHPL de ALTERIC: MANUAL
DEL USUARIO.
55
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 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 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.
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
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
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
: 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
61
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.
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
63
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
64
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
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
: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
-- Bus de datos.
DBus
-- 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;
: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;
End ALTERIC;
: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;
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);
: in std_logic;
: in std_logic;
: in std_logic_vector (1 downto 0);
: Out std_logic);
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
Modo_Bus_Espia:
PARADA Port Map
(Clk, retor, reset, PBUSIN (6 downto 0), PASBUS (6 downto 0), SPY);
Arquitectura:
ARQT Port Map
Comparador_de_Prioridades:
COMPR Port Map
Senal_INT:
INTLINE Port Map
PASBUS (6 downto 0)
PBUS (6 downto 0)
SBUSDC (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.
PREG
-- Contenido de PR.
ATINT
: out std_logic;
-- 1 Si la interrupcin debe ser atendida.
PRD
-- Entrada al registro PR.
End COMPR;
architecture Combinatorio of COMPR is
BEGIN
PROCESS (PREIN,PREG)
BEGIN
IF (PREIN > PREG) THEN
-- Si las lneas de entrada es mayor al dato del reg. PR
ATINT <= '1';
-- Se atiende la interrupcin
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
75
: IN std_logic;
: IN std_logic;
LOADS
-- Control para cargar los registros
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
AyBBUSDC
-- Control para los buses ABUS y BBUS
ADyDBUSDC
-- Control para los buses DBUS y ADBUS
PBUS
-- Paso del cdigo AHPL
ESP
-- Modo de funcionamiento del bus espa
IORQ, IACK, READ, WRITE
: IN std_logic;
: OUT std_logic);
: 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;
USE WORK.FUNCIONES.ALL;
BEGIN
-- Cableado de los componentes necesarios
--En el paso 20 verifica si el modo es directo o indizado
77
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
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
--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
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
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
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
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
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
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
--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;
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.
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
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
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.
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;
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
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
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
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
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.
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;
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
qOut
-- puerto de salida
End Register2;
-- declaracin de arquitectura de register2
architecture Combinatorio of Register2 is
BEGIN
Process (clk,Carga,DatoIN)
BEGIN
IF clk'Event and clk='0' THEN
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
qOut
-- puerto de salida
End Register3;
-- declaracin de arquitectura de register3
architecture Combinatorio of Register3 is
BEGIN
Process (clk,Carga,DatoIN)
BEGIN
IF clk'Event and clk='0' THEN
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
qOut
-- puerto de salida
End Register5;
-- declaracin de arquitectura de register5
architecture Combinatorio of Register5 is
BEGIN
Process (clk,Carga,DatoIN)
BEGIN
IF clk'Event and clk='0' THEN
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
qOut
-- puerto de salida
End Register6;
-- declaracin de arquitectura de register6
architecture Combinatorio of Register6 is
BEGIN
Process (clk,Carga,DatoIN)
BEGIN
IF clk'Event and clk='0' THEN
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
qOut
-- puerto de salida
End Register24;
-- declaracin de arquitectura de register24
architecture Combinatorio of Register24 is
BEGIN
Process (clk,Carga,DatoIN)
BEGIN
IF clk'Event and clk='0' THEN
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
qOut
-- puerto de salida
End Register32;
-- declaracin de arquitectura de register32
architecture Combinatorio of Register32 is
BEGIN
Process (clk,Carga,DatoIN)
BEGIN
IF clk'Event and clk='0' THEN
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;
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;
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
end ADDER32;
architecture Combinatorio of ADDER32 is
component ADDER8
port (A,B
Cin
Resultado
Cout
end component;
signal CInt, CInt1, Cint2 : std_logic;
BEGIN
Bits_7_0:
ADDER8 Port Map (A32(7 downto 0), B32(7 downto 0), Cin32, Resultado32(7 downto 0), CInt);
Bits_15_8:
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
end DECSHC;
Architecture functional of DECSHC is
Component ADDER5
port (
A,B
Cin
Resultado
Cout
end Component;
signal Resta
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
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
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;
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;
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;
143
Entidad RRCL
--*******************************************************************************
--*
ALTERIC
*
--*
PUJ TG 0421
*
--*
Diego Beltrn, Moiss Herrera ,Marco Mayolo
*
--*
*
--* file name:
Rrcl.vhd
*
--* created:
1-09-2004
*
--* last modified: 12-10-2004
*
--*
*
--* Abstract:
*
--*
Entidad encargada de realizar rotaciones con carry hacia la
*
--*
derecha. Ejecuta la instruccin RRC.
*
--*
Se declara puertos de entradas y salidas
*
--*
*
--* Componentes a los que llama:
ninguno
*
--*
*
--*******************************************************************************
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
Entity RRCL is
port (ACREG
Cin
Resultado
Cout
End RRCL;
architecture Combinatorio of RRCL is
BEGIN
Cout <= ACREG(0);
Resultado(31) <= Cin;
S1:
FOR i in 0 to 30 generate
Resultado(i)<=ACREG(i+1);
END generate;
END Combinatorio;
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;
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
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;
end Component;
146
: 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
CTRALU
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
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;
<= "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
-- Bandera de carry
Cin
: in std_logic;
-- OBUS
Salida
-- 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
end Component;
150
Component LSR
port
(ACREG
Resultado
Cout
(ACREG
Resultado
Cout
(ACREG
Resultado
Cout
(ACREG
Resultado
(ACREG
Cin
Resultado
Cout
(ACREG
Cin
Resultado
Cout
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;
: 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
ASR_ALU:
ASR
SHL_ALU:
SHLL Port Map (B,ResultadoShl,CarryShl);
ROR_ALU:
RORL
RRC_ALU:
RRCL
RLC_ALU:
RLCL
ROL_ALU:
ROLL
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
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;
157
: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;
: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.
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
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
End Component;
Component Register32
port
( DatoIN
Carga
clk
qOut
End Component;
Component Register3
port
( DatoIN
Carga
clk
qOut
End Component;
Component Register2
port
( DatoIN
Carga
clk
qOut
End component;
Component Register5
port ( DatoIN
Carga
clk
qOut
End Component;
160
Component Register6
port
( DatoIN
Carga
clk
qOut
(A,B
CTRALU
Cin
Salida
Cout,Ofw,Z,N
End Component;
Component ALU
Port
end Component;
Component DECSHC
port
( SHCD
Resultado
end Component;
--SEALES PARA CONECTAR BLOQUES
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);
(PASO 15)
163
(PASO 47)
164
END CASE;
END PROCESS;
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;
166
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
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
171
END CASE;
END PROCESS;
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
<= "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
174
END Paso34;
-- 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";
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";
-- 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
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";
<= "0010";
END CASE;
END PROCESS;
PROCESS (IR12A15(0))
-- IR(12) Signo del operando
BEGIN
CASE IR12A15(0) IS
<= "1011";
<= "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";
<= "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;
Signal LOADSTemp
Signal Verdadero
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";
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
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;
183
ENTITY Paso44 is
port
(IR5A6
: in std_logic_vector (0 to 1);
-- Tipo de instruccin
IR10
-- Direccin
: in std_logic;
CALU
FLAGSC
END Paso44;
: 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";
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
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