Está en la página 1de 13

INGENIERO TCNICO DE TELECOMUNICACIN. ESPECIALIDAD TELEMTICA.

DISEO DE SISTEMAS ELECTRNICOS. EJERCICIOS RESUELTOS DE VHDL.

Dpto de Tecnologa Electrnica

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 acompaa. x 0 0 0 0 1 1 1 1 x 0 0 y 0 0 1 1 0 0 1 1 y 0 0 z 0 1 0 1 0 1 0 1 z 0 1 H 0 0 0 0 0 1 1 0 H 0 0

x y z CERO H

-- Solucin 1: Generacin 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;

-- Solucin 2: Minimizando (Ecuaciones lgicas) 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;

Problema 2
Operador Concatenacin.
Considere dos vectores A(a 3a2a1a0) 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 = b 3 a2 = b2 a1 = b 1 a0 = b0 donde indica el operador negacin. S=0 en cualquier otro caso.

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

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 efecta la comparacin sobre la variable -- auxiliar IF (svA = svAux) THEN sS<=1; ELSE sS<=0; END ComparadorArch;

-- Solucin 2: CONCATENACIN

Problema 3
Uso de configuraciones.
Escriba la descripcin VHDL estructural (metodologa de instanciacin) 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; --Configuracin para puerta XOR ARCHITECTURE XOR2Arch OF Puerta2 IS BEGIN sOut <= sIn1 xor sIn2; END XOR2Arch; --Configuracin para puerta XNOR ARCHITECTURE XNOR2Arch OF Puerta2 IS BEGIN sOut <= sIn1 xnor sIn2; END XNOR2Arch;

--Configuracin para puerta OR ARCHITECTURE OR2Arch OF Puerta2 IS BEGIN sOut <= sIn1 or sIn2; END OR2Arch; --Configuracin para puerta AND ARCHITECTURE AND2Arch OF Puerta2 IS BEGIN sOut <= sIn1 and sIn2; END AND2Arch; --Configuracin 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; 3

sX, sY: IN std_logic; sF1, sF2, sF3: OUT std_logic ); END Circuito; ARCHITECTURE CircuitoArch OF Circuito IS --Declaracin de componentes. COMPONENT Puerta2 IS PORT (sIn1, sIn2: IN std_logic; sOut: OUT std_logic ); END COMPONENT; --Declaracin de variables auxiliares. SIGNAL sX1, sX2, sX3, sX4, sX5: std_logic; --Declaracin 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 seales auxiliares). sF1<= sX1; sF3<= sX5; -- NOTA: Otra forma de resolucin podra -haber sido declarando las sF como -tipo INOUT. Entonces se podran leer -y podran colocarse en las instanciaciones -de los componentes. END CircuitoArch;

Problema 4
Uso de configuraciones (II).
Escriba la descripcin VHDL estructural (metodologa de instanciacin) 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; --Configuracin para puerta XOR ARCHITECTURE XOR2Arch OF Puerta2 IS BEGIN sOut <= sIn1 xor sIn2; END XOR2Arch; --Configuracin para puerta NOR ARCHITECTURE NOR2Arch OF Puerta2 IS BEGIN sOut <= sIn1 nor sIn2; END NOR2Arch; --Configuracin 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; -- Descripcin 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 --Declaracin del flanco de bajada. IF (falling_edge(CLK)) THEN sQ<= sD; ELSE NULL; END PROCESS; END FlipFlopDArch;

-- Descripcin 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 --Declaracin 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; --Declaracin de variables auxiliares. SIGNAL sX1, sX2, sX3: std_logic;

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

Problema 5.
Control de vagoneta.
Se pretende disear 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, automticamente 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 adems que: s La deteccin de la posicin 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 lgico 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 combinacin de dos seales digitales (I, D) atendiendo a las siguientes combinaciones: I 0 0 1 1 D 0 1 0 1 Accin Motor parado Mover Derecha Mover Izquierda No Valido

SA A B

SB

a) Descripcin de la interfaz: Entradas: Tres entradas asociadas a los sensores de deteccin (SA y SB) y al pulsador (P) ms una seal de reloj (CLK) y otra de inicializacin (ResetH), asociadas a la parte secuencial. Salidas: Dos (I y D), encargadas de controlar el sentido del movimiento.

SA SB P CLK ResetH MQUINA DE ESTADOS I

b) Diagrama de estados inicial

P SA SB / I D E
Notacin Mealy

Equivalentes

c) Diagrama de estados final

P SA SB / I D E
Notacin Mealy

LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY ControlVagoneta IS PORT ( sA, sB, sP: IN std_logic; --Seal de entrada. CLK: IN std_logic; --Seal de reloj. sResetH: IN std_logic; --Seal de inicializacin sI, sD: OUT std_logic); --Salida END ControlVagoneta; ARCHITECTURE ControlVagonetaArch OF ControlVagoneta IS --Declaracin del tipo asociado a los estados. TYPE TipoEstados IS (IZQUIERDA, DERECHA); --Seales auxiliares para la codificacin del --estado actual y siguiente. SIGNAL tEstadoActual, tEstadoSiguiente: TipoEstados; BEGIN -- Proceso dedicado a la lgica 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 --Inicializacin con RESET_H IF (sResetH =1) THEN tEstadoActual<= tEstadoSiguiente<= IZQUIERDA; ELSIF(rising_edge(CLK)) THEN tEstadoActual <= tEstadoSiguiente; END IF; END PROCESS MEM_ESTADO; --Zona concurrente dedicada a modelar la --lgica 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) => Mquina de MEALY. END ControlVagonetaArch;

Problema 6. Detector de secuencia.


Se pide disear un circuito que acepte una entrada de datos serie y presente una salida que se activar (tomar el valor lgico 1) cuando en los instantes de muestreo aparezca la secuencia 1011. a) Descripcin de la interfaz: Entradas: Una entrada de datos (sDataIn) ms una seal de reloj (CLK) y otra de inicializacin (ResetH), asociadas a la parte secuencial. Salidas: Una sDetect, encargada de activarse cuando se ha detectado la secuencia.

sDataIn MQUINA DE ESTADOS sDetect

CLK ResetH
b) Diagrama de estados versin MOORE

Data E S

10

Data E S

LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY SecMoore IS PORT ( sDataIn: IN std_logic; --Seal de entrada. CLK: IN std_logic; --Seal de reloj. sResetH: IN std_logic; --Seal de inicializacin sDetect: OUT std_logic); --Salida END SecMoore; ARCHITECTURE SecMooreArch OF SecMoore IS --Declaracin del tipo asociado a los estados. TYPE TipoEstados IS (E0, E1, E10, E101, E1011); --Seales auxiliares para la codificacin del --estado actual y siguiente. SIGNAL tEstadoActual, tEstadoSiguiente: TipoEstados; BEGIN -- Proceso dedicado a la lgica 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 --Inicializacin con RESET_H tEstadoActual<=E0 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 --lgica de salida. sDetect <= 1 WHEN (tEstadoActual = E1011) ELSE 0; -- sSalida = f(Estado) => Mquina de MOORE. END SecMooreArch;

11

c) Diagrama de estados versin MEALY Data / Detect E


Notacin Mealy

LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY SecMealy IS PORT ( sDataIn: IN std_logic; --Seal de entrada. CLK: IN std_logic; --Seal de reloj. sResetH: IN std_logic; --Seal de inicializacin sDetect: OUT std_logic); --Salida END SecMealy; ARCHITECTURE SecMealyArch OF SecMealy IS --Declaracin del tipo asociado a los estados. TYPE TipoEstados IS (E0, E1, E10, E101); --Seales auxiliares para la codificacin del --estado actual y siguiente. SIGNAL tEstadoActual, tEstadoSiguiente: TipoEstados; BEGIN -- Proceso dedicado a la lgica 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 --Inicializacin con RESET_H IF (sResetH =1) THEN tEstadoActual<=E0 tEstadoSiguiente<= E0; ELSIF(rising_edge(CLK)) THEN tEstadoActual <= tEstadoSiguiente; END IF; END PROCESS MEM_ESTADO; --Zona concurrente dedicada a modelar la --lgica de salida. sDetect <= 1 WHEN (tEstadoActual = E101 and sDataIn = 1) ELSE 0; -- sSalida = f(Estado, Entrada) => Mquina de MEALY. END SecMealyArch;

12