PRÁCTICA 4
Sean las siguientes instrucciones:
a) ADD $t0, $t1, $t2
b) ADDI $s0,$s1, 0x0011
c) ORI $t0, $t2, 0x00A1
d) SLL $t0, $t0, 0x0002
e) SLR $t1, $t0, 0x0002
f) LUI $s0,0x0011
g) SW $t4, 0x0111
h) SLT $t1, $t2, $t0
i) J 0x000001A
j) JR $S0
1. Codificar las instrucciones en hexadecimal, tal como quedarían en memoria.
2. Utilizando la CPU descrita en clase teórica y el lenguaje de transferencia de registro, realizar la
secuencia de transferencias y acciones.
3. Comprobar que todo lo anterior se ha realizado de forma correcta mediante el simulador que se
adjunta para la práctica. Se introducirá el código de instrucción en la memoria de manera que
sean posible realizar todas las fases de la instrucción.
Para poder llevar a cabo la practica hay que tener claro lo que necesitamos:
Tabla de registros para poder codificar correctamente las instrucciones a hexadecimal:
Esquema de la CPU:
Esquema del simulador implementado en Logisim:
Códigos de operación de la ALU de las CPU anteriores:
- 00001 Suma
- 00010 Resta
- 00011 OR
- 00100 AND
- 00101 Desplazamiento a la derecha de 1,2,3,4 bits
- 00110 Desplazamiento a la izquierda de 1,2,3,4 bits
- 00111 NOT
- 01000 XOR
------------------------------------------------------------------------------------------------------------
000000|01001|01010|01000|00000|100000
0000|0001|0010|1010|0100|0000|0010|0000 (Agrupamos de 4
en 4 para pasarlo a hexadecimal)
0x012A4020
Lenguaje de transferencia | Señales | |
C1 |
MAR ← PC
| T4, C1 |
C2 | PC ← PC + 4 MBR ← MP(MAR) | Td, L, C2, C4 |
C3 | RI ← MBR | T3, C6 |
C4 | Decodificación | |
C5 | R8 ← R9 + R10 |
RA=1001, RB=1010, MA=0, MB=0,
C.Op=00001, T5, RC=1000, SC
|
C6 | Comprobación de las señales de interrupción |
------------------------------------------------------------------------------------------------------------
b) ADDI $s0,$s1, 0x0011
001000|10001|10000|0000000000010001
0010|0010|0011|0000|0000|0000|0001|0001 (Agrupamos
de 4 en 4 para pasarlo a hexadecimal)
0x22300011
Lenguaje de transferencia | Señales | |
C1 | MAR ← PC | T4, C1 |
C2 | PC ← PC + 4 MBR ← MP(MAR) | Td, L, C2, C4 |
C3 | RI ← MBR | T3, C6 |
C4 | Decodificación | |
C5 | RT2 ← RI | T8, C10 |
C6 | R16 ← R17 + RT2 |
RA=10001, MA=0, MB=1, C.Op=00001,
T5, RC=10000, SC
|
C7 | Comprobación de las señales de interrupción |
------------------------------------------------------------------------------------------------------------
001101|01010|01000|0000000010100001
0011|0101|0100|1000|0000|0000|1010|0001 (Agrupamos de 4 en 4 para pasarlo a hexadecimal)
0x354800A1
Lenguaje de transferencia | Señales | |
C1 | MAR ← PC | T4, C1 |
C2 | PC ← PC + 4 MBR ← MP(MAR) | Td, L, C2, C4 |
C3 | RI ← MBR | T3, C6 |
C4 | Decodificación | |
C5 | RT2 ← RI | T8, C10 |
C6 | R8 ← R10 or RT2 |
RA=1010, MA=0, MB=1, C.Op=00011, T5,
RC=1000, SC
|
C7 | Comprobación de las señales de interrupción |
------------------------------------------------------------------------------------------------------------
Esta instrucción con valor inmediato es tiene la siguiente peculiaridad:
"Shift register rt left (right) by the distance indicated by
immediate shamt or
the register rs and put the result in register rd. Note that
argument rs is ignored
for sll, sra, and srl."
000000|00000|01000|01000|00010|000000
0000|0000|0000|1000|0100|0000|1000|0000 (Agrupamos de 4 en 4 para pasarlo a hexadecimal)
0x00084080
Lenguaje de transferencia | Señales | |
C1 | MAR ← PC | T4, C1 |
C2 | PC ← PC + 4 MBR ← MP(MAR) | Td, L, C2, C4 |
C3 | RI ← MBR | T3, C6 |
C4 | Decodificación | |
C5 | RT2 ← RI | T8, C10 |
C6 | R8 ← R8 + RT2 | RA=1000, MA=0, MB=1, C.Op=00110, T5, RC=1000, SC |
C7 | Comprobación de las señales de interrupción |
------------------------------------------------------------------------------------------------------------
Esta instrucción con valor inmediato es tiene la siguiente peculiaridad:
"Shift register rt left (right) by the distance indicated by immediate shamt or
the register rs and put the result in register rd. Note that argument rs is ignored
for sll, sra, and srl."
000000|00000|01000|01001|00010|000010
0000|0000|0000|1000|0100|1000|1000|0010 (Agrupamos de 4 en 4 para pasarlo a hexadecimal)
0x00088882
Lenguaje de transferencia | Señales | |
C1 | MAR ← PC | T4, C1 |
C2 | PC ← PC + 4 MBR ← MP(MAR) | Td, L, C2, C4 |
C3 | RI ← MBR | T3, C6 |
C4 | Decodificación | |
C5 | RT2 ← RI | T8, C10 |
C6 | R9 ← R8 + RT2 | RA=1000, MA=0, MB=1, C.Op=00101, T5, RC=1001, SC |
C7 | Comprobación de las señales de interrupción |
------------------------------------------------------------------------------------------------------------
001111|00000|10000|0000000000010001
0011|1100|0001|0000|0000|0000|0001|0001 (Agrupamos de 4 en 4 para pasarlo a hexadecimal)
0x3C100011
Lenguaje de transferencia | Señales | |
C1 | MAR ← PC | T4, C1 |
C2 | PC ← PC + 4 MBR ← MP(MAR) | Td, L, C2, C4 |
C3 | RI ← MBR | T3, C6 |
C4 | Decodificación | |
C5 | MAR ← RI (17-32) | T8, C1 |
C6 | MBR ← MP(MAR) | TD, L, C2 |
C7 | R16 ← MBR | T3, RC=10000, SC |
C8 | Comprobación de las señales de interrupción |
------------------------------------------------------------------------------------------------------------
101011|00000|01100|0000000100010001
1010|1100|0000|1100|0000|0001|0001|0001 (Agrupamos de 4 en 4 para pasarlo a hexadecimal)
0xAC0C0111
Lenguaje de transferencia | Señales | |
C1 | MAR ← PC | T4, C1 |
C2 | PC ← PC + 4 MBR ← MP(MAR) | Td, L, C2, C4 |
C3 | RI ← MBR | T3, C6 |
C4 | Decodificación | |
C5 | MBR ← R12 | RA=1100, T1, C3 |
C6 | MAR ← RI | T8, C1 |
C7 | MP ← MBR | TA, TD, E |
C8 | Comprobación de las señales de interrupción |
------------------------------------------------------------------------------------------------------------
000000|01010|01000|01001|00000|101010
0x0148482A
Lenguaje de transferencia | Señales | |
C1 | MAR ← PC | T4, C1 |
C2 | PC ← PC + 4 MBR ← MP(MAR) | Td, L, C2, C4 |
C3 | RI ← MBR | T3, C6 |
C4 | Decodificación | |
C5 | R9 = R10<R8 | RA=1010, RB=1000, MA=0, MB=0, C.Op=00110, T5, RC=1001, SC |
C6 | Comprobación de las señales de interrupción |
------------------------------------------------------------------------------------------------------------
000010|00000000000000000000011010
0x0800001A
Lenguaje de transferencia | Señales | |
C1 | MAR ← PC | T4, C1 |
C2 | PC ← PC + 4 MBR ← MP(MAR) | Td, L, C2, C4 |
C3 | RI ← MBR | T3, C6 |
C4 | Decodificación | |
C5 | PC ← RI | T8, C5 |
C6 | Comprobación de las señales de interrupción |
------------------------------------------------------------------------------------------------------------
000000|10000|000000000000000|001000
0000|0010|0000|0000|0000|0000|0000|1000 (Agrupamos de 4 en 4 para pasarlo a hexadecimal)
0x02000008
Lenguaje de transferencia | Señales | |
C1 | MAR ← PC | T4, C1 |
C2 | PC ← PC + 4 MBR ← MP(MAR) | Td, L, C2, C4 |
C3 | RI ← MBR | T3, C6 |
C4 | Decodificación | |
C5 | PC ← R16 | RA=10000, T1, C5 |
C6 | Comprobación de las señales de interrupción |
------------------------------------------------------------------------------------------------------------
FAQ's
- ¿Donde puedo encontrar el formato de las instrucciones para poder codificarlas?
Esta parte de la practica corresponde al tema 2, en los apuntes del campus virtual correspondiente a este tema, podemos encontrar el formato y ejemplos de como realizar la codificación.
- En el banco de registros hay un error en los buses. ¿Cómo lo puedo solucionar?
Esto puede deberse a que el decodificador que va unido a los triestados tiene en el atributo "Disabled output" seleccionado "floating". Esto hará que si el decodificador no está activado, el valor de salida sea indefinido. Debemos cambiarlo a "zero" para que al estar desactivado, el valor de salida sea 0, y así los triestados funcionarán.
- ¿Qué debo hacer para empezar de nuevo la simulación de un circuito en Logisim?
Debes pulsar crtl y la tecla R, o darle al botón simulación y "Reset simulation"
- ¿Qué debo hacer para poder mostrar una imagen de mi circuito?
Debes pulsar en "Archivo" y luego en "Export image", de la siguiente forma.
- ¿Por que en los 4 primeros ciclos de reloj siempre se repiten los mismos pasos independientemente de la instrucción?
Porque se ha de generar una secuencia de señales de control que posibiliten buscar el código de instrucción en memoria, su carga en RI y la preparación de PC para el ciclo de instrucción siguiente. y posteriormente su decodificación localizando la secuencia de señales de control que den lugar a la ejecución de la instrucción.