Está en la página 1de 120

Prcticas de Mquina Sencilla con FPGA

TITULACIN: Enginyeria Tcnica Industrial en Electrnica Industrial


AUTOR: Alan Morato Gomis
DIRECTOR: Enrique F. Cant Navarro


FECHA: junio del 2011.
Prcticas de Mquina Sencilla con FPGA ndice General

1

1 ndice General

2 Introduccin Pg. 3
2.1 Antecedentes Pg. 3
2.2 FPGA Pg. 3
2.2.1 Historia de la FPGA Pg. 4
2.3 Spartan-3 XC3S200 FT256 de Xilinx Pg. 5
2.4 Starter Board Kit Pg. 7
2.5 Lenguaje VHDL Pg. 8
2.6 La Mquina Sencilla Pg. 9
2.6.1 Formato de las I nstrucciones Pg. 10
2.6.2 Fases de la Ejecucin de una I nstruccin Pg. 10

3 Memoria Descriptiva Pg. 12
3.1 Simplificaciones para la Implementacin Pg. 12
3.1.2 Cdigos Genricos de Partida Pg. 13
3.1.2.1 Reg Registro Pg. 14
3.1.2.2 Reg1 Registro de 1 bit Pg. 15
3.1.2.3 Mux4 Multiplexor de 4 entradas Pg. 15
3.1.2.4 Mux2 Multiplexor de 2 entradas Pg. 16
3.1.2.5 inc - Incrementador Pg. 16
3.1.2.6 ALU Unidad Aritmtico Lgica Pg. 16
3.1.2.7 UD Unidad de Datos Pg. 16
3.1.2.8 UC Unidad de Control Pg. 17
3.1.2.9 RAM Memoria RAM Pg. 18
3.1.2.10 ROM Memoria ROM Pg. 19
3.1.2.11 RAM_pack Paquete de la memoria RAM Pg. 19
3.1.2.12 ROM_pack Paquete de la memoria ROM Pg. 19
3.1.2.13 led7seg Led 7 segmentos Pg. 20
3.1.2.14 dbug Debug Pg. 20
3.1.2.15 MaquinaSencilla Mquina Sencilla Pg. 20
3.1.2.16 MaquinaSencilla_test Mquina Sencilla test bench Pg. 21
3.1.2.17 MaquinaSencilla.ucf Mquina Sencilla ucf Pg. 21
3.2 Manual de Prcticas Pg. 22
3.3 Proceso General de Implementacin de la Mquina Sencilla Pg. 22
3.3.1 Unidad de Datos Pg. 22
3.3.2 Unidad de Control Pg. 23
3.3.3 Memoria Pg. 23
3.3.4 MquinaSencilla.VHDL Pg. 24
3.3.5 Simulacin Pg. 24
3.3.6 Programacin de la FPGA Pg. 25
3.4 Las Mquinas Sencillas Implementadas Pg. 25
3.4.1 Mquina Sencilla 1 Pg. 25
3.4.2 Mquina Sencilla 2 Pg. 28
3.4.3 Mquina Sencilla 3 Pg. 31
3.4.4 Mquina Sencilla 4 Pg. 34
3.4.5 Mquina Sencilla 5 Pg. 37
3.4.6 Mquina Sencilla 6 Pg. 41
3.4.7 Mquina Sencilla 7 Pg. 43
3.4.8 Mquina Sencilla 8 Pg. 47
3.4.9 Mquina Sencilla 9 Pg. 51
Prcticas de Mquina Sencilla con FPGA ndice General

2

3.4.10 Mquina Sencilla 10 Pg. 54

4 Conclusiones Pg. 59

5 Posibles Mejoras Pg. 60

6 Anexo Manual de Prcticas Pg. 61

7 Bibliografa y Referencias Pg. 119


Prcticas de Mquina Sencilla con FPGA Introduccin

3

2 Introduccin
2.1 Antecedentes
Este proyecto, titulado como Prcticas de Mquina Sencilla con FPGA, tiene como
objetivo preparar las prcticas que realizarn los futuros alumnos de Grado en Ingeniera
Electrnica Industrial y Automtica.
Las prcticas estn relacionas entorno a la Mquina Sencilla. Hasta el momento, los
estudiantes, a lo largo de los aos slo han estudiado la Mquina Sencilla tericamente, y
nunca se ha hecho nada prctico entorno a la Mquina Sencilla. Esto ha sido una de las
motivaciones para crear unas prcticas de Mquina Sencilla.
En las prcticas, el alumno tendr que:
Disear la mquina sencilla. Hacer el diseo de todos sus componentes y de su
jerarqua de bloques.
Simular la mquina sencilla diseada. Mediante el software de Xilinx, el alumno
comprobar que su diseo funciona correctamente observando las formas de onda
de las seales de la mquina sencilla diseada.
Implementar fsicamente la mquina sencilla. El diseo se implementar en una
FPGA. Se podr observar el funcionamiento real de la mquina sencilla mediante
leds y displays 7 segmentos. Adems, se dispondrn de dos relojes, el real de 50
MHz y el manual. Eso facilitar la observacin del funcionamiento.
Para la implementacin fsica se utilizan FPGAs. Las FPGAs utilizadas son de la familia
Spartan 3de Xilinx
[1]
, y estn integradas en una placa de pruebas llamada Starter Board
Kit
[2]
. Para la programacin de las FPGAs se utiliza el programa Xilinx ISE 12.3
[3]
. El
lenguaje de descripcin hardware que se utiliza para disear las mquinas sencillas es el
VHDL
[4]
.
Se ha dado por supuesto que el alumno no tiene ningn conocimiento sobre este lenguaje
ni sobre el software ISE 12.3. Por eso, en este proyecto, se ha redactado un manual de
prcticas.
En las prcticas, cada alumno tendr que implementar una mquina sencilla distinta. En
este proyecto se han implementado un total de 10 mquinas sencillas. El objetivo de
implementar estas mquinas sencillas ha sido detectar las posibles complicaciones con las
que se puede encontrar el alumno e intentar simplificarlas al mximo. Una de las
decisiones principales que se ha tomado para simplificar la problemtica, ha sido generar
unos ficheros genricos, que se pueden aprovechar, casi en su totalidad, para implementar
cualquier mquina sencilla. El alumno, modificando slo parcialmente estos cdigos podr
implementar distintas mquinas sencillas

2.2 FPGA
La mquina sencilla se puede implementar fsicamente de muchas maneras. Se puede
implementar con ASICs (Circuito Integrado de Aplicacin Especfica), CPLDs (Complex
Programmable Logic Device), etc.
Se ha decidido implementar la mquina sencilla con FPGAs por varios motivos:
Prcticas de Mquina Sencilla con FPGA Introduccin

4

- El Departamento de Ingeniera Electrnica, Elctrica y Automtica ya posee una
cierta cantidad de FPGAs Spartan 3 integradas en el Starter Board Kit. Porque se
utilizan en otras asignaturas. As que utilizando estas FPGAs se ahorra el coste de
comprar nuevo material.
- La programacin de las FPGAs se puede hacer con VHDL. Que se trata de un
lenguaje de alto nivel y relativamente fcil de aprender y utilizar.
- La flexibilidad de programacin que ofrece la FPGA no la ofrece la CPLD.
- Una FPGA se puede reprogramar, mientras que un ASIC no.
- La placa de pruebas donde se encuentra integrada la FPGA Spartan-3 ofrece
bastantes posibilidades para hacer la implementacin de la mquina sencilla ms
interactiva.
FPGA es el acrnimo de Field Programmable Gate Array. Se trata de un dispositivo
semiconductor que contiene bloques de lgica cuya interconexin y funcionalidad puede
ser configurada in situ mediante un lenguaje de programacin especializado, en este caso,
el VHDL. [4]

2.2.1 Historia de la FPGA
La FPGA es la evolucin del PLD y el ASIC.
Los PLDs empezaron con los primeros dispositivos PROM y se le aadi versatilidad con
los PAL, que permitieron un mayor nmero de entradas y la inclusin de registros.
Los ASIC siempre han tenido el problema que requieren una considerable inversin de
tiempo y dinero. Con el tiempo se intent reducir esta inversin de tiempo y dinero, para
ello se pas a la modularizacin de los elementos de los circuitos. Por ejemplo, se pas a
crear ASICs basados en celdas.
El paso definitivos fue combinar las dos estrategias con un mecanismo de interconexin
que se poda programar utilizando fusibles, antifusibles o celdas RAM.
Los circuitos que resultaron fueron las FPGAs que son similares en capacidad y
aplicaciones a los PLD ms grandes.
Las FPGAs se han utilizado histricamente como controladores,
codificadores/decodificadores y en microprocesadores hechos a medida.

Prcticas de Mquina Sencilla con FPGA Introduccin

5

2.3 Spartan-3 XC3S200 FT256 de Xilinx
En este proyecto se utiliza una FPGA Spartan-3 modelo XC3S200 FT256 de Xilinx,
empresa lder en el sector de las FPGAs. Esta FPGA est integrada en la placa de pruebas
Starter Board Kit.
La FPGA de esta placa incluye:
- 200.000 puertas lgicas equivalentes de capacidad
- 4.320 CLBs (Bloques Lgicos Configurables)
- 12 block RAMs de 18Kbits. En total 216Kbits de RAM distribuida en bloques.
- 12 18x18 multiplicadores hardware
- 4 DCMs (Digital Clock Managers)
- Hasta 173 seales I/O definidas por el usuario
Las block RAM son memorias configurables y sncronas. En ellas se pueden almacenar
cantidades relativamente grandes de datos de la manera ms eficiente posible dentro de la
FPGA.
En la implementacin de las memorias de la mquina sencilla se hace uso de estos bloques.
Cada CLB de esta FPGA tiene 4 slices agrupados por parejas e interconectados, tal y como
se ve en la siguiente imagen:

Figura 1. Contenido de CLB de la FPGA

Prcticas de Mquina Sencilla con FPGA Introduccin

6

A su vez, cada slice est formado por dos LUTs, 2 Flip-Flops y un conjunto de
multiplexores, puertas lgicas y otro elementos que los interconectan:
Figura 2. Diagrama Simplificado de un Slice

Prcticas de Mquina Sencilla con FPGA Introduccin

7

2.4 Starter Board Kit
En la placa de pruebas, hay:
PROM de configuracin programable in-system Xilinx XCF02S Platform Flash de
2 Mbits
- 1 Mbit de datos no voltiles o de almacenamiento de cdigo de aplicacin
disponible despus de la configuracin de la FPGA.
- Jumpers que permiten a la FPGA leer datos de la PROM o desde otras
fuentes.
1 Mbyte de Fast Asynchronous SRAM.
- Dos SRAMs de 256 k x 16 ISSI IS61 LV25616AL-10T a 10ns.
- Arquitectura de memoria configurable.
Array nico de 256k x 32 SRAM.
2 arrays independientes SRAM de 256 k x 16.
- Chip select individual por dispositivo.
- Byte enables individuales.
Display port de 3 bits y 8 colores VGA.
Puerto serie de RS-232 de 9 pines.
- Conector hembra DB9 de 9 pines.
- Traductor transceiver/level RS-232.
- Utiliza cable serie straight-through para conectar-se al puerto serie del
ordenador.
- Segundo canal RS-232 de transmisin y recepcin disponibles en los puntos
de prueba de la placa.
Puerto PS/2 style para ratn o teclado.
4 displays de siete segmentos LED
8 interruptores.
8 salidas LED individuales.
4 pulsadores.
Reloj de 50 MHz.
Zcalo para reloj auxiliar.
Configuracin de la FPGA seleccionable con jumpers.
Pulsador para forzar la reconfiguracin de la FPGA.
LED indicador de que se ha configurado la FPGA correctamente.
Prcticas de Mquina Sencilla con FPGA Introduccin

8

3 puertos de expansin de 40 pines.
Puerto JTAG para cable de descarga de bajo coste.
Cable Digilent JTAG download/debugging que conecta con el puerto paralelo del
PC.
Port donwload/debug JTAG compatible con Xilinx Parallel Cable IVi el MultiPro
Desktop Tool.
Entrada adaptadora de AC para las fuentes de alimentacin internacionales de +5V
no reguladas incluidas.
LED indicador de Power-on
Reguladores on-board de 3.3V, 3.5V y 1.2V.

Figura 3. Starter Board Kit

2.5 Lenguaje VHDL
El leguaje que se utiliza para la sntesis y la implementacin de la mquina sencilla es el
VHDL.
VHDL es el acrnimo que representa la combinacin de VHSIC y HDL, donde VHSIC es
el acrnimo de Very High Integrated Circuit y HDL es a su vez el acrnimo de Hardware
Description Language.
Es un lenguaje definido por el IEEE, Institute of Electrical and Electronics Engineers, y
usado por ingenieros para describir circuitos digitales. Otros mtodos para disear circuitos
son la captura de esquemas con herramientas CAD y los diagramas de bloques, pero stos
Prcticas de Mquina Sencilla con FPGA Introduccin

9

no son prcticos en diseos complejos. Otros lenguajes para el mismo propsito son
Verilog y ABEL.
El VHDL se trata de un lenguaje de descripcin de hardware a alto nivel que puede
utilizarse para modelar, documentar, simular, verificar y sintetizar sistemas digitales.
Proporciona soporte suficiente para especificar su comportamiento o su estructura,
incluyendo las jerarquas. Por lo tanto, es til para metodologas de diseo ascendientes
(bottom-up) y descendientes (top-down).
La semntica y construcciones del lenguaje permiten disear bancos de pruebas (test-bench)
mediante los cuales es pueden hacer simulaciones de los sistemas modelados.
Aunque puede ser usado de forma general para describir cualquier circuito se usa
principalmente para programa PLD, FPGA, ASIC y similares.
2.6 La Mquina Sencilla
[6]

La mquina sencilla se trata de un computador simplificado. Un computador se define
como una mquina capaz de resolver problemas ejecutando, de manera secuencial, un
programa.
Un programa se trata de una secuencia de instrucciones que describen como ejecutar una
tarea determinada. En el caso de la mquina sencilla, el programa es hecho a base de
lenguaje mquina.
El leguaje mquina se trata de un conjunto de instrucciones primitivas que entiende un
computador.
Este computador simplificado tiene principalmente los siguientes bloques:
Memoria: Parte del computador encargada de almacenar las instrucciones del
programa y los datos relacionados mientras se ejecuta el programa. Hay de dos
tipos:
- RAM: almacena datos del programa y del usuario.
- ROM: almacena datos y programas propios del computador.

Unidad Central de Proceso (CPU): su funcin es ejecutar los programas
almacenados en memoria y ejecutar las operaciones sobre los datos. Tiene dos
partes:
- Unidad de Datos (UD): ejecuta las operaciones segn lo que le ordena la
Unidad de Control. Est compuesta por distintos componentes:
Unidad Aritmtico Lgica (ALU): realiza las operaciones
aritmticas (sumas, restas, multiplicaciones, etc.) y lgicas (and, or,
xor, nor, etc.)
Registros generales: memoria de alta velocidad usada para
almacenar resultados intermedios
Registros especficos: memoria de alta velocidad con funciones
especiales. Suelen ser:
o Contador de Programa (PC): contiene la direccin de la
palabra de memoria donde se encuentra la siguiente
instruccin a ejecutar.
o Registro de Instrucciones (IR): contiene el cdigo a
ejecutar
Prcticas de Mquina Sencilla con FPGA Introduccin

10

o Registro de Estado (SR): sus bits memorizan situaciones
especiales como resultado cero, desbordamiento, etc.
- Unidad de Control (UC): parte de la CPU encargada de gobernar el resto
del computador. Para cada instrucciones del programa, la UC decide que
operaciones tiene que realizar la UD y el resto de bloques del computador.
Buses: son las vas de comunicacin entre los distintos bloques del computador.
Hay de tres tipos:
- Bus de datos: a travs de l se realiza las transferencia de datos y de
instrucciones desde la memoria hasta la CPU (lectura) o des de la CPU a la
memoria (escritura). Es bidireccional.
- Bus de direcciones: a travs de l, la CPU enva las direcciones de
memoria donde se encuentran las instrucciones que se han de leer o las
direcciones de memoria o perifricos donde se han de leer o escribir los
datos. Es unidireccional.
- Bus de control: a travs de l se transmiten las seales de control: lectura,
escritura, reloj, etc.). Es bidireccional.

2.6.1 Formato de las Instrucciones
Instruccin: es un cdigo binario con dos partes diferentes:
Cdigo de operacin: identifica la operacin que se ejecutar.

Cdigo de direccionamiento: indica cmo encontrar los operandos necesarios para
ejecutar la operacin.
Modos de direccionamiento: son los distintos modos que hay para indicar cmo encontrar
los operandos. Los ms utilizados son:
Modo inmediato: el cdigo de direccionamiento de la instruccin contiene el
operando directamente.

Modo absoluto o directo: el cdigo de direccionamiento de la instruccin contiene
la direccin de memoria donde se encuentra el operando.

Modo indirecto: el cdigo de direccionamientos de la instruccin contiene la
direccin de memoria donde est la direccin donde est el operando.

2.6.2 Fases de la Ejecucin de una Instruccin
En general, se puede decir que la ejecucin de una instruccin est dividida en 4 fases:
1) Fetch: bsqueda en memoria de la instruccin, almacenamiento de la instruccin
en IR e incremento del PC, que apuntar a la siguiente instruccin.

2) Decodificacin: decodificacin de la instruccin, se analiza el cdigo de operacin.

3) Bsqueda: se buscan los operandos en memoria o se evala el Status Register.
Prcticas de Mquina Sencilla con FPGA Introduccin

11


4) Ejecucin: ejecucin de la instruccin y almacenamiento de los resultados en
memoria.

La activacin de los bloques correspondientes de la Unidad de Datos y el seguimiento de la
buena secuencia de operaciones lo realiza la Unidad de Control siguiendo un grafo de
estados. Este grafo de estados se trata de una mquina de estados finitos. Las condiciones
de salto de un estado a otro de la mquina de estados las imponen las seales de entrada a
la Unidad de Control, como puede ser el cdigo de operacin, el flag Z, etc.
En el grafo de estados de la UC, cada estado lleva asociado un vector binario de salida.
Este vector almacena los bits de control que manda la Unidad de Control hacia la Unidad
de Datos y la memoria. Pueden ser bits de habilitacin de registros, bits de seleccin de
multiplexores, la seal de lectura/escritura de memoria, etc.


Prcticas de Mquina Sencilla con FPGA Memoria Descriptiva

12

3 Memoria Descriptiva
En este documento se describe el proceso general de implementacin de la mquina
sencilla en VHDL, las distintas decisiones que se han tomado para la simplificacin de la
implementacin, las distintas mquinas sencillas que se han implementado en este proyecto
y el Manual de Prcticas.
3.1 Simplificaciones para la Implementacin
En este apartado se explican las decisiones que se han tomado para intentar simplificar al
mximo el proceso de implementacin de la mquina sencilla.
El primer problema que se presenta para preparar las prcticas que cara al alumno es que el
alumno no conoce el leguaje VHDL. Y muy probablemente, nunca ha utilizado un
lenguaje de descripcin hardware. As que hay dos opciones, ensearle el leguaje VHDL a
fondo para que luego el alumno se sepa valer por s mismo para disear la mquina sencilla
desde cero, o bien, ensear al alumno el lenguaje VHDL de la manera ms sencilla y
prctica posible, de tal manera que slo tenga que saber lo justo y necesario para
implementar una mquina sencilla en VHDL.
Como el objetivo de las prcticas es implementar una mquina sencilla, y no aprender a
disear hardware en VHDL, se ha decidido que al alumno slo se le ensear la base
necesaria de VHDL para que pueda implementar una mquina sencilla sin problemas. Y
adems, se ha escrito un manual de prcticas donde se explica la teora necesaria de VHDL
de la manera ms sencilla posible.
El segundo dilema que ha aparecido durante el proyecto, est tambin relacionado con el
VHDL. Porque en VHDL hay muchos mtodos posibles para llegar a un mismo fin. Hay
muchos tipos de descripciones para llegar a definir un mismo circuito. En VHDL hay tres
formas generales de descripcin:
- Descripcin de comportamiento
- Descripcin de flujo de datos
- Descripcin estructural
Para los componentes de nivel ms bajo en la jerarqua de bloques, se ha combinado la
descripcin de comportamiento con la de flujo de datos. Y para componentes que abarcan
ms subcomponentes, como por ejemplo la Unidad Datos, que abarca registros y
multiplexores, se ha utilizado principalmente descripcin estructural.
Pero no slo hay distintos tipos de descripcin, sino que tambin hay distintas maneras de
organizar los archivos o componentes. Por ejemplo, se puede describir toda la mquina
sencilla entera en un solo archivo, y en l describir todos los componentes y
subcomponentes de la mquina sencilla. O tambin, se puede definir un archivo para cada
componente de la mquina sencilla: un archivo para componente de tipo registro, otro para
tipo multiplexor, otro para tipo Unidad de Datos, etc.
En este proyecto se ha decidido que cada tipo de componente se describir en un archivo
aparte. De esta manera, cabe la posibilidad de intentar hacer archivos genricos para
algunos tipos de componentes.
De hecho, esto es lo que se ha hecho en el proyecto. Se han descrito unos componentes
genricos en unos archivos, que se pueden aprovechar para cualquier mquina sencilla.
Prcticas de Mquina Sencilla con FPGA Memoria Descriptiva

13

Estos cdigos genricos el alumno los tendr desde un buen inicio. Esto simplifica mucho
el proceso de implementacin. Porque el alumno se ahorra mucha cantidad de descripcin
en VHDL. Y como menos descripcin en VHDL tenga que hacer, menos lenguaje VHDL
hay que ensearle.

3.1.2 Cdigos Genricos de Partida
Los cdigos genricos de partida que se han diseado son los siguientes:
UD
Unidad de Datos. Se trata de una Unidad de Datos genrica. No se puede
aprovechar totalmente, pero el cdigo sirve de pauta.

UC
Unidad de Control. Se trata de una Unidad Control genrica. No se puede
aprovechar totalmente, pero el cdigo sirve de pauta.

Reg1
Registro de 1 bit. Totalmente aprovechable para cualquier mquina sencilla.

Reg
Registro. A cada registro se le puede determinar, individualmente, su tamao en
bits. Totalmente aprovechable para cualquier mquina sencilla.

Mux4
Multiplexor de 4 entradas. A cada multiplexor se le puede determinar,
individualmente, el tamao de sus entradas/salida en bits. Totalmente aprovechable
para cualquier mquina sencilla.

Mux2
Multiplexor de 2 entradas. A cada multiplexor se le puede determinar,
individualmente, el tamao de sus entradas/salida en bits. Totalmente aprovechable
para cualquier mquina sencilla.

Inc
Incrementador. Se trata del bloque +1 que siempre suele ir adjunto al registro
PC. Se puede determinar el tamao de su entrada/salida en bits. Totalmente
aprovechable para cualquier mquina sencilla.

ALU
Unidad Aritmtico-Lgica. Este es un archivo ejemplo, cada mquina sencilla tiene
su propia ALU. Aunque este archivo puede servir de pauta.


Prcticas de Mquina Sencilla con FPGA Memoria Descriptiva

14

RAM
Memoria RAM de la mquina sencilla. Este archivo es suficientemente genrico
para que funcione en cualquier mquina sencilla.

RAM_pack
Paquete de la memoria RAM. Se trata de un archivo auxiliar para la memoria. De
este archivo slo hay que modificar un par de constantes.

ROM
Memoria ROM de la mquina sencilla. Este archivo es suficientemente genrico
para que funcione en cualquier mquina sencilla.

ROM_pack
Paquete de la memoria ROM. Se trata de un archivo auxiliar para la memoria. De
este archivo slo hay que modificar un par de constantes.

MaquinaSencilla
La mquina sencilla. Es el archivo que recoge todos los componentes: UD, UC y
memoria(s). No es totalmente aprovechable, pero sirve de pauta.

MaquinaSencilla_test
Se trata de un archivo necesario para poder simular la mquina sencilla en cuestin.
Totalmente aprovechable para cualquier mquina sencilla.

Led7seg
Led de 7 segmentos. Se trata de un archivo necesario para poder utilizar los
displays de 7 segmentos que tiene el kit Spartan-3. Totalmente aprovechable para
cualquier mquina sencilla.

Dbug
Debug. Se trata de un archivo donde se gestionan las seales que se mostrarn
mediante leds o el display. Totalmente aprovechable para cualquier mquina
sencilla.

3.1.2.1 Reg Registro
Este se trata del cdigo que implementa un Registro general en VHDL. El alumno no tiene
que entrar a analizar este cdigo. l slo tiene que saber que en su port map hay genrico
que sirve para determinar el tamao en bits del registro.
Como todo componente, lo primero que se declara son los puertos. Lo primero que hay es
el genrico, donde se determina una constante que indica el tamao en bits del registro. Es
decir, indica el tamao en bits del vector de entrada y del vector de salida del registro. A
Prcticas de Mquina Sencilla con FPGA Memoria Descriptiva

15

continuacin, ya se declaran los puertos de entrada y salida. Es importante saber el orden,
en el caso del componente de tipo registro el port map es el siguiente:
PORT MAP (<reloj>,<reset>,<enable>,<in>,<out>);
La descripcin del comportamiento de este componente se hace mediante un proceso y un
serie de condiciones.
El proceso es sensible a la seales de reloj y reset. Cuando hay un flanco ascendente de la
seal de reloj y la seal de habilitacin est activada la salida del registro toma como valor
la entrada del mismo. Y cuando la seal de reset est activada la salida del registro pasa a
estar toda a nivel bajo. Para evitar problemas de que la seal de reset no est definida en un
principio ni como 0 ni como 1, se inicializa la seal a 0. Es importante remarcar que
el reset del registro es asncrono.

3.1.2.2 Reg1 Registro de 1 bit
Este se trata del cdigo que implementa en VHDL un registro general de tamao 1 bit. El
alumno no tiene que entrar a analizar este cdigo. Se ha tenido que crear un componente
especial para registros de 1 bit porque la los puertos de entrada y salida del componente
reg han de ser vectores, y en este caso la entrada y la salida no son vectores sino simples
std_logic.
Como todo componente, lo primero que se declara son los puertos de entrada y salida. Es
importante saber el orden, en el caso del componente de tipo registro el port map es el
mismo que el componente de tipo registro:
PORT MAP (<reloj>,<reset>,<enable>,<in>,<out>);
La descripcin del comportamiento de este componente es sencillo. Lo que se hace es
transformar el bit de entrada al registro y el bit de salida a vectores de 1 solo bit. Entonces,
como son tipo vectores, se puede crear un componente interno del tipo reg.

3.1.2.3 Mux4 Multiplexor de 4 entradas
Este se trata del cdigo que implementa en VHDL un multiplexor de 4 entradas. El alumno
slo tiene que saber que el componente tiene un genrico para determinar el tamao del
dato de entrada/salida y el orden de las seales de su port map.
Como todo componente empieza declarando los puertos de entrada y salida. Su port map
es el siguiente:
PORT MAP (<in00>,<in01>,<in10>,<in11>,<bits de seleccin>,<out>);
Y para describir su comportamiento, se utiliza la estructura with select when. Donde
segn el valor de los bits de seleccin la salida del multiplexor toma una de las entradas.


Prcticas de Mquina Sencilla con FPGA Memoria Descriptiva

16

3.1.2.4 Mux2 Multiplexor de 2 entradas
Este se trata del cdigo que implementa en VHDL un multiplexor de 2 entradas. El alumno
slo tiene que saber que el componente tiene un genrico para determinar el tamao del
dato de entrada/salida y el orden de las seales de su port map.
Como todo componente empieza declarando los puertos de entrada y salida. Su port map
es el siguiente:
PORT MAP (<in0>,<in1>,<bit de seleccin>,<out>);
Y para describir su comportamiento, se utiliza la estructura with select when. Donde
segn el valor de los bits de seleccin la salida del multiplexor toma una de las entradas.
3.1.2.5 inc - Incrementador
Este se trata del cdigo que implementa el bloque +1 que suele ir adjunto al registro PC.
El alumno slo tiene que saber que hay un genrico para determinar el tamao en bits del
vector de entrada/salida y el orden de las seales de su port map:

PORT MAP (<in>,<out>);
El comportamiento de este componente se trata de una simple suma. El vector de entrada
se transforma a tipo unsigned para poder operar aritmticamente con l, se le suma 1 y se
vuelve a transformar a std_logic_vector.
3.1.2.6 ALU Unidad Aritmtico Lgica
Este es el cdigo que describe la ALU de la mquina sencilla de ejemplo. El alumno no lo
podr aprovechar completamente, pero lo podr usar como pauta.
Primero se describen los puertos de entrada y salida. En el caso del ejemplo, como entradas
hay, dos vectores de datos y la seal de seleccin de la operacin, y como salidas, la seal
del flag Z y el vector con el resultado de la operacin.
Para describir el comportamiento se crean seales auxiliares que almacenan los datos de
entrada transformados a unsigned, para poder operar aritmticamente con ellos. Y la salida
se escoge con un with select when.
3.1.2.7 UD Unidad de Datos
Este es el cdigo que describe la Unidad de Datos de la mquina sencilla de ejemplo. El
cdigo est dividido en 4 partes:
- Puertos. Al principio del cdigo se describen los puertos de entrada y salida de este
registro. Esta parte se modificar segn la mquina sencilla en cuestin. Siempre
suelen haber puertos tpicos como, el bus de direcciones o el bus de datos. Pero el
tamao no siempre es el mismo. Y habr puertos caractersticos de cada Unidad de
Datos, por ejemplo, en el cdigo hay un puerto de salida para el Flag Z, pero no
todas las mquinas sencillas tienen Flag Z.
En los puertos, aparte de los puertos bsicos de entrada y salida que se pueden
determinar fcilmente haciendo un esquema de la caja que representa la UD,
tambin hay definidos unos puertos que empiezan por la palabra dbug. Estos son
puertos de salida de la UD que se usan para poder saber el estado de ciertos
Prcticas de Mquina Sencilla con FPGA Memoria Descriptiva

17

registros internos de la UD como por ejemplo, el registro PC o el IR. Estos puertos
habr que configurarlos segn su tamao y/o aadir/quitar nuevos registros donde
es interesante poder saber su estado en cada momento.

- Seales. Despus de los puertos se definen las seales internas de la UD. Estas
seales, en general, son los puertos de salida de los distintos componentes que
forman la UD. Por ejemplo, PC es la salida del registro PC, MUX es la salida
del multiplexor de 4 entradas. Esta parte de cdigo, lo ms probable es que el
alumno s tenga que modificarla. Puede ser que haya que cambiar slo el nombre de
las seales, o que haya que cambiar el rango porque la seal es de otro tamao, o
que sobren seales, o que falten, y se tengan que crear de nuevo. En general, tiene
que haber una seal por cada seal que va desde un puerto de un componente
interno de la UD, hasta otro puerto de otro componente interno de la UD.

- Componentes. En esta parte se declaran todos los componentes de la UD. La
descripcin que se tiene que dar de cada componente incluye: nombre, tipo de
componente, tamao de los genricos, descripcin de que seal de la UD va a cada
puerto del componente.
El orden en el que se asignan las seales a los puertos de cada componente es
importante. Se tiene que seguir el mismo orden que se ha seguido al definir los
puertos en el componente.

- Gestin de seales. Hay algunas seales que necesitan ser asignadas a puertos, o
que se tienen que dividir en varias seales, o seales que se les tiene que ajusta el
rango, etc. Esto es lo que se hace en esta ltima parte del cdigo. Por ejemplo, de la
seal de salida del registro IR, los dos bits ms altos tienen que asignarse al puerto
de salida CO. O en otros casos, la seal de salida de la ALU, tendr que asignarse
a varios sitios, a memoria y a un registro acumulador, por ejemplo.

3.1.2.8 UC Unidad de Control
Este es el cdigo que implementa la mquina de estados finitos y la tabla con los bits de
control.
Como todo componente, el cdigo empieza con las declaracin de sus puertos. Los puertos
sern las seales de control de salida, como la seal de lectura/escritura, los bits de
habilitacin, etc. y la seales que indican el estado de la Unidad de Datos, como el cdigo
de operacin, el Flag Z, etc.
As que lo primero que hay que hacer con este cdigo es la configuracin de puertos.
Siguiendo el cdigo, vienen la declaracin de seales. Para cualquier UC siempre habr
dos seales:
- La seal o, que almacena los bits de control de la UC. De esta seal hay que
modificar su tamao en bits. Porque las no todas las mquinas sencillas tienen
la misma cantidad de bits de control de salida.
- La seal s, que almacena el estado actual de la Unidad de Control. De esta
seal hay que modificar sus posibles valores, que son los posibles estados en
los que puede estar la mquina sencilla: S0, S1, S2, etc.
Prcticas de Mquina Sencilla con FPGA Memoria Descriptiva

18

As que lo segundo que hay que hacer con este cdigo es la configuracin de las seales.
La siguiente parte del cdigo implementa la mquina de estados en s. Se trata de un
proceso sensible a las seales de clock y reset. Siempre que hay un flanco ascendente de
reloj se ejecuta el proceso y se evala a que estado tiene que pasar la mquina. Y siempre
que la seal de reset est activa, la mquina de estados vuelve al estado inicial, que en
general, es el estado S0.
Para describir la secuencia de estados se utiliza estructuras case is end case anidadas.
Por lo tanto, el alumno s que tendr que saber la sintaxis de esta estructura del VHDL. La
secuencia que seguir depender de las seales de entrada a la UC. En el caso del ejemplo,
depende de CO y FZ.
As que el tercer paso a realizar es la implementacin de la mquina de estados.
Ahora ya se tiene la secuencia de estados que seguir la mquina sencilla. Falta definir los
valores que tendrn de la UC en cada estado. Es decir, falta implementar en VHDL la tabla
con los bits control.
Para ello, se vuelve a utilizar un proceso y la estructura case is end case. Y a casa
estado se le asigna el vector de bits de control correspondiente a la seal o. Por lo tanto,
slo habr que modificar los vectores de bits, que es transcribir tal cual la filas de la tabla
al cdigo VHDL.
As que el cuarto paso consiste en implementacin de la tabla con los bits de control.
Por ltimo, hay que asignar un valor al puerto de salida llamado dbug_state. Este puerto
tiene que informar del estado actual de la UC. As que a este puerto se le tiene que asignar
un valor numrico representativo del estado actual. Lo normal es que se le asigne el
nmero del estado. Por ejemplo, para el estado S12, a dbug_state se le asigna 1100
que es 12 en binario.
As que el quinto, y ltimo paso, consiste en asignar un valor numrico a cada estado y
asignarlo al puerto dbug_state.
3.1.2.9 RAM Memoria RAM
Este es un cdigo genrico que implementa una memoria RAM genrica. El alumno slo
tiene que saber que hay un genrico para determinar la inicializacin de la memoria y el
orden de las seales de su port map. El cdigo es totalmente aprovechable para cualquier
mquina sencilla. Su port map es:
PORT MAP (<reloj>,<lect/escritura>,<data in>,<bus direcciones>,<data out>);
Este cdigo se apoya de un paquete llamado ram_pack que se explica a continuacin. En el
cdigo RAM, se crea una seal interna que es del tipo t_vectores. Cuando se define una
seal con este tipo se est diciendo que la seal es un array de vectores. Y de hecho, esto es
la memoria RAM en s. Se hace as para poder leer/escribir los vectores de entrada/salida
de la memoria de golpe, sin tener que hacerlo bit a bit. Adems esta seal del tipo
t_vectores se inicializa con una funcin diseada en RAM_pack.
La descripcin del comportamiento de este componente es la siguiente. Con el valor del
bus de direcciones se selecciona un vector de todo el array de vectores. Y segn si el bit de
lectura:
Prcticas de Mquina Sencilla con FPGA Memoria Descriptiva

19

a) Si R*/W = 1 el valor del puerto de entrada se escribe en la posicin de memoria
determinada
b) Si R*/W = 0 el vector que hay en la posicin de memoria determinada se asigna
al puerto de salida de la memoria.
Hay que destacar que la escritura es asncrona, mientras que la lectura no lo es.
3.1.2.10 ROM Memoria ROM
Este es un cdigo genrico que implementa una memoria ROM genrica. El alumno no
tiene que modificar nada de este cdigo. La manera de asignar las seales a los puertos es
distinta a la de la RAM, porque no tiene los mismos puertos. El port map de la ROM es:
PORT MAP (<bus direcciones>,<data out>);
El comportamiento de una memoria ROM es bastante sencillo de describir. Simplemente
se trata de un bloque que saca el dato de la direccin de memoria a la que se apunta con el
bus de direcciones.
Hay que destacar que se trata de un componente ascrono.
3.1.2.11 RAM_pack Paquete de la memoria RAM
Se trata de un archivo auxiliar para la memoria. De este archivo slo hay que modificar 2
de constantes. Estas 2 constantes indican el tamao del bus de datos y bus de direcciones
de la memoria RAM .
Pero aparte de estas dos constantes, en el paquete tambin se definen tipos de datos y se
disea una funcin.
Tipos de datos nuevos:
- RAM_type: este tipo indica que el dato de este tipo es una matriz de dos
dimensiones, donde cada una de sus dimensiones tiene un rango natural. Sirve para
guardar la inicializacin de la memoria, es decir el programa, en una matriz
- t_vectores_RAM: este tipo indica que el dato de este tipo es un array de vectores, y
no una matriz de 2 dimensiones. Sirve para que el sintetizador sintetice la memoria
RAM con un bloque de memoria RAM especfico de la FPGA.
Funcin diseada:
- funcin( <tipo RAM_type>) return t_vectores_RAM. A esta funcin se le pasa un
dato tipo RAM_type y devuelve la misma matriz transformada en tipo
t_vectores_RAM, es decir, devuelve un array de vectores. Sirve para poder guardar
la inicializacin en la memoria RAM.
3.1.2.12 ROM_pack Paquete de la memoria ROM
Es el equivalente de RAM_pack pero para la memoria ROM. El cdigo es el mismo pero
adaptando los nombres de los puertos, seales, constantes y variables a los de la memoria
ROM.

Prcticas de Mquina Sencilla con FPGA Memoria Descriptiva

20

3.1.2.13 led7seg Led 7 segmentos
Se trata del cdigo que adapta un dato de entrada para que pueda ser mostrado en
hexadecimal por los 3 displays led de 7 segmentos.
3.1.2.14 dbug Debug
Este es un bloque donde se ha descrito cdigo que no interesa que el alumno tenga que
analizar. Se ha hecho as para simplificar la implementacin de la mquina sencilla. En
este cdigo tiene 3 funciones principales:
- Declarar el componente tipo led7seg, al cual se le pasa el dato a mostrar por
los displays 7 segmentos.
- Asignar la seal dbug_led que contiene el vector a mostrar mediante los 8
leds de la placa al puerto de salida de la mquina sencilla.
- Rectificar efectos de rebote en los pulsadores. Al implementarse fsicamente
la mquina sencilla, se observ que en los pulsadores se producan rebotes
aleatorios que hacan que la mquina sencilla no funcionase correctamente.
Para corregir este efecto, se compara la seal actual del pulsador con la
seal de hace unos 5 ms para saber si se ha tratado de un rebote o de una
verdadera pulsacin.
3.1.2.15 MaquinaSencilla Mquina Sencilla
Este es el cdigo que implementa el componente de mxima jerarqua en la mquina
sencilla de ejemplo. El alumno tendr que modificarlo segn la mquina sencilla, pero hay
algunas partes que se pueden aprovechar.
Lo primero que se declaran son los puertos. Esta declaracin de puertos se puede
aprovechar totalmente para cualquier mquina sencilla.
Seguidamente, viene la declaracin de seales. Aqu s que habr que configurarlas segn
cada mquina sencilla. Slo hay 3 seales, dbug_led, dbug_in y dbug_clk que se pueden
aprovechar totalmente.
A continuacin viene la inicializacin de la memoria. En esta inicializacin se escribe el
programa que ejecutar la mquina sencilla. Las instrucciones se tiene que escribir en
hexadecimal y asignarles un direccin de memoria. El alumno tendr que modificar el
programa, pero puede aprovechar la primera lnea de la declaracin de la constante.
Esta constante es del tipo RAM_type o ROM_type, segn si se trata de una memoria RAM
o ROM. Estos tipos se declaran en RAM_pack y ROM_pack respectivamente, e indican
que la constante es una matriz de dos dimensiones.
Seguidamente, se declaran los componentes de la mquina sencilla. Que principalmente
son la Unidad de Datos, la Unidad de Control y la(s) memoria(s). De la declaracin de
estos tres componentes habr que modificar las seales que se asignan a sus puertos en
cada mquina sencilla.
Hay un componente, dbug, que se puede aprovechar totalmente y el alumno no lo tiene que
modificar.
Finalmente, en este cdigo se hace una gestin de las seales que tienen que mostrarse
mediante leds o displays, y tambin se hace la seleccin del reloj. Utilizando la estructura
Prcticas de Mquina Sencilla con FPGA Memoria Descriptiva

21

with select when en funcin de los interruptores de la placa que estn activos se escoge
la seal a mostrar por los 8 leds y por los 4 displays 7 segmentos y el reloj con el que
funciona la mquina.
3.1.2.16 MaquinaSencilla_test Mquina Sencilla test bench
Este se trata de un cdigo que implementa un test bech para poder simular la mquina
sencilla. Con este cdigo se consigue dar unos valores a las seales de entrada de la
mquina sencilla:
- Al reloj de 50MHz se le asigna el periodo correspondiente.
- A la seal de reset se la inicializa a 1 y se pone a 0 pasados 100 ns.
- A los interruptores selectores de las seales a mostrar y del reloj utilizado se
le asignan 0x03. Bsicamente para que, en a simulacin, la mquina
funcione con el reloj de 50 MHz.
3.1.2.17 MaquinaSencilla.ucf Mquina Sencilla ucf
Este es el cdigo que forma el archivo .ucf de la mquina sencilla. La funcin de este
archivo es unir los puertos de la mquina sencilla con I/Os de la placa Spartan 3. El
cdigo es totalmente aprovechable, el alumno slo tiene que saber a qu I/Os se ha
asignado cada puerto. En la imagen se pueden ver dnde se ha asignado cada puerto de la
mquina sencilla.
1) dbug_led. Displays 7 segmentos.
2) dbug_in. 8 Leds.
3) rst. Seal de reset
4) clk_user. Reloj manual.
5) sw[5:3]. Interruptores que seleccionan la seal a mostrar por los 4 displays 7
segmentos
6) sw[2:1]. Interruptores que seleccionan la seal a mostrar por los 8 leds.
7) sw[0]. Interruptor que selecciona el reloj con el que funciona la mquina
sencilla. 1 para 50 MHz y 0 para reloj manual.

En la implementacin del reloj manual, surgi un problema de sntesis. El sintetizador no
dejaba utilizar los buses dedicados de reloj de la FPGA a este reloj. As que hubo que
Prcticas de Mquina Sencilla con FPGA Memoria Descriptiva

22

describir especficamente que, el reloj manual no utilizara las rutas dedicadas a la seal de
reloj.
3.2 Manual de Prcticas
Uno de los objetivos de este proyecto ha sido redactar un manual de prcticas para el
alumno.
El manual de prcticas que se ha redactado es un manual pensado para que el alumno,
siguiendo todos los pasos que se marcan, llegue a implementar la mquina sencilla de
ejemplo.
Pero cmo el alumno tendr que implementar otra mquina sencilla distinta, en el manual
estn indicadas las modificaciones tpicas que hay que hacer para implementar distintas
mquinas sencillas. Por ejemplo, en la mquina sencilla de ejemplo slo hay memoria
RAM, pero hay mquinas sencillas que tambin tienen memoria ROM, pues en el manual
se ha indicado cmo se hara para implementar una memoria ROM. Otro ejemplo, la ALU
no es siempre la misma en cada mquina sencilla, cada mquina sencilla tiene su propia
ALU, pues en el manual se dan unas indicaciones de cmo habra que modificar el cdigo
para implementar una ALU con otras operaciones aritmtico lgicas. As pues, en general,
en el manual se describen las modificaciones que hay que hacer en los cdigos genricos
de partida para implementar distintas mquinas sencillas.
En el manual, tambin se explica cmo utilizar las distintas herramientas del programa
Xilinx ISE 12.3. Y todo de la manera ms entendedora posible, con imgenes, esquemas,
etc.
El manual se encuentra anexo al final de esta memoria del proyecto, en el apartado 6
Anexo Manual de Prcticas.
3.3 Proceso General de Implementacin de la Mquina Sencilla
En este apartado se describe, sin entrar en detalles, el proceso general para implementar
mquinas sencillas que se ha seguido durante el proyecto. Que es el mismo proceso que se
describe en el manual de prcticas con todo tipo de detalles. Por lo tanto, es el proceso de
implementacin que deber seguir el alumno en las prcticas.
En general, se sigue una metodologa de diseo ascendiente (bottom-up). Porque primero
se disean los bloques de menos nivel en la jerarqua, y se va subiendo de nivel.
Como ya se ha explicado en el anterior apartado, el alumno parte con unos cdigos en
VHDL que son bloques genricos de toda mquina sencilla.
El componente de la mquina sencilla, se ha subdividido en 3 componentes principales: la
Unidad de Datos, la Unidad de Control y la memoria.
3.3.1 Unidad de Datos
El primer bloque que se disea es la Unidad de Datos. Para ello, siguiendo con el mtodo
bottom-up, primero se disean todos los componentes internos de la UD.
A partir de los cdigos de partida reg, reg1, mux2, mux4, ALU y UD se crean sus
respectivos archivos VHDL.
Prcticas de Mquina Sencilla con FPGA Memoria Descriptiva

23

En el archivo UD.VHDL se declaran, por defecto, todos los componentes de la UD. As
que lo que hay que hacer en el archivo UD.VHDL es:
- Configurar bloques. En cada mquina sencilla hay una Unidad de Datos
diferente, no todas tienen los mismos componentes. As que hay que
aadir/eliminar registros y multiplexores y darle el tamao adecuado en bits.
- Redisear a ALU segn la mquina sencilla en cuestin.
- Configurar puertos y seales. Aadir/modificar/eliminar puertos y seales
del bloque UD segn los bloques que se han utilizado en la UD.
- Configurar puertos dbug. Aadir/modificar/eliminar los puertos de debug
necesarios para la UD en cuestin.

3.3.2 Unidad de Control
A partir del cdigo de partida llamado UC se crea su respectivo archivo VHDL. En este
archivo, lo que hay que hacer es:
- Configurar puertos. Con cada mquina sencilla varan las seales de
control que la UC manda hacia la UD y la memoria. Como tambin varan
las seales de entrada a la UC. As que hay que aadir/modificar/eliminar
los puertos que hay por defecto en el archivo UC.VHDL.
- Configurar seales. En el archivo por defecto, y en todas las Unidades de
Control, hay dos seales:
La seal o, que almacena los bits de control de la UC. De esta
seal hay que modificar su tamao en bits. Porque las no todas las
mquinas sencillas tienen la misma cantidad de bits de control de
salida.
La seal s, que almacena el estado actual de la Unidad de Control.
De esta seal hay que modificar sus posibles valores, que son los
posibles estados en los que puede estar la mquina sencilla: S0, S1,
S2, etc.
- Configurar la mquina de estados. Por defecto, est implementada la
mquina de estados de la mquina sencilla de ejemplo. Se tiene que
modificar la secuencia de estados segn el grafo de estados de la mquina
sencilla en cuestin.
- Configurar la tabla con los bits de control. Se tiene que modificar la tabla
con los bits de control que hay implementada por defecto, y asignar un
estado de los bits de control para cada estado.
- Configurar dbug_state. Se trata de un puerto de salida de la UC para saber
en qu estado se encuentra la mquina sencilla cuando se ha implementado
fsicamente. Hay que dar un valor numrico a cada estado.

3.3.3 Memoria
Segn el tipo de memoria de la mquina sencilla, segn si es RAM y/o ROM, se crean los
ficheros VHDL a partir de los cdigos RAM y ROM, respectivamente.
Estos dos archivos son muy genricos, y sirven para cualquier mquina sencilla. As que
no se ha de modificar nada.
Prcticas de Mquina Sencilla con FPGA Memoria Descriptiva

24

A parte de el archivo de memoria en s, hay que crear un archivo auxiliar, un paquete. Cada
tipo de memoria tiene su paquete que es, RAM_pack y ROM_pack respectivamente.
De estos dos archivos auxiliares, s que hay que modificar una pequea parte. La funcin
de estos paquetes, aparte de otras, es determinar el tamao del bus de datos y bus de
direcciones de la memoria. As que hay que configurar sus tamaos en funcin de la
mquina sencilla en cuestin.
3.3.4 MquinaSencilla.VHDL
Por ltimo, hay que crear el archivo MquinaSencilla.VHDL a partir del cdigo
MquinaSencilla. Este es el bloque de mxima jerarqua, y abarca todos los bloques
creados hasta el momento: UD, UC y memoria(s). Aparte, contiene el bloque llamado dbug.
Lo que hay que hacer en este archivo es:
- Configurar seales. Todas las seales que conectan UD con UC y con
memoria(s) hay que aadirlas/modificarlas/eliminarlas.
- Configurar inicializacin de memoria. La inicializacin de la memoria es
el programa que ejecutar la mquina sencilla, hay que crear un programa
que la mquina sencilla en cuestin entienda.
1

- Configurar seales dbug. A final del cdigo, se determina qu seales se
mostrarn por los leds y LCDs de la placa Spartan-3. Hay que
modificar/aadir/eliminar las seales que interese debugear.
Finalmente, hay que crear el archivo MaquinaSencilla.ucf. Se trata del archivo que une
puertos de la mquina sencilla con I/Os de la placa Spartan-3. De este archivo no se tiene
que modificar nada, pero s saber cules son las uniones que se hacen. En el manual de
prcticas que explican estas uniones.
Una vez se llega a este punto, el siguiente paso es simular la mquina sencilla.
3.3.5 Simulacin
Antes de simular se tiene que crear el archivo tipo test bench para dar unos valores
iniciales a los puertos de entrada de la mquina sencilla. El fichero se crea a partir del
cdigo de partida llamado maquinasencilla_test. Este cdigo no hace falta que lo
modifique el alumno, es totalmente aprovechable.
Una vez creado el archivo, se puede pasar a simular la mquina con el programa iSIM
Simulator.
En la simulacin se comprueba el buen funcionamiento de la mquina sencilla, se observa
que la secuencia de estados sea la esperada segn el programa, que la memoria RAM
almacene correctamente los resultados esperados con la ejecucin del programa, que los
registros vayan tomando los valores esperados, etc.
Cuando se determina que la simulacin es correcta, y que por lo tanto, la mquina sencilla
funciona correctamente, se pasa a implementar fsicamente la mquina sencilla, es decir,
programar la FPGA.

1
Es decir, crear un programa con instrucciones propias de la mquina sencilla en cuestin.
Prcticas de Mquina Sencilla con FPGA Memoria Descriptiva

25

3.3.6 Programacin de la FPGA
Primero se crea el archivo de programacin con la herramienta Generate Programming
File, y luego se pasa a programar la FPGA con el software ISE iMPACT.
Una vez programada la FPGA, gracias a las seales dbug se pueden observar las seales
internas de la mquina sencilla, y por lo tanto, se puede comprobar que: siga la misma
secuencia de estados que en la simulacin, que los registros vayan tomando los mismos
valores que en la simulacin, etc.
Una vez se ha comprobado el buen funcionamiento, ya se ha implementado la mquina
sencilla en la FPGA correctamente.
3.4 Las Mquinas Sencillas Implementadas
Todas las mquinas sencillas implementadas se han extrado de los exmenes de aos
anteriores de la asignatura Sistemas Digitales I. As que las mquinas sencillas no se han
diseado desde cero.
2

3.4.1 Mquina Sencilla 1
Se trata de la mquina sencilla de ejemplo. Es la primera mquina sencillas que todos los
alumnos implementarn a modo de ejemplo. Es la mquina sencilla que se implementa si
se siguen todos los pasos del Manual de Prcticas.
La mquina presenta la siguiente Unidad de Datos.

Figura 4. Unidad de Datos de la MS1
2
Pero en algunos casos, se ha encontrado algn error en la solucin y se ha rediseado alguna parte.
Prcticas de Mquina Sencilla con FPGA Memoria Descriptiva

26


Las operaciones que puede realizar la ALU son:
ALU
1
ALU
0
Operacin
0 0 A+B
0 1 A xor B
1 0 B
1 1 -
Tabla 1. Operaciones ALU MS1
El juego de instrucciones de esta mquina es el siguiente:
- Suma
ADD F,D (D) (D)+(F)
FZ 1 si (D)+(F)=0
Formato:
CO
1
CO
0
F
6
F
5
F
4
F
3
F
2
F
1
F
0
D
6
D
5
D
4
D
3
D
2
D
1
D0
0 0 @F @D

- Movimiento
MOV F,D (D) (F)
FZ 1 si (F)=0
Formato:
CO
1
CO
0
F
6
F
5
F
4
F
3
F
2
F
1
F
0
D
6
D
5
D
4
D
3
D
2
D
1
D
0

0 1 @F @D

- Comparacin
CMP F,D FZ 1 si (F)-(D)=0
Formato:
CO
1
CO
0
F
6
F
5
F
4
F
3
F
2
F
1
F
0
D
6
D
5
D
4
D
3
D
2
D
1
D
0

1 0 @F @D

- Salto
BEQ D PC D si FZ = 1
Formato:
CO
1
CO
0
F
6
F
5
F
4
F
3
F
2
F
1
F
0
D
6
D
5
D
4
D
3
D
2
D
1
D
0

1 1 X @D

La Unidad de Control se puede interpretar como la siguiente mquina de estado finitos:
Prcticas de Mquina Sencilla con FPGA Memoria Descriptiva

27


Figura 5. Mquina de Estados de la MS1
La tabla con los bits de control es la siguiente:
MX1 MX0 ALU1 ALU0 R*/W en_PC en_IR en_A en_B en_FZ
S0 0 0 X X 0 1 1 0 0 0
S12 1 0 X X 0 0 0 0 1 0
S6 1 1 X X 0 0 0 1 0 0
S7 1 1 0 0 1 0 0 0 0 1
S9 X X 0 1 0 0 0 1 0 0
S10 1 1 1 0 1 0 0 0 0 1
S11 1 1 X X 0 1 1 0 0 0
Tabla 2. Bits de Control MS1
En el Manual de Prcticas, el programa que se propone para que lo ejecute la mquina
sencilla es el siguiente:
Direccin
en hex.
Instruccin
Ensamblador Binario Hexadecimal
0 MOV 0,c 1011010011100110 B4E6
1 MOV 0,i 1011010011100111 B4E7
2 CMP i,b 0111001111100101 73E5
3 BEQ end 1100000000001000 C008
4 ADD a,c 0011001001100110 3266
5 ADD l,i 0011000001100111 3467
6 CMP 0,0 0111010011101001 74E9
7 BEQ while 1100000000000010 C002
8 BEQ 8 1100000000001000 C008

64 Operando a 0000000000000011 0003
65 Operando b 0000000000000100 0004
68 Nmero 1 0000000000000001 0001
69 Nmero 0 0000000000000000 0000
Tabla 3. Programa MS1
Prcticas de Mquina Sencilla con FPGA Memoria Descriptiva

28

3.4.2 Mquina Sencilla 2
Se trata de la mquina sencilla del examen de Febrero de 2002.
La Unidad de Datos de esta mquina tiene registros de propsito general X, Y, el registro
acumulador A y los registros IR y PC.

Figura 6. Unidad de Datos de la MS2
La ALU, como se puede observar en la imagen, puede realizar las operaciones de suma,
multiplicacin o transferir la entrada I1.
El juego de instrucciones de esta mquina sencilla es el siguiente:
- Cargar el registro A
LDA F A (F)
Formato:
CO
1
CO
0
F
13
F
12
F
11
F
10
F
9
F
8
F
7
F
6
F
5
F
4
F
3
F
2
F
1
F
0

0 0 @F

- Guardar el registro A en memoria
STA D (D) A
Formato:
CO
1
CO
0
D
13
D
12
D
11
D
10
D
9
D
8
D
7
D
6
D
5
D
4
D
3
D
2
D
1
D
0

0 1 @D
Prcticas de Mquina Sencilla con FPGA Memoria Descriptiva

29


- Saltar a la direccin
JMP D IR (D)
PC = D+1
Formato:
CO
1
CO
0
D
13
D
12
D
11
D
10
D
9
D
8
D
7
D
6
D
5
D
4
D
3
D
2
D
1
D
0

1 0 @D

- Mover dato de una direccin a otra
MOV F,D (D) (F)
Formato:
CO
1
CO
0
F
13
F
12
F
11
F
10
F
9
F
8
F
7
F
6
F
5
F
4
F
3
F
2
F
1
F
0

1 1 @F
0 X @D

- Multiplicar y acumular
MAC F,D A A+ (F)*(D)
Formato:
CO
1
CO
0
F
13
F
12
F
11
F
10
F
9
F
8
F
7
F
6
F
5
F
4
F
3
F
2
F
1
F
0

1 1 @F
1 X @D

La Unidad de Control se puede interpretar como la siguiente mquina de estado finitos:

Figura 7. Mquina de Estados de la MS2
Prcticas de Mquina Sencilla con FPGA Memoria Descriptiva

30

La tabla con los bits de control es la siguiente:
en_PC en_IR en_A en_X en_Y MX_@ MX_D MX_I1 ALU1 ALU0 R*/W
S0 1 1 0 0 0 1 0 X X X 0
S1 0 0 0 1 0 0 0 X X X 0
S2 0 0 1 0 0 0 0 X X X 0
S3 0 0 0 0 0 0 X 0 0 0 1
S4 1 1 0 0 0 0 0 X X X 0
S5 1 1 0 0 0 1 0 X X X 0
S6 0 0 0 0 1 0 0 X X X 0
S7 0 0 0 0 0 0 X 1 0 0 1
S8 0 0 0 0 1 X 1 1 1 1 0
S9 0 0 1 0 0 X 1 0 1 0 0
Tabla 4. Bits de Control de MS2
El programa que se ha implementado para que lo ejecute esta mquina sencilla es el
siguiente:
Direccin
en hex.
Instruccin
Ensamblador Binario Hexadecimal
0 LDA 5 0000000000000101 0005
1 MOV 0,6 1100000000000100 C004
2 0000000000000110 0006
3 JMP 9 1000000000001001 8009
4 Nmero 0 0000000000000000 0000
5 Nmero 1 0000000000000001 0001
7 Nmero 3 0000000000000011 0003
8 Nmero 4 0000000000000100 0004
9 MAC 3,4 1100000000000111 C007
A 1100000000001000 C008
B STA 6 0100000000000110 4006
C JMP 12 1000000000001100 800C
Tabla 5. Programa de MS2

Prcticas de Mquina Sencilla con FPGA Memoria Descriptiva

31

3.4.3 Mquina Sencilla 3
Se trata de la mquina sencilla del examen de Febrero de 2005.
La Unidad de Datos de esta mquina un registro de propsito general B, el registro
acumulador A y los registros IR y PC.
El registro acumulador A es accesible por el usuario con varias instrucciones. El registro B
no es visible para el usuario.

Figura 8. Unidad de Datos de la MS3
La ALU, como se puede observar en la imagen, puede realizar las operaciones de suma,
transferir la entrada I1 o transferir la entrada I2.
El juego de instrucciones de esta mquina sencilla es el siguiente:
- Mover de memoria al registro A
MOV A, d A (d)
Formato:
CO
2
CO
1
CO
0
d
12
d
11
d
10
d
9
d
8
d
7
d
6
d
5
d
4
d
3
d
2
d
1
d
0

0 0 0 @d


Prcticas de Mquina Sencilla con FPGA Memoria Descriptiva

32

- Mover literal al registro A
MOV A, #d A d
Formato:
CO
2
CO
1
CO
0
d
12
d
11
d
10
d
9
d
8
d
7
d
6
d
5
d
4
d
3
d
2
d
1
d
0

0 0 1 X
#d

- Mover de A a memoria
MOV d, A (d) A
Formato:
CO
2
CO
1
CO
0
d
12
d
11
d
10
d
9
d
8
d
7
d
6
d
5
d
4
d
3
d
2
d
1
d
0

0 1 X @d

- Sumar A con un dato de memoria
ADD A, d A A + (d)
Z FZ

Formato:
CO
2
CO
1
CO
0
d
12
d
11
d
10
d
9
d
8
d
7
d
6
d
5
d
4
d
3
d
2
d
1
d
0

1 0 0 @d

- Sumar A con un literal
ADD A, #d A A + d
Z FZ

Formato:
CO
2
CO
1
CO
0
d
12
d
11
d
10
d
9
d
8
d
7
d
6
d
5
d
4
d
3
d
2
d
1
d
0

1 0 1 X
#d

- Salto incondicional
JMP d PC d
Formato:
CO
2
CO
1
CO
0
d
12
d
11
d
10
d
9
d
8
d
7
d
6
d
5
d
4
d
3
d
2
d
1
d
0

1 1 0 @d

- Salto condicional
JZ d PC d; si Z=1
Formato:
CO
2
CO
1
CO
0
d
12
d
11
d
10
d
9
d
8
d
7
d
6
d
5
d
4
d
3
d
2
d
1
d
0

1 1 1 @d



Prcticas de Mquina Sencilla con FPGA Memoria Descriptiva

33

La Unidad de Control se puede interpretar como la siguiente mquina de estado finitos:

Figura 9. Mquina de Estados de la MS3

La tabla con los bits de control es la siguiente:
en_PC en_IR en_A en_B en_Z MX_@ MX_D ALU1 ALU0 R*/W
S0 1 1 0 0 0 0 1 X X 0
S1 0 0 0 1 0 1 1 X X 0
S2 0 0 1 0 0 1 1 X X 0
S3 1 0 1 0 0 0 1 X X 0
S4 1 0 0 1 0 0 1 X X 0
S5 0 0 1 0 1 X 0 1 X 0
S6 0 0 0 0 0 1 X 0 0 1
S7 1 1 0 0 0 1 1 X X 0
Tabla 7. Bits de Control de la MS3
Prcticas de Mquina Sencilla con FPGA Memoria Descriptiva

34

El programa que se ha implementado para que lo ejecute esta mquina sencilla es el
siguiente:
Direccin
en hex.
Instruccin
Ensamblador Binario Hexadecimal
0 MOV A,#5 0010000000000000 2000
1 Nmero 5 0000000000000101 0005
2 MOV 20,A 0100000000010100 4014
3 MOV A,@20 0000000000010100 0014
4 MOV 21,A 0100000000010101 4015
5 MOV A,@21 0000000000010101 0015
6 ADD A,@21 1000000000010101 8015
7 ADD A,#9 1010000000000000 A000
8 Nmero 9 0000000000001001 0009
9 JZ 0 1110000000000000 E000
A MOV 21,A 0100000000010101 4015
B JMP 11 1100000000001011 C00B
Tabla 8. Programa de la MS3
3.4.4 Mquina Sencilla 4
Se trata de la mquina sencilla del examen de Noviembre de 2008.
La Unidad de Datos de esta mquina un registro de propsito general T, el registro
acumulador A y los registros IR y PC.

Figura 10. Unidad de Datos de la MS4
La ALU, como se puede observar en la imagen, puede realizar las operaciones de suma,
transferir la entrada I1 o transferir la entrada I2.
Prcticas de Mquina Sencilla con FPGA Memoria Descriptiva

35

El juego de instrucciones de esta mquina sencilla es el siguiente:
- Salto condicional
JSZ d PC d; si FZ=1
Formato:
CO
1
CO
0
d
5
d
4
d
3
d
2
d
1
d
0

0 0 @d

- Guardar A en memoria
STA d (d) A
Formato:
CO
1
CO
0
d
5
d
4
d
3
d
2
d
1
d
0

0 1 @d

- Sumar A con un dato de la memoria
ADD d A A + (d)
FZ=1 si A + (d) = 0
Formato:
CO
1
CO
0
d
5
d
4
d
3
d
2
d
1
d
0

1 0 @d

- Multiplicar A por 2
MUL2 A 2*A
FZ=1 si 2*A = 0
Formato:
CO
2
CO
1
E d
4
d
3
d
2
d
1
d
0

1 1 0 X

- Carga el registro A con un literal
LDA d A k
FZ=1 si k = 0

Formato:
CO
2
CO
1
E d
4
d
3
d
2
d
1
d
0

1 1 1 X
k






Prcticas de Mquina Sencilla con FPGA Memoria Descriptiva

36

La Unidad de Control se puede interpretar como la siguiente mquina de estado finitos:

Figura 11. Mquina de Estados de la MS4
La tabla con los bits de control es la siguiente:
en_PC en_IR en_T en_A en_FZ MX1 MX2 ALU1 ALU0 R*/W
S0 1 1 1 0 0 0 0 X X 0
S1 0 0 0 0 0 X X X X 0
S2 1 1 1 0 0 1 0 X X 0
S3 0 0 0 0 0 1 0 0 1
S4 0 0 1 0 0 1 0 X X 0
S5 0 0 0 1 1 X X 1 X 0
S6 0 0 1 0 0 X 1 0 0 0
S8 1 0 1 0 0 0 0 X X 0
S9 0 0 0 1 1 X X 0 1 0
Tabla 9. Bits de Control de la MS4

Prcticas de Mquina Sencilla con FPGA Memoria Descriptiva

37

El programa que se ha implementado para que lo ejecute esta mquina sencilla es el
siguiente:
Direccin
en hex.
Instruccin
Ensamblador Binario Hexadecimal
0 LDA 5 11100000 E0
1 Nmero 5 05
2 JSZ 0 00000101 00
3 STA 12 01001100 4C
4 LDA 9 11100000 E0
5 #9 00001001 09
6 ADD 12 10001100 8C
7 MUL2 11000000 C0
8 STA 13 01001101 4D
9 LDA 0 11100000 E0
A #0 00000000 00
B JSZ 9 00001001 09
Tabla 10. Programa de la MS4
3.4.5 Mquina Sencilla 5
Se trata de la mquina sencilla del examen de Septiembre de 2003.
La Unidad de Datos de esta mquina un registro de propsito general B, C, el registro
acumulador A y los registros IR y PC.

Figura 12. Unidad de Datos de la MS5
Prcticas de Mquina Sencilla con FPGA Memoria Descriptiva

38

La ALU, como se puede observar en la imagen, puede realizar las operaciones de suma,
resta, transferir la entrada A o transferir la entrada B.
El juego de instrucciones de esta mquina sencilla es el siguiente:
- Cargar A con un inmediato
LDI A A dat
Formato:
CO
2
CO
1
CO
1
d
4
d
3
d
2
d
1
d
0

0 0 0 X X X X X
Dat[15:8]
Dat[7:0]

- Sumar el contenido de A con un inmediato
ADI A A + dat
Formato:
CO
2
CO
1
CO
1
d
4
d
3
d
2
d
1
d
0

1 0 0 X X X X X
Dat[15:8]
Dat[7:0]

- Restar el contenido de A con un inmediato
SBI A A - dat
Formato:
CO
2
CO
1
CO
1
d
4
d
3
d
2
d
1
d
0

1 1 0 X X X X X
Dat[15:8]
Dat[7:0]

- Cargar A con el contenido de una direccin de memoria
LDD addr A (addr)
Formato:
CO
2
CO
1
CO
1
d
4
d
3
d
2
d
1
d
0

0 0 1 X X X X X
addr[15:8]
addr[7:0]

- Guardar el contenido del registro A a una direccin de memoria
STD addr (addr) A

Formato:
CO
2
CO
1
CO
1
d
4
d
3
d
2
d
1
d
0

0 1 1 X X X X X
addr[15:8]
addr[7:0]



Prcticas de Mquina Sencilla con FPGA Memoria Descriptiva

39

- Sumar el contenido de A con el dato de una direccin de memoria
ADD addr A A + (addr)
Formato:
CO
2
CO
1
CO
1
d
4
d
3
d
2
d
1
d
0

1 0 1 X X X X X
addr[15:8]
addr[7:0]

- Restar el contenido de A con el dato de una direccin de memoria
SBD addr A A - (addr)
Formato:
CO
2
CO
1
CO
1
d
4
d
3
d
2
d
1
d
0

1 1 1 X X X X X
addr[15:8]
addr[7:0]

La Unidad de Control se puede interpretar como la siguiente mquina de estado finitos:

Figura 13. Mquina de Estados de la MS5

Prcticas de Mquina Sencilla con FPGA Memoria Descriptiva

40

La tabla con los bits de control es la siguiente:
eIR ePC eCH eCL eAH eAL eBH eBL MX@ MXC MXO ALU
1
ALU
0
R*/W
S0 1 1 0 0 0 0 0 0 0 X X X X 0
S1 0 1 1 0 0 0 1 0 0 0 X X X 0
S2 0 1 0 1 0 0 0 1 0 0 X X X 0
S3 0 0 1 1 0 0 1 0 1 1 X X X 0
S4 0 0 0 0 0 0 0 1 1 X X X X 0
S5 0 0 0 0 1 1 0 0 X X X 0 1 0
S6 0 0 1 1 0 0 0 0 1 1 1 0 0 1
S7 0 0 0 0 0 0 0 0 1 X 0 0 0 1
S8 0 0 0 0 1 1 0 0 X X X X 0 0
S9 0 0 0 0 1 1 0 0 X X X X 1 0
Tabla 11. Bits de Control de la MS5
El programa que se ha implementado para que lo ejecute esta mquina sencilla es el
siguiente:
Direccin
en hex.
Instruccin
Ensamblador Binario Hexadecimal
0 LDI 5 00000000 00
1
Nmero 5
00000000 00
2 00000101 05
3 ADI 6 10000000 80
4
Nmero 6
00000000 00
5 00000110 06
6 SBI 3 11000000 C0
7
Nmero 3
00000000 00
8 00000011 03
9 STD 25 01100000 60
A
Nmero 25
00000000 00
B 00100101 25
C LDD 40 00100000 20
D
Nmero 40
00000000 00
E 01000000 40
F ADD 42 10100000 A0
10
Nmero 42
00000000 00
11 01000010 42
12 SBD 25 11100000 E0
13
Nmero 25
00000000 00
14 00100101 25

40
Nmero 1
00000000 00
41 00000001 01
42
Nmero 7
00000000 00
43 00000111 07
Tabla 12. Programa de la MS5

Prcticas de Mquina Sencilla con FPGA Memoria Descriptiva

41

3.4.6 Mquina Sencilla 6
Se trata de la mquina sencilla del examen de Diciembre de 2008.
La Unidad de Datos de esta mquina un registro de propsito general X, Y, el registro
acumulador A y los registros IR y PC.

Figura 14. Unidad de Datos de la MS6
La ALU, como se puede observar en la imagen, puede realizar las operaciones de suma,
resta o transferir la entrada I2.
El juego de instrucciones de esta mquina sencilla es el siguiente:
- Salto incondicional
JMP d PC d
Formato:
CO
2
CO
1
CO
1
d
4
d
3
d
2
d
1
d
0

0 0 0 X X X X X
d

- Salto relativo
BRA d PC PC
2
+ d
Formato:
CO
2
CO
1
CO
1
d
4
d
3
d
2
d
1
d
0

0 0 1 X X X X X
d

Prcticas de Mquina Sencilla con FPGA Memoria Descriptiva

42

- Sumar dos inmediatos
ADD k1,k2 A k1 + k2
Formato:
CO
2
CO
1
CO
1
d
4
d
3
d
2
d
1
d
0

0 1 0 X X X X X
k1
k2

La Unidad de Control se puede interpretar como la siguiente mquina de estado finitos:

Figura 15. Mquina de Estados de la MS6
La tabla con los bits de control es la siguiente:
en_PC en_IR en_A en_X en_Y MX
1
MX
2
ALU R*/W
S0 1 1 0 0 0 0 1 X 0
S1 1 0 0 0 1 0 1 X 0
S2 1 1 0 0 0 1 1 0 0
S3 0 0 0 1 1 X 0 0 0
S4 1 1 0 0 0 1 1 1 0
S5 1 0 0 1 1 0 1 0 0
S6 0 0 1 0 0 X X 1 0
Tabla 13. Bits de Control de la MS6

Prcticas de Mquina Sencilla con FPGA Memoria Descriptiva

43

El programa que se ha implementado para que lo ejecute esta mquina sencilla es el
siguiente:
Direccin
en hex.
Instruccin
Ensamblador Binario Hexadecimal
0 ADD 3,2 01000000 40
1 Nmero 3 00000011 03
2 Nmero 2 00000010 02
3 BRA 5 00100000 20
4 Nmero 5 00000101 05

A JMP 10 00000000 00
B Nmero 10 00001010 0A
Tabla 14. Programa de la MS6
3.4.7 Mquina Sencilla 7
Se trata de la mquina sencilla del examen de Noviembre de 2006.
La Unidad de Datos de esta mquina un registro de propsito general R, el registro
acumulador A y los registros IR y PC.

Figura 16. Unidad de Datos de la MS7
La ALU, como se puede observar en la imagen, puede realizar las operaciones de suma,
resta, transferir la entrada I1 o transferir la entrada I2.
Prcticas de Mquina Sencilla con FPGA Memoria Descriptiva

44

El juego de instrucciones de esta mquina sencilla es el siguiente:
- Cargar el registro A con un inmediato
LIA k A k
Formato:
d
11
d
10
d
9
d
8
d
7
d
6
d
5
d
4
d
3
d
2
d
1
d
0
CO
3
CO
2
CO
1
CO
0

X X X X X X X X X X X X 0 0 0 1
k

- Salto incondicional
JMP k PC k
Formato:
d
11
d
10
d
9
d
8
d
7
d
6
d
5
d
4
d
3
d
2
d
1
d
0
CO
3
CO
2
CO
1
CO
0

X X X X X X X X X X X X 1 0 0 1
k

- Guardar el contenido de A en memoria
STA k (k) A
Formato:
d
11
d
10
d
9
d
8
d
7
d
6
d
5
d
4
d
3
d
2
d
1
d
0
CO
3
CO
2
CO
1
CO
0

X X X X X X X X X X X X 1 1 0 1
k
X X X X X X X X X X X X X X 0 0

- Sumar el contenido de A con un inmediato
LIA +k A A+k
Formato:
d
11
d
10
d
9
d
8
d
7
d
6
d
5
d
4
d
3
d
2
d
1
d
0
CO
3
CO
2
CO
1
CO
0

X X X X X X X X X X X X 0 0 1 0
k

- Cargar en A, el contenido de la direccin de memoria que apunta (PC +
inmediato)
LRA +k A (PC+k)
Formato:
d
11
d
10
d
9
d
8
d
7
d
6
d
5
d
4
d
3
d
2
d
1
d
0
CO
3
CO
2
CO
1
CO
0

X X X X X X X X X X X X 0 1 1 0
k

- Salto relativo positivo
JMP +k PC PC+k
Formato:
d
11
d
10
d
9
d
8
d
7
d
6
d
5
d
4
d
3
d
2
d
1
d
0
CO
3
CO
2
CO
1
CO
0

X X X X X X X X X X X X 1 0 1 0
k

Prcticas de Mquina Sencilla con FPGA Memoria Descriptiva

45

- Restar al contenido de A un inmediato
LIA -k A A-k
Formato:
d
11
d
10
d
9
d
8
d
7
d
6
d
5
d
4
d
3
d
2
d
1
d
0
CO
3
CO
2
CO
1
CO
0

X X X X X X X X X X X X 0 0 1 1
k

- Cargar en A, el contenido de la direccin de memoria que apunta (PC - inmediato)
LRA -k A (PC k)
Formato:
d
11
d
10
d
9
d
8
d
7
d
6
d
5
d
4
d
3
d
2
d
1
d
0
CO
3
CO
2
CO
1
CO
0

X X X X X X X X X X X X 0 1 1 1
k

- Salto relativo negativo
JMP -k PC PC - k
Formato:
d
11
d
10
d
9
d
8
d
7
d
6
d
5
d
4
d
3
d
2
d
1
d
0
CO
3
CO
2
CO
1
CO
0

X X X X X X X X X X X X 1 0 1 1
k

La Unidad de Control se puede interpretar como la siguiente mquina de estado finitos:

Figura 17. Mquina de Estados de la MS7
Prcticas de Mquina Sencilla con FPGA Memoria Descriptiva

46

La tabla con los bits de control es la siguiente:
en_PC en_IR en_A en_R MX_@ MX_A MX_I1 R*/W
S0 1 1 0 0 1 X X 0
S1 0 0 0 0 X X X 0
S2 1 0 1 0 1 1 0 0
S3 1 0 0 1 1 X 1 0
S4 0 0 1 0 0 0 X 0
S6 1 1 0 0 0 X X 0
S8 1 1 0 0 1 X X 0
S9 0 0 0 0 0 X 0 1
Tabla 15. Bits de Control de la MS7
El programa que se ha implementado para que lo ejecute esta mquina sencilla es el
siguiente:
Direccin
en hex.
Instruccin
Ensamblador Binario Hexadecimal
0 LIA 9 0000000000000001 0001
1 Nmero 9 0000000000001001 0009
2 LIA -3 0000000000000011 0003
3 Nmero3 0000000000000011 0003
4 LIA +7 0000000000000010 0002
5 Nmero 7 0000000000000111 0007
6 STA 20 0000000000001101 000D
7 Nmero 20 0000000000100000 0020
8 0000000000000000 0000
9 LRA -5 0000000000000111 0007
A Nmero 5 0000000000000101 0005
B LRA +2 0000000000000110 0006
C Nmero 2 0000000000000010 0002
D STA 21 0000000000001101 000D
E Nmero21 0000000000100001 0021
F 0000000000000000 0000
10 JMP +5 0000000000001010 000A
11 Nmero 5 0000000000000101 0005
12 JMP 12 0000000000001001 0009
13 Nmero 12 0000000000010010 0012

16 JMP -5 0000000000001011 000B
17 Nmero 5 0000000000000101 0005
Tabla 16. Programa de la MS7

Prcticas de Mquina Sencilla con FPGA Memoria Descriptiva

47

3.4.8 Mquina Sencilla 8
Se trata de la mquina sencilla del examen de Septiembre de 2005.
La Unidad de Datos de esta mquina un registro acumulador A y los registros IR, PC y FZ.

Figura 18. Unidad de Datos de la MS8
La ALU, como se puede observar en la imagen, puede realizar las operaciones de suma,
resta, transferir la entrada I1 o transferir la entrada I2.
El juego de instrucciones de esta mquina sencilla es el siguiente:
- Cargar el registro A con el dato de una direccin de memoria
MOV d A (d)
Formato:
CO
2
CO
1
CO
0
d
9
d
8
d
7
d
6
d
5
d
4
d
3
d
2
d
1
d
0

0 0 0 d

- Cargar el registro A con un inmediato
MOV #k A k
Formato:
CO
2
CO
1
CO
0
d
9
d
8
d
7
d
6
d
5
d
4
d
3
d
2
d
1
d
0

0 0 1 X X K
Prcticas de Mquina Sencilla con FPGA Memoria Descriptiva

48

- Sumar al registro A un dato de una direccin de memoria
MOV d A A + (d)
Formato:
CO
2
CO
1
CO
0
d
9
d
8
d
7
d
6
d
5
d
4
d
3
d
2
d
1
d
0

0 1 0 d

- Guardar el contenido de A en memoria
STO d (d) A
Formato:
CO
2
CO
1
CO
0
d
9
d
8
d
7
d
6
d
5
d
4
d
3
d
2
d
1
d
0

1 0 X d

- Salto incondicional
JMP d PC d
Formato:
CO
2
CO
1
CO
0
d
9
d
8
d
7
d
6
d
5
d
4
d
3
d
2
d
1
d
0

1 1 0 X X X X X X X X X X

- Sumar al registro A un inmediato
ADD #k A A + k
Formato:
CO
2
CO
1
CO
0
d
9
d
8
d
7
d
6
d
5
d
4
d
3
d
2
d
1
d
0

0 1 1 X X K


Prcticas de Mquina Sencilla con FPGA Memoria Descriptiva

49

La Unidad de Control se puede interpretar como la siguiente mquina de estado finitos:

Figura 19. Mquina de Estados de la MS8
La tabla con los bits de control es la siguiente:
en_PC en_IR en_A en_Z MX_@ MX_A MX_I2 ALU
1
ALU
0
R*/W
S0 1 1 0 0 0 X X X X 0
S1 0 0 0 0 X X X X X 0
S2 0 0 1 1 1 0 0 0 1 0
S3 0 0 1 0 X 1 X X X 0
S4 0 0 1 1 1 0 0 1 X 0
S5 0 0 1 1 X 0 1 1 X 0
S6 0 0 0 1 1 X X 0 0 1
S7 1 1 0 0 1 X X X X 0
S8 1 0 0 0 0 X X X X 0
Tabla 17. Bits de Control de la MS8

Prcticas de Mquina Sencilla con FPGA Memoria Descriptiva

50

El programa que se ha implementado para que lo ejecute esta mquina sencilla es el
siguiente:
- Memoria ROM:
Direccin
en hex.
Ensamblador Binario Hexadecimal
0 MOV #4 0010000000100 0804
1 ADD #5 0110000000101 1805
2 STO 2 1000000000010 1002
3 ADD 1 0100000000001 0801
4 SKPZ 1110000000000 1C00
5 MOV 0 0000000000000 0000
6 SKPZ 1110000000000 1C00
7 JMP 8 1100000001000 1808
Tabla 18. Programa en ROM de la MS8
- Memoria RAM:
Direccin
en hex.
Ensamblador Binario Hexadecimal
0 #0 00000000 00
1 #1 00000001 01
Tabla 19. Programa en RAM de la MS8

Prcticas de Mquina Sencilla con FPGA Memoria Descriptiva

51

3.4.9 Mquina Sencilla 9
Se trata de la mquina sencilla del examen de Febrero de 2004.
La Unidad de Datos de esta mquina un registro de propsito general R, un registro
acumulador A y los registros IR y PC.

Figura 20. Unidad de Datos de la MS9

La ALU, como se puede observar en la imagen, puede realizar las operaciones de suma,
resta, transferir la entrada I, transferir la entrada R o restar 1 a la entrada I.
El juego de instrucciones de esta mquina sencilla es el siguiente:
- Mover al registro A un inmediato
MOV d A d
Formato:
CO
2
CO
1
CO
0
d
7
d
6
d
5
d
4
d
3
d
2
d
1
d
0

0 0 0 d


Prcticas de Mquina Sencilla con FPGA Memoria Descriptiva

52

- Cargar el registro A con un dato de la memoria
LDA d A (d)
Formato:
CO
2
CO
1
CO
0
d
7
d
6
d
5
d
4
d
3
d
2
d
1
d
0

0 0 1 d

- Guardar el contenido de A en memoria
STA d (d) A
Formato:
CO
2
CO
1
CO
0
d
7
d
6
d
5
d
4
d
3
d
2
d
1
d
0

0 1 X d

- Sumar al registro A un dato de una direccin de memoria
ADD d A A + (d)
Formato:
CO
2
CO
1
CO
0
d
7
d
6
d
5
d
4
d
3
d
2
d
1
d
0

1 0 0 d

- Restar al registro A un dato de una direccin de memoria
SUB d A A - (d)
Formato:
CO
2
CO
1
CO
0
d
7
d
6
d
5
d
4
d
3
d
2
d
1
d
0

1 0 1 d

- Salto relativo
BRA d PC PC + d
Formato:
CO
2
CO
1
CO
0
d
7
d
6
d
5
d
4
d
3
d
2
d
1
d
0

1 1 0 d

- Salto incondicional
JMP d PC d
Formato:
CO
2
CO
1
CO
0
d
7
d
6
d
5
d
4
d
3
d
2
d
1
d
0

1 1 1 d


Prcticas de Mquina Sencilla con FPGA Memoria Descriptiva

53


La Unidad de Control se puede interpretar como la siguiente mquina de estado finitos:

Figura 21. Mquina de Estados de la MS9
La tabla con los bits de control es la siguiente:
eIR ePC eA eR MX@
1
MX@
2
MXR
1
MXR
0
MXI ALU
2
ALU
1
ALU
0
R*/W
S0 1 1 0 0 0 0 X X X X X X 0
S1 0 0 0 1 1 1 0 1 X X X X 0
S2 0 0 1 0 1 1 1 1 X X X X 0
S3 0 0 1 0 1 1 0 1 X X X X 0
S4 0 0 0 0 1 1 X X 0 0 0 0 1
S5 0 0 1 0 X X 0 0 0 0 1 0 0
S6 0 0 1 0 X X 0 0 0 0 1 1 0
S7 0 0 0 1 1 1 1 1 X X X X 0
S8 0 0 1 0 0 0 1 1 0 X X X 0
S9 1 1 0 0 1 0 1 1 1 0 1 0 0
S10 1 1 0 0 1 0 X X X 0 0 1 0
Tabla 20. Bits de Control de la MS9

Prcticas de Mquina Sencilla con FPGA Memoria Descriptiva

54

El programa que se ha implementado para que lo ejecute esta mquina sencilla es el
siguiente:
- Memoria ROM:
Direccin
en hex.
Ensamblador Binario Hexadecimal
0 MOV #5 00000000101 005
1 STA 0 01000000000 200
2 LDA 1 00100000001 101
3 ADD 2 10000000010 402
4 SUB 3 10100000011 503
5 BRA 5 11000000101 605

A JMP 4 11100000100 704
Tabla 21. Programa en ROM de la MS9
- Memoria RAM:
Direccin
en hex.
Ensamblador Binario Hexadecimal
1 #9 00001001 09
2 #1 00000001 01
3 #7 00000111 07
4 #10 00001010 0A
Tabla 22. Programa en RAM de la MS9
3.4.10 Mquina Sencilla 10
Se trata de la mquina sencilla del examen de Septiembre de 2004.
La Unidad de Datos de esta mquina un registro de propsito general T, dos registros
acumuladores X e Y, y los registros IR y PC.

Figura 22. Unidad de Datos de la MS10
Prcticas de Mquina Sencilla con FPGA Memoria Descriptiva

55

La ALU, como se puede observar en la imagen, puede realizar las operaciones de suma,
resta, transferir la entrada B o sumar 1 a la entrada A.
El juego de instrucciones de esta mquina sencilla es el siguiente:
- Cargar al registro X un inmediato
LDIX d X d
Formato:
CO
3
CO
2
CO
1
CO
0
d
3
d
2
d
1
d
0

0 0 0 0 X
d

- Cargar al registro Y un inmediato
LDIY d Y d
Formato:
CO
3
CO
2
CO
1
CO
0
d
3
d
2
d
1
d
0

0 0 0 1 X
d

- Cargar al registro X un dato de memoria
LDDX d X (d)
Formato:
CO
3
CO
2
CO
1
CO
0
d
3
d
2
d
1
d
0

0 0 1 0 X
d

- Cargar al registro Y un dato de memoria
LDDY d Y (d)
Formato:
CO
3
CO
2
CO
1
CO
0
d
3
d
2
d
1
d
0

0 0 1 1 X
d

- Sumar al registro X un inmediato
ADIX d X X+ d
Formato:
CO
3
CO
2
CO
1
CO
0
d
3
d
2
d
1
d
0

0 1 0 0 X
d

- Sumar al registro Y un inmediato
ADIY d Y Y + d
Formato:
CO
3
CO
2
CO
1
CO
0
d
3
d
2
d
1
d
0

0 1 0 1 X
d

Prcticas de Mquina Sencilla con FPGA Memoria Descriptiva

56

- Sumar al registro X un dato de memoria
ADDX d X X + (d)
Formato:
CO
3
CO
2
CO
1
CO
0
d
3
d
2
d
1
d
0

0 1 1 0 X
d

- Sumar al registro Y un dato de memoria
ADDY d Y Y + (d)
Formato:
CO
3
CO
2
CO
1
CO
0
d
3
d
2
d
1
d
0

0 1 1 1 X
d

- Restar al registro X un inmediato
SBIX d X X - d
Formato:
CO
3
CO
2
CO
1
CO
0
d
3
d
2
d
1
d
0

1 1 0 0 X
d

- Restar al registro Y un inmediato
SBIY d Y Y - d
Formato:
CO
3
CO
2
CO
1
CO
0
d
3
d
2
d
1
d
0

1 1 0 1 X
d

- Sumar al registro X un dato de memoria
SBDX d X X - (d)
Formato:
CO
3
CO
2
CO
1
CO
0
d
3
d
2
d
1
d
0

1 1 1 0 X
d

- Sumar al registro Y un dato de memoria
SBDY d Y Y - (d)
Formato:
CO
3
CO
2
CO
1
CO
0
d
3
d
2
d
1
d
0

1 1 1 1 X
d

- Sumar 1 al registro X
INCX X X +1
Formato:
CO
3
CO
2
CO
1
CO
0
d
3
d
2
d
1
d
0

1 0 X 0 X
Prcticas de Mquina Sencilla con FPGA Memoria Descriptiva

57

- Sumar 1 al registro Y
INCY Y Y + 1
Formato:
CO
3
CO
2
CO
1
CO
0
d
3
d
2
d
1
d
0

1 0 X 1 X

La Unidad de Control se puede interpretar como la siguiente mquina de estado finitos:

Figura 23. Mquina de Estados de la MS10
La tabla con los bits de control es la siguiente:
eIR ePC eX eY eT MX1 MX2 MX3 ALU
1
ALU
0
R*/W
S0 1 1 0 0 0 0 X 0 X X 0
S1 0 0 0 0 0 X X X X X 0
S3 0 1 0 0 1 0 X 0 X X 0
S4 0 0 1 0 0 X X 1 1 1 0
S5 0 0 0 1 0 X X 1 1 1 0
S6 0 0 1 0 0 X 0 1 0 0 0
S7 0 0 0 1 0 X 1 1 0 0 0
S8 0 0 0 0 1 1 X 0 X X 0
S9 0 0 1 0 0 X 0 1 0 1 0
S10 0 0 0 1 0 X 1 1 0 1 0
S11 0 0 1 0 0 X 0 1 1 0 0
S12 0 0 0 1 0 X 1 1 1 0 0
Tabla 23. Bits de Control de la MS10

Prcticas de Mquina Sencilla con FPGA Memoria Descriptiva

58

El programa que se ha implementado para que lo ejecute esta mquina sencilla es el
siguiente:

Direccin
en hex.
Ensamblador Binario Hexadecimal
0 LDIX #5 00000000 00
1 #5 00000101 05
2 LDIY #5 00010000 10
3 #5 00000101 05
4 LDDX 64 00100000 20
5 @64 01000000 40
6 LDDY 64 00110000 30
7 @64 01000000 40
8 ADIX 4 01000000 40
9 #4 00000100 04
A ADIY 01010000 50
B #4 00000100 04
C ADDX 01100000 60
D @64 01000000 40
E ADDY 01110000 70
F @64 01000000 40
10 SBIX 10 11000000 C0
11 #10 00001010 0A
12 SBIY 10 11010000 D0
13 #10 00001010 0A
14 SBDX 64 11100000 E0
15 @64 01000000 40
16 SBDY 64 11110000 F0
17 @64 01000000 40
18 INCX 10000000 80
19 INCY 10010000 90

40 #9 00001001 09
Tabla 24. Programa de la MS10

Prcticas de Mquina Sencilla con FPGA Conclusiones

59

4 Conclusiones
A continuacin se hace un resumen de las conclusiones ms importantes que se pueden
extraer de este proyecto:
- De las 10 mquinas sencillas que se han implementado, hay algunas ms
complicadas que otras. Bien porque tienen ms componentes de por s. O porque
tiene ms instrucciones y por lo tanto la mquina de estados se complica ms. O
porque tiene memoria RAM y memoria ROM. O porque en la Unidad de Datos hay
ms interconexiones entre componentes, etc.

- Cuando se le coge prctica implementando mquina sencillas, se puede
implementar una mquina sencilla nueva en 2 horas. El tiempo de implementacin
de la primera mquina sencilla, cuando an no se tiene experiencia, se estima que
pueda tardar de 4 a 6 horas en implementar y comprobar que funciona
correctamente.

- Finalmente, se han conseguido preparar unas prcticas de mquina sencilla bastante
didcticas e interactivas. Sobre todo por la interactividad conseguida en la
implementacin fsica, gracias al reloj manual, a los leds y a los displays 7
segmentos.
Estas prcticas se espera que ayuden mucho al alumno a acabar de entender
perfectamente el funcionamiento de la mquina sencilla.

- Hay un aspecto que puede hacer dudar al alumno de si la mquina sencilla funciona
bien. Y es el hecho de que en la simulacin se pueden ver X, es decir, valores
indeterminados, y en la realidad no. Este punto ya se explica en el manual de
prcticas, pero es importante remarcarlo.

- Se espera que con el manual de prcticas el profesor de prcticas se ahorre muchas
explicaciones. An as, hay mquinas sencillas que tienen particularidades que
quiz el alumno no es capaz de resolver con la ayuda del manual. Es importante la
presencia de un profesor que gue a los alumnos en esos detalles.

- En las prcticas el alumno recibir el enunciado de la mquina sencilla, pero no el
grafo de estados, ni la tabla con los bits de control. El alumno tendr que resolver
primero el ejercicio tericamente, e implementar la mquina a partir de esa
solucin. As que conviene que esa solucin terica est bien hecha. Quiz la
resolucin del enunciado podra ser una estudio previo de la prctica.

- En las resoluciones tericas que haban hechas previamente a este proyecto, se han
detectado algunos errores en los bits de control. En la memoria descriptiva de este
proyecto se ha puesto la solucin correcta.

Prcticas de Mquina Sencilla con FPGA Posibles Mejoras

60

5 Posibles Mejoras
A continuacin se hace un listado de las posibles mejoras que podra recibir este proyecto:
- La actual placa de pruebas, Starter Board Kit de Xilinx, slo tiene 4 displays de 7
segmentos. Pero hay placas que tienen pantallas LCD. Una mejora sera utilizar
estas pantallas, porque en esas pantallas se puede mostrar mucha ms informacin a
la vez que con los 4 displays 7 segmentos.

- Las mquinas sencillas implementadas estn pensadas para resolverse en un
examen de 1h. Y por lo tanto, algunas tienen un juego de instrucciones muy
reducido, o el conjunto de instrucciones no da para realizar un programa que tenga
algo de sentido. Una posible mejora sera redisear las mquinas sencillas para
poder tener juegos de instrucciones ms amplios y que den la posibilidad de crear
programas que tengan algo de sentido.

- En la implementacin fsica que se hace, se puede observar cualquier seal y
registro interno de la mquina sencilla excepto las celdas de memoria. Un mejora
sera adaptar la implementacin para que se pueda observar el contenido de las
memorias de la mquina sencilla.

- Para hacer la implementacin fsica an ms interactiva, se podra disear un
software que adquiriese datos de la mquina sencilla que se ha implementado
fsicamente para representar la Unidad de Datos grficamente en el ordenador
observar desde ah como circulan las distintas seales y datos por la mquina
sencilla. Para enviar informacin de la placa de pruebas al ordenador se puede usar
el cable RS 232.

Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

61

6 Anexo Manual de Prcticas
3













Prcticas de Mquina Sencilla
Manual de Prcticas











3
El encabezado y nmero de pgina es el correspondiente a la memoria y no a manual
Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

62

0 ndice
4


1 Introduccin Pg. 4

2 Archivos VHDL de Partida Pg. 4

3 Jerarqua de los Archivos VHDL de Partida Pg. 6

4 Proceso General de Implementacin Pg. 6
4.1 Unidad de Datos Pg. 6
4.2 Unidad de Control Pg. 7
4.3 Memoria Pg. 7
4.4 MquinaSencilla.VHDL Pg. 7
4.4 MquinaSencilla.VHDL Pg. 7
4.5 Simulacin Pg. 8
4.6 Programacin de la FPGA Pg. 8

5 La Mquina Sencilla Pg. 9
5.1 Enunciado Pg. 9
5.2 Programa a Ejecutar Pg. 11

6 Implementacin de la Mquina Sencilla Pg. 12
6.1 Creacin del Proyecto Pg. 12
6.2 Unidad de datos Pg. 12
6.2.1 Creacin de ficheros Pg. 12
6.2.2 Diseo de la ALU Pg. 13
6.2.3 UD.VHDL Pg. 13
6.2.4 Anlisis del Cdigo UD.VHDL Pg. 13
6.3 Unidad de Control Pg. 15
6.3.1 Anlisis del cdigo UC.VHDL Pg. 15
6.4 Memorias Pg. 16
6.4.1 Memoria RAM Pg. 16
6.4.2 Anlisis de RAM_pack y ROM_pack Pg. 16
6.5 MaquinaSencilla.VHDL Pg. 16
6.5.1 Anlisis MaquinaSencilla.VHDL Pg. 16
6.6 Simulacin Pg. 19
6.6.1 Comprobacin del buen funcionamiento Pg. 23
6.7 Programacin de la FPGA Pg. 23
6.7.1 Comprobacin del buen funcionamiento Pg. 28

Anexo 1 Crear proyecto Pg. 29

Anexo 2 Crear archivos VHDL,
paquetes, ucf y test_bench Pg. 30
Anexo 2.1 Crear Archivo VHDL Pg. 30
Anexo 2.2 Crear Archivo VHDL package Pg. 31

4
La pgina indicada en el ndice no se corresponde con el nmero de la pgina porque la numeracin de este
documento es la numeracin de la memoria, y no la del manual de prcticas.
Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

63


Anexo 2.3 Crear Archivo MaquinaSencilla_test Pg. 32
Anexo 2.4 Crear Archivo MaquinaSencilla.ucf Pg. 34

Anexo 3 Anlisis de la ALU Pg. 34

Anexo 4 Lenguaje VHDL Pg. 39
Anexo 4.1 Puertos Pg. 39
Anexo 4.2 Seales Pg. 39
Anexo 4.3 Determinar Tamao de Vectores de Bits Pg. 40
Anexo 4.4 Palabra Others y valor X Pg. 40
Anexo 4.5 With select when Pg. 41
Anexo 4.6 Process end process Pg. 41
Anexo 4.7 When y case is - when Pg. 41
Anexo 4.8 Concatenacin Pg. 42

Anexo 5 Check syntax Pg. 42

Anexo 6 Sintaxis para Declarar Componentes Pg. 43

Anexo 7 Port map de cada Componente Pg. 44

Anexo 8 Anlisis de UD.VHDL Pg. 45
Anexo 8.1 Puertos de la UD Pg. 45
Anexo 8.2 Bus de direcciones Pg. 46
Anexo 8.3 Seales de la UD Pg. 46
Anexo 8.4 Comportamiento de UD.VHDL Pg. 46

Anexo 9 Anlisis de UC.VHDL Pg. 48
Anexo 9.1 Puertos de UC.VHDL Pg. 48
Anexo 9.2 Seales de UC.VHDL Pg. 49
Anexo 9.3 Anlisis Mquina de Estados de UC.VHDL Pg. 50
Anexo 9.4 Implementacin de la Tabla con los Bits de Control Pg. 51
Anexo 9.5 El Puerto dbug_state Pg. 52

Anexo 10 Anlisis RAM_pack y ROM_pack Pg. 52

Anexo 11 Inicializacin de Memoria Pg. 53

Anexo 12 Gestin de Puertos de MaquinaSencilla.VHDL Pg. 54

Anexo 13 Sintetizar un Diseo Pg. 56

Anexo 14 Implementar un Diseo Pg. 57

Anexo 15 Cuando no Coincide Simulacin y Realidad Pg. 58

Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

64

1 Introduccin
Este manual de prcticas pretende ser una gua para que el alumno pueda implementar
cualquier mquina sencilla en una FPGA. La FPGA que utiliza el alumno es de la familia
Spartan 3 de Xilinx, y est integrada en el Starter Board kit de Xilinx. As que, para
programar esa FPGA se requiere del uso del programa Xilinx ISE. La versin utilizada en
este manual es la 12.3.
Este manual parte de la base que el alumno tiene distintos archivos de texto con cdigo en
VHDL. Estos archivos contienen distintos genricos de mquinas sencillas. La idea es que
modificando estos cdigos el alumno pueda implementar distintas mquinas sencillas.
2 Archivos VHDL de Partida
Los ficheros de texto con cdigo VHDL que el alumno tendr son bloques genricos de las
mquinas sencillas en general. Y son:
- UD
Unidad de Datos. Se trata de una Unidad de Datos genrica.
- UC
Unidad de Control. Se trata de una Unidad Control genrica.
- Reg1
Registro de 1 bit.
- Reg
Registro. A cada registro se le puede determinar, individualmente, su tamao en
bits .
- Mux4
Multiplexor de 4 entradas. A cada multiplexor se le puede determinar,
individualmente, el tamao de sus entradas/salida en bits.
- Mux2
Multiplexor de 2 entradas. A cada multiplexor se le puede determinar,
individualmente, el tamao de sus entradas/salida en bits.
- Inc
Incrementador. Se trata del bloque +1 que siempre suele ir adjunto al registro
PC.
- ALU
Unidad Aritmtico-Lgica. Este es un archivo ejemplo, cada mquina sencilla tiene
su propia ALU. Aunque este archivo puede servir de pauta.
- RAM
Memoria RAM de la mquina sencilla. El alumno no hace falta que modifique este
archivo, puesto que este archivo es suficientemente genrico para que funcione en
cualquier mquina sencilla.
- RAM_pack
Paquete de la memoria RAM. Se trata de un archivo auxiliar para la memoria. En
este archivo, el Alumno s tiene que hacer alguna modificacin segn la mquina
sencilla en cuestin.
- ROM
Memoria ROM de la mquina sencilla. El alumno no hace falta que modifique este
archivo, puesto que este archivo es suficientemente genrico para que funcione en
cualquier mquina sencilla.


Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

65

- ROM_pack
Paquete de la memoria ROM. Se trata de un archivo auxiliar para la memoria. En
este archivo, el alumno s tiene que hacer alguna modificacin segn la mquina
sencilla en cuestin.
- MaquinaSencilla
La mquina sencilla. Es el archivo que recoge todos los componentes: UD, UC y
memoria(s).
- MaquinaSencilla_test
Se trata de un archivo necesario para poder simular la mquina sencilla en cuestin.
El alumno no tiene que modificar nada de este archivo.
- Led7seg
Led de 7 segmentos. Se trata de un archivo necesario para poder utilizar los
displays de 7 segmentos que tiene el kit de la Spartan-3. El alumno no tiene que
modificar nada.
- Dbug
Debug. Se trata de un archivo donde se gestionan las seales que se mostrarn
mediante leds o los displays. El alumno no tiene que modificar nada.
El alumno dispondr tambin de un archivo que no es .VHDL, sino .ucf:
- MaquinaSencilla.ucf
Este archivo se encarga indicar a qu entradas/salidas de kit de la Spartan-3 van
conectadas los distintos puertos de la mquina sencilla. Une los distintos puertos de
la mquina sencilla con interruptores, leds y displays de la Starter Board. Por
ejemplo, une el puerto de reset con el interruptor L14. El alumno no hace falta
que modifique nada de este archivo. Pero s saber en qu interruptor estn
asignadas las distintas seales de la mquina sencilla.

Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

66

3 Jerarqua de los Archivos VHDL de Partida
En la siguiente imagen se observa la jerarqua de los archivos de partida:

Figura 1. Jerarqua de Componentes
Esta jerarqua hay que tenerla presente en todo el diseo de la mquina sencilla. Hay que
saber en todo momento en qu nivel de la jerarqua se est trabajando.
En este manual de prcticas, la secuencia de diseo que se propone es ascendente, bottom-
up. Adems el orden de abajo a arriba segn se ha dibujado en la jerarqua. Se empieza con
el componente reg y se acaba con maquinasencilla_test. En el siguiente apartado de este
manual se describe la secuencia de diseo general que se seguir par implementar la
mquina sencilla.
4 Proceso General de Implementacin
En general, se sigue una metodologa de diseo ascendiente (bottom-up). Porque primero
se disean los bloques de menos nivel en la jerarqua, y se va subiendo de nivel.
El componente de la mquina sencilla, se ha subdividido en 3 componentes principales: la
Unidad de Datos, la Unidad de Control y la memoria.
4.1 Unidad de Datos
El primer bloque que se disea es la Unidad de Datos. Para ello, siguiendo con el mtodo
bottom-up, primero se disean todos los componentes internos de la UD.
Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

67

A partir de los cdigos de partida reg, reg1, mux2, mux4, ALU y UD se crean sus
respectivos archivos VHDL.
En el archivo UD.VHDL se declaran, por defecto, todos los componentes de la UD. As
que lo que hay que hacer en el archivo UD.VHDL es:
- Redisear a ALU segn la mquina sencilla en cuestin
- Configurar bloques. Aadir/eliminar registros y multiplexores y darle el
tamao adecuado en bits.
- Configurar puertos y seales. Aadir/modificar/eliminar puertos y seales
del bloque UD segn los bloques que se han utilizado en la UD.
- Configurar puertos dbug. Aadir/modificar/eliminar los puertos de debug
necesarios para la UD en cuestin.
4.2 Unidad de Control
A partir del cdigo de partida llamado UC se crea su respectivo archivo VHDL. En este
archivo, lo que hay que hacer es:
- Configurar puertos. Aadir/modificar/eliminar los puertos que hay por
defecto en el archivo UC.VHDL.
- Configurar seales.
- Configurar la mquina de estados. Modificar la secuencia de estados
segn el grafo de estados de la mquina sencilla en cuestin.
- Configurar la tabla con los bits de control.
- Configurar dbug_state.
4.3 Memoria
Segn el tipo de memoria de la mquina sencilla, segn si es RAM y/o ROM, se crean los
ficheros VHDL a partir de los cdigos RAM y ROM, respectivamente.
Estos dos archivos son muy genricos, y sirven para cualquier mquina sencilla. As que
no se ha de modificar nada.
A parte de el archivo de memoria en s, hay que crear un archivo auxiliar, un paquete. Cada
tipo de memoria tiene su paquete que es, RAM_pack y ROM_pack respectivamente.
De estos dos archivos auxiliares, s que hay que modificar una pequea parte.
4.4 MquinaSencilla.VHDL
Por ltimo, hay que crear el archivo MquinaSencilla.VHDL a partir del cdigo
MquinaSencilla. Este es bloque de mxima jerarqua, y abarca todos los bloques creados
hasta el momento: UD, UC y memoria(s). Aparte, contiene el bloque llamado dbug.
Lo que hay que hacer en este archivo es:
- Configurar seales.
- Configurar inicializacin de memoria. Hay que crear un programa que la
mquina sencilla en cuestin entienda.
- Configurar seales dbug.
Finalmente, hay que crear los archivos MaquinaSencilla.ucf, dbug y led7seg.
Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

68

Una vez se llega a este punto, el siguiente paso es simular la mquina sencilla.
4.5 Simulacin
Antes de simular se tiene que crear el archivo tipo test bench para dar unos valores
iniciales a los puertos de entrada de la mquina sencilla. El fichero se crea a partir del
cdigo de partida llamado maquinasencilla_test. Este cdigo no hace falta que lo
modifique el alumno, es totalmente aprovechable.
Una vez creado el archivo, se puede pasar a simular la mquina con el programa iSIM
Simulator.
En la simulacin se comprueba el buen funcionamiento de la mquina sencilla.
Cuando se determina que la simulacin es correcta, y que por lo tanto, la mquina sencilla
funciona correctamente, se pasa a implementar fsicamente la mquina sencilla, es decir,
programar la FPGA.
4.6 Programacin de la FPGA
Primero se crea el archivo de programacin con la herramienta Generate Programming
File, y luego se pasa a programar la FPGA con el software ISE iMPACT.
Una vez se ha programado la FPGA se puede comprobar el funcionamiento, y si es
correcto, ya se ha implementado la mquina sencilla en la FPGA correctamente.

Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

69

5 La Mquina Sencilla
El manual de prcticas sigue el ejemplo de implementacin de una mquina sencilla de
ejemplo. A continuacin est el enunciado de la mquina sencilla.
5.1 Enunciado
Lo primero que hay que hacer es interpretar el enunciado de la mquina sencilla. En este
caso, tenemos una unidad de datos as:

Figura 2. Unidad de Datos
La lneas discontinuas que aparecen en la imagen representan seales procedentes de la
Unidad de Control. Y encima de cada componente, de color rojo, aparece el nombre del
cdigo de partida con el que se crea el componente.
En la imagen tambin aparece el bloque de memoria RAM. Cmo se puede observar, su
bus de direcciones es de 7 bits, por lo tanto la memoria podr almacenar hasta 2
7
palabras
(128). A partir del bus de entrada y de salida de la memoria se puede deducir el tamao de
cada palabra de la memoria, que es de 16 bits. Por lo tanto la memoria a utilizar ser una
memoria de 128 x 16 bits.
En la imagen no salen especificadas las operaciones que puede realizar la ALU. Segn los
bits de seleccin de la ALU, sta realizar las siguientes operaciones:
ALU
1
ALU
0
Operacin
0 0 A+B
0 1 A xor B
1 0 B
1 1 -
Tabla 1. Tabla de Operaciones de la ALU

Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

70

Todas las instrucciones que puede ejecutar esta mquina sencilla tienen un tamao de 16
bits. Los dos bits de mayor peso forman el Cdigo de Operacin, los siguientes 7 bits
forman el operando Fuente y los 7 bits de menor peso forman el operando Destino. Las
instrucciones son:
- Suma
ADD F,D (D) (D)+(F)
FZ 1 si (D)+(F)=0
Formato:
CO
1
CO
0
F
6
F
5
F
4
F
3
F
2
F
1
F
0
D
6
D
5
D
4
D
3
D
2
D
1
D0
0 0 @F @D

- Movimiento
MOV F,D (D) (F)
FZ 1 si (F)=0
Formato:
CO
1
CO
0
F
6
F
5
F
4
F
3
F
2
F
1
F
0
D
6
D
5
D
4
D
3
D
2
D
1
D
0

0 1 @F @D

- Comparacin
CMP F,D FZ 1 si (F)-(D)=0
Formato:
CO
1
CO
0
F
6
F
5
F
4
F
3
F
2
F
1
F
0
D
6
D
5
D
4
D
3
D
2
D
1
D
0

1 0 @F @D

- Salto
BEQ D PC D si FZ = 1
Formato:
CO
1
CO
0
F
6
F
5
F
4
F
3
F
2
F
1
F
0
D
6
D
5
D
4
D
3
D
2
D
1
D
0

1 1 X @D


A partir de aqu ya se puede determinar cmo debe ser la mquina de estados finitos que
describir a la Unidad de Control de esta mquina sencilla. Es necesario realizar bien esta
mquina de estados, porque a partir de ella se disea la Unidad de Control. No es necesario
llegar a tener el diagrama muy simplificado.
A continuacin est representado el grfico de estados completo y simplificado:
Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

71


Figura 3. Mquina de Estados
Ahora se puede disear la tabla con los bits de control de cada uno de los estados:

S0 S12 S6 S7 S9 S10 S11
MX1 0 1 1 1 X 1 1
MX0 0 0 1 1 X 1 1
ALU1 X X X 0 0 1 X
ALU0 X X X 0 1 0 X
L/E 0 0 0 1 0 1 0
PC @+1 1 0 0 0 0 0 1
IR M 1 0 0 0 0 0 1
A M 0 0 1 0 1 0 0
B M 0 1 0 0 0 0 0
FZ Z 0 0 0 1 0 1 0
Tabla 2. Tabla de Bits de Control
5.2 Programa a Ejecutar
Ahora es el momento de disear el programa que ejecutar esta mquina sencilla.
Observando las instrucciones que puede ejecutar esta mquina hay que pensar alguna
aplicacin que podra tener. Lo interesante es que sea un programa que utilice todas las
instrucciones.
En este caso se ha creado un programa que realiza la operacin de multiplicar dos nmeros,
a x b = c. El programa queda en la memoria queda as:
Direccin Instruccin OP Op. F Op. D
@0h MOV 0,c 10 1101001 1100110
@1h MOV 0,i 10 1101001 1100111
@2h CMP i,b 01 1100111 1100101
@3h BEQ end 11 xxxxxxx 0001000
@4h ADD a,c 00 1100100 1100110
@5h ADD l,i 00 1100000 1100111
Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

72

@6h CMP 0,0 01 1101001 1101001
@7h BEQ while 11 xxxxxxx 0000010
@8h BEQ 8 11 xxxxxxx 0001000
Tabla 3. Tabla del Programa 1
Como se puede observar, aparte de determinar la secuencia de instrucciones hay que tener
claros dos puntos:
- La posicin de memoria que ocupar cada instruccin. Tambin hay que tener
claro si vamos a separar la memoria de programa de la memoria de datos, o si
estar todo junto. En este caso se ha separado, puesto que en estas primeras 8
direcciones de la memoria no hay ningn dato como 0 1.
- La traduccin en bits que representa cada instruccin. Porque es necesario ms
adelante.
Este programa utiliza implcitamente otras direcciones de la memoria. Por ejemplo:
En la instruccin MOV 0,c, que significa que cargamos el valor 0 en la variable c,
se le tienen que indicar la direccin donde se encuentra el valor 0, que en este caso es en
@1101001, o en hexadecimal: @69. Por lo tanto, la memoria, tiene que tener por
defecto el valor 0 cargado en la direccin @69 antes de que se ejecute el programa.
En la siguiente tabla, se expresan todas las direccin que el programa anterior utiliza
indirectamente:
Direccin Descripcin Valor incial
@64h Operando a valor deseado
@65h Operando b valor deseado
@66h Operando c xxxxxxx
@67h Variable i xxxxxxx
@68h Nmero 1 0000001
@69h Nmero 0 0000000
Tabla 4. Tabla del Programa 2
6 Implementacin de la Mquina Sencilla
6.1 Creacin del Proyecto
Lo primero que hay que hacer es crear un proyecto. En el Anexo 1 se explica el proceso
para crear un nuevo proyecto.
Una vez se ha creado el proyecto, se puede empezar a crear ficheros VHDL. Siguiendo el
Proceso General de Implementacin, descrito en el apartado 4, se empieza por la Unidad
de Datos.
6.2 Unidad de datos
6.2.1 Creacin de ficheros
Lo primero que se tiene que hacer es crear ficheros VHDL, donde se pegarn los distintos
ficheros de texto con cdigo VHDL que el alumno tiene de un buen inicio.
Para empezar, se har uso slo de los ficheros que afecten a la Unidad de Datos de esta
mquina sencilla. Como ya se ha visto en el enunciado, la Unidad de Datos de esta
mquina sencilla tiene los siguientes bloques:
- Registro PC, Registro A, Registro B, Registro IR. Estos bloques se crearan a
partir del fichero reg.
Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

73

- Multiplexor de 4 entradas. Este bloque se crear a partir del fichero mux4.
- Sumador. Este bloque se crear a partir del fichero inc.
- ALU. Este bloque se crear a partir del fichero ALU.
- Registro Flag Z. Este bloque se crear a partir del fichero reg1.
El proceso de creacin de nuevos ficheros VHDL est descrito en el Anexo 2.1.
Cuando se han creado todos estos archivos VHDL, en la izquierda se puede observar la
jerarqua de los archivos. De momento, slo se puede ver que reg est dentro de reg1.
Si se est siguiendo el ejemplo, se tienen que haber creado los siguientes ficheros: ALU,
reg, reg1, inc, mux2,mux4.
Siguiendo con el Proceso General de Implementacin, el siguiente paso es redisear la
ALU.
6.2.2 Diseo de la ALU
El archivo ALU.vhd que se ha creado en el apartado anterior se trata de de una ALU
concreto de la mquina sencilla de ejemplo. Seguramente no sirve para otras mquinas
sencillas, as que, si se tiene intencin de crear otra mquina sencilla que no sea la del
ejemplo, habr que redisear la ALU.
En el Anexo 3, se hace un anlisis del cdigo para saber cules son los puntos que suelen
variar de la ALU de una mquina sencilla a otra.
Si se est implementando la mquina sencilla de ejemplo, no hace falta modificar el cdigo.
Si se ha tenido de redisear la ALU, hay que hacer una comprobacin de la sintaxis del
cdigo escrito antes de continuar. El proceso para comprobar la sintaxis de cdigo se
explica en el Anexo 5.
Cuando se ha llegado a este punto, ya se tienen diseados todos los tipos de componentes
que van a formar la Unidad de Datos. Ahora hace falta decir cuntos componentes tipo
reg habrn, qu nombre tendr cada registro y cmo estarn conectados con el resto de
componentes de la UD. Y lo mismo para el resto de tipos de componentes, reg1, ALU,
mux4, etc.
6.2.3 UD.VHDL
Para ello se crea un bloque, una caja, que estar un nivel por encima en la jerarqua, de tal
forma que abarcar todos los componentes de la Unidad de Datos. Este bloque nuevo de
jerarqua superior se crear a partir del fichero de partida llamado UD. Para crear el
fichero .VHDL se hace siguiendo los pasos del Anexo 2.1
Si se ha hecho bien, lo primero que se ve es que en la jerarqua, en la izquierda, algunos
componentes, automticamente, se han situado dentro del bloque de UD. Esto se interpreta
como que son de una jerarqua inferior a UD. Sin embargo, puede ser que algn tipo de
componente an no se site dentro de UD, es normal.
A continuacin hay que analizar el archivo UD.VHDL para adaptarlo a la UD de la
mquina sencilla que se est diseando.
6.2.4 Anlisis del Cdigo UD.VHDL
Lo primero que se describe, como en cualquier bloque, son las definiciones de los puertos
de entrada y de salida del bloque. En este caso, la UD se representara as:
Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

74


Figura 4. Esquema Bloque Unidad de Datos

Es aconsejable dibujarse un esquema como este para cada Unidad de Datos para tener ms
claro que puertos tiene que tener en cada caso. El anlisis de los puertos de esta Unidad de
Datos se hace en el Anexo 8.1. Es aconsejable lerselo para saber cules son las
modificaciones que hay que hacer en los puertos de UD para otras mquinas sencillas.
El bus de direcciones, que en este caso se le ha llamado addr es especial. El anlisis de
su modificacin se hace en el Anexo 8.2.
Siguiendo con el cdigo, ahora vienen las seales internas de la UD. En el Anexo 8.3 se
hace un anlisis para saber qu seales se pueden modificar.
Seguidamente de la palabra reservada begin va la descripcin del comportamiento este
componente, UD. El anlisis del comportamiento est hecho en el Anexo 8.4.
Es importante leerse este anexo porque en l se explica, primero cmo declarar
componente y segundo, la gestin de seales que se hace al final de este cdigo.
Cuando se llega a este punto, es necesario comprobar sintaxis como se explica en el Anexo
5.
Si no hay problemas de sintaxis, siguiendo con el Proceso General de Implementacin, se
pasa a disear la Unidad de Control.

Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

75

6.3 Unidad de Control
El objetivo de este apartado es implementar la mquina de estados finita y sus bits de
control en lenguaje VHDL.
Lo primero que se tiene que hacer es crear un fichero .VHDL a partir del cdigo de partida
llamado UC. El procedimiento se explica en el Anexo 2.1.
A continuacin, hay que analizar el cdigo de partida para saber qu partes hay que
modificar para implementar otras mquinas sencillas que no sean la de ejemplo.
6.3.1 Anlisis del cdigo UC.VHDL
La Unidad de Control se trata de otro componente ms, as que como todo componente se
empieza definiendo sus puertos de entrada y salida:

Figura 5. Esquema del Bloque de Unidad de Control
El anlisis de los puertos de hace en el Anexo 9.1.
Una vez declarados los puertos, se pasa a describir el comportamiento del componente.
Pero antes se declaran su seales internas. La explicacin de las seales de la UC, y las
modificaciones que se tienen que hacer, se encuentran en el Anexo 9.2
Una vez declaradas las seales se pasa a declarar el comportamiento de la UC.
En esta parte del cdigo se utilizan dos estructuras del VHDL que an no se haban visto:
-process-end process: explicado en el Anexo 4.6
- If-then-elseif-endif: su utilizacin es la misma que la del leguaje C.
Esta parte se trata de la descripcin en VHDL de la mquina de estados finita de la UC.
Y por lo tanto, se tendr que modificar para cada mquina sencilla.
El anlisis de esta parte, junto con la explicacin de las modificaciones que se podran
hacer, est hecho en el Anexo 9.3.
Una vez determinada la secuencia de estados que puede seguir la mquina sencilla, hay
que determinar los valores que tomarn los bits de control de la UC en cada estado. Se trata
de implementar la tabla de los bits de control en VHDL. Esto se hace con un process
Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

76

end process y una asignacin de seales a puertos. Su explicacin se encuentra en el
Anexo 9.4.
Finalmente, lo que hay que hacer en la UC es darle un valor numrico a cada estado. Este
valor numrico es el que saldr por el puerto dbug_state y servir para saber en qu
estado se encuentra la mquina. La explicacin se encuentra en el Anexo 9.5.
Una vez se llega a este punto, se ha completado la Unidad de Control. Siguiendo con
Proceso General de Implementacin, se pasa a implementar las memorias.
6.4 Memorias
Este apartado tiene como objetivo implementar la memoria de la mquina sencilla. En este
caso, la mquina sencilla slo tiene un tipo de memoria, RAM. Pero puede ser que alguna
mquina sencilla tenga memoria RAM y memoria ROM.
6.4.1 Memoria RAM
El alumno tiene, de partida, un fichero que se llama RAM. Este fichero se ha de convertir
en un fichero .VHDL como se explica en el Anexo 2.1
Del fichero RAM.VHDL el alumno no ha de modificar nada.
El alumno tambin tiene un fichero de partida llamado RAM_pack. A partir de este
cdigo se tiene que crear un VHDL Package y no un archivo .VHDL. Los pasos para
crear un VHDL package se explican en el Anexo 2.2.
Una vez creado el archivo RAM_pack, se tiene que modificar.
6.4.2 Anlisis de RAM_pack y ROM_pack
Este fichero no hace falta que se analice totalmente, porque el alumno slo tiene que
modificar una parte muy pequea del cdigo. La explicacin se encuentra en el Anexo 10.
Una vez se llega a este punto ya se tienen completadas: la Unida de Datos, la Unidad de
Control y la(s) memoria(s).
Ahora hace falta crear un fichero que interconecte estos componentes que se han creado.
Se tiene que crear un fichero de un nivel superior en la jerarqua que los abarque.
Este fichero que se tiene que crear estar en el nivel ms alto de la jerarqua. Los puertos
de entrada y salida de este bloque son entradas y salidas fsicas del Starter Board kit: leds,
switches, el reloj, etc.
6.5 MaquinaSencilla.VHDL
El alumno tiene un cdigo de partida llamado MaquinaSencilla, con este cdigo se tiene
que crear un VHDL Module, como se explica en el Anexo 2.1.
Adems tambin es el momento de crear los ficheros dbug.VHDL y led7seg.VHDL a
partir de los cdigos dbug y led7seg.
6.5.1 Anlisis MaquinaSencilla.VHDL
Libreras y puertos
En este fichero, como en todo componente, se empieza determinando qu libreras utiliza
el cdigo y los puertos de entrada y salida:
Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

77


Figura 6. Cdigo MaquinaSencilla, puertos
El alumno no tiene que modificar ninguno de los puertos.
Como se puede ver, en este caso se utiliza el paquete RAM_pack porque esta mquina
sencilla tiene memoria RAM.
Si la mquina sencilla tiene memoria ROM y RAM, hay que usar las dos libreras, por lo
tanto, se tiene que escribir:

Figura 7. Cdigo MaquinaSencilla, libreras

Siguiendo con el cdigo, a continuacin viene la declaracin se seales de este
componente:

Figura 8. Cdigo MaquinaSencilla, seales
Para saber cules son las seales que hay que definir es aconsejable hacerse un esquema
donde se representen todas las entradas y salidas de la UD, UC y memoria. Por ejemplo, en
este caso el esquema es:
Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

78


Figura 9. Esquema bloque MaquinaSencilla

Todas las entradas y salidas de la UD, UC y memoria tiene que definirse como seales.
El alumno tiene que modificar el nombre y/o rango de bits de las seales que hay en el
cdigo de partida. Probablemente tenga que crear nuevas seales o eliminar seales
inexistentes en su mquina sencilla, como podra ser, por ejemplo, la seal FZ.
Adems hay tres seales que el alumno tiene que dejar tal y como estn: dbug_led,
dbug_in y dbug_clk.
Inicializacin de memoria(s)
La siguiente parte del cdigo realiza la inicializacin de la(s) memoria(s). La inicializacin
es el programa que ejecutar a mquina sencilla. La explicacin de cmo inicializar
memorias est en el Anexo 11.
Declaracin de los componentes: UD ,UC ,memoria(s)
Una vez preparada la inicializacin de las memorias se puede pasar a definir los
componentes que forman la mquina sencilla, que son la UD, UC y memoria(s).
El mtodo para declarar componentes en este bloques es exactamente el mismo mtodo
que se ha utilizado para declarar los componentes de la Unidad de Datos en el archivo
UD.VHDL

Figura 10. Cdigo MaquinaSencilla, componentes.
Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

79


Lo nico que hay que saber, y tener muy en cuenta, es el orden en el que se han declarado
los puertos de cada componente, porque aqu se tienen que asignar las seales en el mismo
orden.
Los port map de las memorias RAM y ROM se explican en el Anexo 7.
El alumno no tiene que modificar el ltimo componente, llamado dbug. Se trata de un
componente que se utiliza para depurar ( o debugear) partes de la mquina sencilla
cuando se ha implementado fsicamente.
Gestin de puertos
Siguiendo con el cdigo, ahora viene una parte que sirve para gestionar los puertos de
entrada y salida de la mquina sencilla. Esta parte del cdigo de explica en el Anexo 12.
Llegado a este punto slo hace falta hacer 2 comprobaciones para saber si todo el cdigo
escrito no tiene errores de sintaxis y es sintetizable.
Para hacer la comprobacin de sintaxis se hace como se explica en el Anexo 5.
Para comprobar si es sintetizable, se explica en el Anexo 13.
Si el cdigo se ha sintetizado sin problemas, se puede pasar a implementar el diseo. La
explicacin de cmo implementar el diseo est en el Anexo 14.
Si se ha sintetizado e implementado el diseo correctamente se puede pasar a programar la
FPGA para implementar fsicamente la mquina sencilla. Pero antes es mejor simular la
mquina con el simulador que tiene el programa. De esta manera sabremos si la mquina
sencilla ejecuta correctamente el programa que tiene en memoria y, por lo tanto, se puede
decir que funciona correctamente.
6.6 Simulacin
Este apartado pretende ser una gua para llegar a simular la mquina sencilla del ejemplo.
Lo primero que hay que hacer es crear un fichero de test bench a partir del archivo de
partida llamado MaquinaSencilla_test. La explicacin de cmo hacerlo se encuentra en
el Anexo 2.3.
Una vez creado el test bench se tiene que hacer clic en simulation:

Figura 11. Selector de Simulacin.
Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

80

Luego se selecciona el archivo MaquinaSencilla_test y se hace doble clic en Simulate
Behavioral Model:

Figura 12. Herramienta Simulate Behavioral Model.
Entonces se abrir otro programa nuevo, el ISim Simulator, el simulador.
Para que se abra el simulador, tiene que estar cerrado, sino la consola avisar de un error y
no se abrir el simulador.
Este simulador tiene la pantalla dividida en 2 ventanas principales. A la izquierda hay
como un explorador de seales y componentes. En esta ventana se pueden buscar las
seales internas de la mquina sencilla. De la misma manera que cuando se exploran
carpetas en el explorador de Windows.
Por ejemplo, si se quiere observar la seal de salida del registro PC, se puede acceder a ella
entrando en: maquinasencilla_test\uut\UD. Si se hace clic en UD, se puede encontrar la
seal PC en la derecha.
Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

81


Figura 13. Explorador de seales.
A la derecha de la pantalla, hay una ventana de fondo negro. Ah se representan las seales
y se puede observar cmo varan con el tiempo. Por defecto, hay algunas seales, se
pueden borrar. Y para observar las seales que son de inters lo que hay que hacer es
buscarlas en el explorador de la izquierda y arrastrarlas a la ventana de fondo negro.
Una vez se han arrastrado todas las seales de inters, y por lo tanto, se tiene un wave
configuration, se puede guardar el archivo. Esto sirve para ahorrarse el tener que hacer la
seleccin de seales cada vez que se abre el programa.
Los botones para controlar la simulacin se encuentran al final de la barra de men
superior:

Figura 14. Herramientas de simulacin.
El primer icono sirve para hacer un reset de la simulacin. Cuando se aade una nueva
seal a la simulacin es necesario hacer un reset para poder verla representada
temporalmente.
El segundo no es til para simular un mquina sencilla
Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

82

El tercero, sirve para simular el tiempo determinado a la derecha. En el caso de la imagen,
1 s. Este es el que se usa para iniciar la simulacin. Hay mquinas sencilla que en 1 s no
han acabado de ejecutar su programa, entonces hay que darle un tiempo de simulacin ms
grande, lo suficiente para que termine de ejecutar el programa.
Para observar mejor las seales, hay opciones de zoom:

Figura 15. Herramientas de zoom.
Es aconsejable hacer clic primero en el tercer icono, Zoom to full view, entonces se ver la
forma de onda cuadrada del reloj. Y despus hacer zoom con el primer icono hasta algo
razonable.
Hay algunas seales, como pueden ser registros de 16 bits, que no es muy cmodo
observarlas en su valor binario. Se pueden observar en hexadecimal haciendo clic derecho
sobre la seal y cambiando el radix:

Figura 16. Observar en hexadecimal.
Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

83

En el explorador, no solo se pueden encontrar seales, tambin se pueden encontrar las
memorias. Haciendo clic en la pestaa memory debajo del explorador:

Figura 17. Pestaa de memoria.
En las memorias se puede observar tanto la inicializacin como el valor final que toma
cada celda de memoria al haberse ejecutado el programa. En el caso de una mquina
sencilla es de inters mirar el estado final de la memoria RAM:

Figura 18. Memoria RAM.
Si se hace doble clic en ram, se abre una tabla donde cada casilla de la tabla es una celda
de la memoria, y dentro est el dato que contiene la celda. No hay que confundir ram con
mem_init, o programa_RAM. Eso son las inicializaciones.

6.6.1 Comprobacin del buen funcionamiento
Cmo primera aproximacin para determinar si la mquina sencilla funciona bien, se
puede observar cmo evoluciona la seal s. En ella se ve el estado actual de la mquina
sencilla. Si la secuencia de estados es la esperada segn el programa que se ha hecho, se
pueden hacer otras comprobaciones como que la memoria RAM tenga los resultados de las
operaciones correctamente guardados en sus celdas.
Si la secuencia de estados no es la esperada, habr que investigar de dnde viene el error.
Primero detectar el primer estado errneo, mirar CO, asegurarse de que se haya descrito
correctamente la mquina de estados en la UC, e ir tirando hacia atrs hasta encontrar el
origen del problema.
6.7 Programacin de la FPGA
En este apartado se explica qu pasos hay que seguir para programar la FPGA con el diseo de la
mquina sencilla que se ha hecho en VHDL.
Primero que todo, hay que crear el fichero maquinasencilla.ucf . Se crea a partir del cdigo de
partida llamado maquinasencilla.ucf. La explicacin de cmo hacerlo est en el Anexo 2.4.
Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

84

Este archivo ucf se encarga de indicar a qu entradas/salidas de la placa van conectadas los
distintos puertos de la mquina sencilla. Une los distintos puertos de la mquina sencilla con
interruptores, leds y displays de la placa. Por ejemplo, une el puerto de reset con el interruptor
L14. El alumno no hace falta que modifique nada de este archivo. Pero s saber en qu
interruptor estn asignadas las distintas seales de la mquina sencilla.
En la siguiente imagen se describe dnde se ha conectado cada puerto de la mquina sencilla:
8) dbug_led. Displays 7 segmentos.
9) dbug_in. 8 Leds.
10) rst. Seal de reset
11) clk_user. Reloj manual.
12) sw[5:3]. Interruptores que seleccionan la seal a mostrar por los 4 displays 7
segmentos
13) sw[2:1]. Interruptores que seleccionan la seal a mostrar por los 8 leds.
14) sw[0]. Interruptor que selecciona el reloj con el que funciona la mquina
sencilla. 1 para 50 MHz y 0 para reloj manual.

Figura 19. Asignacin de puertos en la placa
Una vez creado el archivo .ucf hay que crear el fichero de programacin de la FGPA. Para ello se
tiene que hacer doble clic en Generate Programming File. (Se ha de estar en Implementation y
tener seleccionado el componente de mxima jerarqua, que es MaquinaSencilla).
Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

85


Figura 20. Generate Programming File
Cuando se hace doble clic se vuelve a sintetizar la mquina sencilla. Una vez sintetizada,
automticamente pasa a Implementar el Diseo y finalmente pasa a Generar el Archivo de
Programacin.
De los tres pasos se obtiene el veredicto, que como ya se ha visto puede ser totalmente correcto,
con warnings o errneo. Los warnings hay que mirarlos con detalle y intentar solucionarlos.
Cuando se ha generado el archivo correctamente hay que hacer doble clic en Manage
Configuration Project:

Figura 21. Manage Configuration Prjoect
Entonces se abrir un programa llamado ISE iMPACT.
Ahora se puede conectar la placa Spartan 3 mediante el conector JTAG Puerto Paralelo al PC.
Y tambin el cable de alimentacin.
Una vez conectados los cables hay que seguir estos pasos:
1) Doble clic en Boundary Scan
Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

86


Figura 22. Boundary Scan
2) Clic botn derecho en la ventana principal y clic en Initialize Chain

Figura 23. Initialize Chain
3) El programa detectar la FPGA y memoria.

Figura 24. FPGA y memoria detectadas
La FPGA es el bloque llamado xc3s200

4) Ahora hay que cargar el programa a la FGPA, para ello se tiene que hacer doble clic en el
bloque de la FPGA y se abre una ventana:
Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

87


Figura 25. Seleccionar maquinasencilla.bit
En la ventana hay que seleccionar maquinasencilla.bit. Este es archivo que se genera con la
herramienta Generate Programming File.

5) Antes de programar la FPGA, es muy aconsejable pulsar el pulsador para forzar la
reconfiguracin de la FPGA. Este pulsador es el siguiente:

Figura 26. Pulsador de reconfiguracin

6) Ahora, teniendo seleccionada la FPGA (se tiene que ver de color verde) se hace clic
derecho en la pantalla principal y se selecciona Program:

Figura 27. Program
Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

88


7) Entonces se abrir una ventana. Hay que darle a OK y se empezar a programar la FPGA.

Figura 28. Clic OK
El otro bloque que aparece al lado de la FPGA hay que dejarlo como sale por defecto, en bypass.
6.7.1 Comprobacin del buen funcionamiento
Para comprobar que la mquina sencilla programada en la FPGA funciona correctamente se puede
hacer comparando las seales que se pueden mostrar mediante los leds y displays con la simulacin
hecha en el PC.
Para poder ver mejor su funcionamiento, el reloj de la mquina sencilla debe ser el manual, as que
el sw[0] tiene que estar a 0.
Entonces, con el pulsador de paso a paso se puede ir haciendo avanzar la mquina sencilla estado a
estado. Recordar que para reiniciar la mquina sencilla y que vuelva al estado 0 y a la primera
instruccin del programa, est el botn de reset. Observar figura 19.
Una primera comprobacin puede ser observar si se sigue la misma secuencia de estados que en la
simulacin.
Luego se puede pasar a comprobar los valores que van tomando registros, seales y buses.
En este punto, se ver la diferencia entre simulacin y implementacin real. Porque en la
simulacin, cuando una celda de la memoria vale X, se observa X, pero en la realidad no hay
X, hay o bien 1 o bien 0. Y por eso, cuando en la simulacin un registro, seal o bus marca
que su valor es X en la implementacin real saldr un valor aleatorio.
En ocasiones, puede ser que la seal simulada y la real no coincidan exactamente. Todo tiene su
explicacin lgica. La explicacin se encuentra en el Anexo 15.

Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

89

Anexo 1 Crear proyecto
Para crear un proyecto nuevo, hay que abrir el programa Xilinx ISE.
Una vez abierto, hay que hacer clic en la opcin New project, a la izquierda de la
pantalla.

Figura 29. New project
Se abre una nueva ventana, donde hay que indicar el nombre del proyecto y localizacin
donde se guardar. El nombre es indiferente, MS1 por ejemplo, y la direccin debe ser
alguna de fcil localizacin. Una vez hecho hay que darle a next.

Figura 30. Nombre del proyecto
Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

90

En la siguiente ventana hay que dejar todas las opciones como indica esta imagen y darle a
next.

Figura 30. Propiedades de proyecto
En la siguiente ventana hay que darle a next directamente. Simplemente es informativa.

Anexo 2 Crear archivos VHDL, paquetes, ucf y test_bench
Anexo 2.1 Crear Archivo VHDL
Hay que seguir los 5 pasos siguientes:
1) Project New source.

Figura 31. New source
Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

91

2) En la ventana que se abre hay que seleccionar el tipo VHDL Module. El nombre
del archivo es importante que se utilicen los propuestos: reg para registro, mux2
para multiplexor de 2 entradas, etc. La localizacin del archivo hay que dejar la que
sale por defecto.

Figura 32. VHDL Module
3) Las siguientes dos ventanas se pueden pasar: next y finish.
Ahora ya se ha creado un archivo .VHDL. En la ventana ms grande, en el centro, est el
cdigo VHDL. Por defecto, el programa ya escribe unas lneas de cdigo.
4) Todo el cdigo que genera el programa por defecto se tiene que borrar, ya que no
es de inters.
5) Una vez limpiado el cdigo, hay que poner el cdigo de partida que se est creando.
Por ejemplo, si se est creando el archivo reg.VHDL hay que pegar el cdigo de
partida reg.
6) Guardar el archivo.

Anexo 2.2 Crear Archivo VHDL package
Se siguen los mismo pasos en el Anexo 2.1, con la diferencia que en el paso dos, se escoge
la opcin de VHDL package.
Si se han seguido los 5 pasos correctamente, se puede observar que este fichero creado no
aparece en la jerarqua. Esto es correcto. Este fichero se encuentra en las libreras. Para
acceder a la libreras hay que hacer clic en la pestaa. En la imagen se puede ver dnde
est la pestaa:
Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

92


Figura 33. RAM_pack
Anexo 2.3 Crear Archivo MaquinaSencilla_test
Para hacerlo, se hace como si se creara un archivo .VHDL normal pero hay que seleccionar
VHDL Test Bench:

Figura 34. VHDL Test Bench
Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

93

Como nombre del archivo hay que poner MaquinaSencilla_test.
En la siguiente ventana es importante seleccionar MaquinaSencilla. Porque se quiere
asociar el test bench al archivo de mxima jerarqua:

Figura 35. Asociar con MaquinaSencilla
A continuacin se le da a next y finish. Y se pega el cdigo del archivo de partida en este
archivo nuevo creado. Y se guarda.

Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

94

Anexo 2.4 Crear Archivo MaquinaSencilla.ucf
Para crear un archivo .ucf hay que seguir los mismos pasos que para crear un archivo
VHDL normal, pero hay que seleccionar Implementation Constraits File:

Figura 36. Implementation Constraits File
Una vez se ha creado el archivo .ucf, se pega el cdigo de partida. Y se guarda.

Anexo 3 Anlisis de la ALU
Primero que todo, hay que entender la ALU como un caja que tiene unas entradas y unas
salidas. De hecho, cualquier archivo VHDL tiene que entenderse as. Una ALU siempre
suele tener entradas de datos, entrada de seleccin y salidas.
La caja que representara la ALU del ejemplo de mquina sencilla es la siguiente:

Figura 37. Esquema del bloque de la ALU
En el cdigo, lo primero que hay que determinar son las entradas y las salidas de la caja.
Lo que se llaman puertos.


Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

95

En el archivo de partida, ALU, hay lo siguiente:

Figura 38. Puerto de la ALU
La explicacin general de los puertos en lenguaje VHDL est en el Anexo 4.1.
Una vez definidos los puertos, hay que definir el comportamiento interno de la caja. En el
caso de este ejemplo, el comportamiento se ha descrito as:

Figura 39. Seales y comportamiento de la ALU
La explicacin terica de qu es una seal y cmo se declara se encuentra en el Anexo 4.2.
En este ejemplo hay 4 seales definidas. Se puede decir que, en general, todas ellas se
pueden aprovechar para cualquier ALU. A continuacin est la explicacin de cada seal:
- signal aux : std_logic_vector (15 downto 0);
aux se trata de una seal auxiliar. Su funcin es recoger la operacin que realiza
la ALU, ya sea una multiplicacin, una suma o directamente una de sus
entradas. Su tamao ha de ser el mismo tamao que el puerto de salida de la
ALU o. En este caso 16 bits.
Si se requiere una ALU con una salida de otro tamao, se puede cambiar el
rango (15 downto 0) por el deseado.


- signal ua,ub,usum : std_logic_vector(auxrange);
Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

96

La funcin de las seales ua y ub, que es la abreviatura de unsigned a y
unsigned b, es recoger los datos de entrada a la ALU que entran por los
puertos a y b, pero transformados a enteros sin signo.
Es necesario transformar los datos de entrada a enteros sin signo para poder
realizar las operaciones aritmticas de suma, resta, multiplicacin, etc.
La funcin de la seal usum, que es la abreviatura de unsigned suma, es
recoger el resultado de la operacin aritmtica que se realiza con ua y ub.
En este caso, recoge la operacin de sumar.
Como se puede ver, el tamao de estas tres seales viene determinado como
(auxrange), eso significa que, el rango de estas 3 seales es el mismo rango
que el de la seal aux.
En la misma parte del cdigo se puede observar otra definicin:
- constant X : std_logic_vector (auxrange) := (others => X);
Se trata de una constante llamada X. Es un vector del mismo rango que aux.
Adems, a est constante se le da un valor inicial.
Se pueden asignar valores iniciales tanto a seales como a constantes. Para
hacerlo se utiliza el comando :=<asignacin>.
En este caso, la asignacin es (others=>X). La explicacin de esta
sentencia se encuentra en el Anexo 4.4.
Resumiendo, esta constante X es un vector de bits no definidos y se puede
aprovechar para todas las mquinas sencillas.
Despus de la definicin de las seales y constantes viene la palabra clave begin. Todo el
cdigo que va entre begin y end representa el comportamiento de la caja en s.
Hay que tener presente en todo momento que se trata de descripcin de hardware y no de
software. Esto quiere decir que no se trata de un cdigo que se ejecuta lnea por lnea, con
una secuencia determinada. Sino que simplemente de definen las conexiones entre seales,
puertos y las modificaciones que reciben.
Lo primero que se determina en el comportamiento de esta ALU es:

Figura 40. Transformaciones a unsigned
La lnea 22 asigna el puerto de entrada de la caja llamado a, a la seal interior de la caja
llamada ua. Pero antes, se transforma el tipo del puerto a de tipo std_logic_vector a tipo
unsigned. Esto se hace porque para poder operar aritmticamente es necesario que los
operandos sean nmeros reales y no vectores de bits.
En la lnea 23 se hace exactamente lo mismo, pero con el puerto b.
En la lnea 24 se realiza la operacin de sumar en s. Se suman los dos nmeros reales y se
guarda el resultado en la seal usum.
Siempre que la ALU en cuestin necesite realizar una suma, sern necesarias estas 3 lneas
de cdigo. En el caso de que adems la ALU necesite hacer una resta, se puede aadir una
cuarta lnea como la lnea 24 pero cambiando la suma por una resta y asignando la
Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

97

operacin a otra seal distinta a usum (porque no se pueden asignar dos operaciones a
una misma seal), por ejemplo ures.
En el caso de una multiplicacin, es distinto, porque por ejemplo, el producto de dos
vectores de de 16 bits da como resultado uno de 32 bits. As que, la operacin de
multiplicar se tendra que asignar a un seal de 32 bits. Y si la salida del la ALU tiene que
ser de 16 bits, de esos 32 bits, se cogen los 16 ms significativos, los 16 de menos peso.
Siguientemente va la seleccin de la operacin que tiene que ejecutar la ALU:

Figura 41. Seleccin de la operacin
Esta estructura de cdigo with selec - when es caracterstica del VHDL Es el equivalente
al switch o a un encadenamiento de if-else en lenguaje C. Su explicacin terica se
encuentra en el Anexo 4.5.
Su funcin es asignar un valor a una seal/puerto segn una seal de seleccin. En la ALU,
se tiene que seleccionar una operacin en funcin de sus dos bits de seleccin.
Los dos bits de seleccin de la ALU se recogen en el puerto llamado s. Por eso se
empieza escribiendo with s select .
A continuacin, se pasa a describir las distintas asignaciones segn los bits de s. Darse
cuenta que estos 4 casos se corresponden con la tabla que da el enunciado de la mquina
sencilla, donde se expresan todas las funciones de la ALU:
ALU
1
ALU
0
Operacin
0 0 A+B
0 1 A xor B
1 0 B
1 1 -
Tabla 5. Operaciones de la ALU

- Lnea 26: std_logic_vector(usum) when 00
De la misma manera que antes se ha transformado el tipo de
std_logic_vector a unsigned, ahora se hace el proceso inverso, se transforma
de unsigned a std_logic_vector. Cuando(when) el puerto s vale 00, en la
seal usum se guarda el resultado de la suma de los dos puertos a y b.
- Lnea 27: a xor b when 01
Cuando (when) el puerto s vale 01, a la seal aux se le asigna el
resultado de hacer la operacin lgica xor con a y b.

El VHDL tiene palabras reservadas para todas las operaciones lgicas:
and, or, xor, nand, nor, not, etc. Evidentemente, los operandos deben de ser
del tipo std_logic o std_logic_vector.
- Lnea 28: b when 10
Cuando (when) el puerto s vale 10, a la seal aux se le asigna el
directamente el valor del puerto de entrada b.
Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

98

- Lnea 29: X when others
Aqu se hace uso de la constante X y de la palabra reservada others, que
ya se ha explicado. Esta lnea significa que cuando s valga others, es
decir, cuando valga cualquier valor que an no se ha definido (ni 00, ni 01,
ni 10), a la seal aux se le asigna X.

Hace falta usar others (en vez de 11) porque en la estructura with
select tienen que estar determinados todos los posibles casos, incluidos los
casos en que s valga XX.
A continuacin, se trata con el flag Z de la ALU. Esta ALU s que tiene flag Z y para
implementarlo se utiliza esta lnea de cdigo:

Figura 42. Operacin para Flag Z
La funcin de esta lnea es asignar al puerto z un 1 si es que el resultado de la
operacin (que se almacena en aux) ha dado 0. O en caso de que el resultado haya sido
distinto de 0, asigna a z un 0. Para ello se utiliza la funcin or_reduce, que lo que hace
es realizar la operacin de or con cada bit del vector en cuestin, aux. De tal manera, que
esta operacin slo dar 0 cuando todos los bits valgan 0. Y como esta asignacin est
negada con la palabra reservada not, en caso de que or_reduce(aux) d 0 se asigna un 1
a z. Para utilizar esta instruccin, hay que hacer uso de la librera llamada std_logic_misc,
as que hay que asegurarse que en la cabecera del cdigo haya escrito: use
ieee.std_logic_misc.all; .
Esta lnea es totalmente aprovechable para cualquier ALU que tenga flag z. (Siempre que
se asigne el resultado de las operaciones de la ALU a la seal aux.)
Finalmente, falta asignar la seal aux, donde tenemos el resultado de la operacin, al
puerto de salida de la ALU, que en este caso se ha llamado o.

Figura 43. Asignacin al puerto

Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

99

Anexo 4 Lenguaje VHDL
Anexo 4.1 Puertos
En este anexo se explica el tema de puertos a partir de un ejemplo de port map. El ejemplo
es el port map de la ALU de la mquina sencilla de ejemplo:

Figura 44. Puertos de un componente
Un puerto se podra definir como una va de comunicacin entre el interior de un
componente y el exterior.
Como se puede observar:
- Todos los puertos, tanto los de entrada como los de salida, van dentro del
parntesis que se inicia en port( );
La sintaxis genrica es: <nombre>:[in/out] <tipo de seal>;
- Se escribe in para determinar que se trata de un puerto de entrada, o out
para lo contrario.
- Seguidamente, viene el tipo se seal que entrar/saldr por el puerto.
Principalmente hay dos tipos:
std_logic: que se trata de una seal de 1 bit
std_logic_vector: que se trata de un vector de bits.
- Para determinar el tamao del vector: seguidamente del std_logic_vector se
pone entre parntesis el rango de bits. El orden es importante, porque determina
el peso de los bits. Ejemplos:
std_logic_vector(6 downto 0) se trata de un vector de 7 bits, donde el bit
6 es el de ms peso y el 0 el de menos peso.
std_logic_vector(0 upto 6) significa un vector de 7 bits, donde el bit 6 es
el de menos peso y el 0 el de ms peso.
- Toda definicin de puerto acaba con ; excepto la ltima.
- El orden en que se definen los puertos (primero a, despus b, etc.) es importante
para ms adelante. Hay que procurar seguir un orden lgico, por ejemplo,
primero todas las entradas y luego todas las salidas.
Anexo 4.2 Seales
Una seal se podra definir como una va de comunicacin entre dos partes internas de un
componente. Tomando como ejemplo el cdigo de la ALU de la mquina sencilla de
ejemplo:
Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

100

Figura
45. Seales de un componente
Entre architecture Behavioral of ALU is y begin tenemos una serie de declaraciones.
Todas las declaraciones que van entre estas lneas de cdigo de llaman seales. Las seales,
son como puertos internos de la caja. Se definen igual que un puerto externo, slo que la
palabra clave en este caso es SIGNAL, y adems, no hay que indicar si es de entrada o
salida.
Anexo 4.3 Determinar Tamao de Vectores de Bits
Hay varias maneras de determinar el rango o tamao de un vector de bits:

- Seguidamente del tipo de puerto/seal/variable/constante, por ejemplo tipo
std_logic_vector, se pone entre parntesis el rango de bits. El orden es
importante, porque determina el peso de los bits. Ejemplos:
std_logic_vector(6 downto 0) se trata de un vector de 7 bits, donde el bit
6 es el de ms peso y el 0 el de menos peso.
std_logic_vector(0 upto 6) significa un vector de 7 bits, donde el bit 6 es
el de menos peso y el 0 el de ms peso.

- Seguidamente del tipo de puerto/seal/variable/constante, por ejemplo tipo
std_logic_vector, se pone entre parntesis la referencia a otro
puerto/seal/variable/constante que tiene el mismo rango de bits. Por ejemplo:

std_logic_vector(auxrange), eso significa que, el rango de este
puerto/seal/variable/constante es el mismo rango que el de la seal
aux.
Anexo 4.4 Palabra Others y valor X
La palabra others, es una palabra reservada del VHDL, sirve para asignar un valor a todos
los elementos de una matriz o vector que an no se le ha asignado un valor. Por ejemplo:
A :=(others => 0); asigna un 0 a todas las posiciones de A que no se le
ha asignado an un valor.
A :=(others => 1); asigna un 1 a todas las posiciones de A que no se le
ha asignado an un valor.

Puede ser que se haya escrito A :=(others=>X) lo que significa que se asigna X a todas
las posiciones del vector A. Cuando asignamos el valor X en VHDL significa que ese
elemento no est definido, y cuando simulemos, veremos una X en la posicin que la
hemos asignado . Aunque, hay que tener en cuenta, que cuando se implemente
fsicamente, el bit asignado con una X, ser 0 1, pero no X.

Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

101

Anexo 4.5 With select when
Esta es una estructura del VHDL equivalente al case o a una anidacin de if else en
leguaje C.
Se evala una seal/puerto/variable para ejecutar distintas operaciones segn su valor. Por
ejemplo:
Figura
46. With select - when
Cuando s valga 10 a aux se le asignar b. O cuando s valga 01, a aux se le
asignar el resultado de hacer a xor b.
En esta estructura, todas las posibles combinaciones que puede valer s tienen que estar
determinadas, incluso si vale XX. As que se suele hacer uso de la palabra reservada
others para referirse a todo el resto de valor que puede tomar s.
Como en la primera lnea (lnea 26) se asigna una operacin a la seal aux, si en las
siguientes lneas no se pone a que seal se asigna, el compilador interpreta que se asigna a
la misma seal de la primera lnea, aux.
Anexo 4.6 Process end process
Todo el cdigo que se escribe entre process y end process se ejecuta secuencialmente.
Adems, si por ejemplo, si se ha escrito process (clk,rst). Eso quiere decir que el proceso
es sensible a los cambios de las seales clk y rst. Eso quiere decir que, siempre que haya un
cambio de estas dos seales, se ejecutar el cdigo secuencialmente una vez.
Anexo 4.7 When y case is - when
When es el equivalente al if. Se utiliza para establecer condiciones. Su sintaxis es:
When <condicin> =><operacin a realizar>;
case is when es muy parecido a with select when. Se evala una seal/puerto/variable y
segn su valor se toma ejecuta una operacin u otra. Su sintaxis es:
case<expresin> is
when <valor 1> => <operacin 1>;
when <valor 2> => <operacin 2>;
when others =>
end case;

En un case is end case se tienen que determinar todos los casos posibles, as que cada
case is end case se acaba con un when others=>

Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

102

Anexo 4.8 Concatenacin
Si se escribe A&B , se est concatenando A con B. Es importante no confundir esta
operacin con la operacin lgica AND. Concatenar significa unir, enlazar, una cosa con
otra. En este caso unimos bits o vectores de bits. Por ejemplo, si tenemos estos 3 vectores:
- A=001
- B=010
- C=000111
El resultado de: A&B&C es 001010000111. Como se puede ver, el resultado es un
vector que sus bits representan el vector A, seguido del vector B y seguido del vector C.

Anexo 5 Check syntax
Para saber si las modificaciones que se han hecho en el cdigo estn bien hechas, hay que
comprobar la sintaxis con la herramienta check syntax. Para utilizarla, se debe de
seleccionar bloque que se quiere comprobar en la ventana de la Hierarchy , y a
continuacin, hacer doble clic en check syntax, que est debajo, en la ventana de
Processes.

Figura 47. Herramienta Check Syntax
Al hacer doble clic, se ve como en la consola, que es la ventana de abajo del todo, se
procesa una serie de informacin. Cuando haya terminado de trabajar, al lado de check
syntax saldr simbolizado el resultado. Hay tres tipos de resultado:
- Correcto: el cdigo escrito est completamente correcto.

Figura 48. Check Syntax Correcto
- Correcto con warnings: el cdigo compilar pero hay una/s advertencia/s que
se deben tener en cuenta, porque pueden afectar al buen funcionamiento. En
este caso lo que se tiene que hacer es buscar en la consola donde hay warnings y
intentar resolverlas para que d una sintaxis totalmente correcta. Puede ser que
algunos warnings no se puedan evitar.
Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

103


- Incorrecto: el cdigo tiene un/unos error/es. Hay que buscar en a consola
dnde estn los errores y corregirlos.

Figura 49. Check Syntax Inorrecto

Anexo 6 Sintaxis para Declarar Componentes
A continuacin hay una imagen con un ejemplo de declaracin de componentes.

Figura 50. Declaracin de componentes
<Nombre> : entity <tipo de componente> generic map(<bits genricos>) port map
(<puertos del componente>);
- <Nombre>: la nica restriccin de este nombre es que no puede tener el mismo
nombre que una seal/puerto del mismo componente. Ntese que el nombre s
puede coincidir con el tipo de componente, por ejemplo el componente ALU
coincide con el tipo .ALU.
- <Tipo de componente>: todos los ficheros que se crean siguiendo el Anexo2.1
se guardan por defecto en la librera work. As que por ejemplo, si se quiere
crear un componente de tipo registro, se utiliza el fichero .reg, por lo tanto, se
escribe work.reg en <tipo de componente>.
- <bits genricos>: de los ficheros ya creados, hay algunos que tienen unos bits
genricos. En este caso, sirven para determinar el tamao de los vectores de
entrada/salida que van a sus puertos. Por ejemplo, si se escribe generic map (7)
en la declaracin de un componente tipo .reg significa que la entrada y la
salida de este componente tendr un tamao de 7 bits.
Los ficheros de la UD que tienen genricos son: reg,mux2,mux4,inc.
- <puertos del componente>: aqu se escriben los distintos puertos del
componente. Es muy importante el orden. Hay que listar los puertos en el orden
en el que se han definido al crear el tipo de componente. Si hay un puerto de
entrada al que no se asigna ninguna seal se tiene que poner tantas X como
bits tenga el puerto de entrada. Como se ve por ejemplo en la lnea 24 de este
cdigo.
Es posible que de alguna seal no se tenga que coger todo el rango entero de
bits, sino que slo una parte de ellos. Entonces se determina el rango de bits que
se utilizan de la seal utilizando las palabras clave downto y upto. Por
ejemplo, tenemos la seal seal1 de 5 bits. Y se tiene que asignar a un puerto
de un tamao de 2 bits, es decir, sobran 3 bits de la seal1. Entonces, en el
port map se escribe: port map(seal1(1 downto 0));
El port map de cada componente se describe en el anexo 7.
Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

104


Anexo 7 Port map de cada Componente
A continuacin se describe el orden de los puertos de los componentes que
siempre tienen el mismo orden de puertos:
Reg1
PORT MAP (<reloj>,<reset>,<enable>,<in>,<out>);

Reg
PORT MAP (<reloj>,<reset>,<enable>,<in>,<out>);

Mux4
PORT MAP (<in00>,<in01>,<in10>,<in11>,<bits de seleccin>,<out>);
Es importante fijarse bien a que puerto del multiplexor va asignada cada
entrada para ponerlas aqu en el orden correcto.
Por ejemplo, la entrada que se selecciona cuando los bits de seleccin
valen 10 deber ir en el tercer lugar.

Mux2
PORT MAP (<in00>,<in01>,<bit de seleccin>,<out>);

Inc
PORT MAP (<in>,<out>);

ALU
Depender de cmo se haya diseado en cada caso. En el caso del ejemplo es:
PORT MAP (<in1>,<in2>,<bits de seleccin, <bit flag z>,< out>);

RAM
PORT MAP (<reloj>,<lect/escrit>,<bus direcciones>,<data in>,<data out>);

ROM
PORT MAP (<bus direcciones>,<data out>);

Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

105

Anexo 8 Anlisis de UD.VHDL
Este bloque se puede representar as:

Figura 51. Esquema del bloque de UD
Anexo 8.1 Puertos de la UD
As pues, las entradas y salidas de este bloque quedaran definidas en cdigo VHDL as:

Figura 52. Puertos de UD
Todos los puertos han salido representados en el esquema del bloque UD. Todos excepto los 4
ltimos: dbug_PC, dbug_A, dbug_B y dbug_ IR.
Estos puertos, que empiezan por dbug_ son unos puertos de salida de la Unidad de Datos
que sirven para que, una vez implementada fsicamente la mquina sencilla en la FPGA, se
puedan observar seales internas de la UD como el registro PC, A, B e IR.
Los puertos de entrada y salida de la UD no siempre son los mismos en todas las mquinas
sencillas. Por ejemplo, esta mquina tiene la seal de enable y de salida del Flag Z, pero
hay otras mquinas sencillas que no tienen Flag Z, as que estos dos puertos puede que
sobren en algunos casos. O hay mquinas sencillas que tienen 3 registros de datos. O
tambin puede ser que tengan un registro PC pero que su tamao en vez de 7 bits como en
este caso, sea de 14 bits, por ejemplo. Con lo cual, habra que modificar el rango de bits de
este puerto.
Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

106

Anexo 8.2 Bus de direcciones
Acerca de cambiar el rango de puertos. El rango del bus de direcciones, addr, en este
caso es de 7 bits. Es aconsejable que, aunque el bus de direcciones de la mquina sencilla
en cuestin sea mayor de 7 bits, ste se deje en 7 bits. Porque un bus de direcciones de 7
significa que se implementar una memoria de 2
7
= 128 direcciones, y para el programa
que ejecutar la mquina sencilla, con 128 direcciones da ms que de sobra. Entonces
aumentar el tamao del bus de direcciones significa aumentar la memoria y gastar recursos
innecesariamente. Slo se cambiar el rango de bits del puerto de salida, el rango de bits de
la seal que se asigna a este puerto ser el que tenga que ser. Entonces, lo que habr que
hacer es coger el rango de bits ms representativo de la seal. Lo ms comn es coger os 7
bits ms bajos de la seal.
Anexo 8.3 Seales de la UD
La explicacin terica de que es, en general, una seal se encuentra en el Anexo 4.2.

Figura 53. Seales de UD

Se puede observar, que todas las seales la UD son los puertos de salida de los distintos
componentes que forman la UD. Por ejemplo, PC es la salida del registro PC, MUX es
la salida del multiplexor de 4 entradas. Hay dos casos especiales, que son f y d. Estas
dos son seales que recogen parte de la salida del registro IR. Ms adelante se explica
mejor que se hace con estas dos seales.
Esta parte de cdigo, lo ms probable es que el alumno si tenga que modificarla. Puede ser
que haya que cambiar solo el nombre de las seales, o que haya que cambiar el rango
porque la seal es de otro tamao, o que sobren seales, o que falten, y se tengan que crear
de nuevo. En general, tiene que haber una seal por cada seal que va desde un puerto de
un componente interno de la UD, hasta otro puerto de otro componente interno de la UD.
Anexo 8.4 Comportamiento de UD.VHDL

Figura 54. Componentes de UD

Con estas 7 lneas se describen los 7 componentes que forman la UD, que son: multiplexor,
registro PC, registro IR, sumador, registro A, registro B, registro Flag Z y la ALU.
La sintaxis para declarar componentes se explica en el Anexo 6.
Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

107

Los port map de los componentes que siempre tiene el mismo orden de puesto estn
descritos en el Anexo 7.
Para acabar la Unidad de Datos slo hace falta gestionar aquellas seales que lo necesiten,
que en general son:
- Seales que tiene que salir fuera de la UD y por lo tanto tienen que asignarse
a un puerto. Las seales tpicas a las que hay que asignar un puerto de salida
son: bus de direcciones y las seales a depurar (o debugear).
Lo que hay que hacer es coger la seal y asignarla al puerto. Si el tamao de los
dos no coincide, hay que adaptar el tamao de la seal del tamao del puerto.
Por ejemplo, si la seal que se asigna al puerto del bus de direcciones es de 8
bits, y el puerto tiene un tamao de 7 bits habr que hacer:
puerto (6 downto 0) <= seal (6 downto 0);.
En el caso de esta mquina sencilla, coinciden los bits, as que directamente se
escribe:

Figura 55. Asginacin de puertos dbug y addr.
Ntese que hay puertos de salida de la UD a los que ya se le asignado una seal
directamente en la declaracin del componente. Por ejemplo, en este caso la
salida de la ALU se asigna directamente al puerto wdata en la declaracin de
la ALU.

- Seales que se tienen que fraccionar y que cada fraccin se dirige a un
lugar distinto. Como por ejemplo, en este caso, la seal IR, se tiene que dividir
en operando fuente, operando destino y cdigo de operacin. Aqu tambin hay
que adaptar el tamao de la seal al puerto:

Figura 56. Asginacin de CO, f y d.

Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

108

Anexo 9 Anlisis de UC.VHDL
Anexo 9.1 Puertos de UC.VHDL

Figura 57. Puertos de la UC
Los ms probable es que los puertos de la UC se tengan que modificar con cada mquina
sencilla. Para modificarlos se har de la misma manera que se hecho con la Unidad de
Datos. Es aconsejable hacerse el esquema de la caja:

Figura 58. Esquema del bloque de la UC
Si se tiene esto claro, lo nico importante a destacar es el puerto de salida dbug_state.
Este puerto se utiliza para poder saber en qu estado se encuentra la mquina sencilla
cuando se ha implementado fsicamente en la FPGA. Por ejemplo, si la mquina sencilla se
encuentra en el estado S12, este puerto de salida sacar 1100.

Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

109

Anexo 9.2 Seales de UC.VHDL

Figura 59. Seales de la UC
En el caso de una Unidad de Control siempre tendremos 2 seales:
- Seal o. Se trata de un vector bits que almacenar todos los bits de control de
la UC. Por lo tanto su tamao viene determinado por la cantidad de bits de
control. En el caso de la mquina sencilla de ejemplo: ePC (1 bit), eA (1 bit), eB
(1 bit), eFZ (1 bit), eIR (1 bit), rw (1 bit), selMUX (2 bits), selALU (2 bits). En
total 10 bits, por eso el rango es de (9 downto 0). El alumno slo tendr que
cambiar el rango de la seal segn su UC.
- Seal s. Esta seal es del tipo estados. Este tipo se ha creado especialmente
para la UC. La definicin de este tipo se hace en la lnea 16.
Segn la definicin del tipo estados, una seal de este tipo slo podr tomar
los valores que hay entre parntesis. En este caso: S0,S6, S7, etc.
El alumno tendr que modificar los valores que hay entre parntesis segn su
UC. Por ejemplo, si la UC solo puede tomar 3 estados distintos, se tiene que
poner type estados is (S0,S1,S2);

Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

110

Anexo 9.3 Anlisis Mquina de Estados de UC.VHDL
El objetivo de estas lneas es implementar la secuencia de estados de la mquina de estados
finitos en VHDL. Se basa
en el uso de la estructura
when y case is end
case. Estas dos
estructuras del VHDL se
explican en el Anexo 4.7.
Se empieza con el caso de
que el estado actual, s,
sea S0. Segn el
diagrama, siempre que la
mquina est en el estado
S0 tiene que pasar a
S12 en el siguiente
flanco de subida de reloj.
Esto expresado en VHDL
son las lneas 25 y 26.

Figura 60. Mquina
de Estados en VHDL
Y as se tiene que hacer
para cada estado. Para cada estado tiene que haber un when que especifique qu tiene
que hacer en el siguiente flanco de subida del reloj.
Ntese que si hay varios estados que van a parar al mismo estado despus de un flanco de
subida del reloj, se pueden agrupar en un when. Por ejemplo, los estados finales que
despus de un flanco de subida del reloj han de volver al estado S0 se pueden agrupar en
un when como se ha hecho en la lnea 45.
Cuando el paso de un estado a otro depende de seales de entrada a la UC, como pueden
ser CO y/o FZ, se utilizar la estructura case is end case.
Por ejemplo, en el caso del estado S6 depende del
CO para pasar a S7 o S9. Si CO=X0 tiene
que saltar a S7. Si CO=X1 tiene que saltar a S9.
Esto en VHDL se expresa como en las lneas 41 y
42. Ntese que no se puede escribir X0, hay que
escribir todos los casos que implica X0, es decir,
(00|10)
Recordar que en un case is end case se tienen que determinar todos los casos posibles,
as que cada case is end case se acaba con un when others=>
Tambin puede ser que, un salto de un estado a otro dependa de CO y adems de FZ.
En este caso, hay que anidar dos case is end case.
Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

111

Por ejemplo, en el S12, en algunos casos, a partir de CO ya se puede determinar cul ser
el siguiente estado. Pero
hay un caso que no es as.
En el caso de que CO=11
hay que mirar el valor de
FZ para saber si hay que
saltar a S11 o a S0.
Eso en VHDL se hace
con dos case is end
case anidados. Como se hace en las lneas de la 28 a la 38.
Anexo 9.4 Implementacin de la Tabla con los Bits de Control

Figura 61. Tabla de Bits de Control en VHDL
El Alumno tiene que modificar las partes enmarcadas en los recuadros rojos:
En la primera parte, hay que poner la tabla de los bits de control. A cada estado asignarle el
vector de bits.
Por ejemplo, en este caso, cuando la mquina sencilla se encuentra en S0 la secuencia de
los bits de control es:


Pues esta misma secuencia es la que se le asigna a S0, en la lnea 56 del cdigo.
De esta parte del cdigo, hay que destacar que, a veces, en los bits de seleccin de la ALU,
o de multiplexores, se da el caso de que es lo mismo poner 10 que 11, as que en la
tabla se pone 1X. Bien, pues en la simulacin funciona correctamente, pero cuando se
implementa fsicamente, no. As que en estos casos hay que poner, o bien 10, o bien
11, pero no 1X.
MX1 MX0 ALU1 ALU0 L/E ePC eIR eA eB eFZ
S0 0 0 X X 0 1 1 0 0 0
Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

112

Ahora los bits de cada estado se asignan a la seal auxiliar o. Ahora hay que determinar
que representa cada bit de este vector: qu bit es el ePC, cul el de eA, etc.
Esto se hace como en las lneas de la 65 a la 72. El mtodo es el mismo de asignacin de
seales a puertos que ya se ha visto.
Anexo 9.5 El Puerto dbug_state
Finalmente, lo que hay que hacer en la UC es darle un valor numrico a cada estado. Este
valor numrico es el que saldr por el puerto dbug_state y servir para saber en qu
estado se encuentra la mquina.

Figura 62. Asignacin de Valores a dbug_state
Como se puede ver, al S0 se le asigna 0000, al S12 el 1100, etc.
El Alumno tendr que modificarlo segn los estados que tenga su mquina sencilla y
asignar el nmero representativo de cada estado.

Anexo 10 Anlisis RAM_pack y ROM_pack
Al principio de este fichero se definen dos constantes:

Figura 63. Constantes a modificar
- RAM_ADDR: se trata del nmero de bits del bus de direcciones de la
memoria. En este caso el bus de direcciones es de 7 bits. El alumno tiene que
modificar este nmero segn los bits del bus de direcciones que tenga la
memoria de su mquina sencilla.
Al asignar el nmero de bits de bus de direcciones hay que tener el cuenta el
Anexo 8.2
Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

113

- RAM_DAT: se trata del nmero de bits que ocupa cada palabra de la
memoria. Es decir, es el nmero de bits del dato de salida, o lo que es lo mismo,
del dato de entrada, o lo que es lo mismo el tamao de cada celda de memoria.
En este caso, una palabra ocupa 16 bits. El alumno tiene que modificar este
nmero segn los bits del bus de datos que tenga la memoria de su mquina
sencilla.
En el caso de que se tenga que crear una memoria ROM, el alumno tambin tiene los
ficheros ROM y ROM_pack. Los pasos a seguir son exactamente los mismos:
1) Se crea el fichero ROM.VHDL y no se modifica nada.
2) Se crea el ROM_pack y se modifican las dos constantes del principio del cdigo,
segn bus de direcciones y de datos de la ROM.
Anexo 11 Inicializacin de Memoria
Una vez definidas las seales, se puede pasar a preparar la inicializacin de la(s)
memoria(s). La(s) memoria(s) deben inicializarse con el programa y los datos que
ejecutar la mquina sencilla. En el caso de la mquina sencilla de ejemplo, el programa
que hay que memorizar en la RAM es el explicado en el apartado 5.2

Figura 64. Programa a guardar en memoria RAM

El alumno tiene que modificar la parte dentro del recuadro rojo.
Lo que hay que hacer es asignar a cada direccin de memoria un valor. La sintaxis general
para hacerlo es: <direccin> => X<instruccin en hexadecimal>,
- <direccin>: se trata de la direccin de memoria a la que se le asignar el valor.
Si escribe en nmero directamente se est expresando a direccin en decimal.
- <instruccin en hexadecimal>: En VHDL, si se escribe X<nmero> el
nmero se interpreta como un nmero hexadecimal. Entonces entre las comillas
se escriben las instrucciones en hexadecimal. Por ejemplo, en este caso, la
instruccin BEQ 2 se representa como el siguiente vector de bits:
11XXXXXXX0000010. (Para las X se escribe 1 0). Entonces en
hexadecimal es XC002. Que es precisamente lo que se escribe en la direccin
7 de la memoria RAM de este ejemplo.
Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

114

Ntese que, a todas las posiciones de la memoria se le tiene que asignar un valor. As que
si tenemos un bus de direcciones de 7 bits, quiere decir que tenemos que asignar 128
valores. Pero como se ve en el Anexo 4.4, en VHDL, se puede utilizar la palabra reservada
others para asignar un valor a todo direccin a la que an no se le ha asignado nada. En
la lnea 44 se le da un valor a todas las direcciones a las que no se le ha asignado nada. En
este caso se le asigna X. Hay que poner tantas X como el tamao de la celda de la
memoria. En este caso, la celda es de 16 bits, por eso hay 16 X.
En el caso de tener que inicializar una memoria ROM, lo nico que cambia es la primera
lnea. En el caso de una memoria RAM se escribe:

Figura 65. Declaracin para memoria RAM
En el caso de una memoria ROM, se escribe:

Figura 66. Declaracin para memoria ROM
Ntese que se ha cambiado el nombre de PROGRAMA por el de PROGRAMA_ROM
para que no coincidan los nombres de los dos programas. Y tambin se ha cambiado
RAM_ADDR y RAM_DAT por ROM_ADDR y ROM_DAT respectivamente.

Anexo 12 Gestin de Puertos de MaquinaSencilla.VHDL
En esta parte del cdigo, es donde se da la opcin al usuario de la mquina sencilla de que,
una vez implementada la mquina sencilla fsicamente, pueda seleccionar entre el reloj de
50MHZ o el reloj manual, o que pueda decidir si quiere ver el estado del registro A o del
registro PC, etc.
Al principio del cdigo MaquinaSencilla.VHDL, en la declaracin de los puertos, se ha
declarado un puerto de entrada llamado sw, y de tamao 6 bits. A este puerto de entrada
se la asignarn distintos switches, distintos interruptores, y con ellos se gestionarn los
puertos de la mquina sencilla. Cada bit de este vector es un interruptor.

Figura 67. Seleccin de Reloj
Se utiliza una estructura del VHDL que ya se explica en el Anexo 4.5: with select when.
Su funcin es, por lo menos en este caso, la misma que la funcin del case is end case.
Con el bit 0 de la seal sw se escoge el reloj con el que funcionar la mquina sencilla.
Se pueden dar dos casos
- Que sw(0) = 0 : el reloj con el que funcionar la mquina ser el paso a paso o
manual. Este reloj funciona con un pulsador. Cada vez que el usuario pulsa el
pulsador, se genera un pulso de reloj.
- Que sw(0) no valga 0: entonces el reloj que se utiliza es el reloj de 50 MHz.
El alumno no debe modificar nada de esta seleccin de relojes.
Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

115

Con los bits 1 y 2 de sw se puede seleccionar qu seales se ven representadas con los 8
leds que tiene la placa donde est la Spartan 3:

Figura 68. Seleccin de Seal a Mostrar en Leds
Como los leds de la placa son 8, el tamao de la seal dbug_led tambin es de 8 bits. Y
por lo tanto, las seales (o operacin con seales) que se asignan a dbug_led debe tener
un tamao de 8 bits tambin.
Aqu se ve una nueva operacin lgica que no se haba visto hasta ahora. Se llama
concatenacin. La concatenacin se explica en el Anexo 4.8
As pues, en la lnea 60, lo que se est expresando es que, si los bits 1 y 2 de sw valen
00 a la seal dbug_led se le asignar un vector que contiene rw, ePC, eIR, eA, eB, eFZ
y CO. Se puede comprobar que la suma del tamao de los enables, CO y rw da 8 bits.
En la lnea 61, se estn asignando los bits de seleccin de la ALU y del multiplexor. Si se
suma los bits de cada vector se puede comprobar que da 4 bits. Cmo se tiene que asignar
un vector de 8 bits, se concatena con 0000 para acabar de llegar a los 8 bits.
Finalmente, en la lnea 62, se asigna dbug_state, que es el estado actual de la UC.
El alumno tiene que modificar estas asignaciones segn las seales que sean de inters en
la mquina sencilla en cuestin. Por ejemplo, es probable que la mquina sencilla en
cuestin no tenga flag Z, entonces la seal eFZ tiene que eliminarse. En los leds se
suelen representar seales de 1 bit, o pocos bits, agrupadas. Las seales de un tamao
mayor quiz es ms apropiado representarlas en hexadecimal con los displays 7 segmentos.
Con los bits 3, 4 y 5 se vector sw se puede seleccionar que seal se representa en los
displays BCD de 7 segmentos que incorpora la placa.

Figura 69. Seleccin de Seal a Mostrar en Displays 7 segmentos

En este caso, dbug_in es un vector de 16 bits, as que las seales (o operaciones con
seales) que se asignan al este vector deben tener un tamao total de 16 bits. Si la
asignacin no llega a los 16 bits, se concatena con ceros para llegar a los 16 bits, como ya
se ha hecho anteriormente.
Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

116

El alumno tiene que modificar estas asignaciones segn las seales que sean de inters en
la mquina sencilla en cuestin. Por ejemplo, es probable que la mquina sencilla en
cuestin no tenga un registro B, entonces la seal dbug_B tiene que eliminarse. En los
displays 7 segmentos se suelen representar seales de bastantes bits, hasta un mximo de
16 bits por seal, y se representan en hexadecimal.
Anexo 13 Sintetizar un Diseo
Para comprobar si, el archivo en el mximo nivel de la jerarqua, tiene un buena sintaxis y
adems en sintetizable se tiene que hace doble clic en Synthesize XST

Figura 69. Herramienta Synthesize

Al hacer doble clic empezar a intentar sintetizar la mquina sencilla. Mientras est
trabajando se observa esto:
Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

117


Figura 70. Ejecutndose la Sntesis
Cuando acabe nos aparecer el veredicto representado en un smbolo. Los 3 smbolos
posibles son los mismo que cuando se comprueba la sintaxis, y significan los mismo. En
caso de warnings hay que leerlos, entenderlos y valorar si afectan al funcionamiento de la
mquina sencilla. En caso de errores, hay que detectarlos y corregirlos.

Anexo 14 Implementar un Diseo
Para ello hay que hacer doble clic en Implement Design:

Figura 70. Herramienta Implement Design
Cuando acabe nos aparecer el veredicto representado en uno de los 3 smbolos. En caso
de warnings hay que leerlos, entenderlos y valorar si afectan al funcionamiento de la
mquina sencilla. En caso de errores, hay que detectarlos y corregirlos.

Prcticas de Mquina Sencilla con FPGA Anexo Manual de Prcticas

118

Anexo 15 Cuando no Coincide Simulacin y Realidad
Al observar buses y seales, puede ser que no coincida exactamente con la simulacin y
que an as la mquina est funcionando correctamente. Esto es porque los buses toman
distintos valores pero no siempre se utiliza el valor que tiene el bus. Por ejemplo, en el
caso de la seal de wdata, que es el dato que se escribe en memoria, ir valiendo distintos
valores, pero de todos los valores que toma, slo interesa aquellos valores que coinciden
con que la seal de R*/W vale 1. Porque es entonces cuando realmente se escribe el dato
que hay en el bus en la memoria RAM.
Por lo tanto, cuando una seal no coincida con la simulacin, hay que ver si es obligado
que coincida o no. Esto se determina observando a que componente va a parar la seal y
observando si le va a afectar al componente o no.
Esto solo pasa con seales y buses. Los registros deberan seguir exactamente los valores
que marca la simulacin.




Prcticas de Mquina Sencilla con FPGA Bibliografa y Referencias

119

7 Bibliografa y Referencias

[1] http://www.xilinx.com
[2] Spartan 3 Starter Kit Board User Guide:
http://www.digilentinc.com/Data/Products/S3BOARD/S3BOARD_RM.pdf
[3] Xilinx ISE 12.3 Software Manuals, Xilinx, Inc., 2007
[4] Serafn Alfonso Prez, Enrique Soto, Santiago Fernndez, Diseo de Sistemas Digitales con VHDL
[5] http://es.wikipedia.org/wiki/FPGA
[6] Sistemas Electrnicos Digitales I, Apuntes de la asignatura

También podría gustarte