D
D
p
p
t
t
o
o
d
d
e
e
T
T
e
e
c
c
n
n
o
o
l
l
o
o
g
g
í
í
a
a
E
E
l
l
e
e
c
c
t
t
r
r
ó
ó
n
n
i
i
c
c
a
a
INGENIERO TÉCNICO DE TELECOMUNICACIÓN.
ESPECIALIDAD TELEMÁTICA.
DISEÑO DE SISTEMAS ELECTRÓNICOS.
EJERCICIOS RESUELTOS DE VHDL.
Problema 1
.
Concurrencia.
Construya el listado VHDL que describa el circuito “Cero” de la figura adjunta,
sabiendo que presenta el comportamiento descrito en la tabla de verdad que la
acompaña.
x
y
z
H
0
0
0
0
0
0
1
0
0
1
0
0
0
1
1
0
1
0
0
0
1
0
1
1
1
1
0
1
1
1
1
0
x
y
z
H
0
0
0
0
0
0
1
0
-- Solución 1: Generación de la tabla de verdad.
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; ENTITY Cero IS
PORT ( sX, sY, sZ: IN std_logic; sH: OUT std_logic); END Cero;
ARCHITECTURE CeroArch OF Cero IS BEGIN
sH <= ‘1’ WHEN (sX=’1’ and sY = ‘1’ and sZ = ‘0’) ELSE
‘1’ WHEN (sX=’1’ and sY = ‘0’ and sZ = ‘1’) ELSE
‘0’; END CeroArch;
-- Solución 2: Minimizando (Ecuaciones lógicas)
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; ENTITY Cero IS
PORT ( sX, sY, sZ: IN std_logic; sH: OUT std_logic); END Cero;
ARCHITECTURE CeroArch OF Cero IS BEGIN
sH <= sX and (sY xor sZ); END CeroArch;
x
y
z
H
CERO
Problema 2
Operador Concatenación.
Considere dos vectores A(a
3a
2a
1a
0) y B(b
3b
2b
1b
0), los cuales van a ser las entradas
de un sistema digital. Se desea modelar en VHDL este sistema, sabiendo que
presenta una salida (S) definida por el siguiente comportamiento:
S = 1 si:
a
3= b
3a
2= b’
2a
1= b
1a
0= b’
0S = 0
en cualquier otro caso.
donde ‘ indica el operador negación.
-- Solución 1: Estructura I F-THEN-ELSE
LIBRARY IEEE;
USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; USE ieee.std_logic_unsigned.all;
ENTITY Comparador IS
PORT ( svA, svB: IN std_logic _vector(3 DOWNTO 0); sS: OUT std_logic); END Comparador; ARCHITECTURE ComparadorArch OF Comparador IS BEGIN PROCESS (svA, svB) BEGIN IF (svA(3) /= svB(3)) THEN sS<=’0’; ELSIF (svA(2) /= not svB(2)) THEN sS<=’0’; ELSIF (svA(1) /= svB(1)) THEN sS<=’0’; ELSIF (svA(0) /= not svB(0)) THEN sS<=’0’; ELSE sS<=’1’; END IF; END PROCESS; END ComparadorArch; -- Solución 2: CONCATENACIÓN LIBRARY IEEE; USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; USE ieee.std_logic_unsigned.all; ENTITY Comparador IS
PORT ( svA, svB: IN std_logic _vector(3 DOWNTO 0); sS: OUT std_logic); END Comparador; ARCHITECTURE ComparadorArch OF Comparador IS BEGIN PROCESS (svA, svB)
SIGNAL svAux: std_logic _vector(3 DOWNTO 0); BEGIN
svAux <= svB(3)&(not svB(2))&svB(1)&(not svB(0));
-- Se efectúa la comparación sobre la variable -- auxiliar
IF (svA = svAux) THEN sS<=’1’; ELSE sS<=’0’;
Problema 3
Uso de configuraciones.
Escriba la descripción VHDL estructural (metodología de instanciación) del circuito
de la figura adjunta:
LIBRARY IEEE;
USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; USE ieee.std_logic_unsigned.all; -- Se declara la misma entidad -- para diferentes configuraciones. -- (Todas son puertas de dos entradas -- y una salida).
ENTITY Puerta2 IS
PORT (sIn1, sIn2: IN std_logic; sOut: OUT std_logic );
END Puerta2;
--Configuración para puerta XOR
ARCHITECTURE XOR2Arch OF Puerta2 IS BEGIN
sOut <= sIn1 xor sIn2; END XOR2Arch;
--Configuración para puerta XNOR
ARCHITECTURE XNOR2Arch OF Puerta2 IS BEGIN
sOut <= sIn1 xnor sIn2; END XNOR2Arch;
--Configuración para puerta OR
ARCHITECTURE OR2Arch OF Puerta2 IS BEGIN
sOut <= sIn1 or sIn2; END OR2Arch;
--Configuración para puerta AND
ARCHITECTURE AND2Arch OF Puerta2 IS BEGIN
sOut <= sIn1 and sIn2; END AND2Arch;
--Configuración para puerta NAND
ARCHITECTURE NAND2Arch OF Puerta2 IS BEGIN
sOut <= sIn1 nand sIn2; END NAND2Arch; LIBRARY IEEE; USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; USE ieee.std_logic_unsigned.all; ENTITY Circuito IS
PORT (sA, sB: IN std_logic; sU, sV: IN std_logic;
sX, sY: IN std_logic;
sF1, sF2, sF3: OUT std_logic );
END Circuito;
ARCHITECTURE CircuitoArch OF Circuito IS --Declaración de componentes.
COMPONENT Puerta2 IS
PORT (sIn1, sIn2: IN std_logic; sOut: OUT std_logic );
END COMPONENT;
--Declaración de variables auxiliares. SIGNAL sX1, sX2, sX3, sX4, sX5: std_logic; --Declaración de configuraciones.
FOR G1: Puerta2 USE ENTITY Puerta2(XNOR2Arch);
FOR G2: Puerta2 USE ENTITY Puerta2(AND2Arch);
FOR G3: Puerta2 USE ENTITY Puerta2(XOR2Arch);
FOR G4: Puerta2 USE ENTITY Puerta2(OR2Arch);
FOR G5: Puerta2 USE ENTITY Puerta2(AND2Arch);
FOR G6: Puerta2 USE ENTITY Puerta2(NAND2Arch);
BEGIN
G1: Puerta2 PORT MAP(sIn1=>sA, sIn2=>sB,
sOut=>sX1 );
G2: Puerta2 PORT MAP(sIn1=>sU, sIn2=>sV,
sOut=>sX2 );
G3: Puerta2 PORT MAP(sIn1=>sX, sIn2=>sY, sOut=>sX3 );
G4: Puerta2 PORT MAP(sIn1=>sX1, sIn2=>sX2,
sOut=>sX4 );
G5: Puerta2 PORT MAP(sIn1=>sX2, sIn2=>sX3,
sOut=>sX5 );
G6: Puerta2 PORT MAP(sIn1=>sX4, sIn2=>sX5,
sOut=>sF2 );
-- Se actualizan las funciones de salida -- (Almacenadas en las señales auxiliares). sF1<= sX1;
sF3<= sX5;
-- NOTA: Otra forma de resolución podría -- haber sido declarando las sF como -- tipo INOUT. Entonces se podrían leer -- y podrían colocarse en las instanciaciones -- de los componentes.
Problema 4
Uso de configuraciones (II).
Escriba la descripción VHDL estructural (metodología de instanciación) del circuito
de la figura adjunta:
LIBRARY IEEE;
USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; USE ieee.std_logic_unsigned.all; -- Se declara la misma entidad -- para diferentes configuraciones. -- (Todas son puertas de dos entradas -- y una salida).
ENTITY Puerta2 IS
PORT (sIn1, sIn2: IN std_logic; sOut: OUT std_logic );
END Puerta2;
--Configuración para puerta XOR
ARCHITECTURE XOR2Arch OF Puerta2 IS BEGIN
sOut <= sIn1 xor sIn2; END XOR2Arch;
--Configuración para puerta NOR
ARCHITECTURE NOR2Arch OF Puerta2 IS BEGIN
sOut <= sIn1 nor sIn2; END NOR2Arch;
--Configuración para puerta OR
ARCHITECTURE OR2Arch OF Puerta2 IS
BEGIN
sOut <= sIn1 or sIn2; END OR2Arch;
LIBRARY IEEE;
USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; USE ieee.std_logic_unsigned.all; -- Descripción del FLIP-FLOP D ENTITY FlipFlopD IS
PORT (sD, CLK: IN std_logic; sQ: OUT std_logic );
END FlipFlopD;
ARCHITECTURE FlipFlopDArch OF FlipFlopD IS BEGIN
PROCESS (CLK) BEGIN
--Declaración del flanco de bajada. IF (falling_edge(CLK)) THEN sQ<= sD; ELSE NULL;
END PROCESS; END FlipFlopDArch;
-- Descripción VHDL estructural del circuito. LIBRARY IEEE; USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; USE ieee.std_logic_unsigned.all; ENTITY Circuito IS
PORT (sU, sV: IN std_logic; CLK_C: IN std_logic;
sS: OUT std_logic );
END Circuito;
ARCHITECTURE CircuitoArch OF Circuito IS --Declaración de componentes.
COMPONENT Puerta2 IS
PORT (sIn1, sIn2: IN std_logic; sOut: OUT std_logic ); END COMPONENT; COMPONENT FlipFlopD IS PORT (sD, CLK: IN std_logic; sQ: OUT std_logic ); END COMPONENT;
--Declaración de variables auxiliares. SIGNAL sX1, sX2, sX3: std_logic;
--Declaración de configuraciones. FOR G1: Puerta2 USE ENTITY Puerta2(OR2Arch);
FOR G2: Puerta2 USE ENTITY Puerta2(NOR2Arch);
FOR G3: Puerta2 USE ENTITY Puerta2(XOR2Arch);
BEGIN
G1: Puerta2 PORT MAP(sIn1=>sU, sIn2=>sV,
sOut=>sX1 );
G2: Puerta2 PORT MAP(sIn1=>sU, sIn2=>sV,
sOut=>sX2 );
FD_1: FlipFlopD PORT MAP(sD=>sX2, CLK=>CLK_C,
sQ=>sX3 );
G3: Puerta2 PORT MAP(sIn1=>sX2, sIn2=>sX3, sOut=>sS );
Problema 5.
Control de vagoneta.
Se pretende diseñar un circuito de control de la vagoneta esquematizada en la
figura adjunta; el cual se debe comportar de la siguiente manera:
s Mientras no se pulse el pulsador (P), la vagoneta se encontrará parada en
el punto A.
s Al activar el pulsador (P), independientemente de que se vuelva a pulsar P,
la vagoneta se dirigirá hacia el punto B y, una vez que haya llegado,
automáticamente regresará al punto A.
s De nuevo en el punto A, si pulsamos P se repetirá el ciclo y si no se pulsa la
vagoneta se para.
Se sabe además que:
s La detección de la posición de la vagoneta se lleva a cabo mediante dos
sensores (SA y SB) colocados en los puntos A y B respectivamente, los
cuales toman el valor lógico ‘1’ al detectar la presencia de la vagoneta y el
de ‘0’ en caso contrario.
s El sentido del movimiento de la vagoneta se controla mediante la
combinación de dos señales digitales (I, D) atendiendo a las siguientes
combinaciones:
I
D
Acción
0
0
Motor parado
0
1
Mover Derecha
1
0
Mover Izquierda
1
1
No Valido
SA
SB
A
B
P
a) Descripción de la interfaz:
•
Entradas: Tres entradas asociadas a los sensores de detección (SA y SB) y
al pulsador (P) más una señal de reloj (CLK) y otra de
inicialización (ResetH), asociadas a la parte secuencial.
•
Salidas: Dos (I y D), encargadas de controlar el sentido del movimiento.
b) Diagrama de estados inicial
ResetH
CLK
SA
SB
P
I
D
MÁQUINA
DE
ESTADOS
E
P SA SB / I D
Notación Mealy
Equivalentes
c) Diagrama de estados final
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; ENTITY ControlVagoneta IS
PORT ( sA, sB, sP: IN std_logic; --Señal de entrada.
CLK: IN std_logic; --Señal de reloj. sResetH: IN std_logic; --Señal de
inicialización
sI, sD: OUT std_logic); --Salida END ControlVagoneta;
ARCHITECTURE ControlVagonetaArch OF ControlVagoneta IS
--Declaración del tipo asociado a los estados.
TYPE TipoEstados IS (IZQUIERDA, DERECHA);
--Señales auxiliares para la codificación del --estado actual y siguiente.
SIGNAL tEstadoActual, tEstadoSiguiente: TipoEstados;
BEGIN
-- Proceso dedicado a la lógica de estado:
LOGICA_ESTADO: PROCESS(tEstadoActual, sEntrada)
BEGIN
CASE (tEstadoActual) IS WHEN IZQUIERDA =>
IF (sP = ‘1’ and sA = ‘1’ and sB=’0’) THEN tEstadoSiguiente <= DERECHA;
ELSE tEstadoSiguiente <= IZQUIERDA; END IF;
WHEN DERECHA =>
IF (sA = ‘0’ and sB=’1’) THEN tEstadoSiguiente <= IZQUIERDA;
ELSE tEstadoSiguiente <= DERECHA; END IF;
END CASE;
END PROCESS LOGICA_ESTADO;
-- Proceso dedicado a la Memoria de Estado
MEM_ESTADO: PROCESS(CLK, sResetH, tEstadoSiguiente)
BEGIN
--Inicialización con RESET_H
IF (sResetH =’1’) THEN tEstadoSiguiente<= IZQUIERDA;
ELSIF(rising_edge(CLK)) THEN tEstadoActual <= tEstadoSiguiente;
END IF;
END PROCESS MEM_ESTADO;
--Zona concurrente dedicada a modelar la --lógica de salida.
sI <= ‘1’ WHEN (tEstadoActual = IZQUIERDA and sA = ‘0’ )
ELSE ‘0’;
sD <= ‘1’ WHEN (tEstadoActual = DERECHA and sB = ‘0’ )
ELSE ‘0’;
-- sSalida = f(Estado, Entradas) => Máquina de MEALY. END ControlVagonetaArch;
E
P SA SB / I D
Notación Mealy
tEstadoActual<=Problema 6
.
Detector de secuencia.
Se pide diseñar un circuito que acepte una entrada de datos serie y presente una
salida que se activará (tomará el valor lógico ‘1’) cuando en los instantes de
muestreo aparezca la secuencia “1011”.
a) Descripción de la interfaz:
•
Entradas: Una entrada de datos (sDataIn) más una señal de reloj (CLK) y
otra de inicialización (ResetH), asociadas a la parte secuencial.
•
Salidas: Una sDetect, encargada de activarse cuando se ha detectado la
secuencia.
b) Diagrama de estados versión MOORE
ResetH
CLK
sDataIn
sDetect
MÁQUINA
DE
ESTADOS
E
Data
S
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; ENTITY SecMoore IS
PORT ( sDataIn: IN std_logic; --Señal de entrada.
CLK: IN std_logic; --Señal de reloj.
sResetH: IN std_logic; --Señal de inicialización
sDetect: OUT std_logic); --Salida END SecMoore;
ARCHITECTURE SecMooreArch OF SecMoore IS
--Declaración del tipo asociado a los estados.
TYPE TipoEstados IS (E0, E1, E10, E101, E1011);
--Señales auxiliares para la codificación del --estado actual y siguiente.
SIGNAL tEstadoActual, tEstadoSiguiente: TipoEstados;
BEGIN
-- Proceso dedicado a la lógica de estado:
LOGICA_ESTADO: PROCESS(tEstadoActual, sEntrada)
BEGIN
CASE (tEstadoActual) IS WHEN E0 =>
IF (sDataIn = ‘0’) THEN tEstadoSiguiente <= E0; ELSE tEstadoSiguiente <= E1;
END IF; WHEN E1 =>
IF (sDataIn = ‘0’) THEN tEstadoSiguiente <= E10;
ELSE tEstadoSiguiente <= E1; END IF;
WHEN E10 =>
IF (sDataIn = ‘0’) THEN tEstadoSiguiente <= E0; ELSE tEstadoSiguiente <= E101;
END IF; WHEN E101 =>
IF (sDataIn = ‘0’) THEN tEstadoSiguiente <= E10;
ELSE tEstadoSiguiente <= E1011; END IF;
WHEN E1011 =>
IF (sDataIn = ‘0’) THEN tEstadoSiguiente <= E10;
ELSE tEstadoSiguiente <= E1; END IF;
END CASE;
END PROCESS LOGICA_ESTADO;
-- Proceso dedicado a la Memoria de Estado
MEM_ESTADO: PROCESS(CLK, sResetH, tEstadoSiguiente)
BEGIN
--Inicialización con RESET_H
IF (sResetH =’1’) THEN tEstadoSiguiente<= E0; ELSIF(rising_edge(CLK)) THEN tEstadoActual <= tEstadoSiguiente;
END IF;
END PROCESS MEM_ESTADO;
--Zona concurrente dedicada a modelar la --lógica de salida.
sDetect <= ‘1’ WHEN (tEstadoActual = E1011) ELSE ‘0’;
-- sSalida = f(Estado) => Máquina de MOORE. END SecMooreArch;
E
Data
S
c) Diagrama de estados versión MEALY
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; ENTITY SecMealy IS
PORT ( sDataIn: IN std_logic; --Señal de entrada.
CLK: IN std_logic; --Señal de reloj.
sResetH: IN std_logic; --Señal de inicialización
sDetect: OUT std_logic); --Salida END SecMealy;
ARCHITECTURE SecMealyArch OF SecMealy IS
--Declaración del tipo asociado a los estados.
TYPE TipoEstados IS (E0, E1, E10, E101);
--Señales auxiliares para la codificación del --estado actual y siguiente.
SIGNAL tEstadoActual, tEstadoSiguiente: TipoEstados;
BEGIN
-- Proceso dedicado a la lógica de estado:
LOGICA_ESTADO: PROCESS(tEstadoActual, sEntrada)
BEGIN
CASE (tEstadoActual) IS WHEN E0 =>
IF (sDataIn = ‘0’) THEN tEstadoSiguiente <= E0;
ELSE tEstadoSiguiente <= E1; END IF;
WHEN E1 =>
IF (sDataIn = ‘0’) THEN tEstadoSiguiente <= E10;
END IF; WHEN E10 =>
IF (sDataIn = ‘0’) THEN tEstadoSiguiente <= E0;
ELSE tEstadoSiguiente <= E101; END IF;
WHEN E101 =>
IF (sDataIn = ‘0’) THEN tEstadoSiguiente <= E10;
ELSE tEstadoSiguiente <= E1; END IF;
END CASE;
END PROCESS LOGICA_ESTADO;
-- Proceso dedicado a la Memoria de Estado
MEM_ESTADO: PROCESS(CLK, sResetH, tEstadoSiguiente)
BEGIN
--Inicialización con RESET_H
IF (sResetH =’1’) THEN tEstadoSiguiente<= E0; ELSIF(rising_edge(CLK)) THEN tEstadoActual <= tEstadoSiguiente;
END IF;
END PROCESS MEM_ESTADO;
--Zona concurrente dedicada a modelar la --lógica de salida.
sDetect <= ‘1’ WHEN (tEstadoActual = E101 and sDataIn = ‘1’)
ELSE ‘0’;
-- sSalida = f(Estado, Entrada) => Máquina de MEALY. END SecMealyArch;