Está en la página 1de 32
Universidad Tecnológica Centroamericana Facultad de Ingenierías Manual de Laboratorio de Organización de Computadoras

Universidad Tecnológica Centroamericana Facultad de Ingenierías

Tecnológica Centroamericana Facultad de Ingenierías Manual de Laboratorio de Organización de Computadoras

Manual de Laboratorio de Organización de Computadoras

Diseñado por Iván de Jesús Deras Tábora

Introducción

Introducción La clase de Organización de Computadoras estudia la micro-arquitectura (organización), así como los

La clase de Organización de Computadoras estudia la micro-arquitectura (organización), así como los detalles de implementación de una computadora moderna. El enfoque de la clase esta en los siguientes componentes:

1. Procesador

2. Memoria

3. Dispositivos de E/S

En este manual se detallan una serie de Laboratorios diseñados para enriquecer los conocimientos adquirido durante la clase, utilizando el esquema de aprender haciendo (aprendizaje activo). Los laboratorios enfatizan el uso de componentes de software tales como Verilog un lenguaje de descripción de hardware y de hardware tales como FPGA (Field Programmable Gate Arrays).

Objetivo

Objetivo EL objetivo principal de estos laboratorios es involucrar al estudiante en el diseño e implementación

EL objetivo principal de estos laboratorios es involucrar al estudiante en el diseño e implementación de un procesador de 8 bits que ejecuta 13 instrucciones. De esta manera el estudiante se involucra con tecnologías del mundo real utilizadas para implementar procesadores modernos, por otro lado le ayuda a poner en práctica los conceptos aprendidos durante la clase.

Componentes de Laboratorio A continuación se detallan los componentes que se utilizarán en el laboratorio,

Componentes de Laboratorio

A continuación se detallan los componentes que se utilizarán en el laboratorio, asi como su respectiva utilización:

1. Verilog: Este es un lenguaje de descripción de hardware, el cual se utilizará para escribir

describir descripciones de los diferentes circuitos que implementemos en cada laboratorio.

2. Xilinx ISE WebPack: Este es un conjunto de herramientas de Xilinx, las cuales incuyen

las siguientes:

I. ISE Project Navigator: Este un entorno de desarrollo (IDE), el cual se utilizará para editar descripciones en Verilog, asi como sintetizador de Verilog para implementarlo en la FPGA. Ver Figura 1.

asi como sintetizador de Verilog para implementarlo en la FPGA. Ver Figura 1 . Figura 1:

Figura 1: Xilinx ISE Project Navigator.

II. ISim: Este es un simulador de Verilog, el cual permite depurar y probar los
II.
ISim: Este es un simulador de Verilog, el cual permite depurar y probar los circuitos
antes de sintetizarlos en hardware. Ver Figura 2.
Figura 2: Xilinx ISIM
III.
IMPact: Esta es una herramienta que permite cargar una descripción de un circuito ya
sintetizado en una FPGA. Figura 3.
que permite cargar una descripción de un circuito ya sintetizado en una FPGA. Figura 3. Figura

Figura 3: Xilinx IMPact

3. Tarjeta FPGA de National Instruments : Es una placa de circuitos que incluye un

3. Tarjeta FPGA de National Instruments: Es una placa de circuitos que incluye un FPGA de

Xilinx y varios componentes tales como switches, pulsadores, LEDs los cuales son muy útiles para probar los circuitos. Esta tarjeta se utilizará para probar los circuitos. Ver Figura 4.

se utilizará para probar los circuitos. Ver Figura 4. Figura 4: Tarjeta FPGA de National Instruments

Figura 4: Tarjeta FPGA de National Instruments

4. ChipKit Uno32 o Max32: Esta es una plataforma basado en el microcontrolador PIC32 de

Microchip, la cual utilizaremos en estos laboratorios para la adquisición de datos, esto es enviar y recibir señales de los circuitos que implementemos en la placa FPGA. Ver Figura 5.

es enviar y recibir señales de los circuitos que implementemos en la placa FPGA. Ver Figura

Figura 5: chipKit Uno32

Descripción de los Laboratorios

Descripción de los Laboratorios

Laboratorio 1: Modelando Compuertas Lógicas Objetivo El objetivo de este laboratorio es conocer los operadores

Laboratorio 1: Modelando Compuertas Lógicas Objetivo

El objetivo de este laboratorio es conocer los operadores lógicos de Verilog utilizados para modelar compuertas lógicas. Para ello desarrollaremos un ejercicio para probar 6 compuertas lógicas. Al finalizar este laboratorio el estudiante deberá ser capaz de:

1. Modelar circuitos combinatorios utilizando los operadores lógicos de Verilog.

2. Declarar señales de entrada y salida

3. Modelar componentes básicos

4. Declarar arreglos de señales

Implementación

El circuito que vamos a realizar consiste de 2 entradas a, b, las cuales serán alimentadas a compuertas AND, NAND, OR, NOR, XOR y XNOR, de esta manera el circuito tendrá 6 salidas (r[5:0]). Para generar las entradas utilizaremos 2 de los switches que incluye la placa FPGA, y para desplegar las salidas de las compuertas utilizaremos 6 LEDs, también incluidos en la placa FPGA.

Diagrama del Circuito

también incluidos en la placa FPGA. Diagrama del Circuito Tareas a realizar 1. Iniciar ISE Project

Tareas a realizar

1. Iniciar ISE Project Navigator y crear un proyecto nuevo.

2. Crear un nuevo archivo fuente llamado gates.v , asegúrese de seleccionar Verilog como lenguaje

2. Crear un nuevo archivo fuente llamado gates.v, asegúrese de seleccionar Verilog como

lenguaje de descripción.

3. Copiar el siguiente código en el archivo gates.v:

3. Copiar el siguiente código en el archivo gates.v : 4. Crear un nuevo archivo fuente,

4. Crear un nuevo archivo fuente, esta vez elegir “Implementation Constraint File” en el

“Source Type”. En el nombre colocar gates.ucf, en este archivo incluiremos el mapeo de los

pines con las variables que tenemos en nuestra descripción de Verilog.

5. Copiar el siguiente código en el archivo gates.ucf

5. Copiar el siguiente código en el archivo gates.ucf 6. Compile el proyecto y cárguelo al

6. Compile el proyecto y cárguelo al FPGA utilizando la herramienta Xilinx IMPact. Una vez

cargado pruebe el proyecto utilizando los switches y observe como cambia el estado de los LEDs en el FPGA.

Laboratorio 2: Contador Síncrono de 4 bits Objetivo El objetivo de este laboratorio es utilizar

Laboratorio 2: Contador Síncrono de 4 bits

Objetivo El objetivo de este laboratorio es utilizar construcciones de Verilog para implementar circuitos digitales secuenciales, para ello implementaremos un contador síncrono de 4 bits. Al finalizar el laboratorio el estudiante será capaz de:

1. Utilizar la sentencia always de Verilog para describir circuitos secuenciales.

2. Utilizar la sentencia if-else para modelar multiplexores.

3. Utilizar la sentencia case para modelar multiplexores.

4. Utilizar reg para modelar registros de estado.

5. Implementar e Integrar múltiples componentes en un mismo proyecto.

Implementación

El circuito que vamos a implementar incrementará el valor del contador en cada pulso positivo del reloj. El valor del contador será mostrado en un Display de 7 segmentos, el cual está incluido en la placa FPGA. Para generar las señales de reloj y reset del contador utilizaremos dos pulsadores, los cuales también están incluidos en la FPGA.

Diagrama del Circuito

también están incluidos en la FPGA. Diagrama del Circuito RESET y CLK son entradas, las cuales

RESET y CLK son entradas, las cuales serán generadas mediantes pulsadores incluidos en la placa FPGA. La salida del decodificador de 7 segmentos será conectada al display de 7 segmentos incluido en el FPGA.

Tareas a Realizar

Tareas a Realizar 5. Iniciar Xilinx Project Navigator y crear un nuevo proyecto llamado SCounter .

5. Iniciar Xilinx Project Navigator y crear un nuevo proyecto llamado SCounter.

6. Crear un nuevo archivo fuente llamado SCounter.v, seleccionar “Verilog Module” en el “Source Type”.

7. Copiar el siguiente código de Verilog en el archivo SCounter.v

el siguiente código de Verilog en el archivo SCounter.v 8. Crear otro archivo fuente llamada SevenSegmentDec.v

8. Crear otro archivo fuente llamada SevenSegmentDec.v, seleccionar “Verilog Module” en el “Source Type”.

9. Copiar el siguiente código de Verilog en el archivo SevenSegmentDec.v 10. Crear un archivo

9. Copiar el siguiente código de Verilog en el archivo SevenSegmentDec.v

código de Verilog en el archivo SevenSegmentDec.v 10. Crear un archivo fuente llamado SCounter_Main.v ,

10. Crear un archivo fuente llamado SCounter_Main.v, seleccionar “Verilog Module” en el “Source Type”.

11. Copiar el siguiente código de Verilog en el archivo SCounter_Main.v:

Module ” en el “ Source Type ”. 11. Copiar el siguiente código de Verilog en
12. Crear un nuevo archivo fuente llamado SCounter.ucf , seleccionar “ Implementation Constraint File” en

12. Crear un nuevo archivo fuente llamado SCounter.ucf, seleccionar “Implementation Constraint File” en el “Source Type”. 13. Copiar el siguiente código en el archivo SCounter.ucf

13. Copiar el siguiente código en el archivo SCounter.ucf Nota: Este no es código de Verilog,

Nota: Este no es código de Verilog, este archivo contiene el mapeo de pines de la FPGA con las señales definida en la descripción de Verilog.

14. Compile el proyecto y cárguelo al FPGA utilizando la herramienta Xilinx IMPact. Una vez cargado pruebe el proyecto utilizando los pulsadores para generar señales de RESET y el CLOCK. Recordar que el valor del contador se incrementará cada vez que ocurre un pulso positivo en la señal de reloj.

Laboratorio 3: Modelando una memoria ROM síncrona Objetivo El objetivo de este laboratorio es modelar

Laboratorio 3: Modelando una memoria ROM síncrona Objetivo

El objetivo de este laboratorio es modelar una memoria ROM de 16 palabras, cada una de 4 bits.

Al finalizar este laboratorio el estudiante será capaz de:

1. Utilizar la sentencia case de Verilog para modelar memorias ROM.

2. Utilizar la sentencia reg para definir un almacenamiento temporal.

Implementación

El circuito que vamos a implementar será una memoria ROM síncrona. Utilizaremos los switches disponibles en la FPGA para generar la dirección a leer, y al igual que en laboratorios anteriores utilizaremos un pulsador para generar la señal de reloj. El contenido de la memoria será desplegado en 4 LEDs, también disponibles en la FPGA.

Diagrama del Circuito

LEDs, también disponibles en la FPGA. Diagrama del Circuito Tareas a Realizar 1. Iniciar Xilinx ISE

Tareas a Realizar

1. Iniciar Xilinx ISE Project Navigator y crear un nuevo proyecto llamado MemROM.

2. Crear un nuevo archivo llamado SyncROM.v, seleccionando “Verilog Module” en el “Source Type”

3. Copiar el siguiente código de Verilog, en el archivo SyncROM.v 4. Crear un nuevo
3.
Copiar el siguiente código de Verilog, en el archivo SyncROM.v
4.
Crear un nuevo archivo llamado SyncROM_Main.v, seleccionando “Verilog Module” en
el “Source Type”
5. Copiar el siguiente código de Verilog , en el archivo SyncROM_Main.v 6. Crear un

5. Copiar el siguiente código de Verilog, en el archivo SyncROM_Main.v

código de Verilog , en el archivo SyncROM_Main.v 6. Crear un nuevo archivo fuente llamado SyncROM.ucf

6. Crear un nuevo archivo fuente llamado SyncROM.ucf, seleccionar “Implementation Constraint File” en el “Source Type

7. Copiar el siguiente código en el archivo SyncROM.ucf

7. Copiar el siguiente código en el archivo SyncROM.ucf 8. Compilar el proyecto y cargarlo al

8. Compilar el proyecto y cargarlo al FPGA. Probar el circuito utilizando los switches del 0- 4, para generar la dirección a leer, luego con el pulsador 0 generar pulsos de reloj y observar el valor desplegado en los LEDs.

generar la dirección a leer, luego con el pulsador 0 generar pulsos de reloj y observar
Laboratorio 4: Modelando una memoria RAM Síncrona Objetivo El objetivo de este laboratorio es modelar

Laboratorio 4: Modelando una memoria RAM Síncrona Objetivo

El objetivo de este laboratorio es modelar una memoria RAM síncrona de 16 palabras, cada una de 4 bits cada una (16x4).

Al finalizar este laboratorio el estudiante será capaz de:

1. Utilizar arreglos de 2 dimensiones para modelar memorias RAM.

Implementación

El circuito que vamos a implementar será una memoria RAM síncrona 16x4, 16 palabras de 4 bits. Para probar este laboratorio será necesario implementar un programa en ChipKit que escriba una serie de 16 palabras aleatorias, y luego lea las palabras y compruebe que los valores son correctos. La interfaz de ChipKit mostrará los resultados de la prueba utilizando la interfaz serial. Las señales de entrada/salida del circuito serán mapeadas a pines de propósito general de la FPGA (GPIO0 GPIO13), de la siguiente manera:

Pin(es)

Señal

GPIO0

Write Enable

GPIO1

Clock

GPIO2 … GPIO5

Address

GPIO6 … GPIO9

Data In

GPIO10 …

Data Out

GPIO13

Diagrama del Circuito

GPIO10 … Data Out GPIO13 Diagrama del Circuito Tareas a Realizar 1. Iniciar Xilinx ISE Project

Tareas a Realizar

1. Iniciar Xilinx ISE Project Navigator y crear un nuevo proyecto llamado MemRAM.

3. Copiar el siguiente código de Verilog , en el archivo SyncRAM.v 4. Crear un

3. Copiar el siguiente código de Verilog, en el archivo SyncRAM.v

el siguiente código de Verilog , en el archivo SyncRAM.v 4. Crear un nuevo archivo llamado

4. Crear un nuevo archivo llamado SyncRAM_Main.v, seleccionando “Verilog Module” en el “Source Type”

5. Copiar el siguiente código de Verilog, en el archivo SyncRAM_Main.v

código de Verilog , en el archivo SyncRAM_Main.v 6. Crear un nuevo archivo fuente llamado SyncRAM.ucf

6. Crear un nuevo archivo fuente llamado SyncRAM.ucf, seleccionar “Implementation Constraint File” en el “Source Type

7. Copiar el siguiente código en el archivo SyncRAM.ucf Compilar el proyecto y cargarlo al

7. Copiar el siguiente código en el archivo SyncRAM.ucf

7. Copiar el siguiente código en el archivo SyncRAM.ucf Compilar el proyecto y cargarlo al FPGA.

Compilar el proyecto y cargarlo al FPGA. Hacer las conexiones correspondientes entre ChipKit y la FPGA, luego ejecute el programa de prueba desde ChipKit y compruebe que los resultados mostrados son correctos.

y la FPGA , luego ejecute el programa de prueba desde ChipKit y compruebe que los
Laboratorio 5: Modelando una Unidad Aritmética Lógica Objetivo El objetivo de este laboratorio es modelar

Laboratorio 5: Modelando una Unidad Aritmética Lógica

Objetivo

El objetivo de este laboratorio es modelar una unidad aritmética lógica de 5 operaciones sobre operandos de 4 bits. Al finalizar este laboratorio el estudiante deberá ser capaz de:

1. Entender el rol de la Unidad Aritmética Lógica en un procesador.

2. Utilizar el operador + para implementar sumadores.

3. Utilizar el operador - para implementar restadores.

Implementación

En este laboratorio implementaremos una Unidad Aritmética Lógica con 5 operaciones, las cuales serán aplicadas a operandos de 4 bits, la salida será el resultado de la operación. Las operaciones que se implementarán son las siguientes:

1.

Suma

2.

Resta

3.

Y lógico

4.

O lógico

5.

O exclusivo

Para probar el circuito se deberá implementar una aplicación de prueba en ChipKit utilizando la interfaz serial. La aplicación deberá ejecutar una serie de pruebas para cada operación de la ALU y reportar cualquier error utilizando la interfaz serial de ChipKit.

Diagrama del Circuito

para cada operación de la ALU y reportar cualquier error utilizando la interfaz serial de ChipKit.

Tareas a Realizar

Tareas a Realizar Este proyecto deberá ser implementado llevando a cabo las acciones de la manera

Este proyecto deberá ser implementado llevando a cabo las acciones de la manera que el implementador juzgue apropiado, como parte del proyecto deberá tener un módulo para la Unidad Aritmética Lógica, la cual contendrá el siguiente código de Verilog:

Lógica, la cual contendrá el siguiente código de Verilog: Los módulos restantes quedan a criterio del

Los módulos restantes quedan a criterio del implementador. Se deberá tener en cuenta que para implementar el proyecto en la FPGA hay que crear un archivo con el mapeo de pines, para decidir el mapeo de pines se puede utilizar el “Anexo 1: Mapeo de pines en la placa FPGA de National Instruments

Laboratorio 6: Modelando un Archivo de Registros Objetivo El objetivo de este laboratorio es modelar

Laboratorio 6: Modelando un Archivo de Registros Objetivo

El objetivo de este laboratorio es modelar un archivo de registros el cual contendrá 4 registros de 8 bits cada uno. El archivo de registro proveerá dos puertos de lectura y un puerto de escritura para su acceso. Al finalizar este laboratorio el estudiante deberá ser capaz de:

1. Modelar un archivo de registros como parte del almacenamiento de un procesador.

Implementación

El archivo de registros es el almacenamiento más cercano al procesador, por esta razón también es el más limitado y a la vez el más rápido. El archivo de registros es diferente de la memoria caché. En este laboratorio implementaremos un archivo de registros, el cual más adelante integraremos junto con la ALU y otros componentes para formar un procesador de un solo ciclo. El archivo de registros contendrá las siguientes señales:

Señal

Descripción

Read Address

Dirección del primer registro a leer

1

Read Address

Dirección del segundo registro a

1

leer

Write Address

Dirección del registro a escribir

Write Data

Datos a escribir en el registro especificado por Write Address

Read Data 1

Datos del primer puerto de lectura

Read Data 2

Datos del segundo puerto de lectura

Write Enable

Activar escritura. Si esta señal es ‘1’, el archivo de registro escribirá el valor especificado en el puerto de escritura, en el pulso positivo del reloj.

Clock

Señal de reloj

Para probar el circuito se deberá implementar una aplicación de prueba en ChipKit utilizando la interfaz serial. La aplicación deberá ejecutar una serie de escrituras y lecturas en el archivo de registros, cualquier error deberá ser reportado utilizando la interfaz serial de ChipKit.

Diagrama del Circuito

Diagrama del Circuito Tareas a Realizar Este proyecto deberá ser implementado llevando a cabo las acciones

Tareas a Realizar

Diagrama del Circuito Tareas a Realizar Este proyecto deberá ser implementado llevando a cabo las acciones

Este proyecto deberá ser implementado llevando a cabo las acciones de la manera que el implementador juzgue apropiado, como parte del proyecto deberá tener un módulo para el Archivo de Registros, el cual contendrá el siguiente código de Verilog:

, el cual contendrá el siguiente código de Verilog: Los módulos restantes quedan a criterio del

Los módulos restantes quedan a criterio del implementador. Se deberá tener en cuenta que para implementar el proyecto en la FPGA hay que crear un archivo con el mapeo de pines, para decidir el mapeo de pines se puede utilizar el “Anexo 1: Mapeo de pines en la placa FPGA de National Instruments

Laboratorio 7: Modelando la unidad de control para el procesador MIPS8 Objetivo El objetivo de

Laboratorio 7: Modelando la unidad de control para el procesador MIPS8 Objetivo

El objetivo de este laboratorio es modelar una unidad de control para el procesador MIPS8, el conjunto de instrucciones soportadas por MIPS8 se resume en la Tabla 1. Al finalizar este laboratorio el estudiante deberá ser capaz de:

1. Conocer el conjunto de instrucciones de MIPS8

2. Diseñar e Implementar la unidad de control de MIPS8 utilizando Verilog.

Implementación

La unidad de control de control es la última pieza para completar nuestro diseño de un procesador de un solo ciclo. La siguiente imagen muestra el diagrama del procesador, el cual ejecuta las instrucciones detalladas en la Tabla 1.

el cual ejecuta las instrucciones detalladas en la Tabla 1. El objetivo del último laboratorio, será

El objetivo del último laboratorio, será integrar todos estos componentes (incluyendo la unidad de control) para lograr una implementación de nuestro procesador de un solo ciclo.

Conjunto de Instrucciones de MIPS8

Conjunto de Instrucciones de MIPS8 Formato de Instrucción Operación nop No operación 00000 00000000000

Formato de Instrucción

Operación

nop

No operación

00000

00000000000

add rd, rs

 

rd ← rd + rs Actualiza el registro Flags

00001

rd rs 0000000

sub rd, rs

 

rd ← rd - rs Actualiza el registro Flags

00010

rd rs 0000000

or

rd, rs

rd ← rd | rs Actualiza el registro Flags

00011

rd rs 0000000

and rd, rs

 

rd ← rd & rs Actualiza el registro Flags

00100

rd rs 0000000

xor rd, rs

 

rd ← rd ^ rs Actualiza el registro Flags

00101

rd rs 0000000

mov rd, rs

 

rd ← rs

00110

rd rs 0000000

lw

rd, rs

rd ← M[rs]

00111

rd rs 0000000

sw

rd, rs

M[rs] ← rd

01000

rd rs 0000000

li

rd, N

rd ← N

01001

rd N 0

addi rd, N

 

rd ← rd + N Actualiza el registro Flags

01010

rd N 0

subi rd, N

 

rd ← rd – N Actualiza el registro Flags

01011

rd N 0

cmp rd, rs

 

temp ← rd - rs Actualiza el registro Flags

01100

rd rs 0000000

jz

L

if (Flags.Zero) PC ← L

01101

L 000

jnz L

 

if (!Flags.Zero) PC ← L

01110

L 000

jg

L

if (Flags.Sign==Flags.Ovf and !Flags.Zero) PC ← L

01111

L 000

jl

L

if (Flags.Sign != Flags.Ovf) PC ← L

10000

L 000

jump L

 

PC ← L

10001

L 000

Tabla 1: Conjunto de Instrucciones de MIPS8

Señales de la Unidad de Control

Señales de la Unidad de Control Señal Descripción RegWrite Indica si el archivo de registros escribirá

Señal

Descripción

RegWrite

Indica si el archivo de registros escribirá un registro al final del ciclo de reloj.

IsMove

Indica si la instrucción actual es un “mov”

IsMemAccess

Indica si la instrucción actual es “lw” (Load Word from Memory)

IsImm

Indica si la instrucción actual es un “li”(Load Immediate)

ALU Function

Indica la operación que la ALU debe ejecutar

Write Flags

Indica si el registro Flags se debe escribir al final del ciclo de reloj.

DM Write Enable

Indica si el Data Memory debe ejecutar una escritura al final del ciclo de reloj.

IsJz

Indica si la instrucción actual es un “jz”(Jump if zero)

IsJnz

Indica si la instrucción actual es un “jnz”(Jump if not zero)

IsJl

Indica si la instrucción actual es un “jl”(Jump if less)

IsJg

Indica si la instrucción actual es un “jg”(Jump if greater)

IsJump

Indica si la instrucción actual es un “jump”(Jump)

Tareas a Realizar

La tarea en este laboratorio es implementar la unidad de control utilizando Verilog. El módulo tendrá como entrada el código de la instrucción, el cual es de 5 bits y la salida serán todas las señales de control. Se recomienda utilizar la sentencia case de Verilog. La declaración del módulo será la siguiente:

module ControlUnit( input [4:0] opcode, output reg reg_write, output reg is_move, output reg is_mem_access, output reg is_imm, output reg [2:0] alu_function, output reg flags_write, output reg dm_write_enable, output reg is_jz, output reg is_jnz, output reg is_jl, output reg is_jg, output reg is_jump ); // TODO

endmodule;

La última parte de este laboratorio consiste en diseñar un test bench, para depurar y asegurar el funcionamiento correcto de la unidad de control.

Laboratorio 8: Implementación del procesador MIPS8 Objetivo El objetivo de este último laboratorio es integrar

Laboratorio 8: Implementación del procesador MIPS8

Objetivo

El objetivo de este último laboratorio es integrar todos modelar una unidad de control para el procesador MIPS8, el conjunto de instrucciones soportadas por MIPS8 se resume en la Tabla 1. Al finalizar este laboratorio el estudiante deberá ser capaz de:

1. Implementar un procesador de un solo ciclo (MIPS8).

2. Crear programas en ensamblador y en lenguaje de máquina para MIPS8.

3. Ejecutar programas en MIPS8 y verificar su correcto funcionamiento en modo de simulación y en implementación.

Implementación

MIPS8 es un procesador de un solo ciclo, lo que significa que cada instrucción se ejecutará en un ciclo de reloj. Para la implementación de MIPS8 hay que utilizar como referencia el diagrama del procesador, presentado en el laboratorio 7.

Tareas a realizar

Las tareas a realizar en este laboratorio son:

1. Crear un módulo que será el principal, en este se instanciarán y se interconectarán todos

los módulos del procesador, como ser el “Instruction Memory”, “Register File”, “ALU”, “Data

Memory”, “Control Unit”, etc.

2. Utilizar la herramienta mips8asm, el cual es un ensamblador para MIPS8. Con esta

herramienta generamos el contenido del Instruction Memory, la cual es una ROM y tendrá el

programa a ejecutar.

3. Diseñar un test-bench para comprobar el funcionamiento del procesador.

4. Implementar el procesador en la FPGA y diseñar una interfaz con Arduino/ChipKit, para

ejecutar pruebas sobre el procesador.

Enlaces

Herramienta MIPS8 Assembler

https://dl.dropboxusercontent.com/u/21821636/Clases/Org.%20de%20Computadoras/Resources/mips8asm.exe

Código fuente de MIPS8 Assembler

https://github.com/ideras/MIPS8ASM

Anexos

Anexos
Anexo 1: Mapeo de Pines en la placa FPGA de National Instruments Net "sys_clk_pin" LOC

Anexo 1: Mapeo de Pines en la placa FPGA de National Instruments

Net "sys_clk_pin" LOC="B8"; Net "sys_clk_pin" IOSTANDARD = LVCMOS33;

## System level constraints Net "sys_clk_pin" TNM_NET = sys_clk_pin; TIMESPEC TS_sys_clk_pin = PERIOD "sys_clk_pin" 20000 ps;

## FPGA pin constraints Net "SW0" LOC="J11" | IOSTANDARD = LVCMOS33; Net "SW1" LOC="J12" | IOSTANDARD = LVCMOS33; Net "SW2" LOC="H16" | IOSTANDARD = LVCMOS33; Net "SW3" LOC="H13" | IOSTANDARD = LVCMOS33; Net "SW4" LOC="G12" | IOSTANDARD = LVCMOS33; Net "SW5" LOC="E14" | IOSTANDARD = LVCMOS33; Net "SW6" LOC="D16" | IOSTANDARD = LVCMOS33; Net "SW7" LOC="B16" | IOSTANDARD = LVCMOS33; Net "BTN0" LOC="C13" | IOSTANDARD = LVCMOS33; Net "BTN1" LOC="D12" | IOSTANDARD = LVCMOS33; Net "BTN2" LOC="C12" | IOSTANDARD = LVCMOS33; Net "BTN3" LOC="C10" | IOSTANDARD = LVCMOS33; Net "LED0" LOC="C11" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; Net "LED1" LOC="D11" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; Net "LED2" LOC="B11" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; Net "LED3" LOC="A12" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; Net "LED4" LOC="A13" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; Net "LED5" LOC="B13" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; Net "LED6" LOC="A14" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; Net "LED7" LOC="B14" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8;

Net "GPIO0" LOC="A10" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; Net "GPIO1" LOC="E11" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; Net "GPIO2" LOC="E10" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; Net "GPIO3" LOC="D10" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; Net "GPIO4" LOC="E9" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; Net "GPIO5" LOC="A9" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; Net "GPIO6" LOC="D9" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; Net "GPIO7" LOC="E8" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; Net "GPIO8" LOC="C8" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; Net "GPIO9" LOC="D8" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; Net "GPIO10" LOC="F9" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; Net "GPIO11" LOC="A7" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; Net "GPIO12" LOC="D7" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; Net "GPIO13" LOC="E7" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8;

Net "GPIO14" LOC ="F8" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE =

Net "GPIO14" LOC="F8" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; Net "GPIO15" LOC="C6" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; Net "GPIO16" LOC="D6" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; Net "GPIO17" LOC="A5" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; Net "GPIO18" LOC="A4" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; Net "GPIO19" LOC="B4" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; Net "GPIO20" LOC="C5" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; Net "GPIO21" LOC="C4" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; Net "GPIO22" LOC="C3" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; Net "GPIO23" LOC="B1" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; Net "GPIO24" LOC="L5" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; Net "GPIO25" LOC="P1" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; Net "GPIO26" LOC="P2" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; Net "GPIO27" LOC="M1" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; Net "GPIO28" LOC="R1" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; Net "GPIO29" LOC="R2" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; Net "GPIO30" LOC="N5" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; Net "GPIO31" LOC="T5" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8;

Net "SEGA0" LOC="E3" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; Net "SEGB0" LOC="E1" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; Net "SEGC0" LOC="G5" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; Net "SEGD0" LOC="D1" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; Net "SEGE0" LOC="E4" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; Net "SEGF0" LOC="C1" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; Net "SEGG0" LOC="C2" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; Net "COM0" LOC="B2" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; Net "SEGA1" LOC="H6" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; Net "SEGB1" LOC="K2" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; Net "SEGC1" LOC="H3" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; Net "SEGD1" LOC="K1" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; Net "SEGE1" LOC="G4" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; Net "SEGF1" LOC="J2" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; Net "SEGG1" LOC="G3" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; Net "COM1" LOC="G2" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8;

Net "J1_IO1" LOC ="C15" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8; Net "J1_IO2" LOC ="F13" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8; Net "J1_IO3" LOC ="F14" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8; Net "J1_IO4" LOC ="G13" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8; Net "J1_IO7" LOC ="F12" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8; Net "J1_IO8" LOC ="D14" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8; Net "J1_IO9" LOC ="F15" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8; Net "J1_IO10" LOC ="G14" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8;

Net "J2_IO2" LOC ="J13" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE =

Net "J2_IO2" LOC ="J13" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8; Net "J2_IO3" LOC ="K13" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8; Net "J2_IO4" LOC ="H11" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8; Net "J2_IO7" LOC ="H12" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8; Net "J2_IO8" LOC ="J14" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8; Net "J2_IO9" LOC ="K14" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8; Net "J2_IO10" LOC ="K12" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8;

Net "J3_IO1" LOC ="D15" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8; Net "J3_IO2" LOC ="G16" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8; Net "J3_IO3" LOC ="J16" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8; Net "J3_IO4" LOC ="K15" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8; Net "J3_IO7" LOC ="C16" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8; Net "J3_IO8" LOC ="G15" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8; Net "J3_IO9" LOC ="H15" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8; Net "J3_IO10" LOC ="K16" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8;

Net "J4_IO1" LOC ="M16" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8; Net "J4_IO2" LOC ="L14" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8; Net "J4_IO3" LOC ="P15" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8; Net "J4_IO4" LOC ="R15" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8; Net "J4_IO7" LOC ="L15" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8; Net "J4_IO8" LOC ="N16" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8; Net "J4_IO9" LOC ="P16" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8; Net "J4_IO10" LOC ="R16" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8;

Net "J5_IO1" LOC ="T13" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8; Net "J5_IO2" LOC ="R11" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8; Net "J5_IO3" LOC ="T8" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8; Net "J5_IO4" LOC ="P6" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8; Net "J5_IO7" LOC ="P14" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8; Net "J5_IO8" LOC ="R13" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8; Net "J5_IO9" LOC ="N10" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8; Net "J5_IO10" LOC ="R6" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8;

Net "J6_IO1" LOC ="M8" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8; Net "J6_IO2" LOC ="P8" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8; Net "J6_IO3" LOC ="N6" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8; Net "J6_IO4" LOC ="P5" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8; Net "J6_IO7" LOC ="N9" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8; Net "J6_IO8" LOC ="L8" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8; Net "J6_IO9" LOC ="N8" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8; Net "J6_IO10" LOC ="M6" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8;

Net "SCK" LOC = "R4" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8 ; Net "SDO" LOC = "T4" | IOSTANDARD = LVCMOS33 ;

Net "SDI" LOC = "P3" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE

Net "SDI" LOC = "P3" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; Net "AD_CONV" LOC = "P12" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 6; Net "AMP_DO" LOC ="T3" | IOSTANDARD = LVCMOS33; Net "AMP_SHDN" LOC ="M10" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 6; Net "AMP_CS" LOC ="P11" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 6; Net "DAC_CS" LOC = "N12" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; Net "DAC_CLR" LOC ="P13" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8;