INFORME LABORATORIO 04
DISEÑO E IMPLEMENTACIÓN DE UN PROCESADOR MONOCICLO
GRUPO 06
DAVID MEJIA RESTREPO
C.C. 1039474824
ANDRES FELIPE VASQUEZ RAMIREZ
C.C. 1017174170
FACULTAD DE INGENIERIA
INGENIERIA EN SISTEMAS
ARQUITECTURA DE COMPUTADORES Y LABORATORIO
UNIVERSIDAD DE ANTIOQUIA
NOVIEMBRE DE 2017
Descripción
Se implementó un procesador monociclo MIPS de 32 bits el cual soporta múltiples
instrucciones mostradas en la Tabla 1 en el cual se observan además de las instrucciones
requeridas para el laboratorio, adicionales instrucciones. Adicional se reestructuro uno de los
códigos del laboratorio anterior para ser probado en nuestro procesador MIPS monociclo de
32 bits. Se utilizó la herramienta de Logisim para implementar y simular el procesador, y la
herramienta de MARS para generar el código y la data del codigo a simular que
posteriormente se modifico para ser analizada de forma efectiva por el procesador MIPS
monociclo de 32 bits.
Consideraciones
Se realiza un código de prueba con instrucciones básicas, para determinar el correcto
funcionamiento de la arquitectura del procesador. En las instrucciones se cuentan con sumas
(add, addi), resta (sub), manejo de memoria ROM ( lw/sw ).
La arquitectura cuenta con las instrucciones básicas más instrucciones adicionales debido que
nuestro codigo utiliza saltos y validaciones adicionales. Estas instrucciones son las siguientes
con sus códigos en binario
Formato R está dado por ALU op como 000000
Se maneja los 32 registro del MIPS con la siguiente distribución (MIPS standard), pero se la
CPU se agregan los valores del HI, LO y PC, para los momentos de tener que realizar una
división / multiplicación.
Código de prueba:
El código a ejecutar consta de instrucciones la, lw, sw, addi, slt, beq, j, el código a ejecutar
toma un primer array (vector) y busca el numero mayor, y este es sumado en cada una de las
posiciones del segundo vecto.
.data
intA: .word 15
intB: .word 3
.text
la $t1, intA
lw $t1, 0($t1)
addi $t2, $zero, 4
la $t1, intB
lw $t1, 0($t1)
addi $t3, $zero, 10
add $t4, $t1, $t2
addi $t5, $zero, 8
sw $t4, 0($t5)
Código a ejecutar:
En nuestro ejemplo el vector es de 5 posiciones [9, 4, 5, 2, 10] y suma el número 10 al
segundo vector [1, 2, 5, 6, 8] resultando [11, 12, 15, 16, 18].
.data
sizeA: .word 5
arrayA: .word 9,4,5,2,2
sizeB: .word 5
arrayB: .word 1,1,1,1,1
.text
addi $t0, $zero, 0
la $t1, sizeA
lw $t1, 0($t1) # t8 = sizeA
la $t2, arrayA # t6 = Dirección del arrayA
addi $t4, $zero, 0 # t4 = 0
loopHigh:
slt $t3, $t0, $t1 # if k < size t0 = 1
beq $t3, $zero, addV2 # if k > 0 salte al método addV2
lw $a0, 0($t2) # Carga la base del vector en $a0
slt $t3, $t4, $a0 # if item del vector > Número mayor t3 = 1
beq $t3, $zero, noHigh # if t3 = 0 salte a noHIgh
add $t4, $a0, $zero # t4 = item del vector
noHigh:
addi $t2, $t2, 4 # Incrementa la dirección del vector
addi $t0, $t0, 1 # k++
j loopHigh
addV2: # t0 = k / t1 = sizeB / t2 = apuntador arrayB / t3 =
booleano / t4 = número mayor / a0 = item del vector
addi $t0, $zero, 0
la $t1, sizeB
lw $t1, 0($t1) # t8 = sizeB
la $t2, arrayB # t6 = Dirección del arreyB
loopAdd:
slt $t3, $t0, $t1 # if k < size t0 = 1
beq $t3, $zero, exit # if k > 0 salte al método addV2
lw $a0, 0($t2) # Carga la base del vector en $a0
add $a0, $a0, $t4 # suma t4 a el item del vector a0
sw $a0, 0($t2) # Guarda el item en el vector
addi $t2, $t2, 4 # Incrementa la dirección del vector
addi $t0, $t0, 1 # k++
Modificaciones al procesador MIPS
El procesador tiene alguna variaciones con respecto a la arquitectura estándar, en esta se
cambia los estados de AluOP y Control, cambiando las salidas del control y ALUOP y las
instrucciones de ingreso de la ALU, esto con respecto a la solicitud realizada en el laboratorio
de la siguiente manera.
ALUOp (2 bits) ALU Control (3 bits)
Equip
o SW/LW R beq ADD SUB AND OR NOR SLT
6 0 2 1 0 5 4 3 2 1
En la Arquitectura desarrollada se adapta el control y ALUOP con la información solicitada y
considerando las otras instrucciones con valores definidos por nosotros.
Para las instrucciones se crea el un decodificador de instrucciones para el soporte de todas
las instrucciones mencionadas anteriormente de la siguiente manera.
Componentes del procesador:
main: aquí podremos ingresar la data y el text del programa y/o algoritmo a ejecutar,
de modo que aquí se da inicio a nuestro programa. Sus componentes mas importantes serian:
CPU, RAM y ROM
CPU: aquí se encuentra la datapath base y la unidad de control de nuestro procesador.
Sus componentes más importantes son: ALU, Register File y Control
Control: aquí el sistema procesa la solicitud recibida y procede a enviar las señales
correspondiente a los demás componentes del sistema. Su componente más importante es:
Instruction Decode
Instruction Decode: este componente se encarga de activar señales para decirle al
Control que tipo de instrucción ha llegado
ALU: la ALU se encarga de procesar los datos que le llegan y realizar las operaciones
algorítmicas y lógicas del sistema
Register File: Este sector se encarga de almacenar los 32 registros del sistema. Se
compone de múltiples RegFile8reg y un zeroReg para obtener los 32 registros
RegFile8reg: Estos sectores guardan hasta 8 registros exceptuando. Que más se puede
decir.. son casi todos los registros exceptuando los que almacena zeroReg
zeroReg: Este sector funciona casi igual que los RegFile8reg, excepto porque este
almacena el registro zero que siempre equivale a 0
BussSplit: Este sector divide los 32 bits que llegan al sistema para poder ser
analizados por las diferentes partes del sistema. Algunos ejemplos serian: opcode, shamt, rd,
rt, rs, function y los imm(immediate)
leadingZeros: Este componente genera los ceros a la izquierda del dato que ingresa.
AbsoluteAddress: Este componente se encarga de completar el imm(immédiate) de
dirección cuando no viene en 32 bits
BranchUnit: Este componente suma la dirección actual con la que trae el
imm(immédiate) para obtener la dirección correspondiente a una instrucción tipo branch o
parecidas
MUL_DIV_Unit: Este componente se encarga de almacenar los 16 bits más
significativos y menos significativos de la multiplicación y la división
MemBankText: Este componente es el banco de memoria que almacena el Text
MemBankData: Este componente es el banco de memoria que almacena el data