ejercicios resueltos vhdl2006

13
D Dp p t t o o d d e e T T e e c c n no o l l o o g gí í a a E E l l e ec c t t r r ó ó n ni i c c a a INGENIERO TÉCNICO DE TELECOMUNICACIÓN. ESPECIALIDAD TELEMÁTICA. DISEÑO DE SISTEMAS ELECTRÓNICOS. EJERCICIOS RESUELTOS DE VHDL.

Upload: elfrich

Post on 04-Jul-2015

1.377 views

Category:

Documents


5 download

TRANSCRIPT

Page 1: Ejercicios Resueltos VHDL2006

DDppttoo ddee TTeeccnnoollooggííaa EElleeccttrróónniiccaa

INGENIERO TÉCNICO DE TELECOMUNICACIÓN. ESPECIALIDAD TELEMÁTICA.

DISEÑO DE SISTEMAS ELECTRÓNICOS. EJERCICIOS RESUELTOS DE VHDL.

Page 2: Ejercicios Resueltos VHDL2006

· 1 ·

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

Page 3: Ejercicios Resueltos VHDL2006

· 2 ·

Problema 2 Operador Concatenación. Considere dos vectores A(a3a2a1a0) y B(b3b2b1b0), 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: a3 = b3 a2 = b’2 a1 = b1 a0 = b’0

S = 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’; END ComparadorArch;

Page 4: Ejercicios Resueltos VHDL2006

· 3 ·

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;

Page 5: Ejercicios Resueltos VHDL2006

· 4 ·

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. END CircuitoArch;

Page 6: Ejercicios Resueltos VHDL2006

· 5 ·

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;

Page 7: Ejercicios Resueltos VHDL2006

· 6 ·

-- 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 ); END CircuitoArch;

Page 8: Ejercicios Resueltos VHDL2006

· 7 ·

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

Page 9: Ejercicios Resueltos VHDL2006

· 8 ·

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

Page 10: Ejercicios Resueltos VHDL2006

· 9 ·

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

Propietario
tEstadoActual<=
Page 11: Ejercicios Resueltos VHDL2006

· 10 ·

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

Page 12: Ejercicios Resueltos VHDL2006

· 11 ·

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

Propietario
tEstadoActual<=E0
Page 13: Ejercicios Resueltos VHDL2006

· 12 ·

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; 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 <= 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;

E

Data / Detect

Notación Mealy

Propietario
tEstadoSiguiente<= E0; CLK)) THEN tEstadoActual
Propietario
tEstadoActual<=E0