Sei sulla pagina 1di 15

UNIVERSIDAD PEDAGGICA Y TECNOLGICA DE

COLOMBIA
SEDE SECCIONAL SOGAMOSO
ESCUELA DE INGENIERA ELECTRNICA
ELECTRONICA DIGITAL II

INTRODUCCION A LA PROGRAMACION EN VHDL


Mara Camila Cepeda Senz
e-mail: mariacamila.cepeda@uptc.edu.co
201111557

Santiago Andrs Gelvez Camargo


e-mail: santiago.gelvez@uptc.edu.co
201111163

2 de septiembre de 2015
RESUMEN: La presente gua propone
la elaboracin de algunos cdigos en lenguaje
VHDL, con los cuales ser posible comprobar cul
es el comportamiento de diferentes estructuras
bsicas tales como sentencias concurrentes
(WHEN-ELSE,
WITH-SELECT-WHEN),
sentencias condicionales (IF-THEN-ELSE, CASEWHEN, FOR-LOOP, WHILE-LOOP) y sentencias
process; con las cuales se pueden realizar de
diferentes maneras ejercicios que cumplen con un
mismo propsito. La manera en la cual est
compuesta la gua de laboratorio permite
comprender mejor la composicin y el
funcionamiento del lenguaje VHDL, reforzando en
gran medida la teora vista en clase.
PALABRAS
CLAVE:
VHDL,
sentencias
concurrentes,
sentencias
condicionales,
sentencias process.

1. INTRODUCCIN
El lenguaje VHDL permite simular sistemas de
bajo y alto nivel, el cual permite tres niveles de
descripcin (Estructural, RTL y comportamental).
Tiene varias ventajas entre las cuales se destacan
la reduccin y mejora de calidad del diseo, as
como la posibilidad de visualizar y explorar de
manera sencilla el espacio de diseo, adems de
esto, el VHDL es un lenguaje compatible con una

gran cantidad de herramientas de diseo. El


proceso de diseo se divide en creacin,
compilacin y simulacin. Para cualquier caso es
necesario tener en cuenta que parte del circuito es
combinacional y cul secuencial, asi como evitar
bucles combinacionales, etc. Esta herramienta de
diseo permite identificar de manera rpida y
concreta problemas existentes en el la descripcin
del circuito antes de ser implementado
fsicamente.

2. ABSTRACT
This guide proposes the elaboration of some
programs in VHDL, with which will be possible to
check what is the behavior of different kinds of
basic structures like concurrent sentences
(WHEN-ELSE, SELECT-WHIT-WHEN), conditional
sentences (IF-THEN-ELSE, CASE-WHEN, FORLOOP.WHILE-LOOP) and process sentences; with
which is possible to realize the same exercise by
different ways. The guide is composed in such
mode that allows to understand in a better way the
composition and operation of the Very High Speed
Integrated Language, reinforcing the theory
covered in class.

3. OBJETIVOS

Reconocer los aspectos fundamentales


de la descripcin de circuitos electrnicos
digitales
mediante
lenguajes
de
descripcin de hardware analizando, en
particular, las estructuras bsicas de
descripcin del lenguaje VHDL.

Conocer y usar adecuadamente las


herramientas CAD para la edicin,
simulacin y sntesis de circuitos
digitales, tomando como caso de estudio
el software Quartus II de Altera.

3. MATERIALES Y EQUIPOS

Software Quartus II Web Edition versin 9.0 o


mayor.

4. MARCO TEORICO

SENTENCIAS

CONCURRENTES:
La
instruccin bsica de la ejecucin concurrente es
la asignacin entre seales a travs del smbolo
<=. Para facilitar la asignacin de las seales
VHDL incluye elementos de alto nivel como son
instrucciones condicionales, de seleccin, etc, que
se vern a continuacin:

Tarjeta de desarrollo Altera Terasic DE1 o


DE2.

WHEN -ELSE: Sentencia de seleccin mltiple.


En hardware es necesario incluir todas las
opciones posibles. En este caso es obligatorio
siempre acabar la expresin con un ELSE.
WITH-SELECT-WHEN: Es similar a las sentencias
CASE o SWITCH del lenguaje C. La asignacin
se hace segn el contenido de un objeto o
resultado de cierta expresin.

SENTENCIAS

SECUENCIALES:
VHDL
permite utilizar otro tipo de sentencias
condicionales ms parecidas a los lenguajes de
programacin
usados.
Tiene
que
ir
obligatoriamente dentro de un process. Las

sentencias condicionales ms comunes en VHDL


son las siguientes:

IF-THEN-ELSE: La sentencia if-else permite


cualquier tipo de combinacin y encadenamiento,
exactamente igual que ocurre en C o PASCAL o
cualquier otro lenguaje de programacin de alto
nivel. Permite la ejecucin de un bloque de cdigo
dependiendo de una o varias condiciones.

Las sentencias concurrentes son sentencias


condicionales que tienen al menos un valor por
defecto para cuando no se cumplen ninguna de
las condiciones.
Se requiere disear un decodificador BDC-7
segmentos mediante el uso de los comandos
WHEN-ELSE y WITH-SELEC-WHEN. Para esto
se requiere la ejecucin de los siguientes
programas mostrados en las figuras 1 y 2:

CASE: Es parecido al anterior porque tambin


ejecuta un bloque de cdigo condicionalmente,
pero en esta ocasin se evala una expresin en
vez de una condicin. Se debe recordar que se
deben tener en cuenta todos los casos, es decir,
incluir como ltima opcin la sentencia WHEN
OTHERS.
LOOP: Es la forma de hacer bucles en VHDL.
Sera el equivalente a un FOR o WHILE de un
lenguaje convencional.
El bucle tipo for est soportado si el rango del
ndice es esttico (0 to N N downto 0, donde N
posee siempre el mismo valor) y el cuerpo no
contiene sentencias wait. Los bucles de tipo while
en general no estn soportados.
SENTENCIA PROCESS: La sentencia process es
una de las ms utilizadas en programacin con
VHDL ya que tanto las sentencias condicionales
como la descripcin de HW secuencial se realiza
dentro de l. Pero a la vez es, para aquellos que
se acercan por primera vez a la simulacin y
sntesis con VHDL, el principal problema para un
correcto diseo.
[REFERENCIA 1]

5. PROCEDIMIENTO

El ejercicio de laboratorio consiste en comprobar


algunas estructuras bsicas de un archivo VHDL
(sentencias
concurrentes,
sentencias
condicionales y sentencias process), para su
posterior compilacin y simulacin en Quartus II.
Una vez verificado su funcionamiento se procede
a sintetizar el circuito en la FPGA, de acuerdo a la
tarjeta de desarrollo seleccionada.

SENTENCIAS CONCURRENTES

Figura 1. Cdigo con sentencia concurrente


mediante comando When-Else

Figura 2. Cdigo con sentencia concurrente


mediante comando Whit-Select-When.

SENTENCIAS CONDICIONALES
VHDL permite utilizar sentencias condicionales
que son parecidas alas de los lenguajes en
programacin. Todas estas sentencias tienen que
ir obligatoriamente dentro de un process, los
comandos utilizados se observan en las figuras 3
a 6.

Figura 4. Cdigo con sentencia condicional


mediante comando CASE-WHEN.

Figura 3. Cdigo con sentencia condicional


mediante comando IF-THEN-ELSE.

Figura 5. Cdigo con sentencia concurrente


mediante comando FOR-LOOP.

Figura 7. Cdigo con sentencia process (efecto de


la sensibilidad a).

Figura 6. Cdigo con sentencia condicional


mediante comando WHILE-LOOP.

SENTENCIA PROCESS
La estructura particular denominada process
define los lmites de un dominio que se ejecutar
(simular) si y solo si alguna de las seales de su
lista de sensibilidad se ha modificado en el
anterior paso de simulacin. La lista de
sensibilidad es un conjunto de seales cuyos
cambios de estado activan la ejecucin del
proceso (la lista no puede incluir ni variables ni
constantes). Los comandos utilizados para cada
uno de los ejercicios referentes a la sentencia
process se pueden observar en las figuras 7 a 13.

Figura 8. Cdigo con sentencia process (efecto de


la sensibilidad b).

EFECTO DE
PROCESS

MEMORIA

DENTRO

CONDICIONAL COMPLETO
EFECTO DE LA SENSIBILIDAD

DE

UN

Figura 9. Comando sentencia process (condicional


completo)

Figura 10. Comando sentencia process


(condicional incompleto)

EJECUCION EN PARALELO

Figura 11. Comando sentencia process (a).

Figura 12. Comando sentencia process


(actualizacin).

O, el cual en un orden correcto ir conectado al


display 7 segmentos.
En la arquitectura se emplea la sentencia whenelse para asignar el valor de cada uno de los
segmentos del display de acuerdo con una
combinacin especfica en los puertos de entrada.
Para las combinaciones que no corresponden a
los dgitos entre 0 y 9, se asignar un valor en el
display de tal manera que ste se muestre
totalmente apagado.
Despus de obtener una compilacin exitosa del
cdigo, se realiza la asignacin de pines como se
muestra a continuacin:
Figura 13. Comando sentencia process
(sensibilidad arreglada).

En cada uno de los ejercicios propuestos es


necesario que se observe con detenimiento cada
una de las entradas y salidas del circuito, explicar
su funcionamiento y caractersticas.
Recomendaciones: Tanto el informe de
laboratorio como el cdigo deben ser originales,
por lo que cualquier copia ser calificada con 0,0.
El informe se debe presentar en formato IEEE, en
grupos de mximo dos personas.

SW0: PIN_AB28
SW1: PIN_AC28
SW2: PIN_AC27
SW3: PIN_AD27
O0: PIN_G18
O1: PIN_F22
O2: PIN_E17
O3: PIN_L26
O4: PIN_L25
O5: PIN_J22
O6: PIN_H22

Donde los puertos de entrada corresponden a


Switches, y los puertos de salida, a LED.

EJERCICIO ADICIONAL
Desarrollar
un
decodificador
usando
las
sentencias apropiadas que permita a partir de un
cdigo de entrada visualizar el nombre de uno de
los integrantes del grupo en los display 7segmentos de la tarjeta.

6. ANLISIS DE RESULTADOS
Sentencias Concurrentes
WHEN-ELSE
En este cdigo, la sentencia when-else es usada
para el diseo de un codificador BCD a 7
segmentos.
En la entidad se declara un vector de entrada de 4
posiciones al que se le ha dado como nombre SW,
correspondiente a las entradas del numero binario
BCD y un vector de salida de 7 posiciones llamado

La figura 14 muestra el cdigo empleado con la


utilizacin de la sentencia WHEN-ELSE

Figura 14. Realizacin de cdigo utilizando la


sentencia WHEN-ELSE en el desarrollo de la gua
de laboratorio.

WITH-SELECT-WHEN
Este programa se describe de manera similar a la
sentencia WHEN-ELSE, realizando el mismo
procedimiento de decodificar un cdigo en BCD a
un display 7 segmentos, con la diferencia de que
para la utilizacin de un solo Switch (o
combinacin de switches en este caso) solo es
necesario nombrarlo una vez dentro de la
arquitectura, tal y como se observa en la figura 15
(cdigo usado para la utilizacin de la sentencia
WITH-SELECT-WHEN):

Si la entrada de control del circuito se encuentra


en el estado 00, la salida result mostrar el
resultado obtenido de la operacin A+B; si control
se encuentra en el estado 11, result mostrar el
resultado de la operacin A-B, en cualquier otra
combinacin de las entradas de control, result
mostrar el estado actual de A.
El cdigo implementado para la utilizacin de la
sentencia IF-THEN-ELSE se puede observar en la
figura 16.

Figura 16. Realizacin de cdigo utilizando la


sentencia IF-THEN-ELSE en el desarrollo de la
gua de laboratorio.

Figura 15. Realizacin de cdigo utilizando la


sentencia WITH-SELECT-WHEN en el desarrollo
de la gua de laboratorio.

La asignacin de pines en este caso es igual a la


del cdigo anterior, ya que se trata de una misma
funcin escrita por medio de diferentes sentencias.

Sentencias condicionales

La asignacin de pines para el cdigo de la figura


16 es la siguiente:
A0: PIN_AB27
A1: PIN_AC26
A2: PIN_AD26
B0: PIN_AB28
B1: PIN_AC28
B2: PIN_AC27
Control0: PIN_Y24
Control1: PIN_Y23
Result0: PIN_E21
Result1: PIN_E22
Result2: PIN_E25

IF-THEN-ELSE
Para la utilizacin de esta sentencia, la gua
propone la realizacin de un cdigo que tenga dos
entradas A y B (de 3 bits), y una entrada de control
de 2 bits, asimismo, este tendr una salida (result)
de 3 bits.

CASE-WHEN
Para la elaboracin del ejercicio anterior con este
tipo de sentencia, es necesario nombrar los
resultados a obtener anteponiendo la palabra

when para cada caso de la entrada de control sea


00, 11, u otra combinacin, se obtendrn los
mismos resultados que para el ejercicio anterior.
La descripcin de este cdigo se puede observar
en la figura 17.

A3: PIN_AD27
A4: PIN_AB27
A5: PIN_AC26
A6: PIN_AD26
A7: PIN_AB26
B0: PIN_G19
B1: PIN_F19
B2: PIN_E19
B3: PIN_F21
B4: PIN_F18
B5: PIN_E18
B6: PIN_J19
B7: PIN_H19
B8: PIN_J17

Figura 17. Realizacin de cdigo utilizando la


sentencia CASE-WHEN en el desarrollo de la gua
de laboratorio.
Los pines de conexin para el cdigo de la figura
17 sern los mismos asignados al cdigo
correspondiente a la sentencia IF-THEN-ELSE

FOR-LOOP
El programa propuesto en la gua tiene como
objetivo mostrar un corrimiento del valor
ingresado, por lo cual se asigna una entrada A de
8 bits y una salida B de 9 bits (uno ms debido al
corrimiento generado por el ultimo bit de A).
Se realiza un ciclo para una variable llamada i que
se realizara 8 veces debido a la cantidad de bits
que tiene asignada la entrada A. En la posicin 1
del vector B ira el dato que tiene A en la posicin
0, En la posicin 2 de B ira el dato que se
encuentre en la posicin 1 de A y as
sucesivamente hasta llegar a la posicin 8 del
vector B que tendr el valor del dato contenido en
la posicin 7 del vector A.
La asignacin de pines para el cdigo de la figura
18 se realiza de la siguiente manera:
A0: PIN_AB28
A1: PIN_AC28
A2: PIN_AC27

Figura 18. Realizacin de cdigo utilizando la


sentencia FOR-LOOP en el desarrollo de la gua
de laboratorio.
La figura 18 muestra el cdigo usado con la
sentencia FOR-LOOP, en el cual se observa la
indicacin de nuevas libreras debido a la
necesidad de realizar una operacin aritmtica asi
mismo como usar nmeros con cierto peso fsico.

WHILE-LOOP
Para este tipo de sentencia, la gua indica realizar
el mismo ejercicio del anterior punto pero variando
ciertos detalles a fin de usar la sentencia como tal.
Aqu la variable i que ser encargada de llevar la
cuenta en cuanto a cantidad de repeticiones, debe
tener un valor de inicio y hacer el respectivo ciclo
mientras la variable no supere la mayor cantidad
posible de bits del vector de entrada A.

Para el cdigo mostrado en la figura 19 la


asignacin de pines es igual al anterior caso
debido a que se hace un corrimiento de la misma
manera y con igual cantidad de pines.

Figura 20. Realizacin del cdigo A efecto de la


sensibilidad de las sentencias process planteadas
en la gua.
La asignacin de pines para el cdigo mostrado
en la figura 20 se muestra asi:
Figura 19. Realizacin de cdigo utilizando la
sentencia WHILE-LOOP en el desarrollo de la
gua de laboratorio.

Sentencias process
Efecto de la lista de sensibilidad: A
Para este cdigo se requieren 2 entradas A y B y
una salida C de un bit.
Se necesita realizar un process en el cual en su
lista de sensibilidad solo responder a estmulos
provenientes del puerto de entrada A. El puerto de
salida C tomara el valor en el que se encuentre A
mostrndolo en los LED de la FPGA. La entrada B
se dispone a habilitar la lectura que realiza C de A.

A: PIN_AB28
B: PIN_AC28
C: PIN_G19

Efecto de la lista de sensibilidad: B


Esta descripcin tienen las mismas caractersticas
y el mismo fin que el anterior punto (Efecto de la
sensibilidad: A), agregando la entrada B a la lista
de sensibilidad del process como se puede
observar en la figura 21. Con esto B se convierte
en un habilitador que hace que cuando esta
entrada sea 0, la salida C ser 0 eliminando el
efecto de memoria que se tena en el anterior
punto.

Como se puede observar en la figura 20, B no


est en la lista de sensibilidad lo que genera un
efecto de memoria sin alterar el valor de la salida
C.

Figura 21. Realizacin del cdigo B efecto de la


sensibilidad de las sentencias process planteadas
en la gua.

La asignacin de pines se toma igual al anterior


punto debido a que cumplen una misma funcin.

Efecto de memoria dentro de un process:


Condicional completo
En esta descripcin de observa que hay 3
condiciones: cuando A es mayor, menor e igual a
B.
En la figura 22 se puede observar que el cdigo
tiene 2 puertos de entrada de 2 bits, A y B, y un
puerto de salida C que tambin ser de 2 bits.
El proceso que sigue responde a los estmulos
que generan los vectores A y B de la siguiente
manera:

La estructura del condicional incompleto es


bsicamente la misma estructura del condicional
completo excepto porque aqu se pierde la
condicin cuando A > B lo cual hace que es
sistema tenga una memoria con respecto al dato
anterior.
Como se observa en la figura 23, el cdigo no
plantea un valor de C para una combinacin de
bits tales que A > B, por lo tanto en este caso la
salida C depender de la condicin y la
combinacin en la cual el programa se encuentre
anteriormente.
La asignacin de pines para el cdigo mostrado
en la figura 23, es la misma utilizada en la
sentencia de condicional completo debido a la
similar funcin existente entre ambos cdigos.

Si A = B, la salida C ser la operacin OR entre A


y B;
Si A < B, la salida C tomar los datos que tenga B,
Si A > B, la salida C tomara el valor de 00.

Figura 23. Realizacin del cdigo para el


condicional incompleto de las sentencias process
propuesto por la gua.

Ejecucin en paralelo: (a)

Figura 22. Realizacin del cdigo para el


condicional completo de las sentencias process
propuesto por la gua.
La asignacin de pines para el cdigo de la figura
22 es:
A0: PIN_AD27
A1: PIN_AB27
B0: PIN_AB28
B1: PIN_AC28
C0: PIN_E21
C1: PIN_E22
Condicional incompleto

El cdigo correspondiente a esta sentencia,


muestra una configuracin similar a la del
condicional completo con la diferencia de que para
este caso inicialmente C tiene un valor asignado
como 00 apenas comience la ejecucin de la
arquitectura, razn por la cual cuando se d un
caso no contemplado en el cdigo (A > B),
automticamente se mostrara la salida C con su
condicin inicial 00.
Al tener una configuracin similar a la de los 2
anteriores cdigos, la asignacin de pines se
tomara de igual manera que para dichos casos.
La figura 24 muestra la realizacin del cdigo
correspondiente a la primera sentencia de
ejecucin en paralelo.

Figura 24. Realizacin del cdigo para ejecucin


en paralelo (Actualizacin 1) de las sentencias
process propuesto por la gua.
Sensibilidad Arreglada

Figura 24. Realizacin del cdigo para ejecucin


en paralelo (A) de las sentencias process
propuesto por la gua.
Actualizacin 1 (b)
En este cdigo se observa por primera vez la
utilizacin de una seal (B), la cual interconecta un
vector de entrada A de 2 posiciones con una salida
C de igual nmero de posiciones; es decir, que los
LED a los cuales C fue asignado, mostrarn el
valor de A por medio de una seal B.

El cdigo correspondiente cumple con la misma


funcin del cdigo anterior, es decir, el valor de la
entrada A se ver reflejado en la salida C, con la
diferencia de que estas no estn interconectadas
por una seal B, sino que estn relacionadas
directamente. La seal B est conectada a la
salida C (por esto, C es inout) de tal manera que si
se desea conectar otro componente externo a C,
los datos contenidos en este vector sern
transmitidos por medio de la seal B. Al ser un
ejercicio similar a la actualizacin 1, la asignacin
de pines es la misma.
La figura 25 muestra el cdigo utilizado para la
implementacin del cdigo descrito:

Los pines de entrada y salida asignados para la


realizacin del ejercicio descrito anteriormente son
los siguientes:
A0: PIN_AC28
A1: PIN_AB28
C0: PIN_E22
C1: PIN_E21

El cdigo utilizado para realizar este ejercicio se


observa en la figura 25.

Figura 25. Realizacin del cdigo para ejecucin


en paralelo (sensibilidad arreglada) de las
sentencias process propuesto por la gua.

Ejercicio adicional
Este ejercicio propone visualizar el nombre de uno
de los integrantes del grupo mediante los displays
de la FPGA. El grupo de trabajo decidi mostrar
las palabras SANTI, ANDRES, GELVEZ y la fecha
de presentacin del laboratorio (02-02-2015)
mediante diferentes combinaciones de entradas.
Para realizar este ejercicio es necesario asignar
un vector de 3 posiciones correspondiente a tres
switches de la FPGA. Ya que el ejercicio requiere
de la utilizacin de los 8 displays incluidos en la

misma, es necesario asignar un vector de salida


de 8 posiciones.
La sentencia a utilizar para la decodificacin de los
displays ser WITH-SELECT-WHEN, por lo cual
es necesario describir la salida requerida para
cada display dependiendo de la combinacin de
entradas ingresada, tal y como se muestra en las
26 a 29, en las cuales se indica el cdigo utilizado
para la realizacin del ejercicio adicional.

Figura 28. Cdigo ejercicio adicional (parte 3)

Figura 29. Cdigo ejercicio adicional (parte 4)

Figura 26. Cdigo ejercicio adicional (parte 1)

Figura 27. Cdigo ejercicio adicional (parte 2)

Las figuras 30 a 33 muestran el resultado obtenido


a partir del cdigo mostrado anteriormente, en las
cuales se observan claramente que las salidas en
los display corresponden con las asignaciones
realizadas al principio del ejercicio para cada
combinacin. Es importante destacar que mientras
los switches se encuentren en una combinacin
diferente a las contempladas en el cdigo, todos
los displays debern permanecer apagados.

Figura 30. Salida cdigo ejercicio adicional con


combinacin 000.

7. CONCLUSIONES

Debido a la gran versatilidad que da


VHDL para el manejo de datos, es
posible realizar cdigos utilizando
diferentes sentencias, pero que
tengan
el
mismo
fin,
este
comportamiento se pudo observar
gracias a las simulaciones en Quartus
II y mediante la FPGA, obteniendo el
mismo resultado para los cdigos con
el mismo tipo de sentencias, es decir
que el usuario puede utilizar la
sentencia que ms se le facilite si
esta cumple con los requisitos para
realizar el cdigo.

Es importante tener en cuenta la


estructura y componentes con los
cuales se construye un cdigo en
VHDL, ya que cualquier error alterar
la manera en la cual el programa lee
los datos ingresados, causando
errores de compilacin.

Es importante saber interpretar el


archivo que muestra grficamente las
seales de salida provenientes del
cdigo (vector waveform file), ya que
con este es posible observar que el
cdigo funciona de la manera
deseada, antes de implementarlo en
la FPGA.

Figura 31. Salida cdigo ejercicio adicional con


combinacin 001.

Figura 32. Salida cdigo ejercicio adicional con


combinacin 011.

8. REFERENCIAS

1.

PROGRAMACIN
EN
VHDL
https://es.wbsVHDL.org//Programaci
%C3%B3n_en_VHDL/Arquitectura#Sentencia
s_Concurrentes

2.

INDTRODUCCION
A
LA
PROGRAMACION EN VHDL
http://eprints.ucm.es/26200/1/intro_VHDL.
pdf

3.

SENTENCIAS CONDICIONALES

Figura 33. Salida cdigo ejercicio adicional con


combinacin 111.

http://www.sc.ehu.es/sbweb/energiasrenovables/MATLAB/basico/condicional/co
ndicional_1.html
4.

5.

INTRODUCCION AL LENGUAJE VHDL


http://www.sc.ehu.es/acwarila/LDD/Teoria/
VHDL.pdf
VHDL: LENGUAJE DE DESCRIPCION
DE
HARDWARE
http://www.proenergia.net/ftp/colarte/Curso
s%20Academicos/LOGICA
%20DIGITAL/CLASES/VHDL.pdf

6.

GRAMATICA
DEL
LENGUAJE
http://www.ehu.eus/~jtpolagi/completo/04.
htm

7.

VHDL: LENGUAJE DE DESCRIPCION


DE
HARDWARE
http://www.academia.edu/968671/VHDL._
Tipos_de_datos

Potrebbero piacerti anche