Académique Documents
Professionnel Documents
Culture Documents
implementacin de un
Microprocesador bsico
de 4 bits.
1
RESUMEN
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.
3
CONTENIDO
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
7
LOS MICROPROCESADORES
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.
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.
Los tres mdulos estn conectados entre s por medio de los buses de comunicacin.
Bus de direcciones
Bus de datos
Bus de control
10
Figura 5. Diagrama a bloques de un microprocesador
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.
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.
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
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.
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.
Sistemas embebidos
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.
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.
33
Diseo de microprocesadores en VHDL
MEMORIA RAM
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).
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.
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.
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.
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.
* 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
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
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.
library ieee;
use ieee.std_logic_1164.all ;
use ieee.std_logic_unsigned.all;
38
process(clk, cs, reset)
begin
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
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;
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.
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):
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
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.
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;
end Behavioral;
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.
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;
end Behavioral;
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.
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;
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;
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.
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).
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;
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;
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;
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.
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;
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;
49
Diseo y Programacin de la Unidad Aritmtica y Lgica (ALU)
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;
begin
process(clk)
variable Cout: std_logic;
begin
50
if (clk 'event and clk = '1') then
--Selecciona una operacin,
case cs is
51
rc(3)<= Cout xor cl(1); -- Sobreflujo
end process;
end Behavioral;
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.
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;
type estados is (d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10,
dll, d12, dl3, dl4, d15, d16, d17,d18);
begin
begin
if reset = '1' then
edo_futuro <= d0;
pcontrol <= "11111111";
rw <= '0';
cs <= "11110";
else
case edo_presente is
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;
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;
end case;
end if;
end process proceso1;
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 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.
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.
60
Ms adelante se da una lista detallada de las 16 instrucciones que puede ejecutar
el microprocesador.
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.
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
--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;
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
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;
end TopLevelMicro;
begin
66
u5: RegTriEst port map (cs=>cs, operacion=>operacion, datout=>datout,
clk=>clk);
Lista de instrucciones
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.
68
RESULTADOS
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.
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.
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.
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.
71
Simulacin del Acumulador A
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.
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.
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.
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.
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).
Segunda instruccin MA
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
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
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
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.
Figura 27. Resultado de Simulacin de la quinta instruccin para el Microprocesador; PILA Pcout
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.
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.
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;
dato:= datout;
--escritura
--lectura
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;
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.
84
Figura 30. Simulacin del Microprocesador (captura 3).
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.
86
Figura 33. Simulacin del Microprocesador (captura 6).
87
Figura 34. Simulacin del Microprocesador (captura 7).
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).
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.
89
Figura 36. Simulacin del Microprocesador (captura 9).
90
Figura 37. Simulacin del Microprocesador (captura 10).
91
CONCLUSIONES Y RECOMENDACIONES
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.
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
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.
a) Text File
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:
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.
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.
98
Compilacin del Proyecto
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.
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.
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.
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.
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.
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.
103
Figura 48. Cdigo en VHDL del multiplexor de 4 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
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.
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
Iniciaremos por compuertas lgicas AND, OR y XOR, estas mismas sern utilizadas
para crear un medio sumador y a su vez un sumador completo.
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.
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.
110
Figura 56. Ventana Define Module
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:
--
---------------------------------------------------------------------------
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: ;.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
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;
entity compuerta_and is
Port ( a : in STD_LOGIC;
b : in STD_LOGIC;
s : out STD_LOGIC);
end compuerta_and;
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.
begin
end NOMBRE_ARQUITECTURA;
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.
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.
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
Simulacin de un proyecto
116
Figura 60. Ventana Process 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.
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.
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.
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.
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.
120
Figura 65. Resultado de la tercera simulacin.
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.
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.
s <= a or b;
end Behavioral;
123
Figura 69. Check Syntax 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.
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.
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):
127
Se finaliza con el asistente y para obtener el cdigo creado por Project Navigator.
begin
end NOMBRE_ARQUITECTURA;
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.
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:
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;
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
end behavioral;
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.
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).
component compuerta_or
port (
a : in std_logic;
b : in std_logic;
s : out std_logic
);
end component;
begin
end estructural;
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 s1 : std_logic;
signal c1, c2 : std_logic;
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.
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 );
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;
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
end estructural;
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)
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).
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.
136
ANEXO C
En este anexo se describe cmo utilizar algn diseo creado en el Anexo B, para
configurar un dispositivo, en concreto, la FPGA Spartan3E.
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.
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.
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.
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.
139
Figura 81. Creacin del archivo .bit terminado.
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.
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
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.
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;
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;
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):
144
Figura 85. Diagrama de bloques del circuito a disear.
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;
begin
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;
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;
begin
end Behavioral;
Cdigo 37. Multiplexor de 2 entradas y una salida.
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;
ctrl<=salida;
DSP_A<=salida;
DSP_B<=not salida;
end Behavioral;
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).
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
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.
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.
150
Figura 89. Microprocesador implementado en la tarjeta Basys 2 de Digilent.
151