Está en la página 1de 25

ARQUITECTURA DE COMPUTADORES

ENTREGA 3

PROFESOR:

JUAN PABLO BERRIO LOPEZ

INTEGRANTES DEL GRUPO:

INSTITUCIÓN UNIVERSITARIA POLITÉCNICO GRANCOLOMBIANO


FACULTAD DE INGENIERÍA
INGENIERÍA DE SOFTWARE

Octubre 13, 2020

1. Introducción

La arquitectura del computador se define como: “la ciencia y el arte de diseñar,


seleccionar e interconectar componentes de hardware, y el de diseñar interfaces hardware/
software para crear sistemas de cómputo que cumplan ciertas metas funcionales, de
desempeño, de consumo de energía, de costo, entre otros” (Patt, 2001). Claramente, la
arquitectura del computador no se refiere al diseño de edificios. Sin embargo, sí toma de
la definición de “arquitectura” el hecho de diseñar una estructura y la interconexión de
componentes según las especificaciones de uso esperado, en el caso de la arquitectura del
computador del dispositivo de cómputo.

2. Objetivo General

Analizar y desarrollar el trabajo colaborativo de arquitectura del computador en


relación a nuestro caso de estudio del procesador para determinar si un número es primo
o no, teniendo en cuenta los conocimientos adquiridos durante el módulo con la idea de
alcanzar la resolución de los ejercicios planteados.

3. Objetivos específicos

Elaborar el conjunto de instrucciones y la microarquitectura de un procesador que


permita:
1. Determinar si un número es primo o no.
2. Diseñar el algoritmo en alto nivel.
3. Definir qué instrucciones de bajo nivel son requeridas y diseñar el Conjunto de
Instrucciones (ISA).
4. Definir la estructura de hardware mínima para poder ejecutar todas las instrucciones
definidas en el conjunto de instrucciones.
5. Montar la estructura de la microarquitectura de hardware sobre el simulador Logisim.
6. Incluir la simulación (en Logisim) de al menos 2 ejemplos diferentes para demostrar
que funciona correctamente.
7. Documentar todas las decisiones de diseño.

4. Actividad # 1

1. Documento con el diseño del algoritmo, en pseudocódigo o un lenguaje de


programación en alto nivel, que dé solución al problema: “Determinar si un número es
primo o no”.
2. Adicionalmente, se debe especificar qué tipos de instrucciones pueden ser requeridas
para la solución del problema, de acuerdo con el algoritmo diseñado.

Líne Línea de código Tipo de


a# instrucción
19   if (numero == 0 || numero == 1 || numero == 4)  Instrucción
return false; salto
condicional

21 for (int y = 2; y < numero / 2; y++) Instrucción
aritmética
inmediata
23 if (numero % y == 0) return false; Instrucción
salto
condicional
43 if (Primo(numero)) { Instrucción
condicional

5. Actividad # 2 - Definición detallada del conjunto de instrucciones

1. Listado de instrucciones detallando por cada una:


a. Nombre, mnemónico, parámetros que recibe.
b. Descripción de una frase indicando qué hace en términos de lo que recibe como
parámetro.
c. Ejemplo

A continuación, se detalla el conjunto de instrucciones:


li $v0 4
Instrucción: li rd, inm
Descripción: Carga inmediato (Load inmediate)
Carga el valor inmediato inm de 16 bits en la parte baja (li) del registro rd.

la $a0
Instrucción: la rd, dir
Descripción: Carga dirección (Load Address)
Carga en el registro rd la dirección dir. Esta instrucción carga la dirección y no el valor almacenado en
dicha dirección.

li $v0 5
Instrucción: li rd, inm
Descripción: Carga inmediato (Load inmediate)
Carga el valor inmediato inm de 16 bits en la parte baja (li) del registro rd.

move  $a0 $v0


Instrucción: move rd, ro
Descripción: Mueve (Move)
Copia el valor del registro general ro en el registro general rd.

jal primo
Instrucción: jal etiq
Descripción: Salta y enlaza (Jump and link)
Salta incondicionalmente a la instrucción marcada con etiq, guardando la dirección de la siguiente
instrucción.

move  $t1,$v0
Instrucción: move rd, ro
Descripción: Mueve (Move)
Copia el valor del registro general ro en el registro general rd.

beq  $t1,1
Instrucción: beq ro1, ro2, etiq
Descripción: Bifurcación si igual (Branch on equal)
Salta, si los valores de los registros ro1 y ro2 cumplen una relación, a la instrucción marcada con etiq.
Estas instrucciones son retardadas.

beq  $t1,0,elseif
Instrucción: beq ro1, ro2, etiq
Descripción: Bifurcación si igual (Branch on equal)
Salta, si los valores de los registros ro1 y ro2 cumplen una relación, a la instrucción marcada con etiq.
Estas instrucciones son retardadas.
jr $ra

jr $ra 
Instrucción: jr rd
Descripción: Salta a registro (Jump register)
Salta a la dirección especificada por el valor del registro rd.

la $a0  si_primo
Instrucción: li rd, inm
Descripción: Carga inmediato (Load inmediate)
Carga el valor inmediato inm de 16 bits en la parte baja (li) del registro rd.

j fin

j fin 
Instrucción: j etiq
Descripción: Salto (Jump)
Carga el valor inmediato inm de 16 bits en la parte baja (li) del registro rd.

 
la $a0  no_primo
Instrucción: li rd, inm
Descripción: Carga inmediato (Load inmediate)
Carga el valor inmediato inm de 16 bits en la parte baja (li) del registro rd.

 
move  $s0, $a0
Instrucción: move rd, ro
Descripción: Mueve (Move)
Copia el valor del registro general ro en el registro general rd.

li $t0,0
Instrucción: li rd, inm
Descripción: Carga inmediato (Load inmediate)
Carga el valor inmediato inm de 16 bits en la parte baja (li) del registro rd.

beq  $s0,0,ret
Instrucción: beq ro1, ro2, etiq
Descripción: Bifurcación si igual (Branch on equal)
Salta, si los valores de los registros ro1 y ro2 cumplen una relación, a la instrucción marcada con etiq.
Estas instrucciones son retardadas.

beq  $s0,1,ret
Instrucción: beq ro1, ro2, etiq
Descripción: Bifurcación si igual (Branch on equal)
Salta, si los valores de los registros ro1 y ro2 cumplen una relación, a la instrucción marcada con etiq.
Estas instrucciones son retardadas.

beq  $s0,4,ret
Instrucción: beq ro1, ro2, etiq
Descripción: Bifurcación si igual (Branch on equal)
Salta, si los valores de los registros ro1 y ro2 cumplen una relación, a la instrucción marcada con etiq.
Estas instrucciones son retardadas.

li $t1,2
Instrucción: li rd, inm
Descripción: Carga inmediato (Load inmediate)
Carga el valor inmediato inm de 16 bits en la parte baja (li) del registro rd.

j for

j for 
Instrucción: j etiq
Descripción: Salto (Jump)
Carga el valor inmediato inm de 16 bits en la parte baja (li) del registro rd.

  
rem $t2, $s0,$t1
Instrucción: rem rd, ro1, ro2
Descripción: Resto (Remainder)
Pone en el registro rd el resultado de calcular el resto de la división entre los valores de los registros ro1
y ro2.

beq  $t2, $zero,ret      


Instrucción: beq ro1, ro2, etiq
Descripción: Bifurcación si igual (Branch on equal)
Salta, si los valores de los registros ro1 y ro2 cumplen una relación, a la instrucción marcada con etiq.
Estas instrucciones son retardadas.

addi  $t1,$t1,1
Instrucción: addi rd, ro1, inm
Descripción: Suma palabra inmediata (Add word inmediate)
Suma el valor del registro ro1 y el del valor inmediato de 16 bits inm, y deja el resultado en el registro
rd.

div $t3, $s0,2


Instrucción: div ro1, ro2
Descripción: Divide palabra (Divide word)
Divide el valor del registro ro1 entre el valor del registro ro2. Ambos valores se consideran cantidades
enteras con signo.

blt  $t1,$t3,for
Instrucción: blt ro1, ro2, etiq
Descripción: Bifurcación si menor que (Branch on less than)
Salta, si los valores de los registros ro1 y ro2 cumplen una relación, a la instrucción marcada con etiq.
Estas instrucciones son retardadas.
j  ret
Instrucción: j etiq
Descripción: Salto (Jump)
Carga el valor inmediato inm de 16 bits en la parte baja (li) del registro rd.

move $v0, $t0


Instrucción: move rd, ro
Descripción: Mueve (Move)
Copia el valor del registro general ro en el registro general rd.

2. Definición de la cantidad de registros que se usarán y el tamaño de cada registro.


Los registros son los espacios de memoria RAM que utilizaremos para almacenar

datos. Para la arquitectura de nuestro procesador, utilizaremos 32 bits, o 32 registros

del 0 al 31,para una palabra de 32 bits, 4 bytes. Los registros tendrán el siguiente

tamaño y utilidad[ CITATION Ruy03 \l 9226 ]:

Número de Nombre Uso convencional

registro mnemotécnico
$0 Cero Cero permanentemente
$1 $at Ensamblador temporal (reservado)
$2, $3 $v0; $v1 Valor retornado por una sub-rutina
$4, $7 $a0 -$a3 Argumentos a subrutina
$8 - $15 $t0 - $t7 Temporales – no se preservan al

llamar una función


$16 - $23 $t0 - $t7 Salvados - se preservan al llamar

una función
$24 - $25 $t8 - $t9 Temporales
$26 - $27 $k0 - $k1 Kernel (reservados para OS)
$28 $gp Global pointer
$29 $sp Stack pointer
$30 $fp Frame pointer
$31 $ra Dirección de retorno
3. Descripción breve de los modos de direccionamiento que serán posibles.
En este punto se especifican las reglas de localización en este caso el dato que

va hacer utilizado durante la ejecución de cada una instrucción. El microprocesador

lleva a cabo la función con facilidad dado que usa un direccionamiento el cual

determina la forma en que se interpreta la información.

Directo

El registro se define por la instrucción que contiene el operando.

Inmediato

Establece en el byte o bytes del operando.

Directo
El byte o par de bytes que siguen al código OP de la instrucción el cual da paso a

continuar e 8 ó 16 bits,que, sumado al contenido del registro DS, determina la

localización efectiva en la que se encuentra el dato para ser transferido

4. Traducción del programa de alto nivel (entrega 1) al lenguaje ensamblador que

han construido, usando su propio conjunto de instrucciones.

#si un numero es primo o no


.data
solicitud: .asciiz "\n Ingrese un numero:"
si_primo: .asciiz "\n El numero ingresado es primo"
no_primo: .asciiz "\n No es un numero primo"

.text
main: li $v0 4 #print_string, 4 codigo llamada
la $a0 solicitud #parametro numero
syscall #llamada al sistema,imprime $a0
li $v0 5 #read_int, 5 codigo llamada
syscall #solicita numero
move $a0 $v0 #guarda read en parametro
jal primo #llama a primo
move $t1,$v0 #mueve respuesta de jal primo a
t1
beq $t1,1,if #si es verdadero, if
beq $t1,0,elseif #si es falso,elseif
jr $ra

if: li $v0 4 #print_string, 4 codigo llamada


la $a0 si_primo #guarda mensaje a imprimir
syscall #imprime $a0
j fin

elseif: li $v0 4 #print_string, 4 codigo llamada


la $a0 no_primo #guarda mensaje a imprimir
syscall #imprime $a0
j fin

primo: move $s0, $a0 #parametro numero


li $t0,0 #falso
beq $s0,0,ret #compara si numero es igual a 0
beq $s0,1,ret #compara si numero es igual a 1
beq $s0,4,ret #compara si numero es igual a 4
li $t1,2 #y de for
j for

for: rem $t2, $s0,$t1 #reciduo numero%y


beq $t2, $zero,ret #si el residuo es igual a cero ret
false
addi $t1,$t1,1 #incrementa en 1 y
div $t3, $s0,2 #guarda en temporal numero / 2
blt $t1,$t3,for #si t1 es menor que t3 repite
li $t0,1 #cambia a true
j ret #ret true

ret: #return
move $v0, $t0 #retorno v0
jr $ra #direccion de retorno

fin:

5. Listado en HEXA del binario que representa el programa realizado en el punto 4


de esta entrega.

BINARIO HEXADECIMAL
1111 0000 f0
1111 0001 f1
1111 0010 f2
1111 0011 f3
1111 0100 f4
1111 0101 f5
1111 0110 f6
1111 0111 f7
1111 1000 f8
1111 1001 f9
1111 0001 0000 f10
1111 0001 0001 f11
1111 0001 0010 f12
1111 0001 0011 f13
1111 0001 0100 f14
1111 0001 0101 f15
1111 0001 0110 f16
1111 0001 0111 f17
1111 0001 1000 f18
1111 0001 1001 f19
1111 0010 0000 f20
1111 0010 0001 f21
1111 0010 0010 f22
1111 0010 0011 f23
1111 0010 0100 f24
1111 0010 0101 f25
1111 0010 0110 f26
1111 0010 0111 f27
1111 0010 1000 f28
1111 0010 1001 f29
1111 0011 0000 f30
1111 0011 0001 f31

6. ALU en Logisim, que pueda ejecutar las instrucciones requeridas por el programa.
En diseño fue elaborado en Logisim, en el archivo complementario a éste informe.

Actividad # 3 Finalización del procesador

1. Archivo .circ, realizado sobre Logisim, que incluye: Memoria de Programa, ALU,

Registros, Unidad de Control, interconectados de tal forma que sea capaces de

ejecutar el programa diseñado.

El archivo de la simulación Logisim es: Procesador.circ (Anexo a éste documento).


2. Documento de diseño, reuniendo las entregas 1 y 2, así como la documentación del

diseño de la microarquitectura (Memoria de Programa, ALU, Registros, Unidad de

Control).

El procesador fue elaborado con base en los siguientes circuitos:

Parte 1 – Circuito de Registros VR y FT

Estos dos bloques conformar el circuito del Banco de registros del procesador, son 8

registros para los VR y 8 registros para los FT, por temas de facilidad se trabajo con

registros de 8 bits, en el archivo de Logisim se encuentra el circuito para mayor

visibilidad, con respecto al funcionamiento tiene dos entradas de un bit para grabar el

dato, según el tipo de variable, otra entrada de un bit para activar el multiplexor de las

variables FT, y por último una entrada de un bit para el Reset. Tiene dos entradas de 8

bits para saber la dirección y otras dos para recibir el dato que se desea guardar.
Parte 2 – Circuito Unidad de Control

La unidad de control revisa una instrucción de 32 bit que está compuesta con una secuencia

dada para poder ejecutar la tarea que se le está diseñando, lo que se hizo fue ir controlando

las salidas dividiendo en 4 grupos de 8 bits cada una de las instrucciones recibidas, así tener

un mejor control, la constante se usa para mantener activo la entra de “Selección” de la

memoria ROM y así ir leyendo cada instrucción, se tiene dos salidas para controlar los Jump

del programa las demás salidas son con el fin de controlar como se va ir guardando la

información en los registros, cuando grabar, cuando activar el multiplexor de las variables

FT.
Parte 3: Memoria ROM, Contador y Sumador

Esta parte del circuito representa el contador, que cuenta las instrucciones que se van

ejecutando, la entrada “Activar contador” nos servirá para simular los pulsos de Reloj, el

sumador nos sirve para ir incrementando el valor a cada pulso de reloj, por eso tiene una

entrada con la constante 1, el bloque de Memoria nos permite ir guardando cada una de las

instrucciones del programa que se va a ir ejecutando:

Parte 4: Unidad aritmético – lógica ALU


Este circuito consta de dos entradas de datos de 8 bits, que son para los datos que se van a

operar, tiene 7 operaciones: Suma, División, Modulo, Igual, Menor, Menor o igual y And,

por medio del codOperacion recibido y un multiplexor se muestra el valor de la salida.

Parte final: Circuito Principal


Consideraciones para tener en cuenta, se tiene dos salidas de 8 bit para simular las letras de P

= Primo y NP = No primo. Como se tienen diferentes tipos de variables hay un multiplexor

entre los registros y la CPU que nos ayudará a controlar esta parte.

3. Documento de conclusiones, donde se presenten los ejemplos probados, los

resultados obtenidos y las conclusiones críticas del proyecto desarrollado.

3.1 Ejemplos de aplicación de los circuitos:

ALU
Suma

División
Menor que

Igual

Registros
Dato VR
Grabar en la dirección elegida
Resetear dato VR
Unidad de Control
Grabar dato VR

4.

Activar Jump 2

5.
Activar Jump 1

Grabar dato FT

6.

Activar salida VR
Activar salto a la posición 9

7.
Main

4.2 Conclusiones generales del trabajo colaborativo:

 De acuerdo con la simulación realizada, fue posible comprobar que la unión de

diferentes componentes en una arquitectura de CPU logran llevar a cabo la lectura

de información, su procesamiento siguiendo un programa de instrucciones, y la

generación de un resultado esperado.

 El resultado obtenido es el simulador de un microprocesador de dos entradas de 8-

bits, compuesto por la unidad aritmético-lógica, la cual realiza las operaciones

matemáticas para determinar si un número es primo; registros, los que guardan los

resultados obtenidos; la memoria ROM, que registra y guarda cada una de las

instrucciones que el programa va ejecutando, unidad de control, la que regular

cada una de las tareas asociadas a la validación de los números, su registro y su

procesamiento en memoria.
 Obtuvimos una arquitectura de microprocesador, el cual permite llevar a cabo una

tarea específica, en éste caso, identificar si un número es primo o no, y de paso,

guardar la información y administrar los pasos, de tal manera que generen un

resultado para el usuario que ingresa los números en la entrada del sistema.

 El conjunto de instrucciones diseñado logró llevar a cabo la validación de los

números de entrada, para validar si son o no primos. Igualmente, coordinar las

acciones de cada uno de los componentes: ULA; memoria RAM, memoria ROM;

unidad de control y registros.


Referencias
Wang, R. (30 de 10 de 2003). Fourier eng. Obtenido de Instruction Set of MIPS Processor:
http://fourier.eng.hmc.edu/e85_old/lectures/instruction/node7.html

También podría gustarte