Vous êtes sur la page 1sur 132

Diseo e

implementacin de un
Microprocesador bsico
de 4 bits.

1
RESUMEN

La tendencia actual de describir el Hardware y los Sistemas Digitales


haciendo uso de lenguajes de alto nivel, tales como VHDL, Verilog-HDL y
Altera-HDL, implementar el diseo con una FPGA o un PLD y verificar su
funcionamiento mediante simulacin, presenta una gran cantidad de ventajas
entre las cuales se cuentan, el diseo de alto nivel, el uso de tecnologas
recientes, y la reutilizacin de componentes, as como tambin la
reprogramacin de los dispositivos.

El uso del Lenguaje de Descripcin de Hardware VHDL significa una gran


ventaja debido a lo sencilla, cmoda y predecible que resulta la programacin
y la sintaxis del cdigo que emplea.

El diseo de microprocesadores se facilita gracias a la diversidad de


herramientas que hay en la actualidad y como ya se ha mencionado, el
lenguaje VHDL es una herramienta muy poderosa para el diseo, pues
adems de su flexibilidad permite ahorrar tiempo y costos.

Los microprocesadores tienen un gran uso como componentes


fundamentales en sistemas electrnicos modernos, ya que incrementan su
capacidad de procesamiento de datos y proporcionan un tiempo de ejecucin
menor de las tareas que realiza y adems reduce su costo. Cuando un
sistema electrnico incorpora un microprocesador, ofrece herramientas de
control adicionales con tan slo un incremento relativo en el costo de
software de desarrollo.

Todo esto nos ha conducido a disear e implementar un microprocesador


bsico de 4 bits, con la finalidad de profundizar sobre el tema y de
familiarizarse con las herramientas de diseo, simulacin e implementacin
actuales para estos propsitos.

Cabe mencionar que entre las principales caractersticas del microprocesador


se encuentran, un bus de direcciones de 8 bits (A0-A7), un bus de datos de
4 bits (D0-D3), tres lneas de interrupcin: reset, IRQ1 e IRQ2, una lnea de
validacin de direcciones (VMA), una lnea para una seal de reloj, y una lnea
de lectura/escritura. El microprocesador se compone bsicamente de 11
bloques, cada uno con una funcin especfica.

2
En cuanto a las herramientas utilizadas se mencionan el software ISE Design
Suite 14.1 de Xilinx, entorno de programacin del lenguaje de alto nivel VHDL.
Y su herramienta de simulacin ISim integrada al Software. Con ella se
integran todos los mdulos o bloques lgicos digitales mediante la creacin
de un programa de alto nivel, mdulos que conforman en conjunto al
Microprocesador de clase Von Neumann de 4 bits.

Se incluy al diseo, un mdulo de memoria RAM (Random Access Memory)


de 256x4 bits, y se realiz la simulacin e implementacin de un programa
que ejecuta el microprocesador.

Se utiliza una memoria RAM para comprobar mediante simulacin e incluso


mediante implementacin, que el Microprocesador adems de todas las
funciones lgicas y aritmticas que lleva a cabo, realice eficientemente las
tareas de lectura y escritura de datos.

3
CONTENIDO

LOS MICROPROCESADORES ....................................................................................... 27


Sistema mnimo del microprocesador ...................................................................................... 28
Arquitecturas bsicas de microprocesadores y microcontroladores. Harvard versus Von
Neumann ................................................................................................................................... 30
Sistemas embebidos.................................................................................................................. 32
Diseo de microprocesadores en VHDL .................................................................................... 34
MEMORIA RAM ............................................................................................................................. 34
PROCEDIMIENTO Y DESCRIPCIN DE LAS ACTIVIDADES REALIZADAS .................. 37
Diseo de un microprocesador de 4 bits en el entorno de Programacin de ISE Design Suite 14.1
....................................................................................................................................................... 37
Diseo y Programacin del Contador de programa (PC) .......................................................... 38
Diseo y Programacin del Registro ndice ............................................................................... 40
Diseo y Programacin del Registro de Pila (STACK) ................................................................ 41
Diseo y Programacin de los Acumuladores A y B; Acumulador A ........................................ 42
Diseo y Programacin de los Acumuladores A y B; Acumulador B ........................................ 44
Diseo y Programacin del Registro Sel-Dato ........................................................................... 45
Diseo y Programacin del Registro Tri-Est .............................................................................. 46
Diseo y Programacin del Registro Sel-Dir .............................................................................. 47
Diseo y Programacin del Registro Dir-Val ............................................................................. 48
Diseo y Programacin de la Unidad Aritmtica y Lgica (ALU) ............................................... 50
Diseo y Programacin de la Unidad de Control (CU) ............................................................. 53
Diseo y Programacin de la MEMORIA RAM .......................................................................... 62
Diseo Jerrquico: Creacin del Archivo de Componentes ...................................................... 63
Diseo Jerrquico: Creacin del Archivo de Alto nivel.............................................................. 65
RESULTADOS ..................................................................................................................................... 69
Simulacin del Contador de programa (PC) .................................................................................. 69
Simulacin del Registro ndice (ix) ................................................................................................ 70
Simulacin del Registro de Pila (Stack) ......................................................................................... 71
Simulacin del Acumulador A ....................................................................................................... 72

4
Simulacin de la Unidad Aritmtica y Lgica (ALU) ...................................................................... 73
La Unidad de Control..................................................................................................................... 75
Prueba y Simulacin del Microprocesador de 4bits...................................................................... 75
Primera instruccin X+1 X ................................................................................................. 76
Segunda instruccin MA................................................................................................... 77
Tercera instruccin MB.................................................................................................... 78
Cuarta instruccin A + B A.............................................................................................. 79
Quinta instruccin PILA Pcout ........................................................................................ 80
Prueba y Simulacin de un programa cargado en la memoria RAM ............................................ 81
Simulacin del Microprocesador y ejecucin del programa ..................................................... 83
CONCLUSIONES Y RECOMENDACIONES .................................................................... 92
REFERENCIAS BIBLIOGRFICAS .................................................................................. 94

5
INTRODUCCIN

Hoy en da, en nuestro ambiente familiar o de trabajo nos encontramos


rodeados de sistemas electrnicos muy sofisticados, telfonos celulares,
computadoras personales, televisores porttiles, equipos de sonido,
dispositivos de comunicaciones y estaciones de juego interactivo, entre otros,
estos no son ms que algunos ejemplos del desarrollo tecnolgico que ha
cambiado nuestro estilo de vida hacindolo cada vez ms confortable. Todos
estos sistemas tienen algo en comn: El tamao, sus dimensiones son tan
pequeas que resulta increble pensar que sean igual o ms potentes que
los sistemas mucho ms grandes que existieron hace tan slo algunos aos.

Estos avances son posibles gracias al desarrollo de la microelectrnica, la


cual ha permitido la miniaturizacin de los componentes para obtener as
mayores beneficios de los chips (circuitos integrados) y para ampliar las
posibilidades de aplicacin.

La evolucin en el desarrollo de los circuitos integrados se ha venido


perfeccionando a travs de los aos. Primero, se desarrollaron los circuitos
de baja escala de integracin (SSI o Small Scale Integration), despus los de
mediana escala de integracin (MSI o Mdium Scale Integration) y
posteriormente los de muy alta escala de integracin (VLSI o Very Large
Scale Integration) hasta llegar a los circuitos integrados de propsito
especfico (ASIC).

El lenguaje de descripcin en hardware VHDL es considerado como la


mxima herramienta de diseo por las industrias y universidades de todo el
mundo, pues proporciona a los usuarios muchas ventajas en la planeacin y
diseo de los sistemas electrnicos digitales.

La revolucin de los microprocesadores a partir de la dcada de los aos 70s


y 80s, ha trado al mundo toda una gama de posibilidades de desarrollar
sistemas tecnolgicos de mayor capacidad, de esta forma la evolucin de los
microprocesadores ha avanzado en gran manera.

El trabajo expuesto en el siguiente documento, pretende especficamente


mostrar la estructura bsica, los componentes internos que forman a un
microprocesador de n bits, en el caso presente, un microprocesador de 4
bits.

Se trabaj en el diseo y programacin de un microprocesador de 4 bits


puesto que, a partir de ste y su diseo funcional, se puede tambin hablar
6
de microprocesadores de mayor capacidad que cumplan con las necesidades
requeridas para tareas ms especficas.

En este proyecto se pretende profundizar los conocimientos sobre el diseo


de un microprocesador, conocer a fondo el lenguaje de programacin VHDL;
brindar al lector la oportunidad de comprender, manejar y aplicar uno de los
lenguajes de programacin para este tipo de aplicaciones: VHDL.

El proyecto abarca desde la parte de la bsqueda de la informacin necesaria


y la documentacin sobre el campo de la programacin en el lenguaje VHDL
y el diseo de sistemas embebidos (microprocesadores), hasta la parte de la
creacin del cdigo en VHDL de cada uno de los bloques digitales que
conforman al microprocesador, y finalmente la simulacin e implementacin
del microprocesador en s.

7
LOS MICROPROCESADORES

Los microprocesadores tienen un gran uso como componentes fundamentales en


sistemas electrnicos modernos, ya que incrementan su capacidad y proporcionan
una mejor ejecucin en las tareas que se encomiendan reduciendo su costo.
Cuando un sistema electrnico incorpora un microprocesador, ofrece herramientas
de control adicionales con tan slo un incremento relativo en el costo de software
de desarrollo. Debido a esto cada semana millones de pequeos chips de
computadora salen de fbricas como Motorola, National Semiconductor, Mitsubishi,
etctera y encuentran diversas y nuevas aplicaciones en productos de uso comn
como sistemas de transporte, produccin de comida, defensa militar, sistemas de
comunicacin, etctera.

La electrnica ha sido, y es, la causante y soporte de esta verdadera revolucin de


la sociedad. Y, dentro del campo de la electrnica, el microcontrolador, es, con
frecuencia, el gran protagonista.

El desarrollo de los microprocesadores, un invento introducido recientemente


en1971 en el mbito comercial, ha revolucionado las reas ms importantes de la
electrnica y este avance no le resulta ajeno al individuo medio que trabaja
asiduamente con su computador personal (Pentium, Power PC, etc.), an cuando
la mayor parte de los microprocesadores no reside en los computadores, sino oculta
en cualquier dispositivo electrnico que el usuario utiliza sin ser consciente de l.

En 1971, la compaa de semiconductores Intel lanza al mercado el primer


microprocesador, lo que impone un cambio decisivo en las tcnicas de diseo de
los equipos de instrumentacin y control. Este circuito integrado contiene todos los
componentes de la unidad central de procesos (CPU) de una computadora dentro
de un solo dispositivo. Los fabricantes, conscientes de la importancia de este
mercado, crean una amplia gama de estos circuitos integrados, constituyendo
familias de microprocesadores.

En el ao 1976, gracias al aumento de la densidad de integracin de componentes


en un circuito integrado, sale a la luz el primer ordenador en un chip: en l se
integran, junto con el microprocesador, otros subsistemas que anteriormente
formaban unidades independientes (memoria, entradas/salidas, etc.). A este nuevo
integrado se lo denomina microcomputadora monopastilla.

8
El microprocesador es un componente electrnico complejo que incorpora las
funciones tpicas de todo un computador. La clave del xito de los
microprocesadores como componente electrnico reside en que, modificando el
programa almacenado en memoria, puede adaptarse a numerosas y diferentes
aplicaciones.

As, en la actualidad, debido a su creciente potencia de clculo y variedad de


funciones integradas, se ha convertido en el estndar para la implementacin de
soluciones, tanto de clculo como de control.

De este modo, los microprocesadores no slo se utilizan para construir potentes


computadoras quizs su aplicacin ms difundida sino tambin para la realizacin
de tareas de control en sistemas de aplicacin especfica (por ejemplo, el control de
un horno a microondas, un telfono celular o unos frenos ABS para el automvil),
sustituyendo la circuitera convencional.

Las reas de aplicacin de este tipo de productos tambin exceden el ambiente de


los procesos continuos y se expanden en una gran diversidad de rubros:
cerveceras, curtiembres, edificios inteligentes, bancos de prueba o ensayo,
estaciones de carga, frigorficos, plantas automotrices, industrias alimenticias,
industrias madereras, industrias metalrgicas, industrias petroleras, laboratorios,
medicin de energa, plantas petroqumicas, plantas aceiteras, plantas
embotelladoras, plantas generadoras de energa, plantas papeleras, plantas
pesqueras, plantas potabilizadoras, silos, subestaciones elctricas y centros de
comando, supermercados, sistemas de transporte y muchas ms.5

Sistema mnimo del microprocesador

El sistema mnimo est basado en la arquitectura de Von Neumann, es decir, se


dispone de la misma memoria tanto para las instrucciones como para los datos, Sus
bloques bsicos son:

1. Unidad central de proceso CPU, (Central Process Unit), formada por los bloques:

o Registros internos.
o Unidad de control.
o Unidad de proceso u operativa.

5
Ing. Evaristo Gonzlez Milans: Introduccin a los microprocesadores. Universidad de Matanzas, Diciembre
2003

9
2. Unidad de memoria, donde residen las instrucciones del programa y sus datos.

3. Unidad de entrada/salida, encargada de recibir y entregar informacin al exterior.

Figura 4. Arquitectura Von Neumann.

Los tres mdulos estn conectados entre s por medio de los buses de comunicacin.

Nos referiremos a tres clases de buses:

Bus de direcciones

Bus de datos

Bus de control

Algunas seales tpicas en todos los sistemas son:

Seal de reloj de sincronizacin,


Seal de RESET o inicializacin,
Seal de lectura/escritura en memoria, etc.
Su diagrama de bloques se muestra en la figura 5:

10
Figura 5. Diagrama a bloques de un microprocesador

Arquitecturas bsicas de microprocesadores y microcontroladores.


Harvard versus Von Neumann

Harvard y Von Neumann son dos arquitecturas que se caracterizan por la forma en
la que distribuyen la memoria de datos y de programa dentro de un
microcontrolador.

En la arquitectura Harvard, la memoria de datos y la de programa estn separadas,


y para almacenar las instrucciones se utilizan lo que da en llamarse palabras.
Palabras las hay de muchos tamaos como, por ejemplo, en los microcontroladores
PIC. Los PIC de gama baja usan palabras de 12 bit, los de gama media 14 bit y los
de gama alta 16 bit.

Por otro lado, est la arquitectura Von Neumann que se caracteriza por tener la
memoria de programa y la de datos, implementada en un mismo bloque de memoria,
compartiendo datos e instrucciones en un mismo bus. En este tipo de
microcontroladores se usan bytes para almacenar datos e instrucciones. Ejemplos
de estos microcontroladores son los Zilog, National Semiconductor o los de
Motorola.

Ambas arquitecturas tienen ventajas e inconvenientes y, como siempre pasa en el


mundo de la electrnica, la seleccin depende de la aplicacin en la que vayamos
a usar el microcontrolador, la frecuencia de trabajo, la conexin a otros perifricos,
etc.

30
Arquitectura Von Neumann

Los sistemas basados en arquitectura Von Neumann tienen un slo bus para
acceder tanto a datos como a instrucciones. Diremos que un microcontrolador es
de 4 bits cuando el bus de ste es de 4 bits; ser de 8 bits cuando el bus sea de 8
bits. Esto facilita en gran medida la conexin de memoria externa a travs de las
lneas de entrada/salida con una mnima implementacin extra de hardware.

Por contra, tenemos que una instruccin puede ocupar ms de un byte, con lo que
para poder leer la instruccin completa tendremos que hacer varias lecturas en la
memoria. Ser necesario emplear varios ciclos de reloj para extraer una instruccin.

Otra desventaja es que es posible que el contenido del contador del programa se
corrompa, con lo que se podra estar leyendo un dato y tratar de interpretarlo como
instruccin, con la consecuencia del deterioro y cada del sistema. Normalmente, un
microprocesador controla que el contador no haga cosas raras.

Una de las caractersticas que poseen los microcontroladores basados en este tipo
de arquitectura es que suelen tener un repertorio de instrucciones bastante grande.
Este tipo de repertorio se llama CISC Complex Instruction Set Computer. La
caracterstica principal de este conjunto es que suele ser bastante elevado, con
instrucciones micro-codificadas una instruccin es decodificada por la CPU en
varias instrucciones bsicas. Es fcil deducir que esto hace la ejecucin del
programa un poco ms lenta; pero, tiene la ventaja de que ahorramos memoria:
para dividir slo usamos una instruccin (Por supuesto, aun as, tenemos que tener
en cuenta que la decodificacin se est llevando a cabo en el interior del
microcontrolador, lo que va a ralentizar su ejecucin; y considerar qu tipo de
microcontrolador usar, segn la tarea a desarrollar).

Arquitectura Harvard

La arquitectura Harvard se caracteriza por tener la memoria de datos separada de


la memoria del programa y stas, a su vez, unidas a la CPU a travs de buses
independientes.

El que la informacin se almacene en palabras tiene una gran ventaja y es que tanto
el cdigo de operacin como el dato asociado a ste estn en la misma

31
posicin (por tanto, su lectura es mucho ms rpida). sta es una gran ventaja ya
que dota al microcontrolador de gran agilidad.

La tcnica de procesar varias instrucciones al mismo tiempo se conoce como


pipelining o segmentacin. Con esta tcnica se dividen las instrucciones en distintas
etapas, de modo que el procesador pueda procesar distintas instrucciones en estas
etapas.

Veamos un ejemplo de esto.

Una instruccin tpica se divide en cinco etapas:

1. Bsqueda de la instruccin.
2. Decodificacin de la instruccin.
3. Lectura del dato a travs del bus de datos, ya sea de la memoria RAM o de
cualquier registro mapeado en cualquier parte de la zona de memoria.
4. Ejecucin de la instruccin.
5. Almacenamiento del resultado en memoria.

Una desventaja de este sistema es que la adicin de memoria externa es mucho


ms compleja e, incluso, a veces, imposible.

En contraposicin con los microcontroladores con arquitectura von Neumann, los


basados en Harvard tienen repertorios de instrucciones RISC Reduced Instruction
Set Computer.

Sus ventajas saltan a la vista: ms rapidez de ejecucin de cdigo incluso en


algoritmos de divisin que vienen implementados con ms cdigo en los RISC que
en los CISC, la velocidad de ejecucin es mayor en los primeros y menor el nmero
de instrucciones, lo que simplifica, tambin, nuestro aprendizaje cuando queremos
programar un MCU para una tarea simple. Por el contrario, requiere utilizar ms
memoria en un PIC7 que en un HC08 o un 8051 para realizar una funcin. 6

Sistemas embebidos

Estos sistemas electrnicos basados en microprocesadores y diseados para


aplicaciones especficas se les conocen como sistemas embebidos, es decir, se
trata de un sistema cuyo hardware y software se disean especficamente

6
Microprocesadores y Microcontroladores, Instituto Nacional de Educacin Tecnolgica, INET

32
optimizando su funcionamiento para resolver uno o varios problemas con eficiencia.
El trmino embebido se refiere al hecho de que la microcomputadora es
encapsulada en un solo circuito. Estos sistemas interactan con todo lo que los
rodea y funcionan como el monitor o el control de algn proceso.

Este hardware suele disearse a nivel de componente en un circuito integrado o de


tarjeta; por otra parte, el software que controla al sistema se programa en una
memoria de slo lectura (ROM) y no es accesible para el usuario del dispositivo.

Los sistemas embebidos siempre estn compuestos por microprocesador,


memoria, entradas y salidas a perifricos y un programa de aplicacin dedicado,
guardado permanentemente en la memoria.

Un programa de aplicacin para un sistema embebido forma parte del sistema y por
lo general se ejecuta sin necesidad de un sistema operativo; por tanto, la aplicacin
del programa ha de incluir el software para controlar e interactuar con los
dispositivos perifricos del sistema.

En la actualidad estos sistemas estn presentes en la vida diaria en lavadoras,


videos, televisores, calefaccin, sistemas de alarma, procesadores de alimentos,
computadoras, etc. Adems, van de lo ms simple a lo muy complejo, ya que
controlan desde las luces en los zapatos tenis hasta los sistemas de control de los
aviones militares; asimismo, cuentan con varias entradas y salidas a otros sistemas
o perifricos que son dispositivos conectados al sistema principal y controlado por
el microprocesador. Los microprocesadores que controlan este tipo de sistemas se
pueden dividir en:

Microprocesadores individuales. Se encuentran en dispositivos como sensores de


temperatura, detectores de humo y gas, interruptores de circuitos.

Conjuntos de microprocesadores sin funciones de reloj. Se hallan en


controladores de flujo, amplificadores de seal, sensores de posicin,
servomecanismos de vlvula.

Conjuntos de microprocesadores con funciones de reloj. Se encuentran en


equipos mdicos de monitoreo, controladores, centrales telefnicas, sistemas de
adquisicin de datos (SCADA), sistemas de diagnstico y tipo real.

Sistemas computarizados usados en control de procesos e industrias. Son


computadoras conectadas a equipos para controlarlos.

33
Diseo de microprocesadores en VHDL

Como ya se ha mencionado, los sistemas embebidos tienen una infinidad de


aplicaciones. Estos dispositivos realizan operaciones y controlan otros dispositivos,
para lo cual reciben informacin y dan rdenes a fin de que los dems elementos
trabajen.

El diseo de los microprocesadores se facilita gracias a la diversidad de


herramientas que hay en la actualidad. El lenguaje VHDL es una herramienta muy
poderosa para el diseo, pues adems de su flexibilidad permite ahorrar en tiempo
y costos.7

MEMORIA RAM

Las memorias de las microcomputadoras, son un ejemplo de la aplicacin de los


dispositivos de almacenamientos de datos llamados memorias

El sistema de los MC est compuesto por dispositivos de entradas como son los
teclados, escneres, etc.; y dispositivos de salida como son el monitor y la
impresora. La unidad central de procesamiento CPU controla la operacin de la MC
y procesa los datos. La memoria interna de una MC est constituida por tres tipos
de memoria semiconductoras. La memoria no voltil es llamada ROM (memoria de
solo lectura) y la memoria voltil es llamada RAM (memoria de acceso aleatorio).

Los dispositivos de almacenamiento RAM y ROM vienen en forma de CI y estn


moteados en tarjetas de circuitos impresos.

La mayora de los datos son almacenados normalmente en dispositivos magnticos


de almacenamiento masivos, denominado disco flexible o disco duro.

RANDOM ACCESS MEMORY (RAM)

La memoria RAM es una memoria voltil muy utilizada en los MC para almacenar
los datos temporalmente, y tiene caractersticas de voltil debido a que pierde los
datos almacenados en ella cuando se desconecta de la alimentacin. La RAM se
denomina memoria de lectoescritura. La operacin de ubicar un dato y visualizarlo
se denomina lectura. Almacenar los datos se denomina escritura.

7
David G. Maxinez-Jessica Alcal: VHDL El arte de programar sistemas digitales. CECSA, abril del 2012.

34
Consideremos la memoria de figura como una RAM, si la RAM estuviese en el modo
de escribir, el dato (por ejemplo, 11 E 1) puede grabarse en la memoria en posicin
5 si la RAM estuviese en el modo de leer, el dato puede ser ledo en la posicin
indicada, la RAM tambin es llamada SCRATCH - PAD, esta memoria es llamada
de acceso aleatorio debido a que puedes saltar de una palabra a otra en un solo
paso.

La siguiente figura muestra el diagrama lgico de un sencillo CI RAM 74F189 TTL


de 64 bits, este CI RAM est construido con tecnologa Schottky TTL ms moderna.
FAST, una subfamilia que muestra una combinacin de rendimiento y eficiencia no
alcanzada por otras familias TTL.

Figura 6. Diagrama lgico del CI 74F189

Uno de los modos de operacin del 74F189 es el modo de escritura. Durante esta
operacin los 4 bits ubicados en la entrada de datos (D3, D2, D1, D0) se escriben
en la posicin de la memoria especificada por las entradas de direccin. Por
ejemplo, para escribir 1101 en la posicin de la palabra 5, las entradas de datos
deben ser D3 = 1, D2 = 1, D1 = 0 y D0 = 1 y las entradas de direccin deben ser A3
= 0, A2 = 1, A1 = 0 y A0 = 1. Igualmente, la entrada de habilitacin de escritura WE
debe estar en un nivel bajo y la entrada de seleccin de pastilla CS debe estar en
BAJO.

Otro modo de operacin es el modo de lectura para la RAM 74F189. Las entradas
de control C5 deben estar en un nivel BAJO y WE en ALTO.

A continuacin, el contenido de la posicin direccionada aparecer en la salida de


datos (O3, O2, O, Oo). Debe entenderse que la operacin de lectura uno destruye
el dato almacenado, sino que saca una copia invertida de ese dato.

Tambin encontramos el modo de almacenamiento, (store) o de inhibicin.

35
Existen bsicamente dos tipos de RAM, la esttica y la dinmica. Un ejemplo de
RAM esttica es la CI 74F189. Esta RAM esttica puede fabricarse utilizando
tecnologa bipolar o MOS. La RAM esttica utiliza un flip-flop, celda de memoria, y
conserva la informacin siempre que la alimentacin est conectada al integrado.

La RAM dinmica o DRAM son utilizados como unidades de gran capacidad de


memoria, una celda de RAM dinmica est basada en un dispositivo MOS que al
almacenar una carga como lo hara un capacitor. Un inconveniente es que todas las
celdas deben ser recargadas cada pocos milisegundos para que no pierda los datos.

Los sistemas basados en microprocesador como las microcomputadoras,


convenientemente adecuadas almacenan y transfieren los datos en grupos de ocho
bits llamados byte.

Una SRAM muy popular es la 2114 fabricada con tecnologa MOS; almacena
4.096 bits organizados en 1.024 palabras de 24 bits cada una. Con la conexin de
dos RAM 2114 pueden conformar una memoria de 1.024 palabras de ocho bits por
palabra, a esto se le domina 1 KB de memoria.

Comnmente las RAMs son valoradas mencionando algunas caractersticas


distintivas como son:

* Tamao (en bits) y organizacin (palabra x bits por palabra; por ejemplo; la RAM
2114 sera de 4096 bits, o 1024 x 4

* Tecnologa utilizada para la fabricacin del clip por ejemplo; NMOS para la RAAM
2114

* Tipo de salida; esta ser ambas RAM para 2114, o como en otras que tienen salida
de 3 estados

* Velocidad (tiempo de acceso de la memoria) para la RAM 2114 es de unos 50 a


450ns

* Tipo de memoria (SRAM DRAM).

36
PROCEDIMIENTO Y DESCRIPCIN DE LAS ACTIVIDADES
REALIZADAS
Diseo de un microprocesador de 4 bits en el entorno de Programacin de
ISE Design Suite 14.1

La Figura 7 muestra el diagrama a bloques del microprocesador que se dise. Cabe


mencionar que entre sus principales caractersticas se encuentran un bus de
direcciones de 8 bits (A0-A7), un bus de datos de 4 bits (D0-D3), tres lneas de
interrupcin, reset, IRQ1 e IRQ2, una lnea de validacin de direcciones (VMA), una
lnea para una seal de reloj, y una lnea de lectura/escritura. Adems, se aadi al
proyecto, una memoria RAM, cuyas caractersticas se especifican ms adelante; El
propsito de sta es cargar un programa con el que se pruebe el funcionamiento del
microprocesador de 4 bits.

Figura 7. Diagrama a bloques del microprocesador.

Como puede observarse, el microprocesador se compone bsicamente de 11


bloques, cada uno con una funcin especfica. En lo siguiente, se analiza cada
bloque de manera detallada.

37
Este tipo de microprocesador es de clase Von Neumann, es decir, los datos e
instrucciones se encuentran en la misma memoria externa. Adems, el
microprocesador por s solo no trabajara, ya que requiere ciertos circuitos auxiliares
para su operacin.

Diseo y Programacin del Contador de programa (PC)

El contador de programa PC (Program Counter) es un registro de 8 bits que contiene


la direccin del siguiente registro donde se encuentra la direccin (nibble) de la
instruccin que se buscar en la memoria para su ejecucin. El hecho que el
contador de programa sea de 8 bits genera un total de 256 direcciones nicas. El
bus de direcciones del microprocesador es unidireccional y slo permite salidas del
microprocesador hacia los diferentes dispositivos. Cada vez que se ejecuta una
instruccin, el contador de programa se incrementa. Su diagrama se muestra en la
Figura 8.

Figura 8. Contador de Programa.

El cdigo en VHDL que describe la funcin del contador de programa se encuentra


en el Cdigo 1.

library ieee;
use ieee.std_logic_1164.all ;
use ieee.std_logic_unsigned.all;

entity ContadorDePrograma is port (


clk: in std_logic;
pcontrol: in std_logic_vector (7 downto 0);
cs: in std_logic_vector(4 downto 0);
reset: in std_logic;
pila: in std_logic_vector (7 downto 0) ;
pcout: inout std_logic_vector (7 downto 0));
end ContadorDePrograma;

architecture Behavioral of ContadorDePrograma is


begin

38
process(clk, cs, reset)
begin

if reset = '1' then


pcout <= "00000000";
elsif (clk'event and clk = '1') then
case cs is
when "11110" => pcout <= pcontrol;
when "11111" => pcout <= pcout +
1; when "11101" => pcout <= pila;
when others => null ;
end case;
end if;
end process;
end Behavioral;

Cdigo. Contador de programa

Segn la descripcin anterior en VHDL, el contador del programa tiene tres


variables que lo hacen trabajar: cs, clk y reset.

La variable reset sirve para inicializarlo en la direccin "00000000", misma en que


el microprocesador ejecuta la primera instruccin.

La variable cs indica la funcin que se debe realizar. Cuando es es igual a "11110"


la variable pcout es igual a la variable pcontrol esta ltima seal proviene
directamente de la unidad de control. Adems, puede ser igual a la direccin de
inicio, a una nueva direccin cuando se dio antes una instruccin de salto y a las
direcciones de inicio de las interrupciones IRQ1 y 1RQ2.

Cuando la variable cs del contador del programa es igual a " 11111" el valor de pcout
se incrementa una unidad. Esto ocurre cuando se est ejecutando la instruccin
presente y requiere un dato o la siguiente instruccin.

Cuando cs es igual a "11101", pcout toma el valor que est almacenado en la pila.
Esto sucede cuando el microprocesador atendi una peticin de interrupcin (IRQ1
o IRQ2) y necesita regresar a la direccin donde estaba en un inicio. Cualquier otra
combinacin de cs tiene un efecto nulo en el contador de programa.

La seal de clk indica al microprocesador cundo ejecutar cada una de las acciones
referidas. En todos los bloques del microprocesador, la seal clk tiene efecto cuando
pasa de un bajo a un alto.

39
Diseo y Programacin del Registro ndice

El registro de ndice (IX) es un registro de 8 bits que se usa para almacenar


una direccin donde es posible escribir datos almacenados en el acumulador A.
Este registro se puede incrementar e inicializar a una direccin que el usuario
especifique.

Figura. Registro ndice

Cdigo. Programacin del registro de ndice.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.std_logic_unsigned.all;

entity RegistroIndice is
Port ( clk : in STD_LOGIC;
pcontrol : in STD_LOGIC_VECTOR (7 downto 0);
cs : in STD_LOGIC_VECTOR (4 downto 0);
reset : in STD_LOGIC;
ix : inout STD_LOGIC_VECTOR (7 downto 0));
end RegistroIndice;

architecture Behavioral of RegistroIndice is

begin
process (clk, cs, reset)
begin
if reset = '1' then
ix <= "00000000";
elsif
(clk'event and clk = '1') then
case cs is
when "11010" => ix <= pcontrol;
when "11011" => ix <= ix + 1;
when others => null;
end case;
end if ;
end process;
end Behavioral;

40
Las seales cs, clk y reset afectan el registro de ndice. La seal clk tiene el mismo
efecto que en el contador de programa.

Cuando la seal de reset es igual a "1", coloca el contador de ndice (IX) con la
direccin inicial "00000000". Cuando la seal de cs es igual a "11010" el contador
de ndice es igual a pcontrol. En este caso, el usuario determina el valor de pcontrol
en su programa. Cuando cs es igual a "11011" el valor de IX se incrementa una
unidad. Cualquier otra combinacin de cs tiene un efecto nulo en el registro de
ndice.

Diseo y Programacin del Registro de Pila (STACK)

La pila (stack) es un registro de 8 bits que se usa para almacenar la ltima direccin
del contador de programa cuando ocurre una solicitud de interrupcin (IRQ1 e
IRQ2):

Figura. Registro de Pila (Stack)

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity RegPilaSTACK is
Port (
clk: in std_logic;
pcout: in std_logic_vector (7 downto 0);
pila: inout std_logic_vector (7 downto 0);
reset: in std_logic;
cs: in std_logic_vector (4 downto 0));

end RegPilaSTACK;

41
architecture Behavioral of RegPilaSTACK is

begin

process (clk, cs, reset)


variable q: std_logic_vector (7 downto 0);
begin
if reset = '1' then
pila <= "00000000";
elsif (clk'event and clk = '1') then
case cs is
when "11100" => pila <= pcout;
when others => null;
end case;
end if;
end process;
end Behavioral;

Cdigo. Registro de Pila (Stack)

De acuerdo con la descripcin VHDL del registro de pila, ste se ve afectado por las
seales cs, clk y reset. La seal clk funciona como ya se ha mencionado.

Cuando la seal de reset es igual a "1", inicializa la pila con la direccin "00000000".
Cuando cs es igual a "11100", el valor de la pila es igual al pcout, esto ocurre cuando
existe una interrupcin. Cualquier otro valor en cs tiene un efecto nulo sobre el
registro de pila.

Diseo y Programacin de los Acumuladores A y B; Acumulador A

El microprocesador contiene dos acumuladores (A y B) de 4 bits cada uno,


que se usan como registros temporales. Contiene los operandos y el resultado de
las operaciones efectuadas en la unidad lgica aritmtica.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.std_logic_unsigned.all;

entity AcumA is
port(
cs:in std_logic_vector (4 downto 0);
clk: in std_logic;
datoin:in std_logic_vector (3 downto 0);

42
reset: in std_logic;
a:inout std_logic_vector (3 downto 0));
end AcumA;

architecture Behavioral of AcumA is


begin

process(cs, clk, reset)


variable ares:std_logic_vector (3 downto 0);
begin
if reset = '1' then
a <= "0000";
else
if (clk'event and clk = '1') then
case cs is
when "10001" =>
a <= datoin;
when "11100" =>
ares := a;
when "11101" =>
a <= ares;
when others =>
null ;
end case;
end if ;
end if;
end process;

end Behavioral;

Cdigo. Programacin del acumulador A.

Las seales clk, reset y cs modifican el valor del acumulador A. El contenido de ste
depende del usuario y del resultado de las operaciones efectuadas en la unidad
aritmtica y lgica. Cuando el reset tiene un valor de "1", el contenido del
acumulador es "0000". La variable interna ares desempea una funcin importante
cuando existe una interrupcin, ya que guarda el contenido del acumulador, mismo
que devuelve cuando el microprocesador regresa de dicha interrupcin para que la
ejecucin del programa principal no sufra alteraciones; en la descripcin VHDL se
ve con claridad qu combinaciones de es realizan esta funcin.

Adems, la combinacin de cs igual a "10001" permite almacenar un dato en el


acumulador para su procesamiento.

43
Diseo y Programacin de los Acumuladores A y B; Acumulador B

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.std_logic_unsigned.all;

entity AcumB is
port(
cs:in std_logic_vector (4 downto 0);
clk: in std_logic;
datoin:in std_logic_vector (3 downto 0);
reset: in std_logic;
b:inout std_logic_vector (3 downto 0));
end AcumB;

architecture Behavioral of AcumB is


begin

process(cs, clk, reset)


variable bres:std_logic_vector (3 downto 0);
begin
if reset = '1' then
b <= "0000";
else
if (clk'event and clk = '1') then
case cs is
when "10010" =>
b <= datoin;
when "11100" =>
bres := a;
when "11101" =>
b <= bres;
when others =>
null ;
end case;
end if ;
end if;
end process;

end Behavioral;

Cdigo. Programacin del acumulador B

El acumulador B realiza una funcin similar al acumulador A. La nica variacin est


en el contenido, que depende exclusivamente del valor que asigna el usuario. Para
ello la variable cs debe ser igual a "10010. La variable bres tiene la misma funcin
que la variable ares en el acumulador A.

44
Diseo y Programacin del Registro Sel-Dato
El registro Seleccin del dato, es un registro auxiliar que permite introducir datos al
bus de datos interno del microprocesador. Estos datos tienen como destino los
acumuladores A o B y la unidad de control.

Figura 11. Registro Sel-Dato

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity RegSelDato is
port (
clk:in std_logic;
datout:in std_logic_vector (3 downto 0);
datoin:inout std_logic_vector (3 downto 0);
operacion:in std_logic_vector (3 downto 0);
cs:in std_logic_vector (4 downto 0) ) ;
end RegSelDato;

architecture Behavioral of RegSelDato is


begin

process(cs,clk)
begin
if (clk'event and clk = '1') then
case cs is
when "10110" => datoin <= datout;
when "10101" => datoin <= operacion;
when others => null;
end case ;
end if ;
end process ;

end Behavioral;

Cdigo. Registro Sel-Dato

45
Como se observa, en el cdigo del Sel-Dato, la variable reset no tiene efecto alguno;
en cambio, la seal clk tiene la funcin ya mencionada.

La seal cs determina el tipo de dato que se va a introducir. Este dato puede ser
externo, de una memoria, y se presenta cuando cs es igual a "10110", o interno,
como resultado de una operacin en la unidad lgica aritmtica.

Esto ltimo sucede cuando cs es igual a "10101". En sntesis, el registro Sel-Dato


no es sino un multiplexor de dos entradas con una salida.

Diseo y Programacin del Registro Tri-Est

El registro Tri-Est es un registro que permite sacar datos del microprocesador, los
que pueden ser el resultado de una operacin en la unidad aritmtica y lgica.
Cuando no est en uso este registro, sus salidas tienen un estado de alta
impedancia (Z).

Figura. Registro Tri-Est

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity RegTriEst is

port (
cs:in std_logic_vector (4 downto 0);
clk: in std_logic;
operacion:in std_logic_vector (3 downto 0);
datout:inout std_logic_vector (3 downto 0));

end RegTriEst;

46
architecture Behavioral of RegTriEst is

begin

process(cs, clk)
begin
if (clk'event and clk = '1') then
case cs is
when "11000" => datout <= operacion;
when others => datout <= "ZZZZ";
end case;
end if;
end process;

end Behavioral;

Cdigo. Programacin del registro Tri-Est

Como puede observarse, reset tampoco afecta al registro Tri-Est y segn su


descripcin, se trata de un buffer unidireccional con estado de alta impedancia.

En conjunto, los registros Sel-Dato y Tri-Est dan al bus de datos del


microprocesador la caracterstica de ser bidireccional.

Diseo y Programacin del Registro Sel-Dir

El registro Sel-Dir permite que las direcciones generadas por el contador de


programa o las del registro ndice salgan del microprocesador con objeto de leer o
escribir un dato, segn el valor de la seal R/W.

Figura. Registro Sel-Dir

47
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity RegSelDir is

port (
pcout:in std_logic_vector (7 downto 0);
clk:in std_logic;
ix:in std_logic_vector (7 downto 0);
direccion:out std_logic_vector (7 downto 0) ;
cs:in std_logic_vector (4 downto 0));

end RegSelDir;

architecture Behavioral of RegSelDir is

begin

process(cs, clk)
begin
if (clk'event and clk = '1') then
case cs is
when "11000" => direccion <= ix;
when others => direccion <= pcout;
end case;
end if;
end process;
end Behavioral;

Cdigo. Programacin del Registro Sel-Dir

La mayora de las veces, el registro Sel-Dir selecciona la direccin generada por el


contador de programa, debido a que el microprocesador siempre est leyendo datos
o instrucciones y nada ms escoge la direccin del registro ndice cuando va a
escribir un dato en la direccin que ste seala. Aunque en el cdigo de VHDL de
Sel-Dir no existe la seal de reset, cuando sta es igual a "1" el valor de direccin
es igual a "00000000". Al igual que en el registro Sel-Dato, Sel-Dir no es ms que
un multiplexor de dos entradas y una salida.

Diseo y Programacin del Registro Dir-Val

La importancia de este registro reside en que su salida indica a los


dispositivos perifricos que la direccin presente en el registro Sel-Dir es vlida. En
operacin normal, la seal Dir-Val (VMA) se debe utilizar a fin de habilitar
dispositivos perifricos como memorias, decodificadores o algn otro dispositivo

48
de entrada/salida. Esta seal no es de tres estados y cuando tiene un valor de "1"
indica que la direccin es vlida; en caso contrario es una direccin no vlida.

Esto es as porque durante algunas operaciones internas el microprocesador coloca


una direccin en el bus que no est usando en ese momento.

Figura. Registro Dir-Val

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity RegDirVal is

port (
vma: out std_logic;
cs:in std_logic_vector (4 downto 0) ) ;
end RegDirVal;

architecture Behavioral of RegDirVal is

begin

process(cs)
begin
vma <= (not cs(0) and cs(1) and cs(2) and not cs(3) and cs(4))
or (not cs(0) and not cs(1) and not cs(2) and cs(3) and not cs(4));
end process;
end Behavioral;

Cdigo. Programacin del Registro Dir-Val

Como puede observarse, el registro Dir-Val es un circuito combinacional con una


salida nica (VMA) y su valor es igual a "1" exclusivamente cuando se efecta una
operacin de lectura o escritura. El valor de VMA depende en todo momento de la
seal cs.

49
Diseo y Programacin de la Unidad Aritmtica y Lgica (ALU)

La unidad aritmtica y lgica es uno de los bloques ms importantes que conforman


al microprocesador, trabaja como una funcin multi-operacin digital de lgica
combinacional. Puede realizar un conjunto de operaciones aritmticas bsicas y otro
de operaciones lgicas. Ntense sus entradas y salidas en la Figura.

Figura. ALU (Aritmetic Logic Unit)

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.std_logic_unsigned.all;

entity ALU is
port (
clk:in std_logic;
a,b:in std_logic_vector (3 downto 0);
cs:in std_logic_vector (4 downto 0);
operacion:inout std_logic_vector (3 downto 0);
rc:inout std_logic_vector (3 downto 0));

end ALU;

architecture Behavioral of ALU is

signal cl:std_logic_vector (1 downto 0);

begin

process(clk)
variable Cout: std_logic;
begin

50
if (clk 'event and clk = '1') then
--Selecciona una operacin,

case cs is

when "00001" =>


operacion <= (a + b) ;
cl(0)<=(a(1) and b(1)) or ((a(0) and b(0)) and (a(1) xor b(1)));
cl(1)<= (a(2) and b(2)) or (cl(0) and (a(2) xor b(2)));
Cout:=(a(3) and b(3)) or (cl(1) and (a(3) xor b(3)));

when "00010" =>


operacion <= (a - b);
if (a >= b) then
Cout := '1';
cl(0)<= '1';
else
Cout := '0' ;
cl(0)<= '0';
end if;

when "00011" =>


operacion <= (a and b) ;
Cout := '0';
cl(0)<= '0';

when "00100" =>


operacion <= (a or b) ;
Cout := '0';
cl(0)<= '0';

when "00101" =>


operacion <= (not a) ;
Cout := '0';
cl(0)<= '0' ;

when "00110" =>


operacion <= (a xor b) ;
Cout := '0';
cl(0)<= '0';

when "00111" =>


operacion <= (a and "1111");
Cout := Cout;
cl(0) <= cl(0);

when others => null;


end case;
end if;

51
rc(3)<= Cout xor cl(1); -- Sobreflujo

rc(2)<= not(operacion(3) or operacion(2) or


operacion(1) or operacion(0)); -- Cero

rc(1)<= operacion(3); --Signo

rc(0)<= Cout; --Acarreo

end process;

end Behavioral;

Cdigo. Descripcin de la ALU

La unidad aritmtica y lgica del microprocesador se compone de dos entradas de


4 bits cada una (contenido de los acumuladores A y B) y una salida de 4 bits
(operacin) con acarreo. Puede realizar siete operaciones: dos aritmticas (suma y
resta), cinco lgicas (AND, OR, NOT, OR EXCLUSIVA) y enmascarar el contenido
del acumulador A.

El diseo de esta unidad aritmtica y lgica supone la generacin del registro de


cdigos de condicin (rcc). Este registro es de 4 bits e indica cmo es el resultado
de una operacin en la unidad aritmtica y lgica; estos cuatro bits indican si el
resultado es negativo (N), igual a cero (Z), si tiene sobreflujo (V) y si hay acarreo
(C).

Acarreo (C). Este bit (bit 0) del registro de cdigos de condicin se coloca en
"1" si despus de la ejecucin de ciertas instrucciones hay un acarreo del bit
ms significativo de la operacin que se est ejecutando; de otra manera se
coloca en "0".

Sobreflujo (V). Este bit (bit 3) del registro de cdigos de condicin se pone
en "1" cuando un sobreflujo en complemento a dos resulta de una operacin
aritmtica; se coloca en "0" si el sobreflujo no ocurre en ese tiempo. Por lo
general hay sobreflujo cuando la ltima operacin resulta ser un nmero mayor
que 7 de un registro de 4 bits.

Cero (Z). Este bit (bit 2) del registro de cdigos de condicin se coloca en "1"
si el resultado de la operacin lgica o aritmtica es cero; de otra manera se
pone en "0".

Negativo (N). Este bit (bit 1) del registro de cdigos de condicin se coloca
en "1" si el bit 3 del resultado de una operacin lgica o aritmtica es igual a
"1", de lo contrario se coloca en "0".
52
Aunque son pocas las operaciones que se pueden realizar con esta unidad
aritmtica y lgica, no hay que olvidar que al combinar estas operaciones bsicas
el nmero de stas crece de manera importante y as es posible realizar
decrementos, incrementos, corrimientos a la izquierda o derecha, corrimientos
aritmticos, funciones NAND, OR, etctera.

En lo que se refiere a las seales que controlan la unidad aritmtica y lgica, el valor
de cs determina qu operacin se va a llevar a cabo en dicha unidad y la seal de
clk marca en qu tiempo se realizar.

Diseo y Programacin de la Unidad de Control (CU)

La unidad de control es, en s, la unidad de mayor importancia. Sincroniza


cada una de las acciones realizadas por el microprocesador; as mismo, determina
en qu tiempo, hacia dnde se mandan los datos o de dnde vienen, decodifica
cada instruccin y revisa que se ejecute.

Figura. Unidad de Control

53
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.std_logic_unsigned.all;

entity UnidadDeControl is

port(
reset,clk: in std_logic;
irq: in std_logic_vector (1 downto 0);
rw: inout std_logic;
datoin: in std_logic_vector (3 downto 0);
pcontrol: inout std_logic_vector (7 downto 0);
rc: in std_logic_vector (3 downto 0);
pcout: in std_logic_vector (7 downto 0);
cs: inout std_logic_vector (4 downto 0));

end UnidadDeControl;

architecture Behavioral of UnidadDeControl is

type estados is (d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10,
dll, d12, dl3, dl4, d15, d16, d17,d18);

signal edo_presente, edo_futuro: estados;


signal f: std_logic_vector (7 downto 0);

begin

proceso1: process (edo_presente, irq, reset)

begin
if reset = '1' then
edo_futuro <= d0;
pcontrol <= "11111111";
rw <= '0';
cs <= "11110";
else
case edo_presente is

when d0 =>if irq = "10" then


cs <= "11100";
edo_futuro <= d1;
elsif irq = "01" then
cs <= "11100";
edo_futuro <= d1;
else
edo_futuro <= d3;
cs <= "11111";
end if;

54
when d1 => if irq = "10" then
pcontrol <= "01000000";
edo_futuro <= d1;
elsif irq = "01" then
pcontrol <= "10000000";
edo_futuro <= d1;
else
cs <= "11110";
edo_futuro <= d3;
end if;

when d2 =>
cs <= cs;
edo_futuro <= d5;

when d3 =>
cs <= "10110";
rw <= '1';
edo_futuro <= d4;

when d4 =>
rw <= '0';
if datoin = "0000" then
cs <= "00001";
edo_futuro <= d2;
elsif datoin = "0001" then
cs <= "00010";
edo_futuro <= d5;
elsif datoin = "0010" then
cs <= "00011";
edo_futuro <= d5;
elsif datoin = "0011" then
cs <= "00100";
edo_futuro <= d5;
elsif datoin = "0100" then
cs <= "00101";
edo_futuro <= d5;
elsif datoin = "0101" then
cs <= "00110";
edo_futuro <= d5;
elsif datoin = "0110" then
cs <= "11111";
edo_futuro <= d6;
elsif datoin = "0111" then
cs <= "11111";
edo_futuro <= d7;
elsif datoin = "1000" then
cs <= "11111";
edo_futuro <= d8;

55
elsif datoin = "1001" then
cs <= "00111";
edo_futuro <= d9;
elsif datoin = "1010" then
cs <= "11011";
edo_futuro <= d0;
elsif datoin = "1011" then
cs <= "11111";
if rc(0) = '1' then
edo_futuro <= d10;
else
edo_futuro <= d0;
end if;
elsif datoin = "1100" then
cs <= "11111";
if rc(2) = '1' then
edo_futuro <= d10;
else
edo_futuro <= d0;
end if;
elsif datoin = "1101" then
cs <= "11111";
if rc(1) = '1' then
edo_futuro <= d10;
else
edo_futuro <= d0;
end if;
elsif datoin = "1110" then
cs <= "11111";
if rc(3) = '1' then
edo_futuro <= d10;
else
edo_futuro <= d0;
end if;

else
cs <= "11101";
edo_futuro <= d0;
end if;

when d5 =>
cs <= "10101";
edo_futuro <= dll;

when d6 =>
cs <= "10110";
rw <= '1' ;
edo_futuro <= d12;

when d7 =>
cs <= "10110";
rw <= '1';
edo_futuro <= dll;

56
when d8 =>
cs <= "10110";
rw <= '1';
edo_futuro <= d15;

when d9 =>
cs <= "11000";
edo_futuro <= d18;

when d10 =>


cs <= "10110";
rw <= '1' ;
edo_futuro <= d16;

when dll =>


cs <= "10001";
rw <= '0';
edo_futuro <= d0;

when d12 =>


cs <= "11111";
rw <= '0';
pcontrol(0) <= datoin(0);
pcontrol(1) <= datoin(1);
pcontrol(2) <= datoin(2);
pcontrol(3) <= datoin(3);
pcontrol(4) <= pcontrol(4);
pcontrol(5) <= pcontrol(5);
pcontrol(6) <= pcontrol(6);
pcontrol(7) <= pcontrol(7);
edo_futuro <= dl3;

when dl3 =>


cs <= "10110";
rw <= '1';
edo_futuro <= dl4;

when dl4 =>


rw <= '0';
cs <= "11010";
pcontrol(0) <= pcontrol(0);
pcontrol(1) <= pcontrol(1);
pcontrol(2) <= pcontrol(2);
pcontrol(3) <= pcontrol(3);
pcontrol(4) <= datoin(0);
pcontrol(5) <= datoin(1);
pcontrol(6) <= datoin(2);
pcontrol(7) <= datoin(3);
edo_futuro <= d0;

when d15 =>


cs <= "10010";
rw <= '0';
edo_futuro <= d0;

57
when d16 =>
cs <= "10000";
f(0)<= datoin(0);
f(1)<= datoin(1);
f(2)<= datoin(2);
f(3)<= '0' ;
f(4)<= '0' ;
f(5)<= '0' ;
f(6)<= '0' ;
f(7)<= '0' ;
if datoin(3) = '0' then
pcontrol <= pcout + f;
edo_futuro <= d17;
else
pcontrol <= pcout - f;
edo_futuro <= d17;
end if;

when d17 =>


cs <= "11110";
edo_futuro <= d0;

when d18 =>


cs <= "01000";
edo_futuro <= d0;

end case;
end if;
end process proceso1;

proceso2: process(clk, reset)


begin
if (clk' event and clk = '1') then
if reset = '0' then
edo_presente <= edo_futuro;
else null ;
end if;
end if;

Cdigo. Descripcin de la unidad de control

La unidad de control es una mquina de estados finitos. En ella se describe la


funcin del prximo estado, las asignaciones de salida y las asignaciones sobre el
registro de estados en la transicin activa de la seal de reloj.

La unidad de control genera la seal cs para cada bloque. Esta seal les marca la
funcin que van a realizar y en qu tiempo deben efectuarla; de igual forma, genera
la seal de lectura/escritura, la seal de pcontrol que va directamente al registro del
contador de programa que genera las direcciones. Las seales clk, reset, IRQ1,
IRQ2 y rcc son seales de entrada; la ltima resulta de las

58
operaciones realizadas en la unidad aritmtica y lgica e indica a la unidad de
control cmo es el resultado.

Al inicio del cdigo en VHDL, las interrupciones tienen una funcin preponderante
porque indican al microprocesador dnde leer la primera instruccin.

La interrupcin de mayor importancia es reset, pues inicializa al microprocesador


empezando por la misma unidad de control, coloca al pcontrol con valor de
"11111111" y le dice al contador de programa que se incremente. Despus de reset
puede haber dos interrupciones IRQ1 e IRQ2. En caso de presentarse alguna de
ellas el pcontrol se modifica, pero antes el microprocesador guarda el resultado de
los dos acumuladores y de la ltima direccin (del contador de programa). Si se da
una IRQ1, el pcontrol es igual a "10000000"; si se presenta una interrupcin IRQ2,
el valor de pcontrol es igual a "01000000". Ambas direcciones indican dnde iniciar
las rutinas de interrupcin. Al terminar las rutinas, los acumuladores vuelven a su
valor original, al igual que el valor del contador de programa. En caso de no existir
alguna interrupcin, el microprocesador genera la direccin "00000000" y la seal
R/W se va a "1". Con esto el microprocesador lee el contenido de esta direccin,
que es una instruccin, e inicia la secuencia de ejecucin.

En la Figura, se puede observar un diagrama que indica el flujo de la operacin que


sigue el microprocesador al momento de empezar a trabajar y el camino que toman
las interrupciones.

La unidad de control est compuesta por 17 estados, cada uno con una funcin
especfica. Los estados "0" y "1" se encargan de las tres interrupciones que existen.
Se llega al estado "0" despus de un reset o luego de correr la ltima instruccin.

En el estado "0" se da la orden para incrementar el contador de programa (cs =


"11111"). Del estado "0" se va al estado "1", a menos que entre un reset. En ste la
unidad de control comprueba si ha entrado una interrupcin. En caso positivo
cambia el contador de programa y pasa al estado "3", en caso contrario pasa de
igual forma al estado "3". En este estado la unidad de control lee la instruccin. Para
ello las seales r/w y VMA se van a "1", y la seal cs es igual a "10110".

Este valor de es indica al registro Sel-Dato que deje pasar el dato externo al bus de
datos interno del microprocesador (datoin), para que sea analizado en la unidad de
control. De aqu se va directamente al estado "4", que es el ms importante, ya que
cumple las funciones de decodificador de instrucciones y determina el camino que
se debe seguir en la ejecucin de las instrucciones.

59
Figura. Diagrama de flujo de interrupciones.

En el estado "4" se tienen 16 combinaciones de la seal datoin y cada una


representa una instruccin.

Las 16 instrucciones se dividen en las siguientes categoras:

Nmero de instrucciones Tipo de instruccin


7 Lgica-aritmtica
4 Bifurcacin
4 Carga en acumulador, ndice y direccin
1 Retorno de interrupcin
Tabla Tipos de Instrucciones

60
Ms adelante se da una lista detallada de las 16 instrucciones que puede ejecutar
el microprocesador.

En el estado "4" nada ms se ejecutan las instrucciones lgico aritmticas y se


indica a la ALU el tipo de funcin que se va a realizar. Para este tipo de instrucciones
se pasa al estado "5", donde la unidad de control coloca el resultado de la operacin
en el bus de datos interno. A continuacin se va al estado "11", donde el resultado
se almacena en el acumulador A. Por ltimo se pasa al estado "0" donde todo
comienza de nuevo.

Para llegar al estado "6" es necesario que en el estado "4" el valor de datoin sea
igual a "0110". Este dato corresponde a la instruccin de cargar una direccin en el
registro ndice. En el estado "6" la unidad de control da la orden para introducir un
dato. De aqu se pasa al estado "12", donde el dato que se introdujo en el estado
anterior corresponde a la parte baja de la direccin que se va a cargar en el registro
ndice. En el estado "13" se da la orden de introducir un segundo dato y en el estado
"14" este dato pasa a formar la parte alta de la direccin y desde este estado se
carga esta direccin ya formada en el registro ndice. De aqu se va al estado "0"
para ejecutar la siguiente instruccin.

Para llegar al estado "7", en el estado "4" el datoin debe ser igual a "0111". Este
dato corresponde a la instruccin de cargar un dato en el acumulador A. En el estado
"7" se introduce el dato que se quiere cargar. De ah se pasa al estado "11", donde
la unidad de control coloca el dato en el acumulador A. Para finalizar se va al estado
"0" a esperar la siguiente instruccin.

Para llegar al estado "8", en el estado "4" el valor de datoin debi ser igual a "1000".
Este valor corresponde a la instruccin de cargar un dato en el acumulador
B. En el estado "8" se introduce el dato que se va a cargar. De ah se va al estado
"15", donde la unidad de control coloca dicho dato en el acumulador B y por ltimo
se pasa al estado "0".

Cuando en el estado "4" el datoin es igual a "1001", esto significa que hay una
instruccin de almacenar el dato del acumulador A en la direccin contenida en el
registro ndice. En este estado la unidad de control coloca el valor del acumulador
A en el bus de datos interno. Luego se pasa al estado "9", donde la direccin del
ndice se coloca en el registro Sel-Dir, posteriormente en el estado 18 el registro
Tri-Est es habilitado para sacar el valor del acumulador del microprocesador. De
aqu se salta al estado "0".

Las siguientes cuatro instrucciones son de bifurcacin y todas pasan por los mismos
estados. La nica diferencia es la condicin que tienen que comprobar para validar
la condicin de salto o no. Si en el estado "4" se da alguno de los

61
siguientes valores de datoin: "1011", "1100", "1101" y "1110", se trata de la
instruccin de salta si hay acarreo (C = 1), salta si es igual a cero (Z = 1), salta si es
negativo (N 1) y salta si hay sobreflujo (V = 0), respectivamente. En el mismo
estado "4" se comprueba si la condicin de salto es verdadera. Si es falsa se pasa
al estado "0" y en caso contrario se va al estado "10", donde se introduce el dato
que determina el valor del salto; de aqu se pasa al estado "16".Este salto puede ser
hacia delante o hacia atrs y su valor mximo es 7 direcciones a partir de la
direccin que contiene el dato que determina su longitud. El signo del salto se
determina a partir del valor del tercer bit del dato: si es igual a "0" es positivo y si es
igual a "1" es negativo.

A continuacin se pasa al estado "17", donde la nueva direccin se coloca en el


contador de programa. Para finalizar se va al estado "0". Cuando en el estado "4"
se tiene un valor de datoin igual a "1010", esto significa que hay una instruccin de
incrementar el valor del registro ndice en el mismo estado "4" la unidad de control
realiza esta operacin. De aqu se regresa al estado "0".

La ltima instruccin se utiliza cuando ha habido previamente una interrupcin (IRQI


e IRQ2). Si en el estado "4" el valor de datoin es igual a"1111", esto significa que la
rutina de interrupcin ha terminado y que el microprocesador tiene que regresar a
las condiciones previas a la interrupcin. Para ello la unidad de control saca la
direccin almacenada en la pila, la coloca en el contador de programa y el valor
original de los acumuladores se carga de nuevo. Enseguida se va al estado "0".

Diseo y Programacin de la MEMORIA RAM

La memoria RAM que se dise tiene una arquitectura de un ancho de datos de 1


nibble (4 bits) y se conforma de 256 localidades; esto es 256x4bit, 1Kb de memoria
RAM para leer y escribir datos. A continuacin se muestra en el Cdigo, el mdulo
de la memoria RAM.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.std_logic_unsigned.all;

entity RAM_256X4b is
Port ( direccion : in STD_LOGIC_VECTOR (7 downto 0);
vma : in STD_LOGIC;
rw : in STD_LOGIC;
clk : in STD_LOGIC;
datout : inout STD_LOGIC_VECTOR (3 downto 0);
end RAM_256X4b;

62
architecture Behavioral of RAM_256X4b is
type ram_table is array (0 to 255) of std_logic_vector(3 downto 0);
signal rammemory: ram_table;
begin

process(clk, vma, rw, direccion)


variable dato: std_logic_vector (3 downto 0);
begin
dato:= datout;
--escritura
if (clk' event and clk = '1') then
if vma = '1' then
if rw = '0' then
rammemory(conv_integer(direccion))<= dato;
end if;
end if;
end if;

--lectura
if (clk' event and clk = '0') then
if vma = '1' then
if rw = '1' then
datout <= rammemory(conv_integer(direccion));
else datout <= "ZZZZ";
end if;
end if;
end if;

end process;
end Behavioral;

Cdigo. Memoria RAM 256x4bit.

Diseo Jerrquico: Creacin del Archivo de Componentes

El diseo jerrquico es una herramienta de apoyo que permite la programacin de


extensos diseos mediante la integracin de pequeos bloques, los cuales se
pueden detallar y simular por separado con suma facilidad.

Una vez estudiado cada uno de los bloques que conforman al microprocesador, es
necesario aclarar que de acuerdo con la programacin en VHDL, es necesario crear
dos programas: uno que defina cada uno de estos bloques como componentes y
otro (denominado de alto nivel) que encadena cada uno de estos componentes y
los hace trabajar en conjunto.

63
library ieee;
use ieee.std_logic_1164.all ;
package Microprocesador_C is

component ALU port (


clk:in std_logic;
a,b:in std_logic_vector (3 downto 0);
cs:in std_logic_vector (4 downto 0);
operacion: inout std_logic_vector (3 downto 0);
rc:inout std_logic_vector (3 downto 0));
end component;

component AcumA port (


cs:in std_logic_vector (4 downto 0);
reset:in std_logic;
clk:in std_logic;
datoin:in std_logic_vector (3 downto 0);
a:inout std_logic_vector (3 downto 0));
end component;

component AcumB port (


reset:in std_logic;
cs:in std_logic_vector (4 downto 0);
clk:in std_logic;
datoin:in std_logic_vector (3 downto 0);
b:inout std_logic_vector (3 downto 0));
end component ;

component RegSelDato port (


clk:in std_logic;
datout:in std_logic_vector (3 downto 0);
datoin:inout std_logic_vectcr (3 downto 0);
operacion:in std_logic_vector (3 downto 0);
cs:in std_logic_vector (4 downto 0));
end component;

component RegTriEst port (


cs:in std_logic_vector (4 downto 0) ;
operacion:in std_logic_vector (3 downto 0) ;
datout:inout std_logic_vector (3 downto 0));
end component;

component ContadorDePrograma port (


clk: in std_logic;
reset: in std_logic;
pcontrol, pila: in std_logic_vector (7 downto 0) ;
cs: in std_logic_vector(4 dcwnto 0) ;
pcout: inout std_logic_vector (7 downto 0));
end component;

component RegPilaSTACK port (


clk: in std_logic;
pcout: in std_logic_vector (7 downto 0);
reset: in std_logic;
pila: inout std_logic_vector (7 downto 0);
cs: in std_logic_vector (4 downto 0) ) ;
end component;
64
component RegistroIndice port (
clk: in std_logic;
pcontrol: in std_logic_vector (7 downto 0);
reset:in std_logic;
cs: in std_logic_vector(4 downto 0);
ix: inout std_logic_vector (7 downto 0)) ;
end component;

component RegSelDir port (


pcout:in std_logic_vector (7 downto 0);
clk:in std_logic;
ix:in std_logic_vector (7 downto 0);
direccion:out std_logic_vector (7 downto 0);
cs:in std_logic_vector (4 downto 0));
end component;

component RegDirVal port (


vma:out s td_log i c;
cs:in std_logic_vector (4 downto 0) ) ;
end component;

component UnidadDeControl port (


reset,clk: in std_logic;
irq: in std_logic_vector (1 downto 0) ;
rw: inout std_logic;
datoin: in std_logic_vector (3 downto 0);
pcontrol: inout std_logic_vector (7 downto 0);
rc: in std_logic_vector (3 downto 0) ;
pcout: in std_logic_vector (7 downto 0);
cs: inout std_logic_vector (4 dcwnto 0) ) ;
end component;
component RAM_256X4b port(
direccion : in STD_LOGIC_VECTOR (7 downto 0);
vma : in STD_LOGIC;
rw : in STD_LOGIC;
clk : in
STD_LOGIC;
datout : inout STD_LOGIC_VECTOR (3 downto 0);
end component;
end Microprocesador_C;
Cdigo. Creacin del paquete de componentes del Microprocesador

Cada componente se declara de manera similar a su entidad de diseo y cada uno


se almacena en el paquete llamado Microprocesador_C.

Diseo Jerrquico: Creacin del Archivo de Alto nivel

En VHDL es posible disear en forma estructural; Es decir, uniendo


componente por componente. Esta metodologa es la base del diseo jerrquico,
adems cada bloque o componente del diseo se interconecta por medio de

65
seales o buses internos, los cuales se declaran y asocian mediante clusulas
propias del lenguaje. Con ellos se completa el diseo de bloques funcionales que
interconectados forman sistemas complejos.
La declaracin de la entidad consiste en todas las terminales de entrada y salida del
microprocesador, las cuales se nombran tal como se encuentran referidas en su
mdulo. Las seales que interconectan cada componente se declaran en la
arquitectura.

library IEEE,UNISIM;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.std_logic_unsigned.all;
use work.Microprocesador_C.all;

entity TopLevelMicro is port(


clk, reset:in std_logic;
direccion: out std_logic_vector(7 downto 0);
vma: out std_logic;
datout: inout std_logic_vector (3 downto 0);
rw: inout std_logic;
irq: in std_logic_vector (1 downto 0));

end TopLevelMicro;

architecture Behavioral of TopLevelMicro is

signal a: std_logic_vector (3 downto 0);


signal b: std_logic_vector (3 downto 0);
signal datoin: std_logic_vector (3 downto 0);
signal operacion: std_logic_vector (3 downto 0);
signal rc: std_logic_vector (3 downto 0);
signal cs: std_logic_vector (4 downto 0);
signal pcontrol: std_logic_vector (7 downto 0);
signal pila: std_logic_vector (7 downto 0);
signal pcout: std_logic_vector (7 downto 0);
signal ix: std_logic_vector (7 downto 0);

begin

u1: ALU port map (clk=>clk, cs=>cs,operacion=>operacion, rc=>rc, a=>a,


b=>b);

u2: AcumA port map (cs=>cs, datoin=>datoin, a=>a, clk=>clk, reset=>reset);

u3: AcumB port map (cs=>cs, datoin=>datoin, b=>b, clk=>clk, reset=>reset);

u4: RegSelDato port map (cs=>cs, datoin=>datoin, datout=>datout,


operacion=>operacion, clk=>clk);

66
u5: RegTriEst port map (cs=>cs, operacion=>operacion, datout=>datout,
clk=>clk);

u6: ContadorDePrograma port map (clk=>clk, pcontrol=>pcontrol, cs=>cs,


pcout=>pcout, pila=>pila, reset=>reset);

u7: RegistroIndice port map (cs=>cs, clk=>clk, pcontrol=>pcontrol, ix=>ix,


reset=>reset);

u8: RegPilaSTACK port map (cs=>cs, clk=>clk, pcout=>pcout, pila=>pila,


reset=>reset);

u9: RegSelDir port map (clk=>clk, pcout=>pcout, ix=>ix,


direccion=>direccion,
cs=>cs);

u10: RegDirVal port map (vma=>vma, cs=>cs);

u11: UnidadDeControl port map (clk=>clk, reset=>reset, irq=>irq, rw=>rw,


datoin=>datoin, pcontrol=>pcontrol, rc=>rc, pcout=>pcout, cs=>cs);

u 12: RAM_256X4b port map (direccion=>direccion, vma=>vma, rw=>rw,


clk=>clk, datout=>datout);
end Behavioral;
Cdigo. Programa de alto nivel

Lista de instrucciones

El microprocesador contiene un conjunto de 16 instrucciones. Dichas operaciones


pueden ocupar 1, 2 o 3 nibbles segn el tipo de operacin que se va a ejecutar. En
la Tabla, se puede observar el conjunto de instrucciones.

Instruccin Ciclos de Nibbles Cdigo de Descripcin


reloj Requeridos operacin
A + B A 6 1 0000 Suma los acumuladores y guarda el
resultado en A.
A - B A 5 1 0001 Resta los acumuladores y guarda el
resultado en A
A and B A 5 1 0010 AND lgica entre acumuladores y
guarda el resultado en A.
A or B A 5 1 0011 OR lgica entre acumuladores y
guarda el resultado en A.
not A A 5 1 0100 Invierte A y guarda el resultado en
A.
A xor B A 5 1 0101 XOR lgica entre acumuladores y
guarda el resultado en A.
MX 7 3 0110 Carga el ndice con la direccin de
memoria inmediata.

67
Instruccin Ciclos de Nibble Cdigo de Descripcin
reloj Requeridos operacin
MA 5 2 0111 Carga el acumulador A con el valor
inmediato.
M B 5 2 1000 Carga el acumulador B con el valor
inmediato.
AM 4 1 1001 Almacena el contenido de A en la
direccin del ndice..
X+1 X 3 1 1010 Incrementa en una unidad el valor del
registro ndice.
C = "1" 6 2 1011 Salta si C = '1'.
Z = "1" 6 2 1100 Salta si Z = 1.

N = "1" 6 2 1101 Salta si N = 1.


V = "1" 6 2 1110 Salta si V = '1'.
PILA-- Pcout 3 1 1111 Regresa de una interrupcin.
Tabla de instrucciones del microprocesador

De acuerdo con la tabla, el usuario puede manipular los acumuladores y el registro


ndice, adems de utilizar el registro de cdigos de condicin para conocer el
resultado; no puede modificar el resto de los registros del microprocesador.

68
RESULTADOS

En el presente apartado se exponen los resultados de la simulacin de los bloques


ms importantes que componen al microprocesador, y finalmente del
microprocesador en conjunto.

Cabe hacer mencin nuevamente que para programar se hizo uso del Software ISE
Design Suite 14.1 y de la herramienta ISim para la simulacin.

Simulacin del Contador de programa (PC)

Observe el resultado de simulacin del Contador de programa (Figura 18):

Figura 18. Simulacin del Contador de programa

Se presentan los cuatro casos ms notables y significativos de la seal cs, pero


recordemos que el contador del programa tiene tres variables que lo hacen trabajar:
cs, clk y reset. La variable reset sirve para inicializarlo en la direccin "00000000",
es decir, el valor de pcout ser 00000000.

Cuando cs es igual a "11110" la variable pcout es igual a la variable pcontrol, en


el caso de simulacin pcontrol es igual a 00001111, esta ltima seal provendr
directamente de la unidad de control.

Cuando cs es igual a "11111" la variable pcout se incrementa una unidad, en el


caso de simulacin pcout ha tomado el valor de 00010000, que es correcto.

69
Cuando cs es igual a "11101" la variable pcout toma el valor de la pila, en el caso
de simulacin el valor de pila es igual a 11111111, esto sucede cuando el
microprocesador atendi una peticin de interrupcin (IRQ1 e IRQ2) y necesita
regresar a la direccin donde estaba en un inicio.

En el cuarto valor de la variable cs, no hay cambios en el valor de pcout, puesto


que cualquier otra combinacin de cs tiene un efecto nulo en el contador de
programa.

Por ltimo, se presenta un cambio en el valor de reset, pasa al estado 1, como se


puede observar, el valor de pcout se reinicializa a 00000000.

Con esto, queda demostrado el correcto funcionamiento del Contador de programa.

Simulacin del Registro ndice (ix)

Observe el resultado de simulacin del Registro ndice (figura 19):

Figura 19. Simulacin del Registro ndice

Se muestran los tres valores ms importantes de la seal cs.

Cuando cs es igual a "11010" la seal ix es igual a la variable pcontrol, en el caso


de simulacin pcontrol es igual a 00011111.

Cuando cs es igual a "11011" el valor de ix se incrementa una unidad. En la


simulacin ix ha tomado el valor de 00100000, el caso es correcto.

70
Puesto que cualquier otra combinacin de cs tiene un efecto nulo en el registro de
ndice, en el 3er. valor que se asign a cs 11111111, la seal ix no presenta ningn
cambio.

Por ltimo, al igual que en la simulacin del Contador de programa. Al asignarle a


reset el valor 1 la seal de salida (ix) se reinicia en 00000000.

Simulacin del Registro de Pila (Stack)

Observe el resultado de simulacin del Registro de Pila (figura 20):

Figura 20. Simulacin del Registro de Pila (Stack)

Cuando la seal de reset es igual a "1", inicializa la pila con la direccin "00000000".
Cuando cs es igual a "11100", el valor de pila es igual al pcout, en la simulacin es
11111111, esto ocurre cuando existe una interrupcin. Cualquier otro valor en cs
tiene un efecto nulo sobre el registro de pila, como puede observarse con cs igual
a 11101.

As mismo queda demostrado tambin, el funcionamiento correcto del Registro de


Pila.

71
Simulacin del Acumulador A

Observe el resultado de simulacin del Acumulador A (figura 21):

Figura 21. Simulacin del Acumulador A

Se presentan los cuatro casos ms notables y significativos de la seal cs, los


cuales representan una accin importante en la seal de salida a.

Cuando la variable cs es igual a "10001", a la seal a se le asignar lo que se


encuentra en datoin, en el caso de simulacin datoin es igual a 0011.

Cuando la variable cs es igual a "11100", el valor que se encuentre en a se guardar


en la variable interna ares, valor que podremos recuperar en la prxima instruccin
de cs, con el fin de notar la accin. La variable interna ares desempea una funcin
importante cuando existe una interrupcin, ya que guarda el contenido del
acumulador con el fin de recuperarlo futuramente.

En el tercer cambio de cs, a este le hemos asignado nuevamente el valor "10001",


esto con el fin de distinguir los cambios para cada instruccin de la seal cs y de
a. En el caso de simulacin a datoin se le ha asignado el nuevo valor de 0001.
Cmo se puede observar, a ha tomado el valor de datoin (0001).

En el cuarto cambio de cs le hemos asignado 11101, con esto recuperamos el


valor que se encuentra guardado en la variable interna ares, que, recordemos vala
0011. La seal a toma su valor.

Por ltimo, aplicamos un reset al acumulador y la seal de salida a, vale ahora


0000

72
El acumulador B realiza una funcin similar al acumulador A. La nica variacin est
en el contenido, que depende exclusivamente del valor que asigna el usuario. Para
ello la variable cs debe ser igual a "10010. La variable bres tiene la misma funcin
que la variable ares en el acumulador A. Siendo as, se omitir en el documento su
simulacin.

Simulacin de la Unidad Aritmtica y Lgica (ALU)

Para la simulacin de la ALU, supondremos 4 casos de la variable cs para hacer


ms objetivo el, o los resultados de su funcionamiento, dichos sern una suma,
compuerta AND, compuerta OR, de los acumuladores a y b, y compuerta NOT del
acumulador a.

Observe el resultado de simulacin de la Unidad Aritmtica y Lgica, de los casos


especificados para la seal cs. (Figura 22):

Figura 22. Resultado de Simulacin de la Unidad Aritmtica y Lgica

Estableceremos los valores de los acumuladores a y b igual a 0100 (4 decimal)


y 0010 (2 decimal) respectivamente. Con ellos se realizan las operaciones antes
mencionadas.

Para la primera operacin, la cual ser una suma entre acumuladores a y b, el valor
de la seal cs ser 00001; En este primer caso, notamos en la simulacin que el
resultado de la operacin es 0110 que corresponde a un 6 decimal, valor correcto
para la suma binaria (0100) + (0010), (4+2; decimal).

73
Es preciso hacer notar el valor que adquiere la seal rc (condicin de la operacin),
quien describe que no hay acarreo (bit 0), no es negativo (bit 1), no es un valor cero
(bit 2), y tampoco se presenta un sobre flujo (bit 3), en el resultado de la operacin.

Siguiendo con la segunda operacin, la cual ser una compuerta AND entre
acumuladores a y b, el valor de la seal cs ser 00011; En este segundo caso, el
resultado de la operacin es 0000; recordando la tabla de verdad de una
compuerta AND, comprobamos con veracidad el cumplimiento de la misma para los
acumuladores a y b.

El valor de rc, ahora ha cambiado en el bit 2 al estado 1, esto es correcto, puesto


que indica que el resultado de la operacin es cero 0000.

Para la tercera operacin, que corresponde a una compuerta OR entre


acumuladores a y b, el valor de la seal cs ser 00100; Ntese en la simulacin
que el resultado de la operacin es 0110; recordando la tabla de verdad de una
compuerta OR, comprobamos el cumplimiento de la misma para los acumuladores
a y b.

Nuevamente encontramos un cambio en la seal rc, que ha cambiado en el bit 2 de


un 1 a un 0, justamente porque ahora el valor en la operacin ya no es cero
(0000).

Para la cuarta y ltima operacin presentada en esta simulacin, corresponde a una


compuerta NOT del acumulador a, el valor de la seal cs ser 00101; En este
caso, el resultado de la operacin es 1011, el cual corresponde inequvocamente
a la inversin de acumulador a 0100.

En la seal rc, el bit 1 ha cambiado al estado 1, lo cual denotara que la operacin


es un valor negativo, pero esto no se cumple, hasta que el bit 1 de la seal interna
cl sea 1, y, como podemos notar, esto no ha sucedido; Por lo tanto, se sigue
cumpliendo la correcta funcin de la Unidad (ALU).

Con esto, queda demostrado el correcto funcionamiento de la Unidad Aritmtica y


Lgica.

En lo que se refiere a las seales que controlan la unidad aritmtica y lgica, el valor
de cs determina qu operacin se va a llevar a cabo en dicha unidad y la seal de
clk dispone en qu tiempo se realizar.

74
La Unidad de Control

La unidad de control es en s, una mquina de estados finitos (FSM), por sus siglas
en ingls; Y como ya se ha mencionado, la unidad de control, es en general, el
bloque ms importante dentro del microprocesador, puesto que ste realiza la
funcin de control y sincrona de todos y cada uno de los dems bloques que
componen a este sistema.

La parte de simulacin de este bloque, se detallar juntamente con la simulacin


del Microprocesador en su totalidad, ya que no tiene caso describir su
comportamiento individual, puesto que l mismo realiza el trabajo del Micro en su
descripcin.

Ahora se presentar el resultado de simulacin del Microprocesador de 4 bits, en el


siguiente apartado.

Prueba y Simulacin del Microprocesador de 4bits

Para la prueba y simulacin del Microprocesador bastar que se dicten 5


instrucciones distintas para que ste las ejecute, para ello se describe nuevamente
cada una de las instrucciones y sus caractersticas en la tabla de abajo:

Instruccin Ciclos de Nibbles Cdigo de Descripcin


reloj Requeridos operacin
A + B A 6 1 0000 Suma los acumuladores y guarda el
resultado en A.
A - B A 5 1 0001 Resta los acumuladores y guarda el
resultado en A
A and B A 5 1 0010 AND lgica entre acumuladores y
guarda el resultado en A.
A or B A 5 1 0011 OR lgica entre acumuladores y
guarda el resultado en A.
not A A 5 1 0100 Invierte A y guarda el resultado en
A.
A xor B A 5 1 0101 XOR lgica entre acumuladores y
guarda el resultado en A.
MIX 7 3 0110 Carga el ndice con la direccin de
memoria inmediata.
Instruccin Ciclos de Nibbles Cdigo de Descripcin
reloj Requeridos operacin
MA 5 2 0111 Carga el acumulador A con el valor
inmediato.

75
M B 5 2 1000 Carga el acumulador B con el valor
inmediato.
AM 4 1 1001 Almacena el contenido de A en la
direccin del ndice.
X+1 X 3 1 1010 Incrementa en una unidad el valor del
registro ndice.
C = "1" 6 2 1011 Salta si C = '1'.
Z = "1" 6 2 1100 Salta si Z = 1.

N = "1" 6 2 1101 Salta si N = 1.


V = "1" 6 2 1110 Salta si V = '1'.
PILA-- PCout 3 1 1111 Regresa de una interrupcin.
Tabla 2. Tabla de instrucciones del microprocesador

Primera instruccin X+1 X

Esta instruccin corresponde a la accin de incrementar una unidad el valor del


registro ndice (ix), y de acuerdo a la tabla, se llevar a cabo en 3 ciclos de reloj
(clk).

Observe el resultado de simulacin de la primera instruccin en el Microprocesador.


(Figura 23):

Figura 23. Resultado de Simulacin de la primera instruccin para el Microprocesador; X+1 X

El inicio de la instruccin comienza en el tiempo cuando a datout le asignamos


el valor 1010 correspondiente a la instruccin de incrementar el valor de ix en una
unidad.

76
Se puede observar cmo las seales vma y rw cambian su estado, de acuerdo a lo
establecido en los estados planteados en la unidad de control (vase pg. 101).

El valor de cs tambin cambia, ste ltimo, indica a pcout y la direccin que se


incrementen; Por ltimo, en el instante de subida del tercer ciclo de reloj (clk), el
valor del registro ndice ix se incrementa una unidad de 00000000 a 00000001.
Corresponde correctamente a la ejecucin de la instruccin.

Segunda instruccin MA

Esta instruccin corresponde a la accin de cargar el acumulador a con el valor


inmediato, y de acuerdo a la tabla, consumir 5 ciclos de reloj (clk).

Observe el resultado de simulacin de la segunda instruccin en el


Microprocesador. (Figura 24):

Figura 24. Resultado de Simulacin de la segunda instruccin para el Microprocesador; M A

El inicio de la instruccin comienza en el tiempo , cuando a datout le asignamos


el valor 0111 correspondiente a la instruccin de cargar el acumulador a con el
valor inmediato.

Se puede observar cmo el valor de la direccin se incrementa conforme al valor


de pcout tambin lo hace.

En el momento del quinto ciclo de reloj, (instante ) el acumulador a se ha cargado


con valor el valor inmediato, es decir, el valor presente, en ese instante, en la
entrada datout, en este caso he decidido que el valor sea el mismo que el de

77
la instruccin 0111, aunque pudiera haberse cargado otro valor un ciclo de reloj
anterior al de la ejecucin de la instruccin.

Tercera instruccin MB

Esta instruccin corresponde a la accin de cargar el acumulador b con el valor


inmediato, y de acuerdo a la tabla, consumir 5 ciclos de reloj (clk).

Observe el resultado de simulacin de la tercera instruccin, simular a la anterior


instruccin, en el Microprocesador. (Figura 25):

Figura 25. Resultado de Simulacin de la tercera instruccin para el Microprocesador; M B

El inicio de la instruccin comienza en el tiempo , cuando a datout le asignamos


el valor 1000 correspondiente a la instruccin de cargar el acumulador b con el
valor inmediato.

En el momento del quinto ciclo de reloj, a partir del inicio de la instruccin, (instante
) el acumulador b se ha cargado con valor el valor inmediato, es decir, el valor
presente, en ese instante, en la entrada datout, que corresponde al valor 1000.

Hasta este momento, hemos cargado los acumuladores a y b con los valores 0111
y 1000 respectivamente. Para la siguiente instruccin se har una suma aritmtica
entre los acumuladores y el resultado de la operacin se cargar al acumulador a.

78
Cuarta instruccin A + B A

Esta instruccin corresponde a la accin de Sumar los acumuladores a y b y


guardar el resultado en el acumulador a, y de acuerdo a la tabla, tomar 6 ciclos de
reloj (clk).

Observe el resultado de simulacin de esta instruccin, en el Microprocesador.


(Figura 26):

Figura 26. Resultado de Simulacin de la cuarta instruccin para el Microprocesador; A+B A

El inicio de la instruccin comienza en el tiempo , cuando a datout le asignamos


el valor 0000 correspondiente a la instruccin de sumar acumuladores y cargar el
acumulador a con el valor de la operacin resultante.

En el proceso de ejecucin de esta instruccin suceden dos acciones que no haban


ocurrido con anterioridad, como se puede ver, la variable operacin ahora ha
adquirido el valor de la suma resultante entre los acumuladores. Y la variable rc ha
cambiado en los bits 1 y 2 al valor 1 y 0 respectivamente.

En el momento del sexto ciclo de reloj, a partir del inicio de la instruccin, (instante)
el acumulador a se ha cargado con el resultado de la operacin aritmtica suma, de
los acumuladores, es decir, el valor presente en ese instante, en el acumulador a,
cambia a 1111, este mismo valor corresponde a lo que se encuentra en la
operacin.

79
Quinta instruccin PILA Pcout

Esta instruccin corresponde a la accin de regresar de una interrupcin, de


acuerdo a la tabla, este proceso tomar 3 ciclos de reloj (clk).

Para llevar a cabo esta instruccin, antes, se har uso de una interrupcin, es decir,
el valor de la seal de entrada irq tendr que ser 01 o 10. Para despus hacer el
uso de la instruccin de regreso de interrupcin.

Observe el resultado de simulacin de la quinta instruccin en el Microprocesador.


(Figura 27):

Figura 27. Resultado de Simulacin de la quinta instruccin para el Microprocesador; PILA Pcout

Tmese en cuenta desde el instante de tiempo, a irq se le ha asignado el valor


01, significa que hay una interrupcin y el microprocesador tendr que atender esa
peticin, para esto, en el instante de tiempo, se hace uso de la pila, esta ltima se
carga con el valor que hasta ese momento se encuentra en pcout, este es
00000111. Una vez cargada la ltima direccin en la pila podemos ya hacer uso
de la instruccin de regreso de interrupcin.

La instruccin de regreso de interrupcin (datout = 1111) comienza en el instante


de tiempo; Como se puede observar en la simulacin, el valor de pcout ha
cambiado al valor 10000000 que corresponde a la atencin de peticin de
interrupcin.

80
En el instante de tiempo, ya han transcurrido 3 ciclos de reloj a partir de la instruccin
de retorno de interrupcin, En ese momento se le asigna a pcout el valor que hay
en la pila, el valor podemos notarlo en la simulacin 00000111.

La instruccin de regreso de interrupcin se ha llevado a cabo fielmente.

Prueba y Simulacin de un programa cargado en la memoria RAM

Hasta este momento, se ha revisado el funcionamiento del microprocesador en cada


uno de sus bloques individuales, tambin se ha simulado al microprocesador en su
totalidad, proponiendo una serie de instrucciones, las cuales se han dictado al
Microprocesador de manera manual, es decir, se ha introducido uno por uno, cada
valor (binario) que representa a la instruccin.

Para este apartado se hace uso de la memoria RAM que se ha integrado como uno
ms de los bloques del microprocesador, con la finalidad de demostrar el correcto
funcionamiento del mismo; mediante el cdigo del programa de la memoria RAM,
se establecern, en su arquitectura, los datos e instrucciones necesarios para que
el Microprocesador lea y ejecute dicho programa.

Como se mencion con anterioridad, la RAM consta de 256 localidades, y cada


localidad tiene un ancho de datos de 4bits (1 nibble). El programa que se debe
cargar en la Memoria RAM se muestra en la Tabla 3, y ocupa 14 localidades A0-
A13.

Direcciones Datos Descripcin


A0 0111 MA Carga el acumulador A con el valor inmediato.
A1 0101 Dato: 516
A2 1000 MB Carga el acumulador B con el valor inmediato.
A3 0110 Dato: 616
A4 0010 A and B A Compuerta AND entre acumuladores y resultado en A.
A5 0100 not A A Invierte el contenido del acumulador A y resultado en A.
A6 0001 A - B A Resta Aritmtica entre acumuladores y resultado en A.
A7 1000 MB Carga el acumulador B con el valor inmediato.
A8 1010 Dato: A16
A9 0101 A xor B A Compuerta XOR entre acumuladores y resultado en A.

0110 MIX Carga la direccin del ndice con el dato inmediato de la


memoria
0000 Dato: 016 Valor bajo IX3- IX0
0010 Dato: 216 Valor alto IX7- IX4 IX= 0010 0000 = 3210
1001 AM Almacena el contenido de A en la memoria, en la direccin
que tiene el ndice.
Tabla 3. Programa a cargar en la memoria RAM

81
Ahora se muestra el cdigo en VHDL de la Memoria RAM, basta con modificar el
cdigo original escribiendo las lneas que declaran los valores binarios que
representan las instrucciones y los datos necesarios para que el Microprocesador
pueda leerlos, interpretarlos y, en su caso, ejecutarlos.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.std_logic_unsigned.all;

entity RAM_256X4b is
Port ( direccion : in STD_LOGIC_VECTOR (7 downto 0);
vma : in STD_LOGIC;
rw : in STD_LOGIC;
clk : in STD_LOGIC;
datout : inout STD_LOGIC_VECTOR (3 downto 0));
end RAM_256X4b;

architecture Behavioral of RAM_256X4b is


type ram_table is array (0 to 255) of std_logic_vector(3 downto 0);
signal rammemory: ram_table;
begin

process(rw, vma, clk, direccion)


variable dato: std_logic_vector (3 downto 0);
begin

dato:= datout;

--escritura

if (clk' event and clk = '1') then


if vma = '1' then
if rw = '0' then
rammemory(conv_integer(direccion))<= dato;
end if;
end if;
end if;

--lectura

if (clk' event and clk = '0') then


if vma = '1' then
if rw = '1' then
datout <= rammemory(conv_integer(direccion));
else datout <= "ZZZZ";
end if;
end if;
end if;

82
rammemory (0)<="0111";
rammemory (1)<="0101";
rammemory (2)<="1000";
rammemory (3)<="0110";
rammemory (4)<="0010";
rammemory (5)<="0100";
rammemory (6)<="0001";
rammemory (7)<="1000";
rammemory (8)<="1010";
rammemory (9)<="0101";
rammemory (10)<="0110";
rammemory (11)<="0000";
rammemory (12)<="0010";
rammemory (13)<="1001";

end process;
end Behavioral;

Cdigo 15. Memoria RAM y programa cargado.

Simulacin del Microprocesador y ejecucin del programa

En la Figura 28 se muestran las capturas de pantalla del Simulador, y se describen


de manera especfica cada una de las acciones que se llevan a cabo internamente
en el Microprocesador; los valores que van tomando los acumuladores, el resultado
de la operacin, la direccin, y el valor de la seal de lectura-escritura (rw)
principalmente.

Figura 28. Simulacin del Microprocesador (captura 1).

83
Como puede observarse en la Figura 28, el Microprocesador ejecuta la primera
instruccin 0111, que consiste en asignar un valor al acumulador a (seal azul
rey); desde el instante de , la direccin se establece en 00000000, esta es la
primera localidad de la memoria RAM en la que leer dicha instruccin, ntense los
valores que se han asignado a las localidades de la memoria RAM (rammemory)
desde la programacin de su cdigo vhdl.

Al trmino del instante de tiempo , el Microprocesador ha asignado al acumulador


a, el valor 0101 que corresponde al valor 5 hexadecimal (5 16), las seales rw (en
blanco) y vma (rojo) han adquirido el valor lgico 1 en 2 ocasiones, esto es porque
para la primera se ley la instruccin, misma que corresponde a la carga de un dato
al acumulador a, y para la segunda se ley el dato contenido en la direccin
00000001, y como podemos ver pcout y direccin se han incrementado en una
unidad.

Figura 29. Simulacin del Microprocesador (captura 2).

En la Figura 29, vemos que la direccin ha cambiado a 00000010, el dato


contenido en la memoria RAM en esa localidad es 1000 que es la instruccin de
cargar un valor en el acumulador b.

Despus de 5 ciclos de reloj, el acumulador b (seal en azul claro) ha tomado el


valor 0110 que corresponde al valor 6 hexadecimal (616).

84
Figura 30. Simulacin del Microprocesador (captura 3).

En la Figura 30, se puede observar que el microprocesador lee el dato 0010, en


el instante de tiempo, que corresponde al contenido de la direccin 00000100; Ese
dato es una instruccin, sta ltima realiza una compuerta lgica AND entre
acumuladores y deja el resultado en el acumulador a.

En el tiempo, la seal operacin ha adquirido el valor 0100, valor 4 hexadecimal


(416), y se comprueba el resultado de la compuerta lgica AND entre los
acumuladores a y b: 0101 y 0110 respectivamente. Hacia el tiempo , el
acumulador a, ya ha tomado el valor del resultado de la operacin, mientras tanto
pcout y direccin se incrementan 1 unidad para leer la siguiente instruccin.

Figura 31. Simulacin del Microprocesador (captura 4).

85
En la Figura 31, se puede ver que el microprocesador lee la siguiente
direccin de la memoria, el dato ledo es 0100, de acuerdo a la tabla de
instrucciones, sta corresponde a la accin de invertir el contenido de a y depositar
el resultado en el mismo acumulador.

Al cabo del instante de tiempo , El acumulador a, ha tomado el valor 1011, valor


B hexadecimal (B16) que claramente es el resultado de invertir el valor 0100.
Nuevamente la direccin se ha aumentado una unidad para leer la siguiente
instruccin.

Figura 32. Simulacin del Microprocesador (captura 5).

En la Figura 32, se observa que el microprocesador lee la siguiente direccin


de la memoria 00000110, el dato ledo es 0001, de acuerdo a la tabla de
instrucciones, sta corresponde a la resta aritmtica entre los acumuladores; a-b, el
resultado de dicha operacin se almacenar nuevamente en el acumulador a.

En el tiempo , la seal operacin ha adquirido el valor 0101, valor 5 hexadecimal


(516), y se comprueba el resultado de la operacin aritmtica a-b entre los
acumuladores a y b: 1011 (B16) y 0110 (616) respectivamente. Hacia el tiempo
26us, el acumulador a, ya ha tomado el valor del resultado de la operacin, mientras
tanto pcout y direccin se incrementan 1 unidad para leer la siguiente instruccin.

86
Figura 33. Simulacin del Microprocesador (captura 6).

En la Figura 33, se puede notar que la direccin ha cambiado a 00000111,


el dato contenido en la memoria RAM en esa localidad es 1000 que corresponde
a la instruccin de cargar un valor en el acumulador b.

Hasta el instante de tiempo , el acumulador b (seal en azul claro) ha tomado el


valor 1010 que corresponde al valor A hexadecimal (A 16). Pcout y direccin se
incrementan 1 unidad y el Microprocesador se prepara para leer la siguiente
instruccin

87
Figura 34. Simulacin del Microprocesador (captura 7).

En la Figura 34, se puede observar que el microprocesador lee el dato


0010, en el instante de tiempo (seal color prpura), que corresponde al contenido
de la direccin 00001001; Ese dato es una instruccin, sta ltima realiza una
compuerta lgica XOR entre acumuladores, dejando el resultado en el acumulador
a.

En el tiempo la seal operacin adquiere el valor 1111, valor F hexadecimal


(F16), y se comprueba el resultado de la compuerta lgica XOR entre los
acumuladores a y b: 0101 y 1010 respectivamente. En el tiempo el acumulador
a, ya ha tomado el valor del resultado de la operacin, mientras tanto pcout y
direccin se incrementan 1 unidad para nuevamente leer la siguiente instruccin.

Hasta este punto el Microprocesador slo ha ledo datos de la memoria RAM,


as como instrucciones, mismas que se han ejecutado de manera precisa. Para lo
siguiente se pretende ya no leer, sino ahora escribir un dato en la memoria con el
fin de comprobar la accin, as como de lectura, de escritura de datos
Microprocesador.

Para ello, primero se dicta la instruccin de cargar al registro ndice (ix) la direccin
de la memoria RAM en la que queramos se escriba el dato, y posteriormente la
instruccin de escribir el dato a esa direccin o localidad, (contenida en el ndice),
en la memoria RAM.

88
Figura 35. Simulacin del Microprocesador (captura 8).

En la Figura 35, se puede observar que la siguiente direccin que el micro


lee, es 00001010, el dato contenido en esa localidad de la Memoria RAM 0110
pertenece a la instruccin de cargar el registro ndice (ix) con el dato inmediato
contenido en la memoria, en consecuencia, se puede deducir que para realizar esta
accin es necesario introducir por separado 2 datos que sealarn el valor del
registro ndice, puesto que este ltimo es de 8bits, pero el bus de datos es slo de
4 bits.

El primer dato despus de la instruccin, pasar a ser la parte baja del valor del
ndice, como se aprecia en la imagen, en el instante , se dicta el valor 0000,
seguido de ello, en el instante , se introduce el segundo dato 0010 quien se
asignar a la parte alta del valor del registro ndice.

A partir del instante de tiempo , el valor contenido en el registro ndice ix (seal


en color amarillo), ha cambiado satisfactoriamente a 00100000, este valor
representa a la direccin 32 (decimal). Es en esa direccin que se pretende se
escriba el dato a la memoria RAM en la siguiente instruccin.

89
Figura 36. Simulacin del Microprocesador (captura 9).

La siguiente direccin que el Microprocesador lee en la memoria es


00001101, como puede apreciarse en la Figura 36, sta direccin contiene la
siguiente instruccin 1001, que pertenece a la accin de escribir el contenido del
acumulador a, en la direccin de la memoria RAM que contiene el registro ndice ix.

Ntese que en el instante , la direccin es asignada con el valor que contiene


el registro ndice ix 00100000, es en ese mismo momento que la seal vma (en
rojo) cambia al valor lgico 1, lo que habilita la escritura a la memoria RAM en esa
direccin sealada. Al mismo tiempo el valor presente en el bus de datos datout
(seal prpura), es colocado el contenido del acumulador a, el valor es 1111, valor
F hexadecimal (F16).

Finalmente, como se puede comprobar en la Figura 37, para el instante de tiempo


, se ha escrito en la direccin 00100000 32 (decimal), de la memoria RAM el
dato 1111 (F16), que contena y/o contiene el acumulador a.

90
Figura 37. Simulacin del Microprocesador (captura 10).

En lo que refiere a la parte de presentacin de los resultados de la simulacin


del Microprocesador de 4bits, programado con el lenguaje de programacin VHDL,
puede resumirse y concluir que el Microprocesador trabaja de manera correcta y
satisfactoria con lo establecido al inicio del proyecto.

91
CONCLUSIONES Y RECOMENDACIONES

El diseo de un microprocesador de 4 bits ha concluido de manera


satisfactoria. Se comprob, no slo mediante simulacin sino tambin mediante
implementacin, en la tarjeta de DIGILENT, la FPGA Basys 2 (vase Anexo D),
el correcto funcionamiento de este sistema; diseado y programado en el
software de programacin de alto nivel VHDL ISE Design Suite 14.1 de la
empresa Xilinix.

La relativa facilidad y amplio alcance de diseo de sistemas digitales con


VHDL, hace, del desarrollo de proyectos de diseo y de prcticas, una tarea muy
productiva e incluso remunerable para aquel quien comience con el desarrollo e
integracin de sistemas electrnicos a travs de este lenguaje, si tiene la visin
y oportunidad de crecer como microempresario en el desarrollo de sistemas.

En cuanto al lenguaje, el diseo estructural con VHDL permite conectar


mdulos pre-programados con gran facilidad. Se ha comprobado tambin la
flexibilidad de las herramientas que integran al lenguaje VHDL, como lo es el uso
de las libreras y los paquetes que las conforman. As mismo de la facilidad y
comodidad que resulta al crear propias libreras y agregar a ellas los paquetes o
elementos que contengan las tareas y aplicaciones que nosotros deseemos.
VHDL es ptimo para el desarrollo cualquier tipo de sistema digital a pequea o
grande escala, es decir, permite la descripcin de sistemas electrnicos digitales
a cualquier nivel de abstraccin, esto es, enfatizando el objeto de la tarea.

Al modelar al sistema independientemente del hardware, puede ser


sintetizado y realizado, remodelado y reprogramado mediante diferentes
soluciones con muy poco esfuerzo. Esto quiere decir que tambin implica que el
diseo sea reutilizable y re-moldeable.

VHDL proporciona un interfaz comn, entendible y cmoda para todos los


usuarios (estudiantes, ingenieros, maestros, ect.) involucrados en el proceso de
diseo

La posibilidad del uso de herramientas de sntesis automticas, como en


el caso del software de programacin ISE Design Suite y su herramienta check
syntax, permite al diseador enfocarse ms en los aspectos de la arquitectura,
que en la estructura de sntesis de la misma.

92
En VHDL La probabilidad de error se reduce considerablemente, as como
el tiempo de diseo y el esfuerzo dedicado. Todo ello redunda en una mejora de
la calidad y tiempo de puesta.

Es recomendable para el usuario de lenguaje de Programacin VHDL, no


valerse por completo de la herramienta de sntesis automtica, ya que hasta el
da de hoy, no son el 100 por ciento ptimas en cuanto a la realizacin de su
funcin.

La Herramienta de Simulacin del Sotftware ISE Design Suite llamada


ISim, es del todo entendible a la hora de manejarla, al configurar entradas y
asignar las salidas, mediante los resultados establecidos en el cdigo
programado en ISE. Su comodidad, claridad y facilidad de uso resultan
evidentes.

En tiempos actuales, el diseo de microprocesadores, cada vez de mayor


capacidad, menor coste y menor consumo de energa, se ha extendido tanto que
resulta increble imaginar los lmites de diseo y construccin. El presente trabajo
aqu concluido, ha permitido profundizar los conocimientos necesarios para
comprender el diseo, la construccin, estructura y funcionamiento de estos
sistemas, actualmente, los de mayor importancia en el desarrollo de nuevas
tecnologas en todos los campos de la electrnica.

La implementacin de este microprocesador en una FPGA y la verificacin


de su funcionamiento correcto, han permitido sentar las bases parar trabajar en
microprocesadores con otras arquitecturas.

93
REFERENCIAS BIBLIOGRFICAS

1
David G. Maxinez-Jessica Alcal: VHDL El arte de programar sistemas digitales.
CECSA, abril del 2002.

2
Machado Snchez Felipe- Borromeo Lpez Susana: Diseo de circuitos
digitales con VHDL. Versin 1.01 creada el 20 de julio de 2010

3
Maxinez David G., Alcal Jessica: Diseo de Sistemas Embebidos a travs del
Lenguaje de Descripcin en Hardware VHDL. XIX Congreso Internacional
Acadmico de Ingeniera Electrnica. Mxico, 1997.
4
Notas del Curso: Diseo Digital en VHDL del Dr. Oscar L. Prez Castaeda.

5
Ing. Evaristo Gonzlez Milans: Introduccin a los microprocesadores.
Universidad de Matanzas, Diciembre 2003.

5
http://www.mexchip.com/2010/12/curso-vhdl-diseno-estructural/

7 www.xilinx.com/support/documentation/data_sheets/ds312.pdf

8 www.ladelec.com/teoria/electronica-digital/210-memorias-la-memoria-ram

94
ANEXO A
Manejo del Lenguaje de Programacin VHDL en el entorno
Galaxy del software Warp 6.3 de Cypress

Para introducirnos al entorno de programacin VHDL de utiliz primeramente la


herramienta de programacin y compilacin Galaxy del software Warp Versin 6.3
de la empresa Cypress Semiconductor.

En esta base del lenguaje de programacin en VHDL se realizaron prcticas bsicas


de circuitos lgicos de tipo combinacional y secuencial.

Creacin de un proyecto con Warp 6.3

Con la finalidad de ilustrar la manera de editar y agregar un archivo VHDL a un


proyecto realizado en Galaxy, se programar un sumador de 2 bits con acarreo
(carry) de entrada y de salida. A continuacin se muestra en la figura 38, el
diagrama a bloques del sumador completo de dos bits, al cual llamaremos Full
Adder.

Figura 38. Diagrama a bloques del sumador completo

A continuacin se muestra el cdigo VHDL para el sumador. Hay que editarlo en el


NOTEPAD y guardar este archivo con el nombre Full_Adder.vhd. No olvide darle la
extensin .vhd. Si lo deja con la extensin .txt de los archivos NOTEPAD, Galaxy
no lo reconocer como archivo vhd.

95
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY Full_Adder IS PORT (
a,b,Cin : IN std_logic;
Suma, Cout : OUT std_logic);
END Full_Adder;
ARCHITECTURE arq_Full_Adder OF Full_Adder IS
BEGIN
Suma <= A XOR B XOR Cin;
Cout <= ((A AND B) OR (A AND Cin)) OR (B AND Cin);
END arq_ Full_Adder;
Cdigo 16. Cdigo VHDL para el sumador completo.

Ahora se debe crear una carpeta llamada Full_Adder dentro de la carpeta examples,
la cual se encuentra dentro de la carpeta Warp dentro de Cypress en la carpeta
Program Files (C:\ProgramFiles\Cypress\Warp\examples\Full_Adder) y dentro de
ella copiar el archivo Full_adder.vhd que se acaba de crear.

Una vez realizado lo anterior, comenzamos ya, a trabajar directamente con Warp.
Para lo cual realizamos lo siguiente:

1. Lanzar la aplicacin de Warp 6.3, Galaxy. En Windows vamos a Inicio, hacer clic
sobre botn izquierdo del mouse, en Todos los Programas, buscar Cypress,
despus Warp 6.3 y hacer clic sobre la aplicacin Galaxy.

2. Ubicar el apuntador del mouse sobre File en la parte superior izquierda de


Galaxy. Hacer clic con el botn izquierdo del mouse sobre New. Aparecer la
ventana New con tres diferentes opciones:

a) Text File

b) Project (Tarjet - Device)

c) Project (Tarjet - Library)

3. Seleccionar la opcin Project (Tarjet - Device) y despus hacer clic sobre OK.
Entonces aparecer la ventana Project Information. Como se va a trabajar en este
tutorial con un diseo basado en VHDL, entonces hacer lo siguiente:

a) En la opcin Project Type seleccionar VHDL.

b) En Project Name dar el nombre del proyecto, en este caso lo nombraremos:


Full_Adder.

96
c) En la opcin Project Path, especificar la ruta donde se encuentra la carpeta en
la cual se almacenar el proyecto, en nuestro caso es: C:\Program
Files\Cypress\Warp\examples\Full_Adder. La ventana debe ser similar a la
figura 39. Project Information.

Figura 39. Project Information.

4. Hacer clic sobre el botn Next y aparecer la ventana Add Files Project. Esta
ventana muestra dos recuadros. En el primero, Files in the Project directory,
muestra los archivos VHDL que estn en la carpeta proyecto. Seleccionar con el
apuntador del mouse el archivo Full_Adder y seguido de ello hacer clic en el botn
Add. Entonces en el recuadro titulado Files in the Project deber aparecer el
archivo seleccionado. El aspecto de la ventana ser similar al de la Figura 40. Add
Files Project.

97
Figura 40. Ventana Add Files to Project.

5. Hacer clic en el botn Next y aparecer la ventana Select Target Device. Aqu
se debe escoger el dispositivo que se utilizar. Seleccionar el dispositivo
PALCE16V8-15PC de Lattice, que es el que se utilizar para estas prcticas.

A continuacin hacer clic en el botn de Finish. Finalmente aparecer una ventana


preguntando si se desea salvar el nuevo proyecto (Do you want to save the new
Project?) a lo que se responder de manera afirmativa haciendo clic sobre el botn
Yes.

Ahora deber aparecer la ventana de con el proyecto y el archivo de diseo.


Posicionar el apuntador del mouse sobre el archivo Full_Adder.vhd y hacer clic con
el botn izquierdo sobre dicho archivo. Despus, hacer clic con el botn izquierdo
del mouse en Project y seleccionar la opcin Set Top.
Note que el icono del archivo Full_adder.vhd ahora tiene un rectngulo rojo
indicando que este archivo se convierte en el archivo principal.
Dar doble clic sobre el icono del archivo principal (Full_Adder.vhd) y en el recuadro
del lado derecho aparecer el archivo Full_Adder.vhd ya editado.

98
Compilacin del Proyecto

Ir al men Compile de la barra de mens, hacer clic con el botn izquierdo y


seleccionar la opcin Project, haciendo clic con el botn izquierdo del mouse. Si no
se tiene error alguno en la sintaxis del archivo, se ver una ventana similar a la de
la figura 41 del proyecto.

Figura 41. Ventana Compilacin del sumador completo. Full_Adder

En caso de existir algn error o advertencia (Warning), estos sern mostrados en


la parte inferior de la ventana, en la pestaa de errores. En tal caso se deben
identificar los errores, corregirlos y compilar de nuevo hasta no tener errores.

Simulacin con la herramienta Active-HDL Simule

Seguido de una compilacin sin errores, el siguiente paso es la simulacin.


Para ello hay que seleccionar, haciendo clic con el botn izquierdo, la opcin
Active-HDL Simule del men Tools en la barra de mens (parte superior). En ese
momento se lanzar la aplicacin Active-HDL Simule, la cual lleva a cabo la
simulacin de un proyecto compuesto de archivos VHDL o Verilog.

Estando abierta dicha aplicacin, hay que habilitar el men File en la barra de
herramientas en la parte superior izquierda. Hacer clic con el botn izquierdo del
mouse sobre Open VHDL y seleccionar el archivo Full_Adder.vhd que se desea

99
simular. Automticamente iniciar un proceso de enlace y compilacin del mismo,
generando una ventana similar a la de la figura 42. Simulacin.

Figura 42. Simulacin en Active HDL Sim.

Una vez realizado este proceso, seleccionar la opcin Add Signals, del men
WaveForms, y aparecer una ventana parecida a la de la figura 43 Add_Signals.
Esta ventana se divide en dos columnas. La columna de la derecha muestra las
diferentes libreras o bibliotecas utilizadas en el diseo y la columna de la derecha
muestra las diferentes entradas y salidas del diseo. Identificar las entradas del
diseo, que en este caso son: a, b y Cin; y las salidas son: Cout y Suma.

Figura 43. Add Signals.

100
Hacer doble clic con el botn izquierdo del mouse en cada una de las seales de
entrada y salida del diseo (a, b, Cin, Cout y Suma) y finalmente hacer clic sobre
el botn Add ubicado en la parte inferior central.
El aspecto de la ventana de Active-HDL Sim deber ser similar a la figura 44.
Signals_addeds.

Figura 44. Signals Added.

A continuacin hay que agregar los valores a cada una de las seales de entrada.
Para ello, hay que situar el cursor del mouse sobre alguna de las seales de entrada,
digamos la seal de entrada a, y presionar ahora botn derecho del mouse y
aparecer una pequea ventana con diferentes opciones, seleccionar con el botn
izquierdo del mouse la de Stimulators. Esta accin generar la ventana
Stimulators. Seleccionar dentro de esta ventana la seal a, seguido de ello ir a la
seccin Stimulator Type y escoger el modo formula.

Dentro del recuadro de Enter formula introducir lo siguiente: 0 0 ns, 1 20 ns, 0 40


ns, 1 60 ns. Hacer clic sobre al botn Apply y notar que la entrada a en el recuadro
de la izquierda ahora est marcada.
La sintaxis utilizada es <valor> <tiempo>, <valor> <tiempo>. Donde el parmetro
valor indica el valor deseado tenga la seal. Y el parmetro tiempo indica el
intervalo de tiempo que se desea tenga la seal. La , es slo para separar
diferentes valores. As que, en este caso, los valores dados son 0 en 0 nano
segundos, 1 durante 20 nano segundos, de nuevo 0 a partir de 40 nano segundos
etc.
Para la entraba b, realizar un proceso similar al de la entrada a pero con los valores:
0 0 ns, 1 20 ns, 1 40 ns, 1 60 ns.

101
Para la entada Cin, en el recuadro Stimulator type, seleccionar la opcin Value y
en el recuadro Force value seleccionar 0. Finalmente hacer clic sobre el botn
Apply. La ventana Stimulators deber ser similar a la figura 45. Stimulators.
Finalmente, hacer clic con el botn izquierdo del mouse sobre el botn Close.

Figura 45. Stimulators.

Finalmente, procedemos a iniciar la simulacin, haciendo click en la opcin Initialize


Simulation dentro del men Simulation, o en el botn Run que se encuentra en la
barra de herramientas. Se mostrar el resultado de la simulacin, tendr que ser
similar similar al de la figura 46. Initialize simulation.

Figura 46. Initialize simulation

102
Obsrvese en la figura 45. Como finalmente las salidas Cout y suma, obedecen
de acuerdo a la tabla de verdad del sumador completo, Tabla 4. Tabla de verdad
del sumador completo.

Tabla 4. Tabla de verdad Sumador Completo.

A continuacin se crearn y simularn, de la misma forma que como la prctica


anterior, los circuitos lgicos combinacionales y secuenciales paridad par,
multiplexor, contador ascendente y descendente y un decodificador de 7
segmentos.
En las siguientes capturas se muestran los cdigos de dichos programas creados
en Warp.

Figura 47. Cdigo en VHDL del generador de paridad.

103
Figura 48. Cdigo en VHDL del multiplexor de 4 bits.

Figura 49. Cdigo en VHDL de un contador ascendente de 3 bits.

104
Figura 50. Cdigo en VHDL de un decodificador de 7 segmentos.

Con las actividades detalladas con anterioridad, se concluye con las actividades
correspondientes al manejo y familiarizacin del lenguaje de programacin VHDL
en el entorno de programacin Galaxy, del software Warp 6.3 de la familia de
Cypress.

105
ANEXO B
Instalacin y Manejo del Software ISE Design Suite 14.1; Realizacin
de prcticas que prueben el manejo del entorno ISE Design Suite

Instalacin

La empresa desarrolladora de la tecnologa de los FPGAs y CPLDs, Xilinx, ofrece en


su pgina de internet http://www.xilinx.com/ una licencia gratuita de su entorno de
desarrollo y diseo para sus dispositivos reconfigurables, la versin gratuita se conoce
como Webpack, en ltimas versiones no se trata de un software separado del principal
sino de una licencia de uso especial para el mismo.
A continuacin se indican los pasos necesarios para descargar el software y obtener
la licencia gratuita

1- Ingresar y registrarse en el sitio web de Xilinx: www.xilinx.com. Al ingresar al sitio,


en el men de la parte superior se tiene la opcin Sign In, que permite ingresar
con una cuenta creada con anterioridad o registrarse con una nueva mediante el
enlace Create Account.

Figura 51. Pgina Oficial de XILINIX

Para el registro se deben proporcionar los datos personales tales como


nombre, direccin y correo electrnico.

2- Una vez registrados en el sitio, se puede acceder a la seccin de descargas,


puede hacerse desde el enlace Downloads en la parte superior del sitio.

106
El software que nos interesa se llama ISE Design Suite, en la pgina se
puede seleccionar la versin a descargar as como el sistema operativo con
el cual trabajaremos: hay tres opciones de descarga, instalador para
Windows, instalador para Linux o los binarios. La versin ms reciente del
software y la utilizada en este documento es la 14.1.

3- La descarga no es directa, sino que al hacer clic en alguno de los enlaces se


instala el administrador de descargas de Xilinx, es necesario permitir la
ejecucin del mismo, el cual permitir pausar y continuar la descarga de los
archivos, algo bastante til ya que el software pesa 5.67 GB.

4- Una vez descargado el software, es necesario obtener una licencia de uso, se


utilizar la licencia Webpack que es gratuita, como se ha expuesto
anteriormente la principal diferencia con la versin de pago es que soporta
menos dispositivos, por lo tanto para el desarrollo de proyectos de mayor
volumen no ser de utilidad. En la misma pgina de descargas, a la derecha
de los enlaces para descargar ISE Design Suite se encuentra el enlace
License Solution Center

Figura 52. Seccin de descargas de XILINIX

5- Una vez adquirido el software ISE Design Suite 14.1 y la Licencia,


procedemos a instalarlo; basta con seguir los sencillos pasos y ubicar el
directorio de la licencia.

Con esto se tiene instalado el software necesario para la programacin y


simulacin de los componentes que se realizarn a lo largo del proyecto.

107
Manejo del software

Para explicar el manejo del software ISE Design Suite 14.1, as como las bases del
lenguaje de programacin VHDL, se desarrollarn a continuacin una serie de
programas sencillos que servirn de gua a travs de la creacin y simulacin del
proyecto.

Creacin de un proyecto

Nombre, tipo de proyecto y Configuraciones de dispositivo

Iniciaremos por compuertas lgicas AND, OR y XOR, estas mismas sern utilizadas
para crear un medio sumador y a su vez un sumador completo.

Iniciamos lanzando la aplicacin ISE Project Navigator. Creamos un nuevo


proyecto, para ello se selecciona el men File y despus New Project, con esto se
iniciar el asistente de creacin de nuevo proyecto, en la primera ventana que se
muestra (figura 53. Creacin de un nuevo proyecto) habr que indicar el nombre
del proyecto, la carpeta de trabajo del proyecto (al introducir el nombre del proyecto
se indicar automticamente una carpeta con el mismo nombre), una descripcin
del proyecto (opcional) y en la parte inferior se tiene que indicar el tipo de archivo
fuente que ser el mdulo principal del proyecto, se deja en HDL.

Figura 53. Creacin de un nuevo proyecto

108
A continuacin se da clic en el botn Next, lo cual mostrar la ventana Project
Settings, donde se indica el modelo del dispositivo utilizado en el proyecto, adems
de las herramientas a utilizar para las diferentes etapas del diseo. Para este caso
y por razones de conveniencia, elegiremos como dispositivo la Tarjeta Basys2, las
configuraciones para este dispositivo son mostradas en la Figura 54. Opciones de
configuracin de la tarjeta Basys2.

Figura 54. Opciones de configuracin para la tarjeta Basys2.

Ya indicadas las opciones adecuadas, se hace clic en el botn Next, se mostrar


un resumen del proyecto, finalmente se da clic en el botn Finish y se crear el
proyecto nuevo, todava sin ningn archivo fuente agregado, solamente se ver el
nombre del archivo de proyecto en la parte superior y en la ventana Hierarchy
dentro del panel Design el dispositivo seleccionado.

109
Ahora se procede a agregar un nuevo archivo fuente al proyecto, esto se realizar
utilizando el men Project => New Source, con lo que aparecer una ventana
donde se debe indicar el tipo de mdulo que se desea agregar al proyecto, se
selecciona VHDL Module y como nombre del programa compuerta_and. Es
importante que est seleccionada la opcin Add to Project, tal como en la figura
55. New source wizard.

Figura 55. New source wizard.

Despus se da clic en el botn Next, inmediatamente se mostrar la ventana Define


Module, Figura 56. Aqu se deben indicar las caractersticas del mdulo; el nombre
de la entidad, el nombre de la arquitectura y las entradas y salidas con las que
contar. Se debe tener algo como lo mostrado en la Figura 56.

110
Figura 56. Ventana Define Module

A continuacin se da clic en el botn Next, con lo que se mostrar un resumen del


nuevo archivo fuente que se ha agregado al proyecto. Por ltimo se da clic en el
botn Finish para que se agregue la nueva fuente al proyecto, se abrir la ventana
del editor donde se cargar el contenido del nuevo archivo compuerta_and.vhd (el
nombre indicado para el nuevo archivo fuente con la extensin .vhd que
corresponde a un mdulo VHDL)

Analice el cdigo que se presenta al terminar de crear la nueva fuente del proyecto;
la primera seccin (Ver Cdigo 17. Cdigo predefinido por ISE) que se aprecia
con dos guiones al inicio, es cdigo predefinido que ISE Project Navigator inserta
al inicio de cada mdulo que se agrega a un proyecto, se puede notar que todas las
lneas en esta primera seccin inician con un par de guiones : al igual que en los
lenguajes de programacin de software, VHDL permite insertar comentarios en el
cdigo, los cuales se indican mediante esos dos guiones, todo el texto que siga a
estos guiones se toma como un comentario.

----------------------------------------------------------------------------
------
-- Company:
-- Engineer:
--
-- Create Date: 15:11:22 05/10/2012
-- Design Name:
-- Module Name: compuerta_and - Behavioral
111
-- Project Name:
-- Target Devices:
-- Tool versions:
-- Description:
--
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
---------------------------------------------------------------------------

Cdigo 17. Cdigo predefinido por ISE (Lneas de comentarios)

Para la segunda seccin de ste cdigo predefinido por ISE Design Suite (Cdigo
18. Libreras utilizadas en el proyecto), la instruccin library permite indicar una
biblioteca externa de la cual se desee utilizar sus tipos de datos, operadores y
algunas otras declaraciones; esto podra ser comparable a la instruccin #include
de los lenguajes C y C++. De manera similar a estos lenguajes, VHDL termina cada
instruccin con punto y coma: ;.

Despus se tiene una instruccin use, que permite indicar qu paquete se va a


utilizar de la biblioteca que antes se haba declarado con library. En este caso, se
indica que se va a hacer uso de la biblioteca IEEE, que es una biblioteca estndar
definida por el Institute of Electrical and Electronics Engineers, seguido de use
se tiene STD_LOGIC_1164, lo cual hace referencia al paquete de la biblioteca que
se utilizar y por ltimo se indica que de ese paquete se utilizaran todas sus
declaraciones por medio de la instruccin ALL.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

Cdigo 18. Libreras utilizadas en el proyecto

Entidad y Arquitectura (programacin del cdigo)

En VHDL, cada mdulo est compuesto por dos partes: la entidad y la arquitectura.
La entidad es la seccin donde se indican las conexiones (seales) del mdulo con
el resto de componentes, se indican el nmero de entradas y salidas, adems del
tipo de cada una de ellas. La sintaxis de declaracin de entidad y de sus conexiones
se muestra en el siguiente cdigo.

112
entity NOMBRE_DE_LA_ENTIDAD is
port (
NOMBRE_SEAL1 : MODO TIPO;
NOMBRE_SEAL2 : MODO TIPO
);
end NOMBRE_ENTIDAD;

Cdigo 19. Cdigo de la entidad

En primer lugar se indica el nombre de la entidad, utilizando la palabra reservada


entity, y despus de la instruccin is se inicia la descripcin de la entidad, en este
caso de las seales o puertos mediante los cuales se comunicar con el exterior;
para cada seal se indica su nombre, el modo (entrada, salida o ambos) y el tipo.
Ntese que las declaraciones de puertos finalizan con punto y coma, excepto la
ltima antes del parntesis que culmina la instruccin port.

Ahora, continuando con el mdulo, ISE Project Navigator ha insertado el cdigo


mostrado en el recuadro del Cdigo 20. Entidad_Compuerta AND que es el cdigo
de la declaracin de la entidad:

entity compuerta_and is
Port ( a : in STD_LOGIC;
b : in STD_LOGIC;
s : out STD_LOGIC);
end compuerta_and;

Cdigo 20. Entidad_Compuerta_AND

La entidad cuyo nombre es compuerta_and, tiene tres puertos, todos de tipo


std_logic, los dos primeros denominados a y b, son entradas (in), mientras que el
tercero, denominado s, es una salida (out), el diagrama esquemtico de la entidad
creada se puede representar de la siguiente manera:

Figura 57. Diagrama esquemtico de la compuerta_AND

En la declaracin de la entidad, se describen las entradas y salidas del programa,


pero no su funcionamiento interno, mismo que se describe en la arquitectura.

113
La arquitectura es la seccin de un mdulo VHDL en la que se describe el
funcionamiento de la entidad, y puede hacerse de dos maneras diferentes:
describiendo su estructura interna mediante interconexiones entre compuertas y
componentes que constituyen al mdulo, lo que se denomina una descripcin
estructural, o con una descripcin de lo que hace el mdulo, ya sea mediante
funciones booleanas o mediante una descripcin algortmica, lo que se conoce
como una descripcin de comportamiento. La sintaxis para declarar una arquitectura
es mostrada en el recuadro del Cdigo 21. Arquitectura.

architecture NOMBRE_ARQUITECTURA of NOMBRE_ENTIDAD is

-- Aqu se declaran elementos auxiliares para usar en la descripcin

begin

-- Aqu se realiza la descripcin de la arquitectura,


-- mediante la utilizacin de sentencias secuenciales,
-- combinacionales o subprogramas.

end NOMBRE_ARQUITECTURA;

Cdigo 21. Arquitectura

Como se puede observar se utiliza la instruccin architecture para iniciar la


declaracin de la arquitectura, despus se indica su nombre y el nombre de la
entidad a la cual corresponde la descripcin que se realizar, se continua con la
instruccin begin para indicar el inicio del cdigo que describe el funcionamiento de
la arquitectura, y finaliza con la instruccin end seguido del nombre de la
arquitectura. Entre las instrucciones is y begin, es posible declarar seales,
componentes o elementos auxiliares para la descripcin de la arquitectura, algunos
de estos elementos se vern ms adelante.

ISE Project Navigator nos crea la plantilla de la arquitectura, para que el programa
compuerta_and funcione se debe describir su comportamiento; para lo cual se
agrega despus de la instruccin begin, lo que se desea que haga el programa. El
resultado se muestra en el recuadro del Cdigo 22. Arquitectura de la
compuerta_AND.

architecture behavioral of compuerta_and is


begin

s <= a and b;

end behavioral;
Cdigo 22. Arquitectura de la Compuerta_AND

114
Con esto, se asigna el resultado de la operacin and entre las seales de entrada
a y b a la seal de salida s. Como se observa, la pareja de caracteres <=" son el
operador de asignacin de seales en VHDL, tambin, se hace uso del operador
and, que realiza la operacin lgica AND entre sus dos operandos. Adems del
operador and, en VHDL se tienen definidos los siguientes operadores lgicos: or,
nand, nor, xor y xnor. Finalmente, se termina la instruccin con un punto y coma.

Una vez que se ha adicionado este cdigo al mdulo, se procede a guardar los
cambios realizados usando el comando Save dentro del men File o pulsando en
el botn con icono de un disco flexible en la barra de herramientas. Para comprobar
que no se han cometido errores en el cdigo del mdulo, se debe realizar una
revisin de la sintaxis, para ello, en la ventana Hierarchy, se da clic en el nombre
del mdulo (compuerta_and), despus, en la ventana Processes, se expande la
seccin Synthesize XST, de manera que se pueda ver el proceso Check Syntax
tal y como se muestra en la figura 58. Chequeo de la sintaxis.

Figura 58. Chequeo de la sintaxis

Para iniciar la revisin de sintaxis del cdigo, se hace doble clic sobre el nombre del
proceso o con un clic derecho y luego seleccionando el comando Run del men
contextual. Se puede observar el resultado del proceso de revisin de sintaxis en la
parte inferior del programa en la ventana de resultados.

Al terminar el proceso, un icono con una palomita blanca dentro de un crculo verde
(Figura 59. Resultado del chequeo de sintaxis) indica que la revisin de sintaxis
ha concluido exitosamente pues no se encontraron errores en el cdigo.

115
Figura 59. Resultado del chequeo de sintaxis

Con todo lo anterior se ha revisado el cdigo del mdulo, y se concluye con la


creacin de un proyecto simple, lo que quiere decir que est listo para ser
implementado, slo resta comprobar que funcione correctamente, para ello se
puede realizar una simulacin antes de proceder a la implementacin en un
dispositivo reconfigurable.

Simulacin de un proyecto

Analicemos cmo realizar una simulacin del componente compuerta_and. En


primer lugar, dentro de Project Navigator, en la seccin Design, en la opcin View,
se selecciona Simulation
A continuacin, dentro de la ventana Hierarchy, se selecciona el componente que
se desea simular, al hacerlo cambiarn las opciones disponibles en la ventana
Processes, en este caso se muestra ISim Simulator, se da clic en el signo + a la
izquierda de ISim Simulator con lo que se mostrarn dos procesos: Behavioral
Check Syntax y Simulate Behavioral Model (Figura 60. Ventana Process ISim
Simulator)

116
Figura 60. Ventana Process ISim Simulator

Esta ltima accin es la que permitir lanzar la herramienta de simulacin, se hace


doble clic en Simulate Behavioral Model y se espera a que inicie ISim, la ventana
deber parecerse a la Figura 61. ISim Simulator.

Figura 61. ISim Simulator

117
ISim muestra por defecto cuatro ventanas o secciones, una en la parte inferior y tres
en el medio: Instances and Processes, muestra las entidades, bibliotecas y
procesos existentes en el mdulo; Objects, despliega una lista de los puertos que
forman parte del mdulo, indicando con un pequeo icono con la letra I aquellos que
son entradas y con la letra O los que son salidas; y la ventana de simulacin, donde
se despliegan nuevamente los puertos del mdulo con lneas de tiempo que
permitirn visualizar el comportamiento de cada uno de dichos puertos para cada
instante de la simulacin.

La tabla de verdad de una compuerta AND de dos entradas se muestra en la


Tabla 5. Tabla de verdad del sumador completo.

Tabla 5. Tabla de verdad del sumador completo.

Se tienen cuatro combinaciones posibles de valores para las entradas a y b, para


comprobar el funcionamiento del mdulo es conveniente simular estos cuatro casos;
para ello, se asignan valores a las entradas de manera que se tengan las cuatro
combinaciones posibles y se pueda evaluar el valor que toma la salida para cada
una de ellas.

Se inicia por la primera combinacin, cuando ambas entradas valen 0, para indicar
que una entrada tendr el valor 0 en el simulador, se da clic con el botn derecho
del ratn sobre dicha entrada en la ventana de simulacin, del men que se
despliega se selecciona la opcin Force Constant.

Aparecer la ventana Force Selected Signal; en la opcin Force to Value:


escribiremos un 0 como se muestra en la Figura 62. Ventana Force Selected
Signal. Se hace clic en el botn OK.

Se repiten estos pasos para la seal de entrada b: se hace clic con el botn derecho
sobre el nombre de la entrada en la ventana de simulacin, se selecciona la opcin
Force Constant, y se establece a 0 la opcin Force to Value: se da clic en el botn
OK.

118
Al hacer esto no se nota ningn cambio en la ventana de simulacin una vez que
se han indicado los valores de 0 para las dos seales, estos se notarn hasta que
se ejecute la simulacin. Para ello se har uso de la barra de herramientas de ISim.

Figura 62. Ventana Force Selected Signal

Se da clic en el botn Run for the time especified, esto ejecuta la simulacin por un
tiempo determinado, el cual se indica a la derecha del botn; en este caso, 1 us, la
ventana de simulacin ahora muestra lo que se observa en la Figura 63. Resultado
de la primera simulacin.

Figura 63. Resultado de la primera simulacin.

119
Como se puede observar, los valores en la columna Value han cambiado de U a 0,
la U indica valor desconocido, que era el caso antes de iniciar la simulacin, ahora
que se ha simulado por un tiempo de 1us, las entradas se encuentran en valores de
0, que fue como se forz, adems la seal de salida s tambin tiene el valor de 0,
esta no se forz, sino que ha tomado el valor especificado en la programacin del
mdulo: la operacin AND entre las entradas a y b, que en este caso es 0.

Ahora, cambie el valor de la entrada a por 1, para evaluar el segundo caso de la


tabla de verdad de la operacin AND de dos entradas, se hace clic con el botn
derecho sobre el nombre de la seal y se selecciona el comando Force Constant
nuevamente; en esta ocasin se establecer un 1 en la opcin Force to value. Se
hace clic en el botn para ejecutar la simulacin nuevamente, lo que nos mostrar
algo como lo que se tiene en la Figura 64. Resultado de la segunda simulacin.

Figura 64. Resultado de la segunda simulacin.

La columna Value ha cambiado a 1 para el caso de la seal a, adems, en la


ventana de tiempo la lnea verde a la derecha de la misma seal se encuentra arriba
y ahora con una zona sombreada debajo, esto indica que durante ese tiempo la
seal se encuentra en un estado alto (1). La seal de salida s se mantiene en 0,
que es correcto debido a que solamente cambiar de estado 1 cuando ambas
entradas sean 1. Ahora simule el tercer caso de la tabla de verdad, cuando a vale 0
y b vale 1.

Como se puede observar en la Figura 65. Resultado de la tercera simulacin, la


seal se mantiene en alto durante el tiempo de la simulacin, pero la salida s se
mantiene en 0. Por ltimo simule el caso cuando ambas entradas tienen un valor
alto 1.

120
Figura 65. Resultado de la tercera simulacin.

Observe en la Figura 66. Resultado de la cuarta simulacin, como finalmente la


salida s ha cambiado a 1, lo cual corresponde con la tabla de verdad de la operacin
AND, de esta forma se ha comprobado que el componente funciona correctamente.

Figura 66. Resultado de la cuarta simulacin.

Cabe mencionar que en cada paso, en la ventana de simulacin apareci a la


derecha un valor con letras amarillas que cambi de 1, 000,000 ns a 2,000,000 ns
en el primer tiempo de simulacin, y as hasta llegar a 5,000,000 ns. Esto indica que
entre cada paso se avanz 1 us, que es el tiempo que se configur en la barra de
herramientas.

Para poder visualizar la simulacin completa se hace clic en el botn Zoom to Full
View (sealado en un valo rojo); la simulacin completa se observa en la Figura
67. Resultado de simulacin completa, donde se pueden ver los cuatro pasos

121
de simulacin ejecutados, los cuales corresponden a la tabla de verdad de la
compuerta AND.

Figura 67. Resultado de simulacin completa

Con lo anterior se concluye con la parte de simulacin de un proyecto. Pero ahora


se dar continuacin a la creacin de otros programas que ilustrarn ms el manejo
del lenguaje VHDL en el software ISE Design Suite.

Desarrollo de prcticas adicionales

A continuacin, se agregarn un par de componentes ms al proyecto: una


compuerta OR y otra XOR. Cierre ISim y vuelva a ISE Project Navigator.

Desde el men Project seleccie New Source, o tambin puede hacer clic con el
botn derecho sobre el nombre del proyecto o del dispositivo para el cual est
destinado, donde de igual manera aparece la opcin New Source. Agrege un
mdulo VHDL y como nombre de archivo compuerta_or, enseguida haga clic en el
botn Next.

La ventana Define module debe quedar como se muestra en la Figura 68. Define
Module Compuerta OR.

122
Figura 68. Define Module Compuerta OR.

Haga clic en el botn Next y despus en Finish, con lo cual se obtendr el nuevo
mdulo compuerta_or en la ventana Hierarchy, en el editor se mostrar el cdigo
generado por Project Navigator.

En el recuadro siguiente se muestra la arquitectura de la compuerta OR (Cdigo


23. Arquitectura de la compuerta_OR).

architecture Behavioral of compuerta_or is


begin

s <= a or b;

end Behavioral;

Cdigo 23. Arquitectura de la compuerta_OR

El siguiente paso es revisar la sintaxis del mdulo creado, se debe seleccionar la


opcin Implementation en la ventana Design, despus seleccionar el mdulo
compuerta_or y en la ventana de procesos hacer doble clic en Check Syntax, si
hubo algn problema se indicar en la consola ubicada en la parte inferior.

123
Figura 69. Check Syntax Compuerta OR.

Como se puede observar en la Figura 69. Check Syntax Compuerta OR, no se


tiene ningn error de sintaxis, por lo que ahora se prosigue a hacer la simulacin
del mdulo.

En Project Navigator, seccin Design, pase View a Simulation, enseguida se


selecciona el componente compuerta_or y por ltimo en la ventana Processes
haga doble clic en Simulate Behavioral Model.

Nuevamente se abre ISim Simulator, y de manera similar a la simulacin del


mdulo compuerta_and, se evaluarn las cuatro combinaciones posibles segn la
tabla de verdad de la operacin OR para dos entradas.

Tabla 6. Tabla de verdad Compuerta OR.

124
Haga clic con el botn derecho sobre la entrada a en la ventana de simulacin, pero
en esta ocasin no se utilizar el comando Force Constant, sino el comando Force
Clock.

El comando Force Clock permite indicar que una entrada tendr valores alternados
entre 0 y 1 durante la simulacin, es decir, como una seal de reloj. En la ventana
Define Clock se definen algunas opciones como el periodo, ciclo de trabajo y el
valor del primer pulso, para el caso de esta simulacin, se configura Leading Edge
Value a 0 y Trailing Edge Value a 1, mientras que Period ser de 100 ns, tal y
como se muestra en la Figura 70. Configuracin Define Clock.

Figura 70. Configuracin Define Clock

Haga clic en OK y configure de manera similar la entrada b, pero variando el periodo


a 200 ns.

Hecho esto se ejecuta la simulacin por un tiempo determinado; por defecto 1 us,
se da clic en el botn Run for the time specified on the toolbar y despus en el
botn Zoom to Full View, el resultado es mostrado en la Figura 71. Simulacin
Compuerta OR.

125
Figura 71. Simulacin Compuerta OR.

En figura anterior se observan algunos cambios de valor entre 0 y 1 de las seales


de entrada a y b, los suficientes para evaluar las cuatro combinaciones diferentes
de la tabla de verdad de la compuerta OR. Estas transiciones se consiguen al usar
la opcin Force Clock para las seales a y b, adems, ntese que al configurar el
periodo de la seal b como el doble con respecto al periodo de la seal a, las
transiciones corresponden de manera exacta con las de la tabla de verdad.

Por ltimo practique creando el mdulo de la compuerta XOR. Para agregar el


mdulo, siga los mismos pasos que con los mdulos anteriores. Despus de haber
creado el modulo, chequee la sintaxis, y prosiga a la simulacin; para comprobar la
simulacin obsrvese la tabla de verdad de la compuerta XOR; Tabla 7. Tabla de
verdad Compuerta XOR.

Tabla 7. Tabla de verdad Compuerta XOR.

Diseo Estructural en VHDL

Una de las caractersticas ms potentes del lenguaje VHDL, es la posibilidad de


utilizar los mdulos que se han desarrollado para construir mdulos ms grandes,
es decir, un mdulo VHDL puede convertirse en componente de otro mdulo, de
esta forma se reutilizan o aprovechan mdulos ya diseados con anterioridad, o se
puede dividir un diseo complejo en varios diseos ms simples.

126
Utilizar mdulos VHDL para construir otros mdulos se denomina diseo
estructural, que difiere del diseo por comportamiento que se ha utilizado en la
creacin de las compuertas AND, OR y XOR.

Se aprovecharn dos de los componentes que se han creado hasta este momento
para crear un componente nuevo: Un Medio Sumador.

Como primer paso observe la tabla de verdad de un medio sumador el cual cuenta
con un par de entradas (A y B) y un par de salidas: suma (S) y acarreo (C):

Tabla 8. Tabla de verdad Medio sumador

Se utilizarn como componentes los mdulos compuerta_and y compuerta_xor


para crear un nuevo mdulo llamado medio_sumador. Por lo tanto agregue un
nuevo mdulo llamado medio_sumador, en el asistente indique cuatro seales,
dos entradas (A y B) y dos salidas (C y S) como se muestra en la Figura 72. Define
Module Medio sumador.

Figura 72. Define Module Medio sumador.

127
Se finaliza con el asistente y para obtener el cdigo creado por Project Navigator.

Antes de utilizar un componente, es necesario declararlo, esta declaracin se realiza


en el cdigo de la arquitectura, entre la declaracin del nombre de arquitectura y la
instruccin begin, se incluye el nombre de la entidad que se utilizar como
componente, adems de la declaracin de sus seales (mediante la instruccin
port), la sintaxis es la mostrada en el recuadro del Cdigo 24. Declaracin de
componentes.

architecture NOMBRE_ARQUITECTURA of NOMBRE_ENTIDAD is


component NOMBRE_ENTIDAD_COMPONENTE
port(

NOMBRE_SEAL1: DIRECCIN TIPO;


NOMBRE_SEAL2: DIRECCIN TIPO
);
end component;

begin
end NOMBRE_ARQUITECTURA;

Cdigo 24. Declaracin de componentes.

La instruccin port dentro de la declaracin del componente es prcticamente una


copia de las seales que se declaran en el cdigo de entidad del mdulo que se usa
como componente. Por ejemplo, la declaracin de componente del mdulo
compuerta_and sera la siguiente:

component compuerta_and
is
port(
a : in std_logic;
b : in std_logic;
s : out std_logic
);
end component;
Cdigo 25. Declaracin del componente Compuerta AND.

Con este ejemplo ya se pueden agregar las declaraciones de los componentes


compuerta_and y compuerta_xor en el mdulo medio_sumador.
architecture behavioral of medio_sumador
is
component compuerta_and is
port(
a : in std_logic;
b : in std_logic;
s : out std_logic
);
end component;
128
component compuerta_xor is
port(
a : in std_logic;
b : in std_logic;
s : out std_logic
);
end component;
begin
Cdigo 26. Declaracin de componentes para el Medio sumador.

Ya se han declarado los componentes, ahora se debe hacer uso de ellos, esto se
hace mediante una instanciacin de componente, en la que se indica el
componente del cual se crea una instancia y las conexiones de sus seales, esta
es la sintaxis:

ETIQUETA: NOMBRE_COMPONENTE port map( CONEXION1, CONEXION2 );

Cdigo 27. Instanciacin de componentes, Sintaxis

La etiqueta es obligatoria, permite identificar entre diferentes instanciaciones del


mismo componente. La etiqueta va seguida del nombre del componente y despus
se indican las conexiones de las seales del componente, es decir, se indica con
qu entradas, salidas o seales auxiliares se conectarn las seales que forman
parte de la interfaz del componente. Para el caso del medio sumador, las entradas
A y B se conectarn con las entradas a y b de ambas compuertas, mientras que la
salida del mdulo compuerta_and se conectar con la seal de salida C y la salida
del mdulo compuerta_xor con la seal de salida S.

ACARREO: compuerta_and port map( A, B, C );


SUMA: compuerta_xor port map( A, B, S );

Cdigo 28. Instanciacin de componentes, compuertas AND y XOR

De esta forma, el cdigo final del mdulo medio_sumador es el mostrado en el


Cdigo 29. Cdigo VHDL Medio sumador.

129
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity medio_sumador is
port(
A : in STD_LOGIC;
B : in STD_LOGIC;
C : out STD_LOGIC;
S : out STD_LOGIC
);
end medio_sumador;

architecture behavioral of medio_sumador is

component compuerta_and is
port(
a : in std_logic;
b : in std_logic;
s : out std_logic
);
end component;

component compuerta_xor is
port(
a : in std_logic;
b : in std_logic;
s : out std_logic
);
end component;

begin

ACARREO: compuerta_and port map( A, B, C );


SUMA: compuerta_xor port map( A, B, S );

end behavioral;

Cdigo 29. Cdigo VHDL Medio sumador.

Al guardar el cdigo del mdulo medio_sumador, la jerarqua de archivos del


proyecto cambia.

Los mdulos compuerta_and y compuerta_xor, ahora aparecen anidados dentro


del mdulo medio_sumador, indicando que se estn utilizando como componentes
de este, adems, se muestran las etiquetas que se han utilizado para instanciar los
componentes.

130
Ejecute la sintaxis para observar que est bien estructurado el mdulo de
medio_sumador y prosiga con la simulacin del mismo. El resultado de la
simulacin se muestra en la Figura 73. Simulacin Medio sumador.

Figura 73. Simulacin Medio sumador.

De manera similar a la creacin del medio_sumador, elabore un


sumador_completo para demostrar las ventajas del diseo estructural y como
teniendo los mdulos hechos se pueden realizar diseos de mayor tamao muy
fcilmente.

La construccin de un sumador_completo de un bit a partir de dos medios


sumadores y una compuerta OR se muestra en la Figura 74. Diagrama a bloques
de un sumador completo.

Figura 74. Diagrama a bloques de un sumador completo.

131
Agregue un nuevo mdulo VHDL al proyecto, de nombre sumador_completo,
tendr tres entradas: EntradaA, EntradaB y Cin (acarreo de entrada), y dos salidas:
Suma y Cout (Acarreo de salida).

Agregue la declaracin de los componentes que sern utilizados: medio_sumador


y compuerta_or, de manera que quede similar al Cdigo 30. Declaracin de
componentes.

architecture estructural of sumador_completo is


component medio_sumador
port(
A : in STD_LOGIC;
B : in STD_LOGIC;
C : out STD_LOGIC;
S : out STD_LOGIC
);
end component;

component compuerta_or
port (
a : in std_logic;
b : in std_logic;
s : out std_logic
);
end component;

begin

end estructural;

Cdigo 30. Declaracin de componentes.

Hecho esto toca realizar la instanciacin de los componentes e indicar sus


conexiones, no debe haber ningn problema para la conexin de las seales del
mdulo sumador_completo (EntradaA, EntradaB, Cin, Suma y Cout), pero seguro
habr duda sobre cmo realizar las conexiones entre los componentes, por ejemplo,
cmo indicamos que la salida S del primer medio sumador debe conectarse a la
entrada A del segundo? La respuesta es: mediante seales auxiliares. Las seales
auxiliares podran ser algo afn a variables temporales en otros lenguajes de
programacin (como las usadas en los ciclos, o las usadas para permitir una mayor
claridad de cdigo), en VHDL permiten realizar la conexin entre seales de varios
componentes. En la Figura 75. Interconexin de seales auxiliares, se muestran
en rojo las seales auxiliares de las que se harn uso para realizar las
interconexiones de los componentes del mdulo sumador_completo.

132
Figura 75. Interconexin de seales auxiliares

De manera similar a los componentes, las seales deben ser declaradas antes de
poder utilizarse, y tambin como el caso de los componentes, las seales auxiliares
se declaran despus de la lnea que indica el nombre de la arquitectura y antes de
la instruccin begin. La sintaxis para declarar una seal es la mostrada en el
Cdigo 31. Sintaxis de una seal auxiliar.

signal NOMBRE_SEAL : tipo;

Cdigo 31. Sintaxis de una seal auxiliar.

El cdigo para agregar las seales s1, c1 y c2 al mdulo es el mostrado en el


recuadro del Cdigo 32. Declaracin de seales auxiliares.

signal s1 : std_logic;
signal c1, c2 : std_logic;

Cdigo 32. Declaracin de seales auxiliares.

Ntese que el tipo de las seales auxiliares debe coincidir con el tipo de las seales
de los componentes con los que se desea realizar la conexin.

A continuacin se crean dos instancias del mdulo medio_sumador y una del


mdulo compuerta_or, y se utilizarn las seales s1, c1 y c2 para interconectar
dichas instancias.

133
MS0: medio_sumador port map( EntradaA, EntradaB, c1, s1 );
MS1: medio_sumador port map( s1, Cin, c2, Suma );
COR: compuerta_or port map( c1, c2, Cout );

Cdigo 33. Instanciacin para el sumador completo.

El cdigo completo del mdulo sumador_completo se muestra en el recuadro del


Cdigo 34. Cdigo VHDL Sumador completo.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity sumador_completo is
Port (
EntradaA : in
EntradaB : in
Cin : in STD_LOGIC;
Suma : out STD_LOGIC;
Cout : out STD_LOGIC
);
end sumador_completo;

architecture estructural of sumador_completo is


component medio_sumador
port(
A : in STD_LOGIC;
B : in STD_LOGIC;
C : out STD_LOGIC;
S : out STD_LOGIC
);
end component;

component compuerta_or
port (
a : in std_logic;
b : in std_logic;
s : out std_logic
);
end component;

signal s1 : std_logic;
signal c1, c2 : std_logic;

begin

MS0: medio_sumador port map( EntradaA, EntradaB, c1, s1 );


MS1: medio_sumador port map( s1, Cin, c2, Suma );
COR: compuerta_or port map( c1, c2, Cout );

end estructural;

Cdigo 34. Cdigo VHDL Sumador completo

134
En cuanto se guarda el cdigo, la jerarqua del proyecto se modifica como antes
ocurri con el mdulo medio_sumador. (Figura 76. Jerarqua del Proyecto)

Figura 76. Jerarqua del Proyecto

Ntese que todos los mdulos anteriores se han anidado dentro del mdulo
sumador_completo, adems de que hay dos apariciones del mdulo
medio_sumador, correspondiendo con las instancias que se han creado del
mismo. A continuacin se realiza una revisin de sintaxis, si no hay problemas
proceda con la simulacin. Para comprobar la simulacin observe la tabla de verdad
para el sumador completo de 1 bit (Tabla 9. Tabla de verdad Sumador completo).

Tabla 9. Tabla de verdad Sumador completo

135
Ahora la simulacin, para facilitarla utilice la opcin Force Clock, colocando una
frecuencia de 100 ns para EntradaA, 200 ns para EntradaB y 400 ns para Cin. El
resultado se muestra en la Figura 77. Simulacin del Sumador Completo.

Figura 77. Simulacin del Sumador Completo.

El rectngulo rojo engloba todas las combinaciones de la tabla de verdad, donde


podemos ver que el mdulo funciona de manera correcta. Adems, en la
simulacin es posible ver los valores toman las seales auxiliares, de forma que
sea ms fcil depurar y encontrar posibles errores lgicos del mdulo.

Hasta este punto, concluimos con las actividades correspondientes a la


instalacin, manejo del software ISE Design Suite y la realizacin de prcticas en
ste entorno de programacin.

136
ANEXO C

Descarga de los programas hacia la Tarjeta Basys 2

En este anexo se describe cmo utilizar algn diseo creado en el Anexo B, para
configurar un dispositivo, en concreto, la FPGA Spartan3E.

Despus de haber revisado el cdigo y que los mdulos funcionen


correctamente (mediante la simulacin), el siguiente paso es indicar los pines del
dispositivo programable correspondientes a las entradas y salidas del mdulo
desarrollado.

Si se recuerda, el mdulo sumador_completo cuenta con solo tres entradas:


EntradaA, EntradaB y Cin, y dos salidas: Suma y Cout.

Estas entradas y salidas deben ser asociadas con pines (o puertos) del dispositivo
en el que se desea implementar el diseo, de manera que se conecte el mdulo
con el resto del circuito diseado.

Para este diseo, se conectaran las tres entradas con tres switches, mientras que
las dos salidas son conectadas a leds de la tarjeta de desarrollo, en la Figura 78,
se indica a qu elemento de la tarjeta se conectan los puertos del mdulo
sumador_completo.

Cout Suma Cin Entrada Entrada


(M11) (M5) (K3) A (L3) B (P11)

Figura 78. Asignacin de pines en la tarjeta Basys 2.

137
Se observa que debajo de cada seal a conectar se encuentra entre
parntesis una letra y un nmero, as es como se indican los pines del encapsulado
del dispositivo que se est configurando, en este caso una Basys 2. Sabiendo a qu
pin de la FGPA se asocian los puertos del mdulo, se debe indicar en el proyecto
en ISE Project Navigator, para ello en primera instancia se hace uso de la
aplicacin PlanAhead: se selecciona el mdulo sumador_completo en
la ventana Design, asegurndose de que est seleccionada la opcin
Implementation, despus, en la ventana Processes, se expande la categora User
Constraints, y se da doble clic en el proceso I/O Pin Plannig (Plan Ahead) Post-
Synthesis.

Se esperan unos instantes y se abre el programa PlanAhead, probablemente antes


de cargar PlanAhead se muestre un mensaje que indica que se agregar un archivo
de restricciones de usuario (UCF), debe indicarse que si (Yes).

Ahora se debe observar en pantalla, la ventana PlanAhead. En la parte superior se


observan dos pestaas en las cuales se observan los grficos que representan el
dispositivo a configurar: la pestaa de la izquierda despliega los pines del FPGA en
un arreglo matricial (Package, mientras que la de la derecha representa el
dispositivo en su totalidad (Device).

Debajo de las imgenes, se encuentra una seccin con dos pestaas: I/O Ports y
Package Pins, si se selecciona I/O Ports y se expanden las opciones All ports y
Scalar ports se ven los puertos que forman parte del mdulo
sumador_completo, haciendo clic en uno de ellos puede arrastrarse hacia la
imagen que representa los puertos del dispositivo, donde debe soltarse estando
ubicado en el pin al que se quiere asociar el puerto o tambin puede realizarse
mediante la columna site en la cual solo se escribe la letra y el nmero de la terminal
deseados.

Figura 79. Ventana principal del Plan Ahead.

138
Una vez asociados todos los puertos del mdulo sumador_completo con pines del
FPGA. Se da clic en el botn para guardar el diseo de Plan Ahead y se cierra para
continuar en ISE Project Navigator. Se nota un nuevo archivo agregado al
proyecto, el nombre de este archivo corresponde con el mdulo a enviar al
dispositivo reconfigurable y tiene como extensin .ucf.

Ahora se selecciona el mdulo sumador_completo en la ventana Hierarchy,


despus, en la ventana Processes se hace clic con el botn derecho en Generate
Programming File, seleccionando la opcin Process Properties:

Figura 80. Generacin del archivo .bit

Se abre un dilogo en el que se deben asegurar dos puntos: que en la categora


General Options est habilitada la opcin Create Bit File, y que en la categora
Startup Options, la propiedad FPGA Start-Up Clock est configurada a JTAG
Clock.

Se da clic en el botn OK para cerrar el dilogo y ahora se da doble clic en el proceso


Generate Programming File, inicia la creacin del archivo de configuracin .bit,
que se descarga al FPGA. Si el proceso termina con xito, se habr creado el
archivo sumador_completo.bit dentro de la carpeta del proyecto.

139
Figura 81. Creacin del archivo .bit terminado.

Ahora se enva el archivo a la FPGA, para ello se utiliza el software Adept


de Digilent. Lo primero se hace antes de conectar el cable, es descargar e instalar
el software Adept, que se encuentra en esta pgina: Digilent Adept, la descarga
es Adept 2.6.1 System, 32/64-bit Windows, tambin estn disponibles otras
herramientas y el SDK para quien desee integrarlas a sus aplicaciones, hasta
versiones para Linux aunque por el momento no se ha probado. Una vez instalado
el software, se conecta la tarjeta Basys 2 a un puerto disponible de la computadora.
Windows reconoce que se ha conectado un nuevo dispositivo y procede a asociarlo
con el controlador adecuado. Se abre el software Adept y, si la tarjeta se encuentra
conectada adecuadamente, debe observarse algo como la Figura 82.

Figura 82. Ventana principal del software Digilent Adept.

140
Ahora se configura la FPGA: haciendo clic en el botn Browse a la derecha de
donde aparece el dispositivo FPGA, se abre un dilogo de Windows en el que debe
indicase el archivo de configuracin sumador_completo.bit que se genera antes
en Project Navigator.

Figura 83. Ubicacin del archivo .bit

Haciendo clic en el botn Program a la derecha del botn Browse se inicia el


proceso de carga del archivo de configuracin al FPGA. Durante la programacin,
un led de color rojo, que se encuentra a un lado de los pines de alimentacin externa
de la tarjeta se enciende, una vez terminado el proceso se indica si ha sido exitoso
en la ventana de mensajes de Adept, si no ha habido problemas, el FPGA ha sido
configurado y puede probarse si funciona. Y con ello queda terminada la prctica,
en la cual se explicaron todos los pasos para crear un proyecto, simularlo y
descargarlo a la tarjeta.

141
Figura 84. Descarga del archivo .bit hacia la tarjeta.

Con esto queda finalizado el punto de instalacin y manejo de software ISE Desing
Suite 13.4 y del software Adept de Digilent, y ya puede cargarse cualquier diseo
hacia la tarjeta de la FPGA, Basys 2 de Digilent.

142
ANEXO D
Implementacin del Microprocesador de 4 bits en la tarjeta de
desarrollo Basys 2, de Digilent

Para este anexo, se implementa el microprocesador de 4bits diseado en


el proyecto, con el programa que se haba cargado en la memoria RAM, a fin de
verificar su comportamiento.

Para verificar ese comportamiento se monitorearon los valores que fueron


adquiriendo los acumuladores A y B, as mismo se muestra el contenido de la
direccin 00100000, (3210) de la memoria RAM, con el propsito de comprobar de
forma visual, la escritura del dato del acumulador A, a dicha localidad en la memoria
RAM. (Vase la Tabla 3. Programa a cargar en la memoria RAM.)

En este apartado nos enfrentamos con varios problemas; el primero de ellos radica
en que la seal de reloj que utiliza el microprocesador debe ser lo suficientemente
lenta, de forma tal que podamos distinguir los ciclos de reloj que se efectan y
tambin para dar tiempo a visualizar el contenido de los acumuladores.

La FPGA posee un reloj de 50 MHz (periodo de reloj de ) en la terminal B8. Esta


seal de reloj es la que ser utilizada para el microprocesador, por lo tanto creamos
un proceso que divida la frecuencia del reloj de manera que el periodo sea de 1s,
este reloj ser visualizado como salida en un LED.

Para tal proceso agregaremos al microprocesador un bloque ms, el programa de


este bloque se muestra en el Cdigo 35.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity Reloj1hz is
port(
reloj: in std_logic;
clk: inout std_logic;
led1hz: out std_logic);
end Reloj1hz;

architecture Behavioral of Reloj1hz is


signal divisor : STD_LOGIC_VECTOR (31 downto 0);
signal relojsec : STD_LOGIC;
begin

143
process (reloj)
begin
if reloj'event and reloj='1' then -- el periodo del reloj es de 20 ns
divisor<=divisor + '1'; -- por tanto 50 000 000 cuentas corresponden
if divisor=50000000 then -- con el transcurso de 1s.
relojsec<=not relojsec;
divisor<=(others=>'0');
end if;
end if;
end process;
clk<=relojsec;
led1hz<=relojsec;

end Behavioral;

Cdigo 35. Reloj de 1hz

Ahora, para la visualizacin del contenido de los acumuladores, se hace uso de 2


Displays de 7 segmentos de la tarjeta, y para el contenido de la localidad 32 10 de la
memoria RAM, se utilizan 4 de los 8 leds de los que dispone la tarjeta.

Otro de los inconvenientes, es visualizar dos cifras diferentes en dos de los displays
disponibles en la tarjeta BASYS 2. El problema reside en el hecho de que los valores
(binarios) para excitar los distintos segmentos son compartidos por los
4 displays simultneamente. Existen, no obstante, 4 seales (las correspondientes
a las salidas F12, J12, M13 y K14) que controlan la activacin independiente de
cada uno de los displays.

Para que logremos visualizar cifras diferentes en cada uno, es necesario activar los
segmentos correspondientes al primer dato de uno de los displays junto con su seal
de activacin, y a continuacin hacer lo mismo con el siguiente, luego de regreso y
as sucesivamente. Si esta secuencia se repite ms de 25 veces por segundo, el ojo
no ser capaz de percibir ese cambio, pudiendo as, mostrarse datos diferentes.

Para lograr esto necesitamos los siguientes elementos (ver figura 85):

Un decodificador de binario a 7 segmentos.

Un multiplexor de dos entradas de 4 bits para seleccionar el dato a visualizar.

Un elemento de control que realice el refresco peridico de los displays.

144
Figura 85. Diagrama de bloques del circuito a disear.

En este caso, la manera ms apropiada de describir este hardware consiste en


realizar un bloque independiente por cada elemento, es decir, se deben aadir al
microprocesador, tres bloques ms, uno para el decodificador de 7 segmentos, otro
para el multiplexor y uno ms para el control.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity Decoder7seg is
port(
dato: in std_logic_vector (3 downto 0);
display: OUT std_logic_vector (6 downto 0));
end Decoder7seg;

architecture Behavioral of Decoder7seg is

begin

with dato select display <=


"0000001" when "0000",
"1001111" when "0001",
"0010010" when "0010",
"0000110" when "0011",
"1001100" when "0100",
"0100100" when "0101",
"0100000" when "0110",
"0001111" when "0111",
"0000000" when "1000",

145
"0001100" when "1001",
"0001000" when "1010",
"1100000" when "1011",
"1110010" when "1100",
"1000010" when "1101",
"0110000" when "1110",
"0111000" when "1111",
"1111111" when others;

end Behavioral;

Cdigo 36. Decodificador binario a 7 segmentos.

Este bloque (Cdigo 36.) declarado como Decoder7seg en la entidad, contiene la


descripcin funcional de un decodificador de binario a 7 segmentos. Debe tenerse
en cuenta que segn las conexiones de la figura los segmentos se encienden con
un valor lgico 0 en la terminal correspondiente.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity MultiplexorDisplay is
Port (
DatoAcuma: in STD_LOGIC_VECTOR (3 downto 0); -- Entrada de datos 0
DatoAcumb: in STD_LOGIC_VECTOR (3 downto 0); -- Entrada de datos 1
ctrl : in STD_LOGIC; -- Entrada de control
dato : inout STD_LOGIC_VECTOR (3 downto 0)); -- Dato para el Decoder7seg
end MultiplexorDisplay;

architecture Behavioral of MultiplexorDisplay is

begin

with ctrl select dato<=


DatoAcuma when '0',
DatoAcumb when '1',
DatoAcuma when others;

end Behavioral;
Cdigo 37. Multiplexor de 2 entradas y una salida.

Este bloque (Cdigo 37.) declarado como MultiplexorDisplay en la entidad,


describe un multiplexor de 2 entradas de 4 bits y una salida. Como podemos
observar, los datos de entrada provienen precisamente de los acumuladores A y B,
La seal de control es ctrl, y la salida dato ser quien se conecta a la entrada del
decodificador de 7 segmentos.

146
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity Control is
Port (
reloj : in STD_LOGIC; -- reloj de la FPGA
DSP_A : out STD_LOGIC; -- seal para activar el display 0
DSP_B : out STD_LOGIC; -- seal para activar el display 1
DSP_C : out STD_LOGIC;
DSP_D : out STD_LOGIC;
ctrl : inout STD_LOGIC); -- seal para controlar el mux.

end Control;

architecture Behavioral of Control is


signal contador : STD_LOGIC_VECTOR (31 downto 0);
signal salida : STD_LOGIC;
begin
process (reloj)
begin
if reloj'event and reloj='1' then -- el periodo del reloj es de 20 ns
contador<=contador + '1'; -- por tanto 500.000 cuentas se corresponden
if contador=500000 then -- con el transcurso de 10 ms.
salida<=not salida;
contador<=(others=>'0');
end if;
end if;
end process;

ctrl<=salida;
DSP_A<=salida;
DSP_B<=not salida;

end Behavioral;

Cdigo 38. Control de seales

Este bloque (Cdigo 38.) describe un circuito secuencial de control. Un proceso


divide la frecuencia del reloj de la tarjeta, utilizando un contador. Cada invierte
el valor lgico de la seal salida.

En paralelo con este proceso, la salida ctrl toma el valor de la seal salida, mientras
que las salidas DSP_A y DSP_B toman valores contrarios dependiendo de la seal
salida.

Con este cdigo se describe un elemento que alterna el valor de ctrl cada .
Al mismo tiempo invierte los valores de DSP_A y DSP_B que son las seales que

147
activan los displays. De esta manera uno de ellos est activo cuando se selecciona
una entrada del multiplexor, y el otro se activa cuando se selecciona la otra entrada.
(Tenga en cuenta que segn la figura, los displays se activan cuando la seal de
control DSP correspondiente es 0).

Figura 86. Circuito que alterna el encendido de 2 displays.

Cada uno de los bloques anteriores se declaran como componentes en el


paquete Microprocesador _C y se declaran tambin en la entidad y la arquitectura
del archivo de alto nivel para asociar seales, terminales de entrada y salida.

Ya hecho, checamos la sintaxis del programa de alto nivel, para corregir posibles
errores. Una vez realizado esto sin que se presenten errores, podremos ya,
sintetizar el cdigo con la herramienta synthesize- XST, lo ltimo con la finalidad
de saber y conocer la cantidad de recursos de la tarjeta que se ocuparn y as
mismo determinar tambin si el programa podr o no descargarse a ella. Slo basta
con ejecutarla y si todo est correcto se mostrara en consola el mensaje Process
"Synthesize - XST" completed successfully como se muestra en la Figura 87.

148
Figura 87. Sntesis del programa

Como podemos notar en la figura, la sntesis del programa se ha ejecutado sin


errores.

Para conocer los recursos que ocupa el programa, seleccionamos la pestaa


Design Summary (resumen del diseo), en ella observamos varias tablas que
contienen la informacin acerca del proyecto, en la tabla Device Utilization
Summary encontraremos el reporte de los recursos que ocupa el programa en la
tarjeta, podemos notarlo en la Figura 88. Design Summary.

Figura 88. Design Summary.

149
De los datos de la tabla Device Utilization Summary, notando el porcentaje de los
dispositivos utilizados, se puede afirmar que este proyecto Microprocesador de 4
bits podr ser implementado en la Tarjeta de desarrollo Basys 2 de Digilent.

Por ltimo, las entradas y salidas del circuito principal (programa de alto
nivel), deben asociarse con los recursos correspondientes de la tarjeta; el reloj, los
displays, leds e interruptores a utilizar se muestran en el siguiente cdigo (Cdigo
39.), que corresponde al archivo de asociaciones (*.ucf) del programa principal.

# PlanAhead Generated physical constraints

NET "DSP_A" LOC = K14;


NET "DSP_B" LOC = M13;
NET "DSP_C" LOC = J12;
NET "DSP_D" LOC = F12;
NET "led1hz" LOC = G1;
NET "reloj" LOC = B8;
NET "reset" LOC = P11;
NET "led[0]" LOC = M5;
NET "led[1]" LOC = M11;
NET "led[2]" LOC = P7;
NET "led[3]" LOC = P6;
NET "irq[0]" LOC = E2;
NET "irq[1]" LOC = N3;
NET "display[0]" LOC = M12;
NET "display[1]" LOC = L13;
NET "display[2]" LOC = P12;
NET "display[3]" LOC = N11;
NET "display[4]" LOC = N14;
NET "display[5]" LOC = H12;
NET "display[6]" LOC = L14;

Cdigo 39. Archivo de asociaciones ucf.

Ahora slo resta generar el archivo .bit, que se cargar a la tarjeta mediante el
software Adept de Digilent, recurdese en el ANEXO C, cmo generar dicho archivo
y descargar el programa a la tarjeta.

A continuacin se muestran imgenes del programa en la memoria RAM


ejecutndose en el Microprocesador ahora cargado e implementado en la tarjeta
Basys 2 de DIGILENT.

150
Figura 89. Microprocesador implementado en la tarjeta Basys 2 de Digilent.

Figura 90. Programa en la memoria RAM correctamente ejecutado.

151

Vous aimerez peut-être aussi