Está en la página 1de 10

UNIVERSIDAD POLITECNICO GRANCOLOMBIANO

FACULTAD DE INGENIERÍA, DISEÑO E INNOVACIÓN.

Diseño de conjunto de instrucciones y microarquitectura

Hugo Andrez Bustos Restrepo - hubustos@poligran.edu.co Código: 1821982214

5 de octubre de 2021

Diseño del algoritmo: Pseudocódigo del ciclo.


4. Si el número es mayor a cero
ALGORITMO PARA DETERMINAR SI UN continua el proceso saliendo del ciclo
NUMERO ES PRIMO y se inicia la variable i =2.
5. En un nuevo ciclo en este caso un
Un número primo es aquel que únicamente es para (for) se comprueba si el número
divisible por sí mismo y por la unidad, es decir, ingresado tiene algún divisor a partir
solo tiene 2 divisiones exactas (divisiones con de la variable i.
residuo = 0). 6. Mientras se conoce el ciclo se
aumenta el valor de i=i+1.
El procedimiento consiste en hacer divisiones 7. Analizamos en una condición si el
sucesivas del número de entrada, desde 1 hasta el valor de la variable num = i si es el
número mismo y se va contando cuántas de ellas valor de la variable primo es igual a
producen residuo (no cociente) igual a cero. al true de lo contrario es false.
final, si ese contador es igual a 2 entonces el 8. Si el valor de la variable primo es
número es primo, caso contrario no es primo. igual a true retomamos un mensaje
indicando que el número ingresado
DATOS DE ENTRADA: NUM (número a verificar si es primo de lo contrario le
es primo, introducido por el usuario) indicaremos que el número no es
primo.
PROCESO: Realizar divisiones sucesivas de NUM
entre 1, 2, 3, …, NUM y contar cuántas de ellas
producen RESIDUO cero (utilizamos el operador
MOD).

SALIDA DE DATOS: Mensaje indicando “Es


Primo” ó “No es primo”, según que el contador sea
o no 0.

INSTRUCCIONES

1. Se ingresa un dato de tipo numérico.


2. Se lee el dato numérico ingresado anterior
mente.
3. Se realiza en una condición si el número
ingresado es <= 0, si se cumple esta
condición se indica que se debe de ingresar INICIO
un número mayor a cero y continua dentro
contador 0
“Ingrese un número”
PARA X 1 hasta N Haga

res N div X


SI res = 0 entonces
N contador contador + 1
FIN SI

FIN PARA

Contador  0 SI contador = 2 Entonces

Escriba (“El número “, N, “Es Primo”)

Sino
N Mod Escriba (“El número “, N, “NO Es
Primo”)
R=1
FIN SI
FIN PRIMO
R
1∨N Contador  0
Contador +1 Al codificar este algoritmo en C++ se
obtendría un programa como el siguiente:

/* Programa NUMPRIMO.CPP */

#include<iostream.h>

#include<conio.h>

void main ()
Contador = 2
{

Int contador, x;
clrscr();
cout << " Ingrese un número ";
cin >> n;
N “no es número N “es numero contador = 0; /* inicia en 0 */
primo” primo” for (i=1; i < n; i++)
{
res = n % i; /* va obteniendo sucesivamente los
residuos de dividir n entre i */
SEUDO CODIGO CON PARA
Fin if (res = 0)
PRIMO
contacero += 1;
Escriba (“Digite el número:”); Lea(N) }
variable i =2.
if ( contacero = 2 )
•En un nuevo ciclo en este caso un while
{ se comprueba si el número ingresado
gotoxy(10,10); cout << “ El número“<< tiene algún divisor a partir de la variable
N<< “ Es Primo”; i.
}
•Mientras se conoce el ciclo se aumenta
Else el valor de i=i+1.

{ •Analizamos en una condición si el valor


gotoxy(10,10); cout << “ El número“<< de la variable num = i si es el valor de la
N<< “ NO es Primo”; variable primo es igual a true de lo
} contrario es false.
gotoxy(10,20); cout << “ Pulse ENTER para
terminar”; getch(); •Si el valor de la variable primo es igual
} a true retomamos un mensaje indicando
que el número ingresado es primo de lo
Fin contrario le indicaremos que el número
no es primo.
Esta entrega incluye la definición detallada del 2. Definición de la cantidad de registros
conjunto de instrucciones que se va a usar: que se usarán y el tamaño de cada
1. Listado de instrucciones detallando por cada registro.
una: 3. Descripción breve de los modos de
b. Nombre, mnemónico, parámetros que direccionamiento que serán posibles.
recibe. 4. Traducción del programa de alto nivel
c. Descripción de una frase indicando qué (entrega 1) al lenguaje ensamblador que
hace en términos de lo que recibe como han construido, usando su propio
parámetro. conjunto de instrucciones.
d. Ejemplo 5. Listado en HEXA del binario que
representa el programa realizado en el
Instrucciones punto 4 de esta
entrega.
•Se ingresa un dato de tipljk}o numérico. 6. ALU en Logisim, que pueda ejecutar
las instrucciones requeridas por el
•Se lee el dato numérico ingresado anterior programa.
mente.
DEFINICIÓN DE LA CANTIDAD DE
•Los puntos anteriores se realizan en un siclo REGISTROS QUE SEUSARÁN Y EL
en este caso un do-while TAMAÑO DE CADA REGISTRO
•Se realiza en una condición si el numero Los registros de memoria son una
ingresado es <= 0, si se cumple esta condición pequeña cantidad de memoria muy
se indica que se debe de ingresar un número rápida en donde almacena y accedes a
mayor a cero y continua dentro del ciclo. datos de
mayor frecuencia lo que permite
•Si el número es mayor a cero continua el incrementar la velocidad de un programa
proceso saliendo del ciclo y se inicia la en ejecución
La mayoría de las arquitecturas de especifica la forma en que se interpreta la
computadora emplean registros, moviendo información.
datos desde la memoria principal hacia los
registros, se opera sobre éstos, y el resultado • Directo a registro
El registro definido por la instrucción que
es movido
contiene el
nuevamente a la memoria principal. operando
Registr Descripción
o
X Registro acumulador, usándolo
se produce una instrucción que
ocupa un byte menos que si se
utilizaran otros registros de uso
general.
SP Registro de uso general, debe
utilizarse solo como puntero de
pila, la cual sirve para almacenar
las direcciones de
retorno subrutinas y datos
temporarios.
BX Registro base de propósito
similar (se usa para
direccionamiento indirecto) • Inmediato
CX Registro contador, se utiliza Se proporciona en el byte o bytes el
como contador en bucle, en operando que siguen el
operaciones con cadenas código de operación de la instrucción
DX Registro de datos, se utiliza
junto con el registro AX en
multiplicaciones y divisiones en
la instrucción CWD (el
registro DX indica el número de
puerto de entrada/salida)
• Directo
BP Puntero base, generalmente se
utiliza Eldebyte
Código o par de bytes que siguen al código
Ejecución
operación
para realizar direccionamiento OP de la instrucción da el desplazamiento
indirecto de 8 ó 16 bits, que, sumado al contenido del
dentro de la pila registro DS, determina la dirección efectiva
DI Puntero destino(no se puede en la que se encuentra el dato a transferir.
subdividir)
SI
Código de Puntero índice, sirve como Dirección
operación puntero fuente para las de memoria
operaciones con cadenas,
también sirve para realizar
direccionamiento indirecto

DESCRIPCIÓN BREVE DE LOS MODOS DE Memoria


Ejecución
DIRECCIONAMIENTO QUE SERÁN POSIBLES.

Es el conjunto de reglas que especifican una


localización (posición) del dato usado durante la TRADUCCIÓN DEL PROGRAMA DE ALTO
ejecución de una NIVEL (ENTREGA1) AL LENGUAJE
instrucción. ENSAMBLADOR QUE HAN CONSTRUIDO,
El microprocesador desempeña una función con USANDO SU PROPIO CONJUNTO DE
facilidad debido a que usa un modo de INSTRUCCIONES
direccionamiento el cual
L3:
file "primo.c" mov eax, DWORD PTR [esp+20]
.intel_syntax noprefix cmp DWORD PTR [esp+28], eax
.text jge L5
.def ___main; .scl 2; .type 32; .endef cmp DWORD PTR [esp+24], 1
.section .rdata,"dr" jne L6
LC0: L5:
.ascii "\12Numero.....: \0" cmp DWORD PTR [esp+24], 0
LC1: jne L7
.ascii " %d\0" mov eax, DWORD PTR [esp+20]
LC2: mov DWORD PTR [esp+4], eax
.ascii "\12El numero %d es primo\0" mov DWORD PTR [esp], OFFSET FLAT:LC2
LC3: call _printf
.ascii "\12El numero %d no es primo\0" jmp L2
.text L7:
.globl _main mov eax, DWORD PTR [esp+20]
.def _main; .scl 2; .type 32; .endef mov DWORD PTR [esp+4], eax
_main: mov DWORD PTR [esp], OFFSET FLAT:LC3
LFB17: call _printf
.cfi_startproc L2:
push ebp mov eax, DWORD PTR [esp+20]
.cfi_def_cfa_offset 8 cmp eax, -1
.cfi_offset 5, -8 jne L8
mov ebp, esp mov eax, 0
.cfi_def_cfa_register 5 leave
and esp, -16 .cfi_restore 5
sub esp, 32 .cfi_def_cfa 4, 4
call ___main ret
mov DWORD PTR [esp+20], 0 .cfi_endproc
mov DWORD PTR [esp+28], 0 LFE17:
mov DWORD PTR [esp+24], 0 .ident "GCC: (MinGW.org GCC-8.2.0- 3)
L8: 8.2.0"
mov DWORD PTR [esp], OFFSET FLAT:LC0 .def _printf; .scl 2; .type 32; .endef
call _printf .def _scanf; .scl 2; .type 32; .endef
lea eax, [esp+20]
mov DWORD PTR [esp+4], eax
mov DWORD PTR [esp], OFFSET FLAT:LC1 LISTADO EN HEXA DEL BINARIO QUE
call _scanf REPRESENTA EL PROGRAMA
mov eax, DWORD PTR [esp+20] REALIZADO EN EL PUNTO 4 DE ESTA
cmp eax, -1 ENTREGA.
je L2 BINARIO HEXADECIMAL
mov eax, DWORD PTR [esp+20] 10110100 B4
test eax, eax 1 1
jle L2 11001101 CD
mov DWORD PTR [esp+24], 0 00100001 21
mov DWORD PTR [esp+28], 2
10001010 8A
jmp L3
11111000 F8
L6:
11011000 D8
mov eax, DWORD PTR [esp+20]
0010 2
cdq
11011111 DF
idiv DWORD PTR [esp+28]
mov eax, edx 01110101 75
test eax, eax 0011 3
jne L4 11101001 E9
mov DWORD PTR [esp+24], 1 11100011 E3
L4: 0 0
add DWORD PTR [esp+28], 1 10111011 BB
10111000 B8 INSTRUCCIONES REQUERIDAS POR EL
0110 6 PROGRAMA.
10110111 B7
0111 7 Son dos entradas de datos de 4 bits que son
10111010 BA los números para operar, los cuales
10111001 B9 aparecen como valor 1 y valor 2 y el
01001111 4F resultado es de 5 Bits una salida de 1 bit
00011000 18 para la referencia del
01010111 57
residuo.
00010000 10
10110110 B6
10111010 BA
10111001 B9
01001111 4F
00011000 18
01010111 57
00010000 10
10110110 B6
10111010 BA
0101 5
11101000 E8
11111101 FD
01111100 7C La entrada de 3 bits la cual se llama código de
11000111 C7 operación es la encargada de manejar las 3
11111001 F9 operaciones básicas (suma, resta
00111001 39 y división) parametrizadas de acuerdo a la siguiente
01111111 7F tabla:
11000010 C2
10000000 80 Operación Código Decimal
11111011 FB operación
10011100 9C Suma 0 0
01110100 74 Resta 1 1
1000 8 División 10 2
10011101 9D
10001000 88
00101110 2E
01010101 55
Esta entrega corresponde a la
1110 0E
01010110 56 finalización del procesador. Se debe
00110000 30 entregar:
10110000 B0
1010 0A 1. Archivo .circ, realizado sobre Logisim,
10001001 89 que incluye: Memoria de Programa,
10110101 B5 ALU,
01110100 74
00011110 1E
Registros, Unidad de Control,
00111011 3B interconectados de tal forma que sea
11101011 EB capaces de ejecutar
11101010 EA el programa diseñado.
11110111 F7 2. Documento de diseño, reuniendo las
11110011 F3 entregas 1 y 2, así como la
01110100 74 documentación del
diseño de la microarquitectura (Memoria
de Programa, ALU, Registros, Unidad de
ALU EN LOGISIM, QUE PUEDA EJECUTAR LAS Control).
Este tiene seis entradas:
CPU
Los registros que utilizaremos son los
En este proyecto utilizaremos Logisim para siguientes:
implementar un procesador de 32-bits, cuyo
ISA es un subset de las instrucciones de
RISC-V. Algunos componentes del proyecto
serán más sencillos que los componentes de
hardware verdaderos para evitar realizar
trabajo repetitivo. Nuestro ISA utiliza 32
registros de 32 bits cada uno y una memoria,
cuyas direcciones son de 32 bits.

No Anch Descripción
o en
bits
Clock 1 Señal de reloj. Aquí se
recibirá una señal de reloj
"non gated", es decir, se
recibe la señal directa sin
ser afectada por ANDs,
NOTs o cualquier
compuerta.
Write Enable 1 Indica si se debería escribir
a un registro en el siguiente
flanco de subida del reloj.
Register File Read 5 Registro a leer y cuyo valor
Register 1 será enviado a Read Data 1.
Sólo implementaremos 9 (abajo se indica Read 5 Registro a leer y cuyo valor
Register 2 será enviado a Read Data 2.
cuales) para evitar realizar trabajo repetitivo. Write 5 Determina cuál registro será
Todas nuestras señales (rs1, rs2, rd) siguen Register modificado en el siguiente
siendo de 5-bits, pero sólo se estarán usando flanco de subida
(asumiendo que Write
los registros indicados. Enable = 1).
Write Data 32 Los 32 bits de datos a
El register file debe poder leer y escribir a los guardarse en el registro, en
el siguiente flanco de subida
registros que se especifiquen según la (asumiendo que Write
instrucción, sin afectar o modificar a cualquier Enable = 1).
otro registro. Existe una excepción: El registro
cero está alambrado a tierra y su valor no
puede ser cambiado por ningún motivo.
operación del ALU
ALU Op 4 Selecciona la operación
que el ALU debe de
efectuar

...y cuatro salidas:


Nombre de Ancho Descripción
Entrada en Bits
Out 32 Resultado de la operación
efectuada por el ALU
Equal 1 1 si A y B son iguales; 0
de lo contrario
LT 1 1 si A es menor que B
(signed); 0 de lo contrario
LTU 1 1 si A es menor que B
(unsigned); 0 de lo
contrario

Esta es la lista de operaciones que


necesitan implementar.

El register file tiene las siguientes salidas:


Nombre Ancho Descripción
en bits
Read 32 Datos que se están leyendo,
Data 1 según el registro que Read
Register 1 pidió.
Read 32 Datos que se están leyendo,
Data 2 según el registro que Read
Register 2 pidió.
s0 Value 32 Valor de s0 (salida para
DEBUG/TEST).
s1 Value 32 Valor de s1 (salida para
DEBUG/TEST).
t0 Value 32 Valor de t0 (salida para
DEBUG/TEST).
t1 Value 32 Valor de t1 (salida para
DEBUG/TEST).
a0 Value 32 Valor de a0 (salida para
DEBUG/TEST).
ra Value 32 Valor de ra (salida para
DEBUG/TEST).
sp Value 32 Valor de sp (salida para
DEBUG/TEST).

ALU

Creamos un ALU que soporte todas las


operaciones que necesitan las instrucciones
de nuestro ISA
Nombre de Ancho Descripción
Entrada en Bits
Las salidas Equal, LT, LTU siempre
A 32 Datos para usar por A en la tienen que sacar el valor correcto de
operación del ALU comparación sin importar el valor de
B 32 Datos para usar por B en la
ALU Op. Nuevamente, deben tener cuidado dirección será entregada al harness y
con los inputs y output pins, no los modifiquen este nos dará una instrucción. La
por ningún motivo. instrucción será recibida por el
procesador y será ejecutada. En el
archivo riscv.circ podemos ver
exactamente qué sucede.
El ALU debería de encajar con el harness
alu_harness.circ. Siguiendo las mismas El procesador tiene dos inputs que
instrucciones que en el register file. En vienen del harness:
particular, se deberían de asegurar que el ALU
es cargado correctamente por el harness
antes de que hacer submit.
El procesador debe tener los siguientes
outputs, que entregará al harness:
Output Name Bit Descripción
Width
s0 32 Contenido de s0,
sólo para pruebas.
s1 32 Contenido de s1,
sólo para pruebas.
t0 32 Contenido de t0,
sólo para pruebas.
t1 32 Contenido de t1,
sólo para pruebas.
a0 32 Contenido de a0,
sólo para pruebas.
ra 32 Contenido de ra,
CPU sólo para pruebas.
sp 32 Contenido de sp,
sólo para pruebas.
El procesador tendrá una instancia del ALU y FETCH_ADDRESS 32 Dirección que indica
qué instrucción
Register File, así como una unidad de queremos obtener
memoria que ya se tiene. Se debe construir el del harness. En
respuesta a esto, el
datapath y control completo, desde cero. El harness enviará
procesador debe implementar el ISA que se alguna instrucción a
través de
detalla más abajo. INSTRUCTION.

Memoria

Un resumen de los inputs y outputs


El procesador obtendrá su programa del
armazón (harness) riscv.circ. el procesador
tendrá un output llamado FETCH_ADDRESS
que indica cuál instrucción queremos, esta
Input Name Bit Descripción
Nombre Tipo Bit Descripción Width
Width INSTRUCTION 32 Aquí se recibe la
instrucción que se
ADDRESS input 32 Dirección a leer o escribir obtuvo en la
en la memoria. dirección
WRITE input 32 Valor a escribirse en la identificada por
DATA memoria. FETCH_ADDRES
WRITE input 1 En = 1 en las S.
ENABLE instrucciones que CLOCK 1 Input del reloj.
escriben; En = 0 en las Puede ser
demás. necesario estar
Clk input 1 Señal de reloj que viene enviando esta
desde cpu.circ. señal a varios
subcircuitos. Esta
READ output 32 Datos leídos en la
señal no debe
DATA dirección especificada.
pasar por ninguna
compuerta (NOT,
AND, etc).
Control
CONCLUSION
Las señales de control tienen un papel muy
importante en el proyecto. podemos necesitar Aprendí la relación entre el software y
un MUX y, por lo tanto, alguna señal de el hardware de un computador y de qué
control. manera se deben relacionar entre sí,
además de entender la forma en que
Existen varias formas de implementar las debemos analizar las ordenes que va a
señales de control. Por ejemplo, pueden recibir el software para así poder
construir una palabra de control y guardarla en generarlas de un modo adecuado y
una memoria ROM (micro-codigo) o pueden cumplir con la necesidad planteada.
construir un circuito que elija qué acción tomar
basándose en algunos bits del opcode, func3 y
func7. 2. REFERENCIAS

Es obligatorio que sus componentes estén EcuRed. (s. f.). Unidad Aritmético Lógica.
Recuperado 17 de abril de 2020, de
unidos y las señales de control necesarias
estén implementadas. Si en la calificación del https://www.ecured.cu/Unidad_Aritm
proyecto sólo tiene componentes sueltos %C3%A9tico_L%C3%B3gica
(como el ALU y Reg File de la primera fase) y
estos no se comunican entre sí, su nota será (2020). Retrieved 21 April 2020,
cero. Obtenido de
https://techlandia.com/tipos-modos-
direccionamiento-computadoraslista_
1. Documento de conclusiones, dondese 548496/
presenten los ejemplos probados, los https://cc-3.github.io/projs/proj02/
resultados obtenidos y las conclusiones
críticas del proyecto desarrollado. Creación y funcionamiento de una ALU
ISA con logisim. (2020). Retrieved 21 April
2020, obtenido de
https://www.youtube.com/watch?
v=xp6aXno6nac

https://cc-3.github.io/projs/proj02/

También podría gustarte