Sie sind auf Seite 1von 11

Electrónica Digital

Dpto Ing. Electrónica 1

Práctica 9
Introducción al lenguaje VHDL (parte 3)

1. Programación de un contador de 4 bits en la Coolrunner .............................................................................2


1.1. La tarjeta Coolrunner .............................................................................................................................3
1.2. Programación de la tarjeta Coolrunner ...................................................................................................3
1.3. Problemas de rebotes .............................................................................................................................3
1.3.1. Nuevo fichero de restricciones (contador_sin_rebotes.ucf) .............................................................5
1.3.2. Cambios en el fichero de diseño (contador_sin_rebotes.vhd) ..........................................................5

2. Ejercicios puntuables para la práctica ...........................................................................................................6


2.1. Control de la barrera del tren (tren.vhd, trenCorto_tb.vhd) .....................................................................6
2.1.1. Modificación: simulación y síntesis de la máquina de Moore que controla la barrera.......................6
2.1.2. Modificación: Diseño con más de un fichero de estímulos. ..............................................................9
2.1.3. Modificación. Simulación para el caso de un funcionamiento bidireccional......................................9
2.1.4. Modificación. Síntesis para el caso de un funcionamiento bidireccional ...........................................9
2.1.5. Modificación: simular la barrera del tren (unidireccional) como una máquina de Mealy ................ 10
2.1.6. Modificación: simular la barrera del tren (bidireccional) como una máquina de Mealy .................. 11
2.1.7. Modificación: síntesis y simulación en proteus para una barrrera del tren bidireccional con una
máquina de Mealy.................................................................................................................................. 11

4. Consideraciones sobre la práctica ...............................................................................................................11

Objetivos:
 Distinguir entre máquina de Moore y máquina de Mealy.
 Diseñar máquinas de estados en VHDL.
 Utilizar más de un fichero de estímulos en un proyecto para la depuración del
diseño.
 Programación de un disposito real a partir del fichero de fusibles (*.jed).

Profesores de prácticas:
 Carlos Janer, janer@us.es. Esta práctica ha sido concebida y desarrollada por el Profesor
Rafael Millán.

Rafael Millán
2 Lenguaje VHDL

1. Programación de un contador de 4 bits en la Coolrunner


En este apartado se programará la tarjeta coolrunner con un contador de 4 bits
reversible con señal de habilitación y salida en 7 segmentos. El diseño se ha realizado en
un único fichero por lo que se tiene la solución al apartado 2.2.3 de la práctica 5.

-- **********************************************************************
-- ARQUITECTURA (descripción de la circuitería)
-- **********************************************************************
ARCHITECTURE contador7seg_arq OF contador7seg IS
SIGNALcnt :std_logic_vector(3 DOWNTO 0);

BEGIN

-- ==============================================================
-- Proceso para el contador. Se asigna la señal "cnt"
-- ==============================================================
-- Sincronizamos el reset al no incluirlo en la lista sensible.
-- Ahora solo el reloj dispara el proceso. El reset tieneprioridad.
PROCESS (clk) IS
BEGIN
IF (reset = '1') THEN
cnt<= (others =>'0');-- Inicialmentetodoslos bits a '0'
ELSIF (clk'eventANDclk='1') THEN
IF (enable='1') THEN
-- cuentaascendente
IF (up_down='1') THEN
cnt<= cnt + 1;-- Incrementa la salida del contador
IF (cnt = "1001") then-- Si llega a 9 -> 0
cnt<= "0000";
END IF;
-- cuenta descendente
ELSE
cnt<= cnt - 1; -- Decrementa la salida del contador
IF (cnt = "0000") then-- Si llega a 0 -> 9
cnt<= "1001";
END IF;
END IF;
END IF;
END IF;
END PROCESS;

-- ==============================================================
-- Proceso para la salida de 7 seg. Se asigna la señal "segment7"
-- ==============================================================
PROCESS (cnt)
BEGIN
CASEcntIS
when"0000"=> segment7 <= "1000000"; -- '0' [gfedcba]="1000000"]
when"0001"=> segment7 <= "1111001"; -- '1'
when"0010"=> segment7 <= "0100100"; -- '2'
when"0011"=> segment7 <= "0110000"; -- '3'
when"0100"=> segment7 <= "0011001"; -- '4'
when"0101"=> segment7 <= "0010010"; -- '5'
when"0110"=> segment7 <= "0000010"; -- '6'
when"0111"=> segment7 <= "1111000"; -- '7'
when"1000"=> segment7 <= "0000000"; -- '8'
when"1001"=> segment7 <= "0010000"; -- '9'
when"1010"=> segment7 <= "0001000"; -- 'A'
when"1011"=> segment7 <= "0000011"; -- 'b'
when"1100"=> segment7 <= "0100111"; --'c'
when"1101"=> segment7 <= "0100001"; -- 'd'
when"1110"=> segment7 <= "0000110"; -- 'E'
when"1111"=> segment7 <= "0001110"; -- 'F'
whenothers=> segment7 <= "1111111"; -- Apagado si el numero está mal
END CASE;
END PROCESS;

END contador7seg_arq;
Lenguaje VHDL 3

1.1. La tarjeta Coolrunner

La tarjeta coolrunner lleva integrada el


dispositivo XC2C256 de Xilinx. Este compo-
nente es un CPLD
(ComplexProgrammableLogicDevice) que
contiene 256 biestables.
En este ejercicio solo interesa conocer
los pines del XC2C256 que se conectan a los
periféricos que se van a utilizar para el conta-
dor. Los displays se encienden o apagan
atacando a las bases de los transistores PNP.
Se ha incluido en la ENTITY del diseño
una salida nueva llamada ilumina para poder
poner a 0 o a 1 las bases de estos transistores.
Si ilumina(0)=0 entonces el display de la
derecha se iluminaría ya que el su transistor
PNP estaría en estado activo y dejaría pasar
corriente al display. Los 7 segmentos están
compartidos por los 4 displays. Por tanto, si
ilumina=”0000” entonces los 4 displays se
iluminarían y mostrarían el mismo número.

En este ejercicio se utilizará el siguiente fichero contador.ucf para la asignación de


pines. La versión 3 del programa Xilinx ISE no contiene la Coolrunner. Se ha utilizado la
versión 9.1 en el que la sintaxis cambia ligeramente para especificar un elemento de un
vector (se utiliza <n> en lugar de [n]).

NET "clk" LOC = "P143"; # BTN0


NET "enable" LOC = "P94" ; # BTN1
NET "reset" LOC = "P39" ; # SW0
NET "up_down" LOC = "P124"; # SW1

NET "ilumina<0>" LOC = "P126" ; # 1: Apagado, 0: encendido (display derecha)


NET "ilumina<1>" LOC = "P128" ;# 1: Apagado, 0: encendido
NET "ilumina<2>" LOC = "P129" ;# 1: Apagado, 0: encendido
NET "ilumina<3>" LOC = "P130" ;# 1: Apagado, 0: encendido (display izquierda)

NET "segment7<0>" LOC = "56" ; # segmento A. compartido por los 4 displays


NET "segment7<1>" LOC = "53" ; # segmento B. compartido por los 4 displays
NET "segment7<2>" LOC = "60" ; # segmento C. compartido por los 4 displays
NET "segment7<3>" LOC = "58" ; # segmento D. compartido por los 4 displays
NET "segment7<4>" LOC = "57" ; # segmento E. compartido por los 4 displays
NET "segment7<5>" LOC = "54" ; # segmento F. compartido por los 4 displays
NET "segment7<6>" LOC = "61" ; # segmento G. compartido por los 4 displays

1.2. Programación de la tarjeta Coolrunner

El manejo de la versión 9.1 de Xilinx es muy similar al de la versión 3 utilizada


para la síntesis e implementación de la 22V10. Se crea un proyecto y se incluyen los
ficheros contador.vhd y contador.ucf. A continuación se ejecuta la opción de
implementación y se obtiene el fichero contador.jed.
El fichero contador.jed se da en este ejercicio para que el alumno programe
directamente la tarjeta y compruebe el funcionamiento. El programa para programar la
tarjeta se llama ADEPT y pertenece al DIGILENT que es el fabricante de la tarjeta
Coolrunner.

1.3. Problemas de rebotes


4 Lenguaje VHDL

Los rebotes se producen cuando un dispositivo mecánico actúa en un circuito


eléctrico. Este es el caso de los interruptores y los pulsadores. Cuando un pulsador
(como el de la siguiente figura) está inactivo el pin de entrada al dispositivo está a nivel
alto a través de la resistencia de 10K. Si se aprieta el pulsador éste hace que la tensión
del pin cambie a nivel bajo manteniéndose en este nivel mientras el botón se mantenga
pulsado. Este cambio de nivel lógico presenta el problema de que produce un transitorio
indeseable en el pin de entrada.

Los sistemas digitales van provistos de algún dispositivo –normalmente un diodo-


para disminuir el transitorio por hardware. El diodo entra en conducción cuando la
tensión se hace negativa en el pin limitando el valor de ésta a la caída de tensión del
diodo. De esta forma le quita energía a la primera semionda negativa (la más fuerte) de
una forma apreciable. El transitorio queda muy debilitado desde el principio. En la
siguiente figura se muestra un esquema típico de un pulsador y del efecto del diodo en el
transitorio.

A pesar de la protección hardware, pueden pasar varios pulsos en el transitorio


que ocurre cuando se pulsa un botón. Esto haría que el contador se incrementará en más
de uno al pulsar el botón conectado a la entrada de reloj del contador. Por ejemplo, al
pulsar un botón la señal de salida pasaría de 1 a 0 pero con rebotes: 1 0

La solución pasa por utilizar un biestable RS que actúe como supresor de rebotes.
En este caso habría que utilizar dos botones para el reloj: BTN0 sería para generar un
flanco de subida y BTN1 para generar el flanco de bajada. Por tanto, el contador deja ya
de tener entrada de enable ya que el botón BTN1 se utilizará para la señal de reloj.

Supongamos que inicialmente la salida del biestable es ‘0’. Dicha salida se


mantiene a ese valor mientras no se pulse ningún botón ya que las entradas están a ‘1’.
Cuando se pulsa el botón BTN0, la entrada S pasará de 1 a 0 con rebotes. La salida del
biestable cambiará de 0 a 1 sin rebotes ya que en su entradas verá bien el valor de 01 ó
11 para las entradas S R . Cuando valen 01 el biestable pone su salida a 1 y cuando
valen 00 el salida mantiene ese estado (salida 1).

Programación de la Coolrunner: Se utilizará el programa Adept del fabricante de la


Coolrunner (Digilent). En el laboratorio se explicará los pasos que hay que dar para
programar el dispositivo con el fichero *.JED resultado de la síntesis e implementación.
Lenguaje VHDL 5

1.3.1. Nuevo fichero de restricciones (contador_sin_rebotes.ucf)

NET "clk0" LOC = "P143"; # BTN0


NET "clk1" LOC = "P94" ; # BTN1 (ya no es el pin de enable)
NET "reset" LOC = "P39" ; # SW0
NET "up_down" LOC = "P124"; # SW1

NET "ilumina<0>" LOC = "P126" ; # 1: Apagado, 0: encendido (display derecha)


NET "ilumina<1>" LOC = "P128" ; # 1: Apagado, 0: encendido
NET "ilumina<2>" LOC = "P129" ; # 1: Apagado, 0: encendido
NET "ilumina<3>" LOC = "P130" ; # 1: Apagado, 0: encendido (display izquierda)

NET "segment7<0>" LOC = "56" ; # segmento A. compartido por los 4 displays


NET "segment7<1>" LOC = "53" ; # segmento B. compartido por los 4 displays
NET "segment7<2>" LOC = "60" ; # segmento C. compartido por los 4 displays
NET "segment7<3>" LOC = "58" ; # segmento D. compartido por los 4 displays
NET "segment7<4>" LOC = "57" ; # segmento E. compartido por los 4 displays
NET "segment7<5>" LOC = "54" ; # segmento F. compartido por los 4 displays
NET "segment7<6>" LOC = "61" ; # segmento G. compartido por los 4 displays

1.3.2. Cambios en el fichero de diseño (contador_sin_rebotes.vhd)


En la entidad se sustituye la entrada clk por clk0 y la entrada enable por clk1.
La señal clk (sin rebotes) ahora será interna de la arquitectura. Se obtiene a partir de
clk0 y clk1 que si tienen rebotes. Hay que añadir un proceso en la arquitectura cuya
salida es clk y que implementa el biestable RS que suprime los rebotes de las entradas
de los botones clk0 y clk1.

-- **********************************************************************
-- ENTIDAD (entradas/salidas, visto como una caja negra)
-- **********************************************************************
ENTITY contador7seg IS
PORT (
-- Entradas
clk0 :INstd_logic;-- P143 <-- BTN0
clk1 :INstd_logic;-- P94 <-- BTN1
reset :INstd_logic;-- P39 <-- SW0
up_down :INstd_logic;-- P124 <-- SW1
-- salidas
ilumina :OUTstd_logic_vector(3 DOWNTO 0);-- P126 <-- '1' (encendido)
-- P128 <-- '0' (apagado)
-- P129 <-- '1'
-- P130 <-- '1'

segment7: OUT std_logic_vector(6DOWNTO 0)-- P25 <-- segment(0)


-- P16 <-- segment(1)
-- P23 <-- segment(2)
-- P21 <-- segment(3)
-- P20 <-- segment(4)
-- P17 <-- segment(5)
-- P83 <-- segment(6)
);
END contador7seg;

-- **********************************************************************
-- ARQUITECTURA (descripción de la circuitería)
-- **********************************************************************
ARCHITECTURE contador7seg_arq OF contador7seg IS
SIGNALcnt :std_logic_vector(3 DOWNTO 0);
SIGNAL clk :std_logic;

BEGIN

-- ==============================================================
-- Proceso para genera clk a partir de "clk0" y "clk1"
-- ==============================================================
-- clk0 y clk1 están a '1' en reposo (si no se pulsa ningún botón)
-- clk0='0' cuando pulso el botón BTN0
-- clk1='0' cuando pulso el botón BTN1
PROCESS (clk0, clk1) IS
BEGIN
IF (clk0 = '0') THEN
clk<= '1';
ELSIF (clk1 = '0') THEN
clk<= '0';
ELSE
clk<= clk;
END if;
END PROCESS;
6 Lenguaje VHDL

2. Ejercicios puntuables para la práctica

En esta práctica se simularán dos circuitos que se descargarán desde la web de la


asignatura: un contador y un autómata. Se propondrán diferentes comprobaciones y
modificaciones a dichos circuitos. También se realizará la síntesis de los circuitos
modificados y, dicho resultado final, se simulará con el programa PROTEUS. Si se
dispusiera de una tarjeta con la PAL22V10 se podría programar y probar su validez
dando tensión (ya no sería simulación).

2.1. Control de la barrera del tren(tren.vhd, trenCorto_tb.vhd)

2.1.1. Modificación: simulación y síntesis dela máquina de Moore que controla la


barrera.

Se incluirán los dos ficheros en el proyecto. Sólo se tienen estímulos para el caso del
tren corto (trenCorto_tb.vhd). Las curvas tienen que ser como las que se muestran en la
siguiente figura.

1. Simulación con punto de parada para comprobar que una señal puede
asignarse varias veces en un proceso pero que el valor que toma es el último
asignado dentro del proceso. Dicho valor se hará efectivo cuando termine el
proceso:

 Poner un punto de parada en la línea 41 del fichero tren.vhd

 Se reinicia la simulación pulsando F5o bien en el menú


Simulate ->Restart
 Avanzar en la simulación hasta que pare en el punto de parada
fijado.
En la siguiente figura se ve que el cursor está en la línea 41 pero
aun no la ha ejecutado. Se le ha dado un primer valor a la salida
Lenguaje VHDL 7

barrera en la línea 38. Se ha puesto a ‘1’ pero ese valor no es efectivo


hasta que termine el proceso. Puede verse dicho valor en la esquina
inferior izquierda marcada con un recuadro rojo.
En la línea de parada se le va a asignar un nuevo valor que será el
que tenga la señal cuando termine de ejecutarse este proceso.

 Si se ejecuta un paso (picando en el icono que está justo a la


derecha del icono de la mano) veremos que asignará este último
valor a la salida barrera. Este se hará efectivo cuando salga del
proceso. Dado que al avanzar un paso finaliza el proceso actual
(ahora salta al proceso del reloj en el fichero de est), veremos
que la señal barrera cambia a su nuevo valor de ‘0’. Como ahora
estamos en el fichero de estímulos, las señales que se ven son
las de la arquitectura de este fichero que llevan el sufijo “_test”
y que se pasan como parámetros al compontente “tren” (U1).

2. Visualización de señales internas del sistema.

Es muy útil en la simulación de autómatas ver el estado en el que se


encuentra a lo largo de la simulación. Para poder ver esta señal se hará lo
siguiente:
8 Lenguaje VHDL

 Picamos en la opción Heriarchy. Aparecerán los diferentes


componentes que se han creado en el diseño. En nuestro caso
solo está el componente U1. Para ver las señales internas de un
determinado componente se pica sobre él.
 En la esquina inferior izquierda aparecerán las señales de este
componente entre las que se encuentra la señal estado.
 Picamos sobre dicha señal con el botón de la derecha y
seleccionamos AddSelected to Waveform.

 Se reinicia la simulación pulsando F5o bien en el menú


Simulate ->Restart. Se avanza en la simulación. Aparecerá el
estado en el que se encuentra el autómata.

En la figura anterior se aprecia que el diseño corresponde a una máquina de


Moore porque la salida depende solo del estado. El estado está almacenado en los
biestables y éstos cambian en sincronía con el flanco activo del reloj (de subida). Por
tanto, la salida cambia en sincronía con el reloj como se muestra con los dos recuadros
en rojo sobre la curva de la señal fin_test.
Lenguaje VHDL 9

Síntesis, implementación y simulación en proteus

Será necesario crear el fichero tren.ucf acorde con el esquema del fichero proteus
que se da para este apartado. Las etiquetas que aparecen en el fichero de proteus son
solo informativas (CLOCK, RESETN, sensores0, sensores1, barrera). No se utilizan en
el fichero tren.ucf. En el fichero UCF se utilizan los nombres de las señales tal y como
aparecen en la entidad del fichero de diseño en VHDL.

U3

U1
CLOCK=100Hz 1 23
I0/CLK IO0
2 22
I1 IO1 330
3 21
I2 IO2
4 20
I3 IO3
RESETN 5 19
1 6
I4
I5
IO4
IO5
18
7 17
I6 IO6
8 16
I7 IO7
9 15
I8 IO8
0 sensores0
10
11
I9 IO9
14 barrera
I10
sensores1 13
0 I11
AM22V10
FILE=tren.jed

2.1.2. Modificación: Diseño con más de un fichero de estímulos.


Al proyecto de simulación del apartado anterior se le añadirá un nuevo fichero de
estímulos (trenLargo_tb.vhd). La entidad de este nuevo fichero de estímulos se llamará
test_largo. Por tanto, el proyecto tendrá dos ficheros de estímulos. A la hora de simular
se podrá elegir entre los estímulos para el caso del tren corto o del tren largo. Esto se
consigue con la opción Simulate ->Select Top Level. Para el caso de utilizar los
estímulos del fichero para el tren corto se elige la opción test_corto. Para el caso del
tren largo se elegiría la opción test_largo.

2.1.3.Modificación. Simulación para el caso de un funcionamiento bidireccional

En este caso el tren puede venir por la izquierda o por la derecha. El fichero tren.vhd
requiere que se le añadan nuevos estados para que contemplen el caso de que el tren
venga por el lado contrario.
Habrá que actualizar los ficheros de estímulos y simular el caso de que el tren venga
primero en un sentido y después en el otro tanto para el fichero trenCorto_tb.vhd
como para el fichero trenLargo_tb.vhd.

2.1.4. Modificación. Síntesis para el caso de un funcionamiento bidireccional

El fichero tren.UCF y tren.DSN no necesitan modificación. Sólo hay que añadir el fichero
del apartado anterior: tren.vhd.
10 Lenguaje VHDL

2.1.5. Modificación: simular la barrera del tren (unidireccional) como una


máquina de Mealy
En este apartado se tiene que modificar el diseño para que se comporte como una
máquina de Mealy. Además, se simulará tanto el caso del tren corto como el del tren
largo.

 El fichero de diseño se ha dividido en dos procesos:

o Uno síncrono (solo tiene el reloj en la lista sensible) para asignar la


señal estado. Gestiona como evolucionan los estados según el valor del
estado actual y del valor de las entradas. Equivale al proceso del fichero
de los apuntes pero eliminando la señal de salida barrera de dicho
proceso. Es la caja de color verde (en medio) de la figura.
o Otro asíncrono (tiene en la lista sensible la señal estado –síncrono- y
las entradas –asíncronas-). En este proceso se asigna la salida barrera.
Este proceso será muy similar al anterior pero cuando se asigna el valor
para el estado, se sustituye por la salida barrera. Es la caja de la
derecha de la figura. Las dos flechas de entrada a dicha caja son las
entradas al proceso para asignar la salida barrera: estado y entradas.

 En las curvas de la simulación se muestra el resultado y se ve que la


conmutación de la salida depende del estado y del cambio en la señal de
entrada. Por tanto, dichos cambios no están en sincronía con el flanco de
subida del reloj (flanco activo). Las salidas son asíncronas. Esta es la diferencia
entre la máquina de Moore y la de Mealy.

Concepto Importante: Una señal solo puede asignarse en un proceso o bien fuera de
él. Lo que no puede ocurrir es que a una misma señal se le asignen valores en dos o más
procesos. Cada proceso intentaría construir un circuito cuya salida fuera esa señal lo cual
generaría una colisión. En el fichero tren.vhd se aprecia que en el primer proceso se
asigna la señal barrera y en el segundo proceso la señal estado.
Lenguaje VHDL 11

Se va a provocar un error relacionado con este concepto. Se va asignar la salida


barrera en el proceso síncrono. Ver la siguiente figura:

En este caso el sistema permite compilar e incluso simular el circuito. Sin embargo, la
salida sale en color rojo porque hay una colisión al estar asignada en dos procesos. Lo
cual es un grave error. Esto ya se explicó en la clase anterior pero se volverá a realizar.

2.1.6. Modificación: simular la barrera del tren (bidireccional) como una


máquina de Mealy

Se adaptará el fichero en el que se diseña el circuito y se realizarán las dos


simulaciones: tren largo y tren corto.

2.1.7. Modificación: síntesis y simulación en proteus para una barrera del tren
(bidireccional) con una máquina de Mealy
El alumno utilizará los ficheros anteriores que considere convenientes.

4. Consideraciones sobre la práctica


La asistencia puntúa 3 puntos.

Cada subapartado del apartado 2 puntúa con 1 punto.

El punto de parada es meramente informativo. No se va a evaluar.

Das könnte Ihnen auch gefallen