Manual De Referencia BASYS 2x 2 8E 8S

User Manual:

Open the PDF directly: View PDF PDF.
Page Count: 48

DownloadManual De Referencia BASYS 2x 2-8E-8S
Open PDF In BrowserView PDF
Universidad Politécnica de Madrid
ETSI de Telecomunicación
Departamento de Ingeniería Electrónica

Circuitos Electrónicos (CELT)

Manual de referencia de la tarjeta
BASYS 2

Álvaro de Guzmán Fernández

Manual de referencia tarjeta BASYS 2

Manual de referencia de la tarjeta BASYS 2

Índice general
Pág
Introducción .........................................................................................................

3

Descripción general de la tarjeta BASYS 2 ............................................................

4

Síntesis de circuitos mediante la tarjeta BASYS 2 ................................................

5

El equipo de desarrollo del laboratorio ................................................................

6

La estructura básica de un diseño VHDL ..............................................................

7

Ejemplo 1: Encendido de un LED mediante un conmutador ........................

7

Ejemplo 2: Utilización del reloj de la FPGA. ..................................................

8

Ejemplo 3: Visualización de dos cifras diferentes en dos displays. Las
cifras hexadecimales se introducen mediante los conmutadores. ...............

9

Ejemplo 4: Contador rotatorio ......................................................................

13

Entradas y salidas externas ..................................................................................

21

Ejemplo 5: Observación en el osciloscopio de señales rápidas del circuito
VHDL ..............................................................................................................

23

Ejemplo 6: Observación de señales internas del circuito..............................

25

Empleo de señales de reloj externas (diferentes de CLK = 50 MHz) ....................

26

Ejemplo 7: Diseño de un flip‐flop JK con su entrada de reloj conectada a
un pulsador ....................................................................................................

26

Ejemplo 8: Utilización de una entrada externa para el desarrollo de un
frecuencímetro ..............................................................................................

28

Utilización del entorno ISE ...................................................................................

37

Simulación de circuitos mediante ISIM ................................................................

39

1. Simulación de circuitos secuenciales (síncronos con una señal de
entrada de reloj) ..........................................................................................

39

2. Simulación de circuitos combinacionales .................................................

43

Volcado del “bit stream” sobre la FPGA para sintetizar el circuito ......................

47

Bibliografía ............................................................................................................

48

2

Manual de referencia tarjeta BASYS 2

Introducción
Esta guía pretende resumir los conceptos básicos de la utilización de la tarjeta BASYS2 y
presentar unas directrices generales para el uso de la herramienta ISE, de tal forma que el
alumno pueda empezar a utilizar las herramientas de desarrollo del laboratorio en un corto
periodo de tiempo.
En ningún caso se pretende que este documento sea una descripción exhaustiva del lenguaje
VHDL o del funcionamiento completo del ISE. Para ello remitimos al lector a los libros y
manuales correspondientes que se detallan al final en la bibliografía adjunta.
Se recomienda que utilice los ejemplos que aparecen en esta guía para practicar en el manejo
de las herramientas. También se recomienda sintetizar dichos ejemplos e incluso que pruebe a
modificar su funcionamiento nominal. De esta manera podrá familiarizarse con el equipo de
diseño del laboratorio y aumentar su eficiencia a la hora de desarrollar el prototipo que se
exige en la asignatura.
La guía comienza con una descripción de la tarjeta BASYS2, de sus características y
particularidades ilustradas a través de ejemplos. Por último se dan algunas ideas sobre el uso
de la herramienta ISE y sobre la carga de los ficheros de configuración de la FPGA (“bit
stream”).

3

Manual de referencia tarjeta BASYS 2

Descripción general de la tarjeta BASYS 2

La tarjeta BASYS 2 es una tarjeta de desarrollo fabricada por la compañía DIGILENT que
contiene una FPGA modelo Spartan 3E de XILINX. Está diseñada para el aprendizaje de la
síntesis de circuitos de complejidad media utilizando un entorno de desarrollo profesional.
Además de la citada FPGA, esta tarjeta contiene una serie de recursos que pueden ser
utilizados en los diseños de los circuitos. Concretamente contiene:







4 pulsadores
8 conmutadores
8 LEDS
4 displays de 7 segmentos
Un conector de teclado de PC
Una salida de vídeo VGA

Todos estos recursos se encuentran conectados a las patillas de la FPGA de la forma que se
indica en la siguiente figura:

Además la FPGA posee una entrada conectada a un reloj con una frecuencia de 50 MHz que se
corresponde con la patilla M6.

4

Manual de referencia tarjeta BASYS 2
En dicha figura se han omitido intencionadamente el conector de teclado y la salida VGA por
no ser necesarias para las aplicaciones que se pretenden realizar en esta asignatura.
De esta manera, el valor lógico proporcionado por el pulsador BTN0, se leerá en la patilla G12
de la FPGA. Del mismo modo, para activar el LED LD0, es necesario poner un valor lógico ‘1’ en
la patilla M5.
Además de los recursos integrados en la tarjeta, existe la posibilidad de utilizar entradas y
salidas externas, las cuales también se encuentran conectadas a las patillas de la FPGA y que se
encuentran disponibles en los conectores externos del entrenador presente en cada puesto
del laboratorio (conectores marcados como ENTRADAS DIGITALES y SALIDAS DIGITALES). En el
enunciado de cada práctica se indicarán las patillas concretas de la FPGA que se corresponden
con estas entradas y salidas.

Síntesis de circuitos mediante la tarjeta BASYS 2
La síntesis de circuitos se realizará mediante el lenguaje de descripción hardware VHDL. Se
compilará utilizando el entorno ISE de XILINX que se encontrará disponible en el ordenador de
cada puesto del laboratorio. Este entorno es capaz de crear un archivo para la configuración de
la FPGA a partir del código VHDL que se escriba (archivo de “bit stream” con extensión .bit).
Dicho archivo debe ser cargado en la tarjeta BASYS 2. Esto hace que el hardware interno de la
FPGA se configure para seguir las especificaciones hardware descritas.
Para volcar el contenido del archivo en la FPGA y configurarla es necesario utilizar el programa
ADEPT de DIGILENT, el cual también estará disponible en el ordenador de cada puesto.
Por tanto, la secuencia de síntesis de un circuito deberá seguir necesariamente los siguientes
pasos:
1. Escribir un código en VHDL que describa el hardware que queremos sintetizar.
Recuerde que ESTAMOS SINTETIZANDO HARDWARE y que por tanto el VHDL NO ES UN
LENGUAJE DE PROGRAMACIÓN, SINO UN LENGUAJE DE DESCRIPCIÓN HARDWARE
2. Simulación del circuito para estudiar su comportamiento antes de su síntesis en la
FPGA. Esto le ayudará a depurar posibles errores que puedan existir en el código.
3. Compilar dicho código y generar el archivo de “bit stream”. Evidentemente el archivo
no se generará si el programa tiene errores.
4. Una vez generado el fichero de “bit stream”, deberá utilizarse el programa ADEPT para
volcarlo en la FPGA.
5. En este momento, la FPGA se convierte en un circuito que deberá realizar la tarea que
haya sido descrita mediante el VHDL.

5

Manual de referencia tarjeta BASYS 2

El equipo de desarrollo del laboratorio
En el laboratorio se dispone de un equipo de desarrollo que consiste en un armazón metálico
con tapa transparente el cual contiene una tarjeta BASYS2 y algunos circuitos de protección
para evitar que pueda ser dañada por causa de malas conexiones o cortocircuitos. Los recursos
de la tarjeta pueden ser accedidos desde el exterior (microinterruptores y pulsadores).
El citado armazón está conectado a su vez a una tabla de madera que posee varios conectores,
un teclado y un display. Los conectores se emplean para acceder a las entradas y salidas
externas de la tarjeta BASYS 2 y serán descritos con detalle más adelante en este documento.
La fotografía siguiente muestra la disposición de los elementos que integran el equipo de
desarrollo.

El equipo de desarrollo (armazón azul) posee un interruptor en la parte posterior. Dicho
interruptor deberá estar encendido para que el equipo funcione correctamente. Asegúrese
también que los cables planos se encuentran conectados a los conectores ENTRADAS y
SALIDAS del armazón azul.

6

Manual de referencia tarjeta BASYS 2

La estructura básica de un diseño VHDL
Un diseño VHDL consiste en la especificación de un hardware concreto que se quiere sintetizar
en el interior de la FPGA. Para escribir el código VHDL se utilizará el editor del entorno ISE, y
serán necesarios obligatoriamente los siguientes archivos:
1. Uno o varios archivos conteniendo el código VHDL, (dependiendo de su complejidad a
veces es más sencillo separar el código en varios ficheros independientes). En estos
archivos se declararán entidades (“entity”) cuyas entradas y salidas tendrán nombres
arbitrarios elegidos por el desarrollador.
2. Un archivo de asociaciones donde se le dice al compilador qué patillas de la FPGA se
corresponden con cada entrada y salida declaradas en las entidades que componen el
circuito. Este fichero es IMPRESCINDIBLE para generar el “bit stream”. La sintaxis
empleada en este fichero es muy sencilla y se describe en los ejemplos siguientes.
Ejemplo 1: Encendido de un LED mediante un conmutador.
El objetivo de este ejemplo es demostrar cómo se sintetiza un circuito que sea capaz de
reflejar en un LED el valor lógico proporcionado por un conmutador. Se utilizarán los recursos
de la tarjeta BASYS 2.
Se realizará con dos ficheros: uno de código VHDL y otro de asociaciones.
FICHERO PRUEBA_LED.VHD (fichero de código VHDL)
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity circuito is
port (
CONMUT : in
STD_LOGIC;
LED
: out
STD_LOGIC
);
end circuito;

-- Conmutador conectado a una entrada
-- LED conectado a una salida

architecture a_circuito of circuito is
begin
LED<=CONMUT;
end a_circuito;

FICHERO DE ASOCIACIONES: ASOCIACIONES.UCF
NET "CONMUT" LOC = "P11"; # Conmutador 0
NET "LED" LOC = "M5";
# LED0

Con estos dos ficheros se puede ya compilar el código y obtener un “bit stream”. En el fichero
VHDL declaramos una entidad llamada “circuito” con una entrada llamada CONMUT y una
salida llamada LED. En su descripción funcional, decimos que dicha salida se corresponde con
la entrada (de esta manera el valor del LED variará según el valor digital del conmutador). Es
por tanto un circuito combinacional. En el fichero de asociaciones indicamos cuáles son las
patillas de la FPGA que se asocian físicamente con la entrada y la salida de la entidad. Fíjese

7

Manual de referencia tarjeta BASYS 2
que se asocian exactamente con las patillas donde se encuentran conectados los recursos de la
tarjeta BASYS 2.
Ejemplo 2: Utilización del reloj de la FPGA.
La FPGA posee una entrada conectada a un reloj de 50 MHz en la patilla M6. Este reloj puede
ser utilizado para el diseño de circuitos secuenciales síncronos. En este ejemplo utilizaremos el
reloj para dividir su frecuencia mediante un contador visualizando la salida en un LED.
Utilizaremos un proceso en cuya lista de sensibilidad se coloca la señal de reloj. Con cada
flanco activo se incrementará un contador. Queremos que el LED parpadee con un periodo
encendido/apagado de 500 ms cada uno.
Se utilizarán igualmente dos ficheros, uno VHDL y otro de asociaciones.
FICHERO DIV_RELOJ.VHD (fichero de código VHDL)
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity circuito is
Port ( CLK : in STD_LOGIC;
SAL : out STD_LOGIC);
end circuito;

-- Reloj de entrada a la FPGA
-- salida del circuito para conectar al LED

architecture a_circuito of circuito is
signal contador : STD_LOGIC_VECTOR (31 downto 0);
signal flag : STD_LOGIC;
begin
PROC_CONT : process (CLK)
begin
if CLK'event and CLK='1' then
contador<=contador + '1';
if contador=25000000 then
-- el reloj tiene un periodo de 20 ns (50 MHz)
flag<=not flag;
-- tras 25e6 cuentas habrán transcurrido 500 ms
contador<=(others=>'0');
end if;
end if;
end process;
SAL<=flag;
end a_circuito;

FICHERO DE ASOCIACIONES: ASOCIACIONES.UCF
NET "CLK" LOC = "M6"; # Reloj de la FPGA
NET "SAL" LOC = "M5"; # LED0

En este caso se trata de un circuito secuencial con un proceso que sincroniza el sistema.
Esta es la estructura básica cuando se trata de un circuito de muy poca complejidad como los
presentados en los ejemplos 1 y 2. A continuación se muestra un ejemplo más complejo con
varios ficheros VHDL.

8

Manual de referencia tarjeta BASYS 2
Ejemplo 3: Visualización de dos cifras diferentes en dos displays. Las cifras hexadecimales se
introducen mediante los conmutadores.
En este caso queremos visualizar dos cifras diferentes en dos de los displays disponibles en la
tarjeta BASYS 2. El problema de este ejemplo reside en el hecho de que los 7 valores binarios
para excitar los distintos segmentos son compartidos por los 4 displays simultáneamente.
Existen, no obstante, 4 señales (las correspondientes a las salidas F12, J12, M13 y K14) que
controlan la activación independiente de cada uno de los displays. Para visualizar cifras
diferentes en cada uno, es necesario activar los segmentos correspondientes a la cifra de uno
de los displays junto con su señal de activación, a continuación hacer lo mismo con el siguiente
y así sucesivamente. Si esta secuencia se repite más de 25 veces por segundo, el ojo no es
capaz de percibir el parpadeo, pudiendo representarse varias cifras diferentes.
Para este ejemplo necesitaremos los siguientes elementos (ver figura):




Un decodificador de binario a 7 segmentos.
Un multiplexor de dos entradas de 4 bits para seleccionar la cifra a visualizar
Un elemento de control que realice el refresco periódico de los displays.

J12
F12

Vcc

Recursos de
La tarjeta
A

Señales CA a CG

G

E

Control

B
C

D

CLK

Decod
Bin a 7seg
s_datos

s_control

Circuito a
diseñar

F

S
E0

SAL
Multiplexor

Conmutadores
(P11 a B4)

Nomenclatura
de segmentos

E1

Conmutadores
(G3 a N3)

Visualizaremos todos los valores entre 0000 y 1111 utilizando para ello cifras hexadecimales
tal como se muestra en la figura. Utilizaremos los recursos de la tarjeta: 8 conmutadores (4
para la primera cifra y 4 para la segunda), dos displays y el reloj para controlar la visualización.
En este caso, la manera más apropiada de describir este hardware consiste en realizar un
fichero independiente por cada elemento, con descripciones funcionales de dichos elementos
y un fichero maestro con una descripción estructural de interconexión entre ellos. Además
también es necesario escribir el fichero de asociaciones.
El ejemplo constaría por tanto de 4 ficheros VHDL más uno de asociaciones.
9

Manual de referencia tarjeta BASYS 2

FICHERO decod7s.vhd
Library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity decod7s is
Port ( D : in STD_LOGIC_VECTOR (3 downto 0); -- entrada de datos en binario
S : out STD_LOGIC_VECTOR (0 to 6));
-- salidas para los segmentos
end decod7s;
architecture a_decod7s of decod7s is
begin
with D select S <=
"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",
"0001100" when "1001",
"0001000" when "1010",
"1100000" when "1011",
"0110001" when "1100",
"1000010" when "1101",
"0110000" when "1110",
"0111000" when "1111",
"1111111" when others;

a
f
e

b
g

c

d

end a_decod7s;

Este primer fichero contiene la descripción funcional de un decodificador de binario a 7
segmentos. Debe tenerse en cuenta que según las conexiones de la figura los segmentos se
encienden con un “0” en la patilla correspondiente.
FICHERO MUX.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity MUX is
Port ( E0 : in STD_LOGIC_VECTOR (3 downto 0); -- Entrada de datos 0
E1 : in STD_LOGIC_VECTOR (3 downto 0); -- Entrada de datos 1
S : in STD_LOGIC;
-- Entrada de control
SAL : out STD_LOGIC_VECTOR (3 downto 0)); -- Salida
end MUX;
architecture a_MUX of MUX is
begin
with S select SAL<=
E0 when '0',
E1 when '1',
E0 when others;
end a_MUX;

Este fichero describe un multiplexor de 2 entradas de 4 bits y una salida. La señal de control es
S.
10

Manual de referencia tarjeta BASYS 2
FICHERO control.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity control is
Port ( CLK : in STD_LOGIC;
DSP0 : out STD_LOGIC;
DSP1 : out STD_LOGIC;
SCONTROL : out STD_LOGIC);
end control;

-----

reloj
señal
señal
señal

de la FPGA
para activar el display 0
para activar el display 1
para controlar el mux.

architecture a_control of control is
signal contador : STD_LOGIC_VECTOR (31 downto 0);
signal salida : STD_LOGIC;
begin
process (CLK)
begin
if CLK'event and CLK='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;
SCONTROL<=salida;
DSP0<=salida;
DSP1<=not salida;
end a_control;

Este fichero describe un circuito secuencial de control. Un proceso divide la frecuencia del reloj
utilizando un contador. Cada 10 ms invierte el valor lógico de la señal ‘salida’.
En paralelo con este proceso la salida SCONTROL toma el valor de la señal ‘salida’, mientras
que las salidas DSP0 y DSP1 toman valores lógicos opuestos dependiendo de la señal ‘salida’.
Con este código se describe un elemento que alterna el valor de SCONTROL cada 10 ms. Al
mismo tiempo invierte los valores de DSP0 y DSP1 que son las señales que activarán los
displays. De esta manera uno de ellos está activo cuando se selecciona una entrada del
multiplexor. El otro se activa cuando se selecciona la otra entrada. (Tenga en cuenta que según
la figura, los displays se activan cuando la señal de control DSP correspondiente es ‘0’).

J12
F12
‘0’

Vcc

‘1’

J12
F12
‘1’

Control

Vcc

‘0’

Control

CLK

CLK

Decod
Bin a 7seg
‘0’

Decod
Bin a 7seg
‘1’

S
E0

SAL
Multiplexor

S
E1

E0

SAL
Multiplexor

E1

El circuito de control alterna
estas dos configuraciones cada 10 ms

11

Manual de referencia tarjeta BASYS 2
FICHERO circuito.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity circuito is
Port ( CIFRA0 : in STD_LOGIC_VECTOR (3 downto
CIFRA1 : in STD_LOGIC_VECTOR (3 downto
SEG7 : out STD_LOGIC_VECTOR (0 to 6);
DISP1 : out STD_LOGIC;
DISP2 : out STD_LOGIC;
CLK : in STD_LOGIC);
end circuito;

0); -- entrada de cifra 0
0); -- entrada de cifra 1
-- salidas para los displays
-- salida para activar display 1
-- salida para activar display 2
-- reloj de la FPGA

architecture a_circuito of circuito is

-- en este caso se trata de una

component decod7s
Port ( D : in STD_LOGIC_VECTOR (3 downto 0);
S : out STD_LOGIC_VECTOR (0 to 6));
end component;

-- descripción estructural

component MUX
Port ( E0 : in STD_LOGIC_VECTOR (3 downto 0);
E1 : in STD_LOGIC_VECTOR (3 downto 0);
S : in STD_LOGIC;
SAL : out STD_LOGIC_VECTOR (3 downto 0));
end component;
component control
Port ( CLK : in STD_LOGIC;
DSP0 : out STD_LOGIC;
DSP1 : out STD_LOGIC;
SCONTROL : out STD_LOGIC);
end component;
signal s_control : STD_LOGIC;
signal s_datos
: STD_LOGIC_VECTOR (3 downto 0);
begin
U1 : control
port map (
CLK => CLK,
DSP0 => DISP1,
DSP1 => DISP2,
SCONTROL => s_control
);
U2 : MUX
port map (
E0 => CIFRA0,
E1 => CIFRA1,
S => s_control,
SAL => s_datos
);
U3 : decod7s
port map (
D => s_datos,
S => SEG7
);
end a_circuito;

Este es el fichero maestro que describe la interconexión entre los distintos elementos. Se
describe un circuito principal cuyas entradas son las dos cifras binarias de 4 bits y la señal de
reloj. Sus salidas son las señales de activación de los displays, y los valores de los segmentos.
Cuando una entrada o salida de un componente se cablea directamente a una entrada o salida
del circuito principal, se asigna directamente en el “port map”. Si se trata de interconexiones
12

Manual de referencia tarjeta BASYS 2
entre elementos entonces deben utilizarse señales adicionales declaradas también en el
fichero.
FICHERO DE ASOCIACIONES: asociaciones.ucf
NET "CLK" LOC = "M6"; # RELOJ DE LA FPGA
NET
NET
NET
NET
NET
NET
NET

"SEG7<0>"
"SEG7<1>"
"SEG7<2>"
"SEG7<3>"
"SEG7<4>"
"SEG7<5>"
"SEG7<6>"

LOC
LOC
LOC
LOC
LOC
LOC
LOC

=
=
=
=
=
=
=

"L14";
"H12";
"N14";
"N11";
"P12";
"L13";
"M12";

#Segmento
#Segmento
#Segmento
#Segmento
#Segmento
#Segmento
#Segmento

a
b
c
d
e
f
g

NET
NET
NET
NET

"CIFRA0<0>"
"CIFRA0<1>"
"CIFRA0<2>"
"CIFRA0<3>"

LOC
LOC
LOC
LOC

=
=
=
=

"P11"; # CONMUTADOR 0
"L3";
"K3";
"B4"; # CONMUTADOR 3

NET
NET
NET
NET

"CIFRA1<0>"
"CIFRA1<1>"
"CIFRA1<2>"
"CIFRA1<3>"

LOC
LOC
LOC
LOC

=
=
=
=

"G3"; # CONMUTADOR 4
"F3";
"E2";
"N3"; # CONMUTADOR 7

NET "DISP1" LOC = "F12"; # ACTIVACIÓN DISP 1
NET "DISP2" LOC = "J12"; # ACTIVACIÓN DISP 2

Por último, las entradas y salidas del circuito principal deben asociarse con los recursos de la
tarjeta. Esto se hace mediante el correspondiente fichero de asociaciones que se muestra. La
nomenclatura SEG7 se corresponde con el bit N de la salida SEG7. Lo mismo sucede con
CIFRA0 y CIFRA1.

Con este circuito se representan las cifras hexadecimales correspondientes a los conmutadores
en los dos displays de la derecha. Sin embargo los otros dos presentan también cifras como
consecuencia de no estar desactivados. Un posible ejercicio consiste en modificar el archivo de
descripción estructural (cricuito.vhd) y el fichero de asociaciones para que se mantengan
desactivados los dos displays no utilizados.

Ejemplo 4: Contador rotatorio
Se muestra a continuación el desarrollo de un contador rotatorio. Se trata de un contador que
utiliza los 4 displays y que genera la siguiente secuencia en los mismos: 0000, 0001, 0012,
0123, 1234, 2345, 3456, 4567, 5678, 6789, 7890, 8901, 9012, 0123, … repitiéndose la
secuencia constantemente. Los cambios se producen cada segundo.
El desarrollo de este contador supone el empleo de varios módulos digitales: un contador de
décadas, un registro de desplazamiento de 4 bits, un multiplexor paralelo con 4 entradas de 4
bits, un decodificador BCD a 7 segmentos y algunos elementos adicionales que se muestran en
la figura siguiente:

13

Manual de referencia tarjeta BASYS 2

FPGA

AN0
AN1
AN2
AN3

Vcc

S1

S0

CONTROL

A…G
DECOD 7SEG
DIN
N_Y
N_S

CLK

DIVISOR
RELOJ

CLK_1s

CLK_1ms

Q3
N_C1S

E0
N_E0

N_E1

E3

N_E3

N_C1MS

Y
MUX x4
E2
E1
N_E2

S1
S0

Q2
Q1
Q0
REG_DESP x4
E
N_Q

Q
CONTADOR
DÉCADAS

Todo lo que se encuentra dibujado dentro de la línea punteada son los circuitos que debemos
implementar en la FPGA. Lo que se encuentra fuera de dicha línea son los recursos de la tarjeta
que emplearemos en el fichero de asociaciones.
El divisor del reloj genera dos relojes adicionales, uno con periodo de 1 ms y otro con periodo
de 1 s. El primero se emplea para refrescar los displays periódicamente, puesto que como ya
se ha mencionado todos ellos comparten las líneas A..G y por lo tanto es necesario presentar
las cifras una a una de forma muy rápida. El segundo se utiliza para incrementar el contador y
desplazar las cifras hacia la izquierda.
El refresco de los displays se realiza de una forma similar a la descrita en el ejemplo 3, aunque
con 4 entradas en lugar de 2.
El diseño completo de este contador rotatorio está compuesto por varios módulos, los cuales
se describen con detalle a continuación:
14

Manual de referencia tarjeta BASYS 2
FICHERO contador.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity contador is
Port ( CLK : in STD_LOGIC;
-- entrada de reloj
Q
: out STD_LOGIC_VECTOR (3 downto 0)); -- salida de datos
end contador;
architecture a_contador of contador is
signal QS : STD_LOGIC_VECTOR (3 downto 0); -- señal que almacena el valor del contador
begin
SYNC : process (CLK)
begin
if (CLK'event and CLK='1') then
QS<=QS+1;
if QS=9 then
QS<="0000";
end if;
end if;
end process;
Q<=QS;
end a_contador;

-- con cada flanco activo se incrementa
-- si llega a 9 se pone a 0

-- actualización de la salida

Este fichero define un contador de décadas. Con cada flanco de reloj el contador se
incrementa y cuando esta cuenta llega a 9, el contador vuelve a 0 en el siguiente ciclo de reloj.
FICHERO reg_desp4.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity reg_desp4
Port ( CLK :
E
:
Q0 :
Q1 :
Q2 :
Q3 :
end reg_desp4;

is
in
in
out
out
out
out

STD_LOGIC;
STD_LOGIC_VECTOR
STD_LOGIC_VECTOR
STD_LOGIC_VECTOR
STD_LOGIC_VECTOR
STD_LOGIC_VECTOR

(3
(3
(3
(3
(3

downto
downto
downto
downto
downto

0);
0);
0);
0);
0));

-------

entrada de reloj
entrada de datos
salida Q0
salida Q1
salida Q2
salida Q3

architecture a_reg_desp4 of reg_desp4 is
signal
signal
signal
signal

QS0
QS1
QS2
QS3

:
:
:
:

STD_LOGIC_VECTOR
STD_LOGIC_VECTOR
STD_LOGIC_VECTOR
STD_LOGIC_VECTOR

(3
(3
(3
(3

downto
downto
downto
downto

begin
process (CLK)
begin
if (CLK'event and CLK='1') then
QS3<=QS2;
QS2<=QS1;
QS1<=QS0;
QS0<=E;
end if;
end process;
Q0<=QS0;
Q1<=QS1;
Q2<=QS2;
Q3<=QS3;

0);
0);
0);
0);

-----

señal
señal
señal
señal

que
que
que
que

almacena
almacena
almacena
almacena

el
el
el
el

valor
valor
valor
valor

de
de
de
de

Q0
Q1
Q2
Q3

-- con cada flanco activo
-- se desplazan todas las salidas

-- y se copia el valor de la entrada en Q0

-- actualización de las salidas

end a_reg_desp4;

15

Manual de referencia tarjeta BASYS 2
Este fichero contiene la descripción de un registro de desplazamiento que desplaza palabras de
4 bits. Con cada flanco de reloj, los datos de la entrada E son copiados en la salida Q0, mientras
el resto de las salidas son desplazadas hacia la izquierda.
FICHERO MUX4.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity mux4 is
Port ( E0 :
E1 :
E2 :
E3 :
Y :
S :

in
in
in
in
out
in

STD_LOGIC_VECTOR
STD_LOGIC_VECTOR
STD_LOGIC_VECTOR
STD_LOGIC_VECTOR
STD_LOGIC_VECTOR
STD_LOGIC_VECTOR

(3
(3
(3
(3
(3
(1

downto
downto
downto
downto
downto
downto

0);
0);
0);
0);
0);
0));

-------

entrada E0
entrada E1
entrada E2
entrada E3
salida Y
entradas de control

end mux4;
architecture a_mux4 of mux4 is
begin
Y <= E0
E1
E2
E3

when
when
when
when

S="00" else
S="01" else
S="10" else
S="11";

-- se selecciona la salida en función de las entradas
-- de control

end a_mux4;

Como puede verse, en este caso se trata de un multiplexor de 4 entradas de 4 bits (E0..E3)
cuyas entradas de control son S0 y S1 y la salida es Y.
FICHERO decod7s.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity decod7s is
port ( DIN
: in STD_LOGIC_VECTOR (3 downto 0);
-- entrada de datos
S7SEG : out STD_LOGIC_VECTOR (0 to 6));
-- salidas 7seg (abcdefg)
end decod7s;
architecture a_decod7s of decod7s is
begin
with DIN select S7SEG <=
"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",
"0001100" when "1001",
"1111111" when others;
end a_decod7s;

a
f
e

b
g

c

d

Este fichero define un decodificador de binario a 7 segmentos donde las entradas pueden
tomar los valores decimales 0 a 9. En otro caso se presenta un valor que apaga todos los
segmentos.

16

Manual de referencia tarjeta BASYS 2
FICHERO control.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity control is
Port ( CLK : in STD_LOGIC;
-- entrada de reloj
AN : out STD_LOGIC_VECTOR (3 downto 0); -- activación displays
S : out STD_LOGIC_VECTOR (1 downto 0)); -- selección en el MUX
end control;
architecture a_control of control is
signal SS

: STD_LOGIC_VECTOR (1 downto 0);

begin
process (CLK)
begin
if (CLK'event and CLK='1') then
SS<=SS+1;
end if;
end process;
S<=SS;
AN<="0111"
"1011"
"1101"
"1110"

when
when
when
when

SS="00" else
SS="01" else
SS="10" else
SS="11";

-- genera la secuencia 00,01,10 y 11

-- activa cada display en function del valor de SS

end a_control;

Este módulo secuencial utiliza una señal de reloj para incrementar un contador de 2 bits que
repite la secuencia 00, 01, 10 y 11 indefinidamente. Con esta secuencia se genera una señal AN
que activa cada uno de los displays (mediante un ‘0’). Esto se empleará para realizar el refresco
de los displays. La secuencia de dos bits conmutará las entradas del multiplexor y las señales
AN activarán los displays en consonancia, de un modo similar al del ejemplo 3 pero con 4
displays.

FICHERO div_reloj.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity div_reloj is
Port ( CLK : in STD_LOGIC;
CLK_1S : out STD_LOGIC;
CLK_1MS : out STD_LOGIC);
end div_reloj;
architecture a_div_reloj of div_reloj is
signal
signal
signal
signal

div1
: STD_LOGIC_VECTOR (31 downto 0); -- contador
div2
: STD_LOGIC_VECTOR (31 downto 0); -- contador
S_1S
: STD_LOGIC;
-- señal de
S_1MS : STD_LOGIC;
-- señal de

para dividir el reloj
para dividir el reloj
periodo 1s
period 1ms

17

Manual de referencia tarjeta BASYS 2
begin
DIV : process (CLK)
begin
if (CLK'event and CLK='1') then
div1<=div1+1;
-- en cada flanco de CLK se incrementa div1
div2<=div2+1;
-- en cada flanco de CLK se incrementa div2

if div1=25000000 then
S_1S<=not S_1S;
div1<=(others=>'0');
end if;

-- cuando llega a este valor han transcurrido 500ms
-- se conmuta el valor de S_1S

if div2=25000 then
S_1MS<=not S_1MS;
div2<=(others=>'0');
end if;

-- div2=2500 cuando han transcurrido 500 us
-- se conmuta el valor de S_1MS

end if;
end process;

CLK_1S<=S_1S;
CLK_1MS<=S_1MS;
end a_div_reloj;

Este es otro módulo secuencial en el que se utiliza el reloj del sistema de 50 MHz para generar
los relojes de menor frecuencia que deben utilizarse en este circuito. Mediante dos contadores
(div1 y div2) se realiza la división. Cuando uno de ellos cuenta 25.000.000 ciclos, habrán
transcurrido 500 ms. En ese momento se conmuta el valor de la señal S_1S, por lo que la
frecuencia que aparecerá en esta señal será de 1 Hz. En el otro caso, se conmuta el valor de
S_1MS cada 25000 cuentas, por lo que la frecuencia de esta señal será de 1 KHz.

FICHERO circuito.vhd

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity circuito is
Port ( CLK : in STD_LOGIC;
SEG7 : out STD_LOGIC_VECTOR (0 to 6);
AN
: out STD_LOGIC_VECTOR (3 downto 0));
end circuito;
architecture a_circuito of circuito is
signal
signal
signal
signal
signal
signal
signal
signal
signal

N_E0 :
N_E1 :
N_E2 :
N_E3 :
N_Y :
N_Q :
N_S :
N_C1S
N_C1MS

STD_LOGIC_VECTOR
STD_LOGIC_VECTOR
STD_LOGIC_VECTOR
STD_LOGIC_VECTOR
STD_LOGIC_VECTOR
STD_LOGIC_VECTOR
STD_LOGIC_VECTOR
: STD_LOGIC;
: STD_LOGIC;

(3
(3
(3
(3
(3
(3
(1

downto
downto
downto
downto
downto
downto
downto

0);
0);
0);
0);
0);
0);
0);

component contador
Port ( CLK : in STD_LOGIC;
Q
: out STD_LOGIC_VECTOR (3 downto 0));
end component;

18

Manual de referencia tarjeta BASYS 2
component reg_desp4
Port ( CLK : in STD_LOGIC;
E
: in STD_LOGIC_VECTOR (3 downto 0);
Q0 : out STD_LOGIC_VECTOR (3 downto 0);
Q1 : out STD_LOGIC_VECTOR (3 downto 0);
Q2 : out STD_LOGIC_VECTOR (3 downto 0);
Q3 : out STD_LOGIC_VECTOR (3 downto 0));
end component;
component mux4
Port ( E0 : in
E1 : in
E2 : in
E3 : in
Y
: out
S
: in
end component;

STD_LOGIC_VECTOR (3 downto 0);
STD_LOGIC_VECTOR (3 downto 0);
STD_LOGIC_VECTOR (3 downto 0);
STD_LOGIC_VECTOR (3 downto 0);
STD_LOGIC_VECTOR (3 downto 0);
STD_LOGIC_VECTOR (1 downto 0));

component decod7s
port ( DIN
: in STD_LOGIC_VECTOR (3 downto 0);
S7SEG : out STD_LOGIC_VECTOR (0 to 6));
end component;
component control
Port ( CLK : in STD_LOGIC;
AN : out STD_LOGIC_VECTOR (3 downto 0);
S
: out STD_LOGIC_VECTOR (1 downto 0));
end component;
component div_reloj
Port ( CLK
: in STD_LOGIC;
CLK_1S
: out STD_LOGIC;
CLK_1MS : out STD_LOGIC);
end component;
begin
U1 : decod7s
port map (
DIN=>N_Y,
S7SEG=>SEG7
);
U2 : mux4
port map (
E0=>N_E0,
E1=>N_E1,
E2=>N_E2,
E3=>N_E3,
Y=>N_Y,
S=>N_S
);
U3 : reg_desp4
port map (
CLK=>N_C1S,
E=>N_Q,
Q0=>N_E0,
Q1=>N_E1,
Q2=>N_E2,
Q3=>N_E3
);
U4 : contador
port map (
CLK=>N_C1S,
Q=>N_Q
);
U5 : control
port map (
CLK=>N_C1MS,
AN=>AN,
S=>N_S
);

19

Manual de referencia tarjeta BASYS 2
U6 : div_reloj
port map (
CLK=>CLK,
CLK_1S=>N_C1S,
CLK_1MS=>N_C1MS
);
end a_circuito;

Por último, en este código VHDL se realiza la descripción estructural del circuito completo,
detallando la interconexión entre los distintos componentes. Las señales declaradas al
principio de la arquitectura se corresponden con los nodos internos del circuito que no están
directamente conectados a las entradas o salidas del mismo.

FICHERO DE ASOCIACIONES asociaciones.ucf
# Señal de reloj del sistema
NET "CLK" LOC = "M6"; # Reloj del sistema de 50 MHz
# DISPLAY DE 7 SEGMENTOS
NET
NET
NET
NET
NET
NET
NET

"SEG7<0>"
"SEG7<1>"
"SEG7<2>"
"SEG7<3>"
"SEG7<4>"
"SEG7<5>"
"SEG7<6>"

LOC
LOC
LOC
LOC
LOC
LOC
LOC

=
=
=
=
=
=
=

"L14";
"H12";
"N14";
"N11";
"P12";
"L13";
"M12";

#
#
#
#
#
#
#

SEÑAL
SEÑAL
SEÑAL
SEÑAL
SEÑAL
SEÑAL
SEÑAL

=
=
=
=
=
=
=

CA
CB
CC
CD
CE
CF
CG

# SEÑALES DE ACTIVACIÓN DE LOS DISPLAYS
NET
NET
NET
NET

"AN<0>"
"AN<1>"
"AN<2>"
"AN<3>"

LOC
LOC
LOC
LOC

=
=
=
=

"K14";
"M13";
"J12";
"F12";

#
#
#
#

SEÑAL
SEÑAL
SEÑAL
SEÑAL

=
=
=
=

AN0
AN1
AN2
AN3

Este es el fichero de asociaciones correspondiente al circuito anterior donde se asignan las
entradas y salidas a los diferentes recursos de la tarjeta. Solamente nos hacen falta en este
caso el reloj del sistema y los displays.

20

Manual de referencia tarjeta BASYS 2

Entradas y salidas externas
Además de los recursos conectados a algunas de las salidas de la FPGA, en la tarjeta BASYS2
existen también entradas y salidas externas que pueden utilizarse para conectar la tarjeta con
circuitos exteriores.
Estas entradas y salidas se encuentran disponibles en el tablero de madera conectado a la caja
azul que contiene la tarjeta. La figura siguiente muestra el esquema del citado tablero. Está
formado por 4 conectores de 13 patillas más un teclado y un display. EL TECLADO Y EL DISPLAY
NO SERÁN UTILIZADOS, POR LO TANTO NO TENGA EN CUENTA SU PRESENCIA.

ENTRADAS

SALIDAS

1 2 3 A
4 5 6 B
7 8 9 C
* 0 # D

DISPLAY

TECLADO

Las entradas se refieren a señales del exterior que entran hacia la FPGA. Las salidas son señales
que proporciona la FPGA hacia el exterior. Se dispone de 8 ENTRADAS y 8 SALIDAS que se
encuentran conectadas a las patillas de la FPGA. Por lo tanto, para emplear estas entradas y
salidas, será necesario incluir su definición en el fichero de asociaciones.
Concretamente, el cableado de estas entradas y salidas, junto con las asociaciones a las
patillas de la FPGA se encuentran detallados en la figura de la página siguiente.

21

Manual de referencia tarjeta BASYS 2

1
2
3
4

5
6
7
8

14
15
16
17

18
19
20
21

C6
B6
C5
B7

A9
B9
A10
C9

C12
A13
C13
D12

Salidas desde la FPGA

B2
A3
J3
B5

Entradas hacia la FPGA

BASYS 2

Nomenclatura patillas FPGA

13

1

GND

26

14

… Cortocircuitados
en vertical
Cortocircuitados
en vertical

Cortocircuitados
en vertical
Cortocircuitados
en vertical

ENTRADAS
DIGITALES

13

1

GND

26

14

SALIDAS
DIGITALES

(Conectores 1 a 8)
(Masa en el 25)

(Conectores 14 a 21)
(Masa en el 25)

Como puede verse en la figura, las entradas están disponibles en el conector superior
izquierdo, siendo las patillas 1 a 8 las líneas de salida y la masa está situada en el terminal 25
del conector inferior.
Las salidas se encuentran disponibles en el conector inferior derecho en las patillas 14 a 21 con
la masa en el terminal 25 del citado conector.
La correspondencia de las líneas de salida y entrada con las patillas de la FPGA es la siguiente:
Entrada
(terminal
conector)
1
2
3
4
5
6
7
8

Patilla FPGA

Salida (terminal
conector)

Patilla FPGA

B2
A3
J3
B5
C6
B6
C5
B7

14
15
16
17
18
19
20
21

A9
B9
A10
C9
C12
A13
C13
D12

ATENCIÓN: EN LAS ENTRADAS DEBERÁN SIEMPRE INTRODUCIRSE TENSIONES DE 0V
Y 5V PARA EL “0” Y EL “1” RESPECTIVAMENTE. IGUALMENTE, LAS SALIDAS
PROPORCIONAN TENSIONES ENTRE 0 Y 5 V.
22

Manual de referencia tarjeta BASYS 2
Cada conector individual está formado por 13 columnas de 2 terminales. Los terminales
verticales están cortocircuitados internamente para facilitar la interconexión con circuitos
exteriores.
Una posible asignación en el fichero de asociaciones podría ser la siguiente:
# ENTRADAS
# -------------NET “E1” LOC = “B2”;
NET “E2” LOC = “A3”; …
…
# SALIDAS
# -------------NET “S9” LOC = “A9”;
NET “S10” LOC = “B9”; …
…
Donde E1, E2, S9 y S10 serían nodos del circuito definido en VHDL.

Ejemplo 5: Observación en el osciloscopio de señales rápidas del circuito VHDL.
A veces puede ser necesario observar una señal interna del circuito VHDL. Para ello es
necesario volcar dicha señal hacia uno de los terminales de salida exterior y medirla con el
osciloscopio.
En el siguiente ejemplo se define un contador binario de 4 bits con salida RCO (“Ripple Carry
Out”) que indica el final de cuenta (se activa cuando el contador alcanza el valor binario
“1111”). La señal de reloj que gobierna el contador es de 10 KHz y se genera a partir del reloj
principal del sistema (50 MHz) por división de frecuencia.
Dado que la frecuencia del reloj es alta, en este caso no podemos volcar las salidas del
contador ni la señal RCO hacia ninguno de los recursos de la tarjeta (LEDS o DISPLAYS), ya que
la alternancia entre 0 y 1 haría que se viesen constantemente encendidos con una luminosidad
intermedia.
Si queremos medir con precisión las frecuencias del reloj, las señales de cada una de las salidas
del contador y la señal RCO, es necesario volcarlas hacia las salidas externas y conectar el
osciloscopio en los terminales correspondientes para visualizarlas.

23

Manual de referencia tarjeta BASYS 2

FICHERO contador.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity contador is
Port ( CLK : in
Q
: out
RCO : out
end contador;

STD_LOGIC;
-- Entrada de reloj
STD_LOGIC_VECTOR (3 downto 0); -- Salidas
STD_LOGIC); -- Salida RCO activa si Q=15

architecture a_contador of contador is
signal flag : STD_LOGIC :='0';
signal divisor : STD_LOGIC_VECTOR (15 downto 0) := "0000000000000000";
signal QS : STD_LOGIC_VECTOR (3 downto 0) := "0000";
begin
SYNC : process (CLK)
begin
if (CLK'event and CLK='1') then
divisor<=divisor+1;
if divisor=2500 then
divisor<=(others=>'0');
flag <= not flag;
end if;
end if;
end process;

-- proceso que divide el reloj

-- tras 2500 cuentas han transcurrido
-- 50 us, luego la frec. de la señal
-- flag será de 10 KHz.

CONT : process (flag)
begin
if (flag'event and flag='1') then
QS<=QS+1;
end if;
end process;
RCO<= QS(3) and
Q <= QS;
end a_contador;

QS(2) and QS(1) and QS(0); -- RCO es 1 cuando Q=15
-- asignamos la señal QS a la salida real

Este fichero describe un contador binario de 4 bits. Con un primer proceso (SYNC), se divide la
frecuencia del reloj de la FPGA de tal manera que genera una señal (flag) con una frecuencia
de 10 KHz. Un segundo proceso (CONT), utiliza esta última para incrementar el contador. La
señal RCO será 1 cuando todas las salidas del contador sean 1 simultáneamente.

FICHERO DE ASOCIACIONES: asociaciones.ucf
NET "CLK" LOC = "M6";

# RELOJ DE LA FPGA

NET
NET
NET
NET
NET

#Salida
#Salida
#Salida
#Salida
#Salida

"Q<0>" LOC = "A9";
"Q<1>" LOC = "B9";
"Q<2>" LOC = "A10";
"Q<3>" LOC = "C9";
"RCO" LOC = "C12";

terminal
terminal
terminal
terminal
terminal

14
15
16
17
18

En este caso, volcamos las salidas del contador (salidas Q y RCO) hacia los terminales del
tablero. Conectando la sonda entre los terminales 14 y 25 (SALIDA) podrá observar la señal
Q(0). El resto de las señales podrán medirse en los terminales 15, 16, 17 y 18.

24

Manual de referencia tarjeta BASYS 2
Ejemplo 6: Observación de señales internas del circuito.
Imagine que en el ejemplo anterior quisiera observar en el osciloscopio la forma de onda de la
señal “flag”. Dicha señal es interna al circuito y por lo tanto no está definida como salida o
entrada en la declaración “entity”, ni puede por tanto asignarse a ningún terminal en el fichero
de asociaciones.
Para visualizar esta señal será necesario modificar el fichero contador.vhd de tal manera que
defina una nueva salida (que llamaremos TP1 “terminal de prueba 1”). Esta salida se asignará a
la señal “flag”. Posteriormente se modificará el fichero asociaciones.ucf para volcar dicha
salida hacia uno de los terminales externos de la FPGA.
FICHERO contador.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity contador is
Port ( CLK : in
Q
: out
RCO : out
TP1 : out
end contador;

STD_LOGIC;
STD_LOGIC_VECTOR (3 downto 0);
STD_LOGIC;
STD_LOGIC ); -- nueva salida (terminal de prueba)

architecture a_contador of contador is
signal flag : STD_LOGIC :='0';
signal divisor : STD_LOGIC_VECTOR (15 downto 0) := "0000000000000000";
signal QS : STD_LOGIC_VECTOR (3 downto 0) := "0000";
begin
SYNC : process (CLK)
begin
if (CLK'event and CLK='1') then
divisor<=divisor+1;
if divisor=2500 then
flag<=not flag;
divisor<=(others=>'0');
end if;
end if;
end process;

-- proceso que divide el reloj

-- tras 2500 cuentas han transcurrido
-- 50 us, luego la frec. de la señal
-- flag será de 10 KHz.

CONT : process (flag)
begin
if (flag'event and flag='1') then
QS<=QS+1;
end if;
end process;
RCO<= QS(3) and
Q <= QS;
TP1<=flag;
end a_contador;

QS(2) and QS(1) and QS(0); -- RCO es 1 cuando Q=15
-- asignamos la señal QS a la salida real
-- asignamos la señal flag a TP1 para medirla

Modificación del fichero del ejemplo 5 para poder visualizar la señal interna “flag”. Las líneas
subrayadas son las añadidas respecto al fichero del ejemplo 5.

25

Manual de referencia tarjeta BASYS 2
FICHERO DE ASOCIACIONES: asociaciones.ucf
NET "CLK" LOC = "M6";

# RELOJ DE LA FPGA

NET
NET
NET
NET
NET
NET

#Salida
#Salida
#Salida
#Salida
#Salida
#Salida

"Q<0>" LOC = "A9";
"Q<1>" LOC = "B9";
"Q<2>" LOC = "A10";
"Q<3>" LOC = "C9";
"RCO" LOC = "C12";
"TP1" LOC = "A13";

terminal
terminal
terminal
terminal
terminal
terminal

14
15
16
17
18
19

Ahora, volcamos las salidas del contador (salidas Q, TP1 y RCO) hacia los terminales del
tablero. Conectando la sonda entre los terminales 19 y 25 (SALIDA) podrá observar la señal
“flag”. El resto de las señales podrán medirse en los terminales 14, 15, 16, 17 y 18.

Empleo de señales de reloj externas (diferentes de CLK = 50 MHz)
En ocasiones puede ser necesario excitar algunos de los componentes secuenciales diseñados
en la FPGA mediante el empleo de señales de reloj diferentes a la señal principal de la tarjeta
BASYS2 (CLK=50 MHz). Por ejemplo, se podría definir un biestable tipo JK donde las entradas J
y K estuviesen conectadas a los conmutadores de la tarjeta y la señal de reloj del biestable
estuviese conectada a uno de los pulsadores.
En estos casos, el compilador VHDL del ISE nos dará un error de implementación puesto que
esta es una práctica poco recomendable que puede dar lugar a fallos en el sistema si el reloj
que se utiliza no es suficientemente fiable (por ejemplo posee skew, rebotes o retardos).
Es posible, no obstante, forzar al compilador para que admita dicha línea de reloj. En este caso
deberá añadirse una directiva de compilación al fichero de asociaciones antes de la definición
de la línea de reloj. Suponga que la línea de reloj ha sido definida como CLK en los ficheros
VHDL. Para escribir su asociación, por ejemplo, a uno de los pulsadores externos (BTN0, patilla
G12 de la FPGA), deberá escribirse:
NET "CLK" CLOCK_DEDICATED_ROUTE = FALSE;
NET "CLK" LOC = "G12"; # Pulsador BTN0

La directiva CLOCK_DEDICATED_ROUTE = FALSE fuerza al compilador a admitir que la línea CLK
sea asignada al pulsador, en lugar de estar conectada al reloj de la FPGA.
Ejemplo 7: Diseño de un flip‐flop JK con su entrada de reloj conectada a un pulsador
Ya que se ha citado el ejemplo en el párrafo anterior, a continuación se detalla el diseño de un
flip flop de tipo JK cuyas entradas J y K están conectadas a dos de los conmutadores de la
placa, mientras que la entrada de reloj está conectada a un pulsador. Las dos salidas (Q y QN,
negada de la anterior) se visualizan a través de dos LEDs. Sintetizando este ejemplo podrá
probar el funcionamiento del flip flop produciendo flancos activos de reloj mediante el
pulsador.

26

Manual de referencia tarjeta BASYS 2
FICHERO flip_flop_JK.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity flip_flop_JK is
Port ( J
: in
K
: in
CLK : in
Q
: out
QN
: out
end flip_flop_JK;

STD_LOGIC;
STD_LOGIC;
STD_LOGIC;
STD_LOGIC;
STD_LOGIC);

------

Entrada J del flip flop
Entrada K del flip flop
Entrada CLK del flip flop
Salida del flip flop
Salida negada

architecture a_flip_flop_JK of flip_flop_JK is
signal QS : STD_LOGIC := '0';
begin
process (CLK)
begin
if (CLK'event and CLK='1') then
if
(J='0' and K='0') then
QS<=QS;
elsif (J='1' and K='0') then
QS<='1';
elsif (J='0' and K='1') then
QS<='0';
elsif (J='1' and K='1') then
QS<=not QS;
end if;
end if;
end process;
Q<=QS;
QN<= not QS;

-- funcionamiento del JK

-- se asignan las señales a las salidas reales

end a_flip_flop_JK;

En este caso se trata de un proceso con CLK en su lista de sensibilidad. En cada flanco activo de
CLK se comprueban los valores de J y K y se genera la salida correspondiente del biestable en la
variable QS. En paralelo, dicha señal es empleada para obtener las salidas complementarias Q
y QN.
FICHERO DE ASOCIACIONES: asociaciones.ucf
#Pulsadores
NET "CLK" CLOCK_DEDICATED_ROUTE = FALSE; #Forzar al compilador a admitir el
#pulsador como línea de reloj.
NET "CLK" LOC = "G12"; # Pulsador BTN0
# Conmutadores
NET "J"
NET "K"

LOC = "N3";
LOC = "E2";

# Conmutador SW7
# Conmutador SW6

#LEDs
NET "Q" LOC = "G1";
NET "QN" LOC = "P4";

# LED 7
# LED 6

Observe que se incluye la directiva de compilación para forzar la utilización del pulsador como
línea de reloj.

27

Manual de referencia tarjeta BASYS 2
Ejemplo 8: Utilización de una entrada externa para el desarrollo de un frecuencímetro.
Queremos desarrollar un frecuencímetro que sea capaz de medir frecuencias entre 1 Hz y
9999 Hz y que presente la lectura en los displays de la tarjeta BASYS2. La señal entrante deberá
ser digital TTL (es decir con valores de 0V y 5V para el “0” y el “1” respectivamente), de tal
manera que sea compatible con la lógica de la tarjeta BASYS2. Esta señal es sencilla de
obtener, puesto que está disponible en el conector “TTL” del generador de funciones.
El funcionamiento interno de un frecuencímetro se basa en contar los flancos activos de la
señal entrante durante un periodo de tiempo conocido T. Puesto que el resultado de dicha
cuenta se presenta en los displays, es importante diseñar adecuadamente el valor del tiempo T
para que el número visualizado se corresponda realmente con la frecuencia expresada en Hz.
En nuestro caso, cuando el valor presentado sea 9999 habrán transcurrido realmente
10000∙100 µs = 1s , por lo tanto el valor del intervalo T se corresponderá con esta cifra.
Variando el valor de T se pueden obtener diferentes precisiones y diferentes escalas de
medida.
La siguiente figura, resume de forma simplificada el funcionamiento del frecuencímetro.

CONTROL

N1ms

S1

DIVISOR
RELOJ

S0

CLK

AN0
AN1
AN2
AN3

Vcc

A…G
DECOD 7SEG
DIN
NY

NSS

S1
S0

Y
MUX x4
E3

E2
NQL3

LE
NLE

NQ3

AUTÓ‐
MATA

Frecuencia
a medir

Q
LATCH
E

Q
RCO
EN
CONTADOR
DÉCADAS
RST

E1
NQL2

LE

Q
LATCH
E
NQ2

EN
Q
RCO
CONTADOR
DÉCADAS
RST

E0
NQL1

LE

Q
LATCH
E
NQ1

Q
RCO
EN
CONTADOR
DÉCADAS
RST

NQL0

LE

Q
LATCH
E
NQ0

Q
RCO
EN
“1”
CONTADOR
DÉCADAS
RST

NRST

En esencia, un autómata controla el funcionamiento del frecuencímetro. Cada segundo,
deberá generar un pulso en las patillas LE (“latch enable”) para que el valor de la cuenta se
quede retenido y a continuación deberá generar otro pulso en RST que ponga a 0 los
contadores (ver figura siguiente). La anchura de los pulsos es de 10 µs separados entre sí
también 10 µs.
28

Manual de referencia tarjeta BASYS 2

LE

RST

30 µs
(3x10 µs)

1 seg

Por otro lado, un sistema de control actualiza la visualización de los displays de un modo
similar a los ejemplos 3 y 4.
Como la entrada externa por la que se suministrará la frecuencia a medir se va a utilizar como
señal de reloj para los contadores, es necesario forzar al compilador para que admita dicha
línea como señal externa de reloj (fíjese en el fichero de asociaciones).
Al igual que en ejemplos anteriores, lo que se encuentra dentro de la zona punteada es el
circuito que debemos sintetizar en la FPGA, mientras que lo que se encuentra fuera de dicha
línea se corresponde con los diferentes recursos de la tarjeta y las líneas exteriores.
Este proyecto, al ser de gran envergadura, estará también dividido en varios ficheros, los
cuales se describen detalladamente a continuación:
FICHERO contador_decadas.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity contador_decadas
Port ( CLK
: in
EN
: in
RST_L : in
Q
: out
RCO
: out
end contador_decadas;

is
STD_LOGIC;
-- entrada de reloj
STD_LOGIC;
-- entrada de ENABLE
STD_LOGIC;
-- entrada de RESET asíncrona
STD_LOGIC_VECTOR (3 downto 0); -- Salida
STD_LOGIC); -- Salida de fin de cuenta

architecture a_contador_decadas of contador_decadas is
signal QS : STD_LOGIC_VECTOR (3 downto 0) := "0000";
begin
process (CLK,RST_L)
-- RESET asíncrono en lista de sensibilidad
begin
if (RST_L='0') then
-- Si RST=0, el contador se pone a 0
QS<="0000";
elsif (CLK'event and CLK='1') then
if (EN='1') then
-- en cada ciclo de reloj
QS<=QS+1;
-- si EN=1 el contador se incrementa
if (QS=9) then
-- si llega a 9 vuelve a 0 en el sig. ciclo
QS<="0000";
end if;
else
QS<=QS;
end if;
end if;
end process;
Q<=QS;
RCO<='1' when QS="1001" and EN='1' else '0'; -- RCO es 1 cuando Q=9 y EN=1
end a_contador_decadas;

29

Manual de referencia tarjeta BASYS 2
Este contador de décadas tiene una entrada de reloj (CLK) y una entrada de ENABLE. Cuando el
ENABLE está activo (“1”), el contador se incrementa con cada ciclo de reloj. Si la cuenta llega a
9, se vuelve a 0 en el siguiente ciclo. La salida RCO se utiliza para encadenar contadores, por lo
tanto será 1 cuando la salida es igual a 9 y cuando el ENABLE está activo. Además también
tiene una entrada de RESET (RST) asíncrona, activa a nivel bajo, que pone el contador a 0
independientemente del reloj.
FICHERO latch.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity latch is
Port ( E : in STD_LOGIC_VECTOR (3 downto 0); -- entrada del latch
Q : out STD_LOGIC_VECTOR (3 downto 0); -- salida del latch
LE : in STD_LOGIC);
-- activación del latch
end latch;
architecture a_latch of latch is
signal QS : STD_LOGIC_VECTOR (3 downto 0);
begin
process (LE,E)
begin
if (LE='1') then
QS<=E;
end if;
end process;
Q<=QS;
end a_latch;

Este módulo define un latch de 4 bits. Tiene una entrada de 4 bits y una salida de 4 bits. La
señal de activación es LE. Mientras LE es 1, se copia el valor de la entrada en la salida. Cuando
LE es igual a 0, la salida se queda congelada en el último valor que adquirió.
FICHERO MUX4.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity mux4 is
Port ( E0 :
E1 :
E2 :
E3 :
Y :
S :

in
in
in
in
out
in

STD_LOGIC_VECTOR
STD_LOGIC_VECTOR
STD_LOGIC_VECTOR
STD_LOGIC_VECTOR
STD_LOGIC_VECTOR
STD_LOGIC_VECTOR

(3
(3
(3
(3
(3
(1

downto
downto
downto
downto
downto
downto

0);
0);
0);
0);
0);
0));

end mux4;
architecture a_mux4 of mux4 is
begin
Y <= E0
E1
E2
E3

when
when
when
when

S="00" else
S="01" else
S="10" else
S="11";

end a_mux4;

30

Manual de referencia tarjeta BASYS 2
Al igual que en el ejemplo 4, este multiplexor se emplea para la visualización en los displays.
Posee 4 entradas de 4 bits, una salida de 4 bits y dos entradas de control.
FICHERO decod7s.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity decod7s is
port ( DIN
: in STD_LOGIC_VECTOR (3 downto 0);
-- entrada de datos
S7SEG : out STD_LOGIC_VECTOR (0 to 6));
-- salidas 7seg (abcdefg)
end decod7s;
architecture a_decod7s of decod7s is
begin
with DIN select S7SEG <=
"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",
"0001100" when "1001",
"1111111" when others;
end a_decod7s;

a
f
e

b
g

c

d

Nuevamente, como en el ejemplo 4, este decodificador de binario a 7 segmentos se emplea
para la visualización en los displays. Posee una entrada de datos de 4 bits y 7 salidas para cada
uno de los segmentos (vea ejemplos 3 y 4).
FICHERO control.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity control is
Port ( CLK : in STD_LOGIC;
AN : out STD_LOGIC_VECTOR (3 downto 0);
S : out STD_LOGIC_VECTOR (1 downto 0));
end control;
architecture a_control of control is
signal SS

: STD_LOGIC_VECTOR (1 downto 0);

begin
process (CLK)
begin
if (CLK'event and CLK='1') then
SS<=SS+1;
end if;
end process;
S<=SS;
AN<="0111"
"1011"
"1101"
"1110"

when
when
when
when

SS="00" else
SS="01" else
SS="10" else
SS="11";

end a_control;

31

Manual de referencia tarjeta BASYS 2
Este código es el mismo que el utilizado en el ejemplo 4. Es un módulo secuencial que utiliza
una señal de reloj para incrementar un contador de 2 bits que repite la secuencia 00, 01, 10 y
11 indefinidamente. Con esta secuencia se genera una señal AN que activa cada uno de los
displays (mediante un ‘0’). Esto se empleará para realizar el refresco de los displays. La
secuencia de dos bits conmutará las entradas del multiplexor y las señales AN activarán los
displays en consonancia, de un modo similar al del ejemplo 3 pero con 4 displays.
FICHERO div_reloj.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity div_reloj is
Port ( CLK : in STD_LOGIC;
CLK_1MS : out STD_LOGIC);
end div_reloj;

-- entrada de reloj del sistema
-- salida de reloj de frecuencia menor

architecture a_div_reloj of div_reloj is
signal div
signal S_1MS

: STD_LOGIC_VECTOR (15 downto 0);
: STD_LOGIC;

begin
process (CLK)
begin
if (CLK'event and CLK='1') then
div<=div+1;
if div=25000 then
S_1MS<=not S_1MS;
div<=(others=>'0');
end if;
end if;
end process;

-- con cada ciclo de reloj se incrementa div
-- tras 25000 cuentas han transcurrido 500 us
-- la frecuencia de S_1MS es de 1 KHz

CLK_1MS<=S_1MS;
end a_div_reloj;

También como en el ejemplo 4, este código realiza la división de frecuencia del reloj del
sistema proporcionando a la salida un reloj de frecuencia 1 KHz para el refresco periódico de
los displays.
FICHERO automata.vhd

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

entity automata is
port ( CLK
: in STD_LOGIC;
RST_L : out STD_LOGIC;
LE
: out STD_LOGIC);
end automata;

-- reloj de la FPGA
-- Salida de reset para los contadores
-- salida de latch enable

32

Manual de referencia tarjeta BASYS 2
architecture a_automata of automata is
type STATE_TYPE is (CUENTA,LE_ON,LE_OFF,RESET_CNT); -- autómata de 4 estados
signal NWS : STATE_TYPE := CUENTA ; --estado actual
signal DivCLK : STD_LOGIC_VECTOR (31 downto 0) := "00000000000000000000000000000000";
--contador para dividir la frecuencia del reloj.
begin
process (CLK)
begin
if (CLK'event and CLK='1') then
DivCLK<=DivCLK+1;
case NWS is
when CUENTA =>
if (DivCLK=50000000) then
NWS <= LE_ON;
DivCLK<=(others=>'0');
else
NWS <= CUENTA;
end if;

-- El estado CUENTA dura 1s

when LE_ON =>
if (DivCLK=500) then -- El estado LE_ON dura 10 us
NWS <= LE_OFF;
DivCLK<=(others=>'0');
else
NWS <= LE_ON;
end if;
when LE_OFF =>
if (DivCLK=500) then -- El estado LE_OFF dura 10 us
NWS <= RESET_CNT;
DivCLK<=(others=>'0');
else
NWS <= LE_OFF;
end if;
when RESET_CNT =>
if (DivCLK=500) then -- El estado RESET_CNT dura 10 us
NWS <= CUENTA;
DivCLK<=(others=>'0');
else
NWS <= RESET_CNT;
end if;
end case;
end if;
end process;
LE <=
'1' when NWS=LE_ON else '0';
RST_L <= '0' when NWS=RESET_CNT else '1';

-- Las salidas dependen del estado
-- Es un autómata de Moore

end a_automata;

Este autómata es el núcleo del frecuencímetro, pues proporciona las señales que activan la
captura de la cuenta y la puesta a 0 de los contadores en los instantes de tiempo
determinados. El autómata pasa cíclicamente por 4 estados:





CUENTA: El autómata permanece 1 segundo en este estado con las dos salidas
desactivadas (LE=0 y RST=1)
LE_ON: El autómata permanece 10 µs en este estado con la salida LE activa
(LE=1 y RST=1)
LE_OFF: El autómata permanece 10 µs en este estado con ambas salidas
desactivadas (LE=0 y RST=1)
RESET_CNT: autómata permanece 10 µs en este estado con la salida RST activa
(LE=0 y RST=0)

33

Manual de referencia tarjeta BASYS 2
FICHERO circuito.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity circuito is
Port ( CLK
FREQ_INPUT
AN
SEG7
end circuito;

:
:
:
:

in STD_LOGIC;
in STD_LOGIC;
out STD_LOGIC_VECTOR (3 downto 0);
out STD_LOGIC_VECTOR (0 to 6));

architecture a_circuito of circuito is
component contador_decadas
Port
( CLK
: in STD_LOGIC;
EN
: in STD_LOGIC;
RST_L : in STD_LOGIC;
Q
: out STD_LOGIC_VECTOR (3 downto 0);
RCO
: out STD_LOGIC);
end component;
component latch
Port
( E : in STD_LOGIC_VECTOR (3 downto 0);
Q : out STD_LOGIC_VECTOR (3 downto 0);
LE : in STD_LOGIC);
end component;
component MUX4
Port
( E0 : in STD_LOGIC_VECTOR (3 downto 0);
E1 : in STD_LOGIC_VECTOR (3 downto 0);
E2 : in STD_LOGIC_VECTOR (3 downto 0);
E3 : in STD_LOGIC_VECTOR (3 downto 0);
Y : out STD_LOGIC_VECTOR (3 downto 0);
S : in STD_LOGIC_VECTOR (1 downto 0));
end component;
component decod7s
port
( DIN
: in STD_LOGIC_VECTOR (3 downto 0);
S7SEG : out STD_LOGIC_VECTOR (0 to 6));
end component;
component control
Port
( CLK : in STD_LOGIC;
AN : out STD_LOGIC_VECTOR (3 downto 0);
S : out STD_LOGIC_VECTOR (1 downto 0));
end component;
component div_reloj
Port
( CLK : in STD_LOGIC;
CLK_1MS : out STD_LOGIC);
end component;
component automata
port ( CLK
: in STD_LOGIC;
RST_L : out STD_LOGIC;
LE
: out STD_LOGIC);
end component;
signal
signal
signal
signal
signal
signal
signal
signal
signal
signal
signal
signal
signal
signal
signal
signal

NQ0 : STD_LOGIC_VECTOR (3 downto 0); -- nodos del circuito
NQ1 : STD_LOGIC_VECTOR (3 downto 0);
NQ2 : STD_LOGIC_VECTOR (3 downto 0);
NQ3 : STD_LOGIC_VECTOR (3 downto 0);
NQL0 : STD_LOGIC_VECTOR (3 downto 0);
NQL1 : STD_LOGIC_VECTOR (3 downto 0);
NQL2 : STD_LOGIC_VECTOR (3 downto 0);
NQL3 : STD_LOGIC_VECTOR (3 downto 0);
NY : STD_LOGIC_VECTOR (3 downto 0);
NSS : STD_LOGIC_VECTOR (1 downto 0);
NLE : STD_LOGIC;
NRST : STD_LOGIC;
N1MS : STD_LOGIC;
NRCO0 : STD_LOGIC;
NRCO1 : STD_LOGIC;
NRCO2 : STD_LOGIC;

34

Manual de referencia tarjeta BASYS 2
signal NRCO3 : STD_LOGIC;
begin
U1 : contador_decadas
-- 4 contadores
port map (
CLK=>FREQ_INPUT,
EN=>'1',
RST_L=>NRST,
Q=>NQ0,
RCO=>NRCO0
);
U2 : contador_decadas
port map (
CLK=>FREQ_INPUT,
EN=>NRCO0,
RST_L=>NRST,
Q=>NQ1,
RCO=>NRCO1
);
U3 : contador_decadas
port map (
CLK=>FREQ_INPUT,
EN=>NRCO1,
RST_L=>NRST,
Q=>NQ2,
RCO=>NRCO2
);
U4 : contador_decadas
port map (
CLK=>FREQ_INPUT,
EN=>NRCO2,
RST_L=>NRST,
Q=>NQ3,
RCO=>NRCO3
);
U5 : latch
port map (
E=>NQ0,
Q=>NQL0,
LE=>NLE
);

-- 4 latches

U6 : latch
port map (
E=>NQ1,
Q=>NQL1,
LE=>NLE
);
U7 : latch
port map (
E=>NQ2,
Q=>NQL2,
LE=>NLE
);
U8 : latch
port map (
E=>NQ3,
Q=>NQL3,
LE=>NLE
);
U9 : MUX4
port map (
E0=>NQL0,
E1=>NQL1,
E2=>NQL2,
E3=>NQL3,
Y=>NY,
S=>NSS
);

35

Manual de referencia tarjeta BASYS 2

U10 : decod7s
port map (
DIN=>NY,
S7SEG=>SEG7
);
U11 : control
port map (
CLK=>N1MS,
AN=>AN,
S=>NSS
);
U12 : div_reloj
port map (
CLK=>CLK,
CLK_1MS=>N1MS
);
U13 : automata
port map (
CLK=>CLK,
RST_L=>NRST,
LE=>NLE
);
end a_circuito;

En este fichero se realiza la interconexión de todos los elementos mediante una descripción
estructural que responde al diagrama de bloques presente al principio de este ejemplo. Las
señales definidas son los nodos internos del circuito.
FICHERO DE ASOCIACIONES: asociaciones.ucf
# Reloj principal del sistema
NET "CLK" LOC = "M6"; # Señal de reloj del sistema

# Conexiones de los
NET "SEG7<0>" LOC =
NET "SEG7<1>" LOC =
NET "SEG7<2>" LOC =
NET "SEG7<3>" LOC =
NET "SEG7<4>" LOC =
NET "SEG7<5>" LOC =
NET "SEG7<6>" LOC =

DISPLAYS
"L14"; #
"H12"; #
"N14"; #
"N11"; #
"P12"; #
"L13"; #
"M12"; #

# Señales de activación de
NET "AN<0>" LOC = "K14"; #
NET "AN<1>" LOC = "M13"; #
NET "AN<2>" LOC = "J12"; #
NET "AN<3>" LOC = "F12"; #

señal
Señal
Señal
Señal
Señal
Señal
Señal

=
=
=
=
=
=
=

CA
CB
CC
CD
CE
CF
CG

los displays
Activación del
Activación del
Activación del
Activación del

display
display
display
display

0
1
2
3

=
=
=
=

AN0
AN1
AN2
AN3

#Entrada externa donde se conecta la señal entrante
NET "FREQ_INPUT" CLOCK_DEDICATED_ROUTE = FALSE; #Forzar al compilador a admitir esta
#línea como entrada de reloj.
NET "FREQ_INPUT" LOC = "B2"; #Entrada terminal 1

Finalmente, el fichero de asociaciones asigna cada una de las entradas y salidas del circuito a
los recursos físicos de la tarjeta y también a la entrada externa por la que se introduce la señal
cuya frecuencia se desea medir.
Por último, para probar este circuito conecte la salida TTL del generador de funciones a la
entrada externa (cable rojo al terminal 1 y cable negro (masa) al terminal 25). Ajuste el mando
de frecuencia entre 1 Hz y 9999 Hz y dicha frecuencia aparecerá en los displays de la tarjeta.
36

Manual de referencia tarjeta BASYS 2

Utilización del entorno ISE
Para realizar una síntesis mediante el entorno ISE debe crearse un proyecto. El proyecto
incluirá todos los ficheros correspondientes al diseño incluido el fichero de asociaciones.
Vaya al menú FILE ‐> NEW PROJECT. Aparecerá una ventana donde tendrá que escribir el
nombre del nuevo proyecto. El entorno creará una carpeta dentro de la ubicación “Location”
que aparece en dicha ventana. En dicha carpeta almacenará toda la información del proyecto,
incluidos los ficheros VHDL, el fichero de asociaciones y el “bit stream” una vez obtenido.
Asegúrese también que en la casilla de selección “Top level Source Type” aparece “HDL”.
En la siguiente pantalla deberá ajustar los siguientes valores:
Family: Spartan 3E
Device: XC3S100E
Package: CP132
Speed: ‐5
Synthesis tool: XST (VHDL/Verilog)
Simulator: ISim (VHDL/Verilog)
Preferred Language: VHDL

Por último sáltese las siguientes pantallas pulsando en “Next”. En la última aparecerá el botón
“Finish”.
Una vez creado el proyecto pueden añadirse ficheros nuevos pulsando con el botón derecho
del ratón sobre el icono “xc3s100e‐5cp132” que aparece en la parte izquierda de la pantalla.
En el menú que se despliega seleccione “New Source”. Si el fichero que pretende añadir ya ha
sido creado previamente seleccione entonces “Add Source”.
Elija VHDL module para crear un nuevo archivo VHDL. Escriba un nombre para el archivo y pase
a la siguiente pantalla. En ella puede declarar las entradas y las salidas del módulo (sección
port dentro de la declaración entity). Si lo desea puede pasar esta pantalla y declarar las
entradas y salidas manualmente más tarde. Tras esta pantalla aparecerá un editor con el
esqueleto principal del código VHDL ya escrito. Puede escribir en el archivo y grabar los
cambios con el icono de un diskette en la parte superior de la pantalla.
Para el archivo de asociaciones elija “Implementation Constraints File” y escriba un nombre. Se
creará un archivo con extensión UCF. Para acceder a él, selecciónelo en la parte superior
izquierda de la pantalla, luego pulse con el ratón el icono “Edit Constraints (Text)” en la parte
inferior izquierda (ver figura).

37

Manual de referencia tarjeta BASYS 2

Para compilar el código y generar el “bit stream” , seleccione el fichero principal del proyecto y
haga doble click en “Generate Programming File” en la parte inferior izquierda. Vea la figura
siguiente:

Evidentemente tendrá que depurar todos los errores existentes en el código hasta que se
pueda generar un fichero “bit stream”. En el momento en que todo esté correcto aparecerá un
icono verde a la izquierda de la etiqueta “Generate Programming File”.
38

Manual de referencia tarjeta BASYS 2

Simulación de circuitos mediante ISIM
ISIM es una herramienta integrada en el entorno ISE para la simulación de circuitos. Con esta
herramienta es posible probar el funcionamiento de los mismos antes de su síntesis en la
tarjeta BASYS2. Es muy recomendable simular los circuitos antes de realizar la síntesis. Aunque
un circuito que funciona bien en la simulación no tiene por qué ser necesariamente
sintetizable, la simulación es un proceso que puede ahorrar tiempo de depuración sobre el
circuito real y que además puede ser realizado fuera del laboratorio.
La simulación se lleva a cabo creando un nuevo fichero de test ("test bench") donde tendremos
que introducir una secuencia lógica dependiente del tiempo en las variables de entrada. Como
resultado, el simulador nos representará de forma gráfica los valores de las salidas en función
de las citadas entradas.
1. Simulación de circuitos secuenciales (síncronos con una señal de entrada de reloj)
Para ilustrar el funcionamiento del simulador ISIM utilizaremos el código VHDL
correspondiente al flip flop JK definido en el ejemplo 7 de este documento. Por tanto debemos
cargar el código del citado ejemplo en primer lugar.
Para añadir al diseño del flip flop el fichero de test haga click con el botón derecho sobre el
icono “xc3s100e‐5cp132” y elija la opción "New Source". Seleccione en este caso "VHDL test
bench" para el tipo e introduzca un nombre para el archivo (por ejemplo "test_flip_flop").

En la siguiente ventana se le preguntará por el fichero al cual quiere asociar el test bench. Debe
asociarse al fichero principal. En este caso es sencillo porque solamente existe un fichero
VHDL, pero en los diseños complejos donde existe más de un fichero, deberá asignarse al
fichero principal que constituye la interconexión de los módulos. La simulación se realizará
siempre tomando como entradas y salidas las correspondientes al fichero seleccionado (vea la
siguiente figura).

39

Manual de referencia tarjeta BASYS 2

Después de hacer click en "Next" y "Finish" el fichero se añadirá al proyecto, aunque aún no
aparece. Para ver su contenido deberá pasar del modo "implementation" al modo "Behavioral
Simulation" seleccionando la opción en la parte superior de la ventana que contiene los
nombres de fichero:

El simulador creará un nuevo fichero con código VHDL. Abra este fichero haciendo doble click
sobre la línea correspondiente. Podrá observar que se trata de un código VHDL especial que
contiene la declaración de una entidad y una arquitectura. En la figura siguiente se puede
observar el test bench creado por el ISE para el ejemplo del flip‐flop. Entre las líneas 42 y 50 se
define un componente correspondiente al circuito sobre el que se va a realizar la simulación.
También se definen señales (líneas 54 a 60) por cada una de las entradas y salidas y se les
asigna un valor inicial a las entradas igual a '0' (se puede cambiar por '1' si es necesario). Por
último, se asignan dichas señales a las entradas y salidas del componente (líneas 68 a 74).

40

Manual de referencia tarjeta BASYS 2

Los dos procesos que siguen a continuación crean la secuencia temporal de las señales de
entrada que serán empleadas por el simulador para generar las salidas. Se trata en este caso
de dos procesos:




CLK_process crea una secuencia de '0' y '1' con periodo de CLK_period/2 cada uno.
Esta secuencia ha sido creada por el ISE tras interpretar que la señal CLK es una señal
de reloj. La secuencia se repite indefinidamente.
stim_proc es un proceso en el que debemos detallar la secuencia temporal que
queremos analizar para las señales de entrada (en nuestro caso J y K).

En nuestro caso (en la figura siguiente), hemos escrito algunas líneas con diferentes valores
para las entradas (J y K). Tenga en cuenta que se trata solamente de un ejemplo reducido, no
un banco de prueba completo para comprobar el funcionamiento exhaustivo del flip flop.
Se inicia el proceso esperando 10 ns (un periodo de reloj). Entre las líneas 95 y 112 damos
valores a las entradas y esperamos otros 10 ns para que se produzca un flanco activo de reloj.
Nuevamente se cambian los valores de las entradas, y así sucesivamente.
Este proceso se ejecuta en paralelo con el anterior, por lo que es posible sincronizar los valores
de las entradas con la señal de reloj. Esta característica es muy importante, por ejemplo, a la
hora de simular autómatas.

41

Manual de referencia tarjeta BASYS 2

Para realizar la simulación, haga click con el botón derecho sobre la línea "Simulate Behavioral
Model" en la parte inferior izquierda de la pantalla y seleccione "Rerun All".

Esto recompilará el código VHDL junto con el fichero correspondiente al "test bench" creando
la simulación. Al terminar se arrancará el entorno de visualización ISIM donde aparecerá el
cronograma con las señales de entrada y salida. En dicho entorno tiene varias opciones para
poder realizar zoom en el cronograma, observar los valores lógicos de las señales, cambiar el
tiempo total de simulación, etc.

42

Manual de referencia tarjeta BASYS 2

2. Simulación de circuitos combinacionales
Los circuitos combinacionales no son dependientes de la señal de un reloj. No obstante, como
veremos a continuación, el simulador sigue añadiendo las líneas correspondientes al proceso
de sincronización, aunque nos dirá que no identifica la señal de reloj. En este caso el simulador
hará referencia a una señal  no existente en el circuito.
Cuando estamos simulando circuitos combinacionales se trabaja únicamente con el proceso
stim_proc, y deben eliminarse todas las líneas correspondientes al reloj si no son necesarias.
Para comprobar el funcionamiento, se asignarán valores a las entradas y se añadirán tiempos
de espera entre variaciones en las mismas.
Como ejemplo para ilustrar esta parte vamos a utilizar el código VHDL de un circuito
combinacional que convierte código binario de 5 bits a BCD (decenas y unidades). Su entrada
(BIN) será un vector binario de 5 bits y sus salidas serán dos vectores de 4 bits para las
unidades y las decenas BCD respectivamente.
Por ejemplo, ante la entrada “11000” (24 decimal), el circuito deberá obtener en sus salidas los
valores: “0010” para las decenas y “0100” para las unidades. Ante la entrada “11111” (31
decimal), deberá obtener los valores “0011” para las decenas y “0001” para las unidades. En
este ejemplo utilizaremos estos dos valores en la simulación, aunque para comprobar
exhaustivamente su funcionamiento deberíamos probar todos los valores posibles de las
entradas.
43

Manual de referencia tarjeta BASYS 2
El código correspondiente al convertidor se muestra a continuación:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity BIN2BCD is
Port ( BIN
: in STD_LOGIC_VECTOR (4 downto 0);
-- entrada binaria
DECBCD : out STD_LOGIC_VECTOR (3 downto 0); -- decenas BCD
UNIBCD : out STD_LOGIC_VECTOR (3 downto 0)); -- unidades BCD
end BIN2BCD;
architecture a_BIN2BCD of BIN2BCD is
begin
with BIN select UNIBCD<=
"0000" when "00000",
"0001" when "00001",
"0010" when "00010",
"0011" when "00011",
"0100" when "00100",
"0101" when "00101",
"0110" when "00110",
"0111" when "00111",
"1000" when "01000",
"1001" when "01001",
"0000" when "01010",
"0001" when "01011",
"0010" when "01100",
"0011" when "01101",
"0100" when "01110",
"0101" when "01111",
"0110" when "10000",
"0111" when "10001",
"1000" when "10010",
"1001" when "10011",
"0000" when "10100",
"0001" when "10101",
"0010" when "10110",
"0011" when "10111",
"0100" when "11000",
"0101" when "11001",
"0110" when "11010",
"0111" when "11011",
"1000" when "11100",
"1001" when "11101",
"0000" when "11110",
"0001" when "11111",
"0000" when others;
with BIN select DECBCD<=
"0000" when "00000",
"0000" when "00001",
"0000" when "00010",
"0000" when "00011",
"0000" when "00100",
"0000" when "00101",
"0000" when "00110",
"0000" when "00111",
"0000" when "01000",
"0000" when "01001",
"0001" when "01010",
"0001" when "01011",
"0001" when "01100",
"0001" when "01101",
"0001" when "01110",
"0001" when "01111",
"0001" when "10000",
"0001" when "10001",
"0001" when "10010",
"0001" when "10011",
"0010" when "10100",
"0010" when "10101",
"0010" when "10110",
"0010" when "10111",
"0010" when "11000",

44

Manual de referencia tarjeta BASYS 2
"0010"
"0010"
"0010"
"0010"
"0010"
"0011"
"0011"
"0000"

when
when
when
when
when
when
when
when

"11001",
"11010",
"11011",
"11100",
"11101",
"11110",
"11111",
others;

end a_BIN2BCD;

El test_bench para este circuito se crea de la misma forma que hicimos en el caso anterior. El
código que aparecerá hará referencia a una señal  que no existe. Las líneas que
contengan esta señal y el proceso de sincronización pueden eliminarse o comentarse (en el
siguiente código, correspondiente al citado test_bench, aparecen comentadas y marcadas en
rojo).
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;

ENTITY test_BIN2BCD IS
END test_BIN2BCD;
ARCHITECTURE behavior OF test_BIN2BCD IS
-- Component Declaration for the Unit Under Test (UUT)
COMPONENT BIN2BCD
PORT(
BIN : IN std_logic_vector(4 downto 0);
DECBCD : OUT std_logic_vector(3 downto 0);
UNIBCD : OUT std_logic_vector(3 downto 0)
);
END COMPONENT;

--Inputs
signal BIN : std_logic_vector(4 downto 0) := (others => '0');
--Outputs
signal DECBCD : std_logic_vector(3 downto 0);
signal UNIBCD : std_logic_vector(3 downto 0);
-- No clocks detected in port list. Replace  below with
-- appropriate port name
-- constant _period : time := 10 ns; COMENTAMOS ESTA LINEA (NO NECESARIA)
BEGIN
-- Instantiate the Unit Under Test (UUT)
uut: BIN2BCD PORT MAP (
BIN => BIN,
DECBCD => DECBCD,
UNIBCD => UNIBCD
);

--------

-- Clock process definitions
_process :process
begin
 <= '0';
wait for _period/2;
 <= '1';
wait for _period/2;
end process;

-- Stimulus process
stim_proc: process
begin

45

Manual de referencia tarjeta BASYS 2
-- hold reset state for 100 ns.
wait for 10 ns;
BIN<="11000";
wait for 10 ns;
BIN<="11111";
--

wait for _period*10;
-- insert stimulus here
wait;
end process;

END;

En este código solamente se tiene en cuenta el proceso stim_proc donde asignamos el valor
“11000” a la entrada y tras 10 ns asignamos el valor “11111”. Inicialmente se esperan 10 ns en
los que la entrada es “00000”. El resultado de la simulación puede verse a continuación,
observe que los valores de las salidas son correctos en ambos casos:

46

Manual de referencia tarjeta BASYS 2

Volcado del “bit stream” sobre la FPGA para sintetizar el circuito
Una vez realizada la síntesis del circuito, se genera un archivo con extensión .bit que contiene
la secuencia “bitstream” de configuración interna para la FPGA. Esta secuencia deberá ser
cargada a través de la tarjeta BASYS2. Para ello necesita el programa ADEPT de DIGILENT
disponible en todos los ordenadores del laboratorio. Arranque dicho programa:

Mediante el botón “Browse…” situado en la línea superior puede seleccionar el archivo que
desea cargar. El archivo debe tener extensión .bit
A continuación haga click en el botón “Program”. Acepte la ventana que aparece y el fichero
será transferido a la FPGA configurándola de tal manera que sintetice el circuito descrito en su
diseño. A partir de este momento, la FPGA comenzará a comportarse según el diseño descrito
en el código VHDL.

47

Manual de referencia tarjeta BASYS 2

Bibliografía
BASYS 2 reference manual
(http://www.digilentinc.com/Data/Products/BASYS2/Basys2_rm.pdf)
DIGILENT website:
http://www.digilentinc.com/Products/Detail.cfm?NavPath=2,400,790&Prod=BASYS2
XILINX ISE Webpack design software:
http://www.xilinx.com/products/design‐tools/ise‐design‐suite/ise‐webpack.htm
Material docente de la asignatura Electrónica Digital (EDIG).
Digital Design, J.F. Wakerly, 4th edition, Prentice Hall, 2005. ISBN: 0‐13‐186389‐4

48



Source Exif Data:
File Type                       : PDF
File Type Extension             : pdf
MIME Type                       : application/pdf
PDF Version                     : 1.5
Linearized                      : Yes
Author                          : alvaro
Create Date                     : 2013:06:20 16:47:02+02:00
Modify Date                     : 2013:06:20 16:47:02+02:00
XMP Toolkit                     : Adobe XMP Core 4.2.1-c043 52.372728, 2009/01/18-15:08:04
Creator Tool                    : PScript5.dll Version 5.2.2
Format                          : application/pdf
Title                           : Microsoft Word - Manual de referencia BASYS 2.docx
Creator                         : alvaro
Producer                        : Acrobat Distiller 9.4.2 (Windows)
Document ID                     : uuid:cbf8ac5e-55d5-407d-a1a4-f62555316596
Instance ID                     : uuid:5eccd9ff-060c-40d8-b893-86aad02d898c
Page Count                      : 48
EXIF Metadata provided by EXIF.tools

Navigation menu