Beruflich Dokumente
Kultur Dokumente
Práctica 9
Introducción al lenguaje VHDL (parte 3)
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
-- **********************************************************************
-- 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
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.
-- **********************************************************************
-- 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'
-- **********************************************************************
-- 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
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:
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
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.
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
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
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.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.