• No se han encontrado resultados

Ejercicios Resueltos VHDL2006

N/A
N/A
Protected

Academic year: 2021

Share "Ejercicios Resueltos VHDL2006"

Copied!
13
0
0

Texto completo

(1)

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.

(2)

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

(3)

Problema 2

Operador Concatenación.

Considere dos vectores A(a

3

a

2

a

1

a

0

) y B(b

3

b

2

b

1

b

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

3

a

2

= b’

2

a

1

= b

1

a

0

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

(4)

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;

(5)

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.

(6)

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;

(7)

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

(8)

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

(9)

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

(10)

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

(11)

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

(12)

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

(13)

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;

E

Data / Detect

Notación Mealy

tEstadoActual<=E0

Referencias

Documento similar

You may wish to take a note of your Organisation ID, which, in addition to the organisation name, can be used to search for an organisation you will need to affiliate with when you

Where possible, the EU IG and more specifically the data fields and associated business rules present in Chapter 2 –Data elements for the electronic submission of information

The 'On-boarding of users to Substance, Product, Organisation and Referentials (SPOR) data services' document must be considered the reference guidance, as this document includes the

In medicinal products containing more than one manufactured item (e.g., contraceptive having different strengths and fixed dose combination as part of the same medicinal

Products Management Services (PMS) - Implementation of International Organization for Standardization (ISO) standards for the identification of medicinal products (IDMP) in

Products Management Services (PMS) - Implementation of International Organization for Standardization (ISO) standards for the identification of medicinal products (IDMP) in

This section provides guidance with examples on encoding medicinal product packaging information, together with the relationship between Pack Size, Package Item (container)

Package Item (Container) Type : Vial (100000073563) Quantity Operator: equal to (100000000049) Package Item (Container) Quantity : 1 Material : Glass type I (200000003204)