Docsity
Docsity

Prepara tus exámenes
Prepara tus exámenes

Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity


Consigue puntos base para descargar
Consigue puntos base para descargar

Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium


Orientación Universidad
Orientación Universidad


Lenguaje de programación VHDL, Resúmenes de Lenguajes de Programación

Programación VHDL para sistemas embebidos

Tipo: Resúmenes

2022/2023

Subido el 09/08/2023

carlos-alberto-mercado
carlos-alberto-mercado 🇲🇽

1 documento

1 / 93

Toggle sidebar

Esta página no es visible en la vista previa

¡No te pierdas las partes importantes!

bg1
Guía Básica del VHDL Instituto Tecnológico de Querétaro
Armando Mora Campos
1
GUÍA BÁSICA DEL VHDL
1. INTRODUCCION.
Dentro de la secuencia de diseño electrónico (fig. 1.1), la primera tarea, después de
concebir la idea, es realizar una descripción de lo que se pretende hacer. Las computadoras
personales ofrecen hoy día herramientas para la creación y verificación de diseños. Con
dichas herramientas es posible describir tanto un circuito sencillo que represente una
compuerta como un circuito complejo que defina un procesador digital de señales o un
microprocesador.
Al principio, las herramientas CAD (Diseño Asistido por Computadora) se
limitaban a servir de meros instrumentos de dibujo para poder realizar el diseño. Con la
incorporación de herramientas de fabricación de circuitos impresos e integrados,
simuladores, etc., la descripción del circuito empieza a desempeñar un papel más
importante, ya que sirve como entrada de información a las herramientas posteriores en el
flujo de diseño. Esto, junto con la metodología Top-Down de diseño de circuitos
electrónicos (proceso de capturar una idea en un alto nivel de abstracción e implementarla
partiendo de esta descripción abstracta y después ir hacia abajo incrementando el nivel de
detalle según sea necesario), en contraposición a la metodología bottom-up, llevó a la
aparición de herramientas de descripción que permiten al diseñador definir el problema de
una forma abstracta, utilizando a la PC para materializar la idea.
Las herramientas CAD actuales permiten las siguientes posibilidades de abordar la
descripción de una idea o diseño electrónico:
Descripción Estructural. Consiste en enumerar los componentes de un circuito y
sus interconexiones. De acuerdo a la herramienta que se utilice se tienen dos formas
de hacerlo:
Esquemas. Consiste en la descripción gráfica de los componentes de un
circuito (método tradicional).
Lenguaje. Se realiza una enumeración de los componentes de un circuito así
como su conexión.
Descripción Comportamental. Es posible describir un circuito electrónico
(generalmente digital) simplemente describiendo como se comporta, utilizando un
lenguaje de descripción de hardware apropiado.
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23
pf24
pf25
pf26
pf27
pf28
pf29
pf2a
pf2b
pf2c
pf2d
pf2e
pf2f
pf30
pf31
pf32
pf33
pf34
pf35
pf36
pf37
pf38
pf39
pf3a
pf3b
pf3c
pf3d
pf3e
pf3f
pf40
pf41
pf42
pf43
pf44
pf45
pf46
pf47
pf48
pf49
pf4a
pf4b
pf4c
pf4d
pf4e
pf4f
pf50
pf51
pf52
pf53
pf54
pf55
pf56
pf57
pf58
pf59
pf5a
pf5b
pf5c
pf5d

Vista previa parcial del texto

¡Descarga Lenguaje de programación VHDL y más Resúmenes en PDF de Lenguajes de Programación solo en Docsity!

GUÍA BÁSICA DEL VHDL

1. INTRODUCCION.

Dentro de la secuencia de diseño electrónico (fig. 1.1), la primera tarea, después de concebir la idea, es realizar una descripción de lo que se pretende hacer. Las computadoras personales ofrecen hoy día herramientas para la creación y verificación de diseños. Con dichas herramientas es posible describir tanto un circuito sencillo que represente una compuerta como un circuito complejo que defina un procesador digital de señales o un microprocesador.

Al principio, las herramientas CAD (Diseño Asistido por Computadora) se limitaban a servir de meros instrumentos de dibujo para poder realizar el diseño. Con la incorporación de herramientas de fabricación de circuitos impresos e integrados, simuladores, etc., la descripción del circuito empieza a desempeñar un papel más importante, ya que sirve como entrada de información a las herramientas posteriores en el flujo de diseño. Esto, junto con la metodología Top-Down de diseño de circuitos electrónicos (proceso de capturar una idea en un alto nivel de abstracción e implementarla partiendo de esta descripción abstracta y después ir hacia abajo incrementando el nivel de detalle según sea necesario), en contraposición a la metodología bottom-up, llevó a la aparición de herramientas de descripción que permiten al diseñador definir el problema de una forma abstracta, utilizando a la PC para materializar la idea.

Las herramientas CAD actuales permiten las siguientes posibilidades de abordar la descripción de una idea o diseño electrónico:

Descripción Estructural. Consiste en enumerar los componentes de un circuito y sus interconexiones. De acuerdo a la herramienta que se utilice se tienen dos formas de hacerlo:

Esquemas. Consiste en la descripción gráfica de los componentes de un circuito (método tradicional).

Lenguaje. Se realiza una enumeración de los componentes de un circuito así como su conexión.

Descripción Comportamental. Es posible describir un circuito electrónico (generalmente digital) simplemente describiendo como se comporta, utilizando un lenguaje de descripción de hardware apropiado.

Figura 1.1. Flujo de diseño para sistemas electrónicos y digitales.

IDEA

DESCRIPCIÓN MODELADO

PRUEBA SIMULACIÓN

CORRECTO

SINTESIS MAPEADO TENOLOGICO

EXTRACCIÓN DE PROPIEDADES

SIMULACIÓN

CORRECTO

FABRICACIÓN

PRUEBA DEPURADO

FUNCIONA

PRODUCTO TERMINADO

SI

SI

SI

NO

NO

NO

en distintos estilos, del comportamiento de un sistema digital conocido y el desarrollo de modelos de simulación.

Los objetivos del lenguaje VHDL son el modelado (desarrollo de un modelo para la simulación de un circuito o sistema) y la síntesis (proceso en donde se parte de una especificación de entrada con un determinado nivel de abstracción y se llega a una realización más detallada, menos abstracta) de circuitos y sistemas electrónicos y digitales.

1.1.2 ALGUNAS VENTAJAS DEL USO DEL VHDL.

  • VHDL permite diseñar, modelar y comprobar un sistema desde un alto nivel de abstracción bajando hasta el nivel de definición estructural de compuertas.
  • Circuitos descritos utilizando VHDL, siguiendo unas guías para síntesis, pueden ser utilizadas por diversas herramientas de síntesis para crear e implementar circuitos.
  • Los módulos creados en VHDL pueden utilizarse en diferentes diseños, lo que permite la reutilización del código. Además, la misma descripción puede utilizarse para diferentes tecnologías sin tener que rediseñar todo el circuito.
  • Al estar basado en un estándar (IEEE std 1076-1987, IEEE std 1076-1993) los ingenieros de toda la industria de diseño pueden usar este lenguaje para minimizar errores de comunicación y problemas de compatibilidad.
  • VHDL permite diseño Top-Down, esto es, describir (modelar) el comportamiento de los bloques de alto nivel, analizarlos (simularlos) y refinar la funcionalidad en alto nivel requerida antes de llegar a niveles más bajos de abstracción de la implementación del diseño.
  • VHDL permite dividir o descomponer un diseño hardware y su descripción VHDL en unidades más pequeñas (modularidad).

2. SINTAXIS DEL VHDL.

VHDL es verdaderamente un lenguaje, por lo que tiene sus elementos sintácticos, sus tipos de datos y sus estructuras como cualquier otro tipo de lenguaje.

2.1. ELEMENTOS SINTÁCTICOS.

Comentarios. Cualquier línea que empieza por dos guiones “-- “ es un comentario.

Símbolos especiales. De un solo carácter: + - / * ( ). , : ; & ´ “ < > = | # De dos caracteres: ** => := /= >= <= --

Identificadores. Se utilizan para dar nombre a variables, señales, nombres de rutinas, etc. puede ser cualquier nombre compuesto por letras y números, incluyendo el símbolo del subrayado “_”; nunca puede contener símbolos especiales o palabras claves del VHDL ni empezar por un número o subrayado; tampoco se permite que el identificador acabe con un subrayado ni que haya dos seguidos. Las mayúsculas o minúsculas son consideradas iguales.

Números. Cualquier número se considera que se encuentra en base 10. Se admite la notación científica convencional para números en punto flotante. Es posible manejar números en otras bases utilizando el símbolo del sostenido “#”. Ejemplo: 2#11000100# y 16#c4# representan el entero 196.

Caracteres. Es cualquier letra o carácter entre comillas simples: ´1´, ´3´, ´t´.

Cadenas. Son un conjunto de caracteres englobados por comillas dobles: “esto es una cadena”.

Cadenas de bits. Los tipos bit y bit_vector son de tipo carácter y matriz de caracteres respectivamente. En VHDL se tiene una forma elegante de definir números con estos tipos y es mediante la cadena de bits. Dependiendo de la base en que se especifique el número, se puede poner un prefijo B (binario), O (octal), o X (hexadecimal). Ejemplos: B”11101001”, O”126”, X”FE”.

Palabras reservadas. Son aquellas que tienen un significado especial. Son las instrucciones, órdenes y elementos que permiten definir sentencias. La tabla 1 muestra las palabras clave del VHDL87 y la tabla 2 las que se agregaron en el VHDL93.

abs( ) (valor absoluto). Devuelve el valor absoluto de su argumento.

***** (multiplicación). Multiplica dos números de cualquier tipo numérico.

/ (división). Funciona con cualquier dato numérico.

mod (módulo). Calcula el módulo de dos números.

rem (resto). Calcula el resto de una división entera.

+ (suma y signo positivo). Indica suma o signo.

- (resta y signo negativo). Indica resta y signo negativo.

2.2.3 OPERADORES DE DESPLAZAMIENTO.

Estos operadores solo existen en el VHDL`93.

sll, srl (desplazamiento lógico, a la izquierda o a la derecha). Desplaza un vector un número de bits a izquierda o derecha rellenando con ceros los huecos libres. Ejemplo: dato sll 2, desplaza a la izquierda dos posiciones al vector dato, es decir, lo multiplica por 4.

sla, sra (desplazamiento aritmético a la izquierda o a la derecha). La diferencia con el anterior es que este desplazamiento conserva el signo, es decir, conserva el valor que tiene el bit más significativo del vector.

rol, ror (rotación a la izquierda o a la derecha). Es como el desplazamiento, pero los huecos que se forman son ocupados por los bits que van saliendo.

2.2.4 OPERADORES RELACIONALES.

Devuelven siempre un valor de tipo booleano (true o false). Los tipos con los que pueden operar dependen de la operación.

=, /= (igualdad, desigualdad). El primero devuelve true si los operandos son iguales y false en caso contrario. El segundo indica desigualdad, así que funciona al revés. Los operandos deben ser del mismo tipo.

<, <=, >, >= (menor, mayor) Tienen el significado habitual. Los tipos de datos que pueden manejar son escalares o matrices de una sola dimensión de tipos discretos.

2.2.5 OPERADORES LÓGICOS.

Son not , and , nand , or , nor , xor y en el VHDL`93 se añadió xnor. Actuan sobre los tipos bit, bit_vector y boolean. En un vector, las operaciones son bit a bit.

2.2.6 PRECEDENCIA DE OPERADORES.

La siguiente tabla muestra la precedencia de los operadores. Los operadores que se encuentran en la misma fila tienen la misma precedencia, por lo tanto, en una expresión, se evaluarán primero siguiendo el orden de izquierda a derecha de la expresión. El uso de paréntesis altera la precedencia a conveniencia del programador.

Mayor | ** abs not | * / mod rem | + (signo) - (signo) | + - & | = /= < <= > >= Menor | and or nand nor xor xnor

Tabla 3. Precedencia de los operadores en VHDL.

2.3. TIPOS DE DATOS.

La sintaxis del VHDL es estricta con respecto a los tipos. Cualquier objeto en VHDL debe tener un tipo. Aquí no existen tipos propios del lenguaje, lo que tiene son los mecanismos para poder definir cualquier tipo. Normalmente al compilar un programa, se cargan los tipos de datos que se encuentran en una librería. A continuación se presentan las declaraciones de los dos grupos de tipos de datos del VHDL: los escalares y los compuestos.

2.3.1 TIPOS ESCALARES.

Son tipos simples que contienen algún tipo de magnitud. Se muestra a continuación la forma de declararlos, así como algunos predefinidos.

Enteros. Datos cuyo contenido constituye un valor numérico entero. Se definen con la palabra range. No se dice que es un dato entero, sino que está comprendido en cierto intervalo especificando los límites de dicho intervalo con valores enteros. Ejemplos:

A los elementos de una matriz se accede mediante el índice: dato(3) es el elemento 3 de la matriz dato. De la misma manera se puede acceder a un rango: datobyte <= datoword(2 to 9). También se pueden utilizar en las asignaciones lo que se conoce como agregados o conjuntos ( aggregate ), que no es más que una lista separada por comas de manera que al primer elemento de la matriz se le asigna el primer elemento de la lista y así sucesivamente. Ejemplos.

semaforo <= (apagado, encendido, apagado); dato <= (datohigh, datolow); triestado <= ( others => ´z´);

En este último se ha empleado la palabra others para poner todos los bits del triestado a ´z´, de esta forma se puede poner un vector a un valor sin necesidad de saber cuántos bits tiene la señal.

Registros. Es equivalente al tipo registro o record de otros lenguajes. Ejemplo.

type trabajador is record Nombre: string; Edad: integer; end record ;

Para referirse a un elemento dentro del registro se utiliza la misma nomenclatura que en Pascal, es decir, se usa un punto entre el nombre del registro y el nombre del campo: persona.nombre = “Carlos”.

2.3.3 SUBTIPOS DE DATOS.

VHDL permite la definición de subtipos que son restricciones o subconjuntos de tipos existentes. Se tienen dos alternativas. La primera son los subtipos obtenidos a partir de la restricción de un tipo escalar a un rango. Ejemplos:

subtype raro is integer range 4 to 7; subtype digitos is character range ´0´ to ´9´; subtype natural is integer range 0 to entero_mas _alto; -- Predefinido. subtype positive is integer range 1 to entero_mas_alto; -- Predefinido.

La segunda alternativa de subtipos son los formados por aquellos que restringen el rango de una matriz. Ejemplos:

subtype id is string (1 to 20); subtype word is bit_vector(31 downto 0);

La ventaja de utilizar subtipos es que las mismas operaciones que sirven para el tipo también sirven para el subtipo. Esto tiene especial importancia cuando se describe un

circuito para ser sintetizado, ya que si se utiliza integer sin más, esto se interpretará como un bus de 32 líneas (según la herramienta que se utilice) y lo más probable es que se requieran muchas menos.

2.4 ATRIBUTOS.

Los elementos en VHDL, como señales, variables, etc. pueden tener información adicional llamada atributos. Estos atributos están asociados a estos elementos del lenguaje y se manejan en VHDL mediante la comilla simple ´. Por ejemplo, t´left indica el atributo ´left de t que, en este caso, es un tipo escalar (este atributo indica el límite izquierdo del rango).

Algunos de estos atributos están predefinidos en el lenguaje, mostrándose a continuación los más interesantes. Suponiendo que t es un tipo enumerado, entero, flotante o físico, se tienen los siguiente atributos:

t´left Límite izquierdo del tipo t.

t´right Límite derecho del tipo t.

t´low Límite inferior del tipo t.

t´high Límite superior del tipo t.

Suponiendo un tipo t como el anterior, un miembro x de ese tipo y un entero N, se pueden utilizar los siguientes atributos.

t´pos(x) Posición de x dentro del tipo t.

t´val(N) Elemento N del tipo t.

t´leftof(x) Elemento que está a la izquierda de x en t.

t´rightof(x) Elemento que está a la derecha de x en t.

t´pred(x) Elemento que está delante de x en t.

t´succ(x) Elemento que está detrás de x en t.

Si a es un tipo matriz, u un elemento de éste y N es un entero desde 1 hasta el número de dimensiones de la matríz, se pueden usar los siguientes atributos:

a´left(N) Límite izquierdo del rango de dimensión N de a.

attribute pin: integer; attribute encapsulado: string; attribute pin of control: signal is 5; attribute encapsulado of ne555: component is “dip8”; begin if control´pin > 4 then ... if ne555´encapsulado = “dip8” then ... end ;

2.5 DECLARACIÓN DE CONSTANTES, VARIABLES Y SEÑALES.

Un elemento en VHDL contiene un valor de un tipo especificado. Hay tres tipos de elementos en VHDL: las variables, las señales y las constantes. Las variables y constantes son similares a lo que se encuentra en otros lenguajes. Las señales, en cambio, son elementos con un significado enfocado a la descripción de hardware.

2.5.1 CONSTANTES.

Una constante es un elemento que se inicializa a un valor determinado y que no puede ser cambiado una vez inicializado. Ejemplos:

constant e : real := 2.71828; constant retraso : time := 10 ns; constant max_size : natural;

En la última sentencia la constante max_size no tiene nungún valor asociado. Esto se permite siempre y cuando el valor sea declarado en algún otro sitio y se hace así para las declaraciones en paquetes que se verán más adelante.

2.5.2 VARIABLES.

Una variable en VHDL es similar al concepto de variable en otros lenguajes. Ejemplos:

variable contador : natural := 0; variable aux : bit_vector(31 downto 0);

Es posible, dado un elemento previamente definido, cambiarle el nombre o ponerle nombre a una parte. Esto se realiza mediante la instrucción alias que suele resultar muy útil. Ejemplos:

variable instrucción : bit_vector(31 downto 0); alias codigo_op : bit_vector(7 downto 0) is instrucción(31 downto 24);

2.5.3 SEÑALES.

Las señales se declaran igual que las constantes y variables, con la diferencia de que las señales pueden ser normal , register o bus. Si en la declaración no se especifica nada, se entiende que la señal es de tipo normal ; para que sea de tipo bus o register se debe declarar explícitamente con las palabras clave bus o register.

Una señal no es lo mismo que una variable, La señal no es exactamente un objeto del lenguaje que guarda un valor, sino que lo hace en realidad es guardar un valor (o varios como se verá más adelante) y hacerlo visible en el momento adecuado. Esto es, se puede decir que la señal tiene dos partes, una donde se escribe y que almacena el valor y otra que se leé y que no tiene por qué coincidir con lo que se acaba de escribir.

Internamente se establece una conexión entre la parte que se escribe y la que se lee. Es posible en VHDL desconectar una parte de la otra, de manera que al leer la señal no se tenga acceso a lo que se escribió. La desconexión de una señal se hace asignándole el valor null. La diferencia entre una señal normal , register o bus viene del comportamiento al desconectarse. Las de tipo normal no se pueden desconectar. Las de clase bus y register se pueden desconectar, ya que o bien se trata de señales de tipo resuelto, que admiten varios o ningún valor escrito a un tiempo, o bien de tipo vigiladas, que tienen una condición de desconexión. La diferencia entre ambas es que la señal de tipo bus tiene un valor por defecto cuando todas las fuentes de la señal están desconectadas y las de clase register no tienen un valor por defecto pero conservan el último valor que se escribió.

Al igual que en variables y constantes, a las señales también se les puede dar un valor inicial si se quiere. Ejemplos:

signal selec: bit := ´0´; signal datos: bit_vector(7 downto 0) bus := B”00000000”;

2.5.4 COMPARACIÓN ENTRE CONSTANTES, SEÑALES Y VARIABLES.

Constantes, señales y variables, son cosas diferentes. Las variables sólo tienen sentido dentro de un process o subprograma, es decir, solo tienen sentido en entornos de programación donde las sentencias son ejecutadas en serie. Las señales pueden ser declaradas únicamente en las arquitecturas, paquetes ( package ) o en los bloques concurrentes ( block ). Las constantes pueden ser habitualmente declaradas en los mismos sitios que las variables y señales.

Las variables son elementos abstractos del lenguaje, lo que significa que no tienen por qué tener una concordancia física real inmediata. Las señales poseen un significado físico inmediato y es el de representar conexiones reales en el circuito; son visibles por

Existe una biblioteca que es la más empleada en la industria de los semiconductores y que prácticamente también es estándar, la biblioteca IEEE, con sus paquetes std_logic_1164 y std_logic_1164_ext. El primero contiene la definición de tipos y funciones para trabajar con un sistema de nueve niveles lógicos que incluyen los de tipo bit con sus fuerzas correspondientes, así como los de desconocido, alta impedancia, etc. El segundo paquete, el cual es una extensión del anterior, incorpora alguna función de resolución más, así como operaciones aritméticas y relacionales.

Es por ello que la primera parte de una descripción VHDL contiene la declaración de librerías utilizadas en el proyecto. Con el objeto de respetar la definición IEEE del VHDL se tratara lo más posible de utilizar solo la librería estándar 1164. Existen muchas otras librerías, pero solo se aplican para los dispositivos de algunas empresas, por lo que no son estándar.

Todas las descripciones del texto incluyen las siguientes dos líneas en la sección de librerías:

library IEEE; use IEEE.std_logic_1164. all

Una excepción a lo anterior es cuando se describen memorias, donde se necesita utilizar dos librerías adicionales que también son parte del estándar 1164.

2.6.2 TERMINALES DE ENTRADA Y SALIDA: ENTITY.

La segunda sección de la descripción VHDL, la entidad, define la interfaz con el entorno del sistema, ya que contiene las terminales de entrada y salida que lleva un diseño. La entidad es la estructura que permite realizar diseños jerárquicos en VHDL (colección de módulos interconectados entre sí). La forma de declarar una entidad es:

entity nombre is [ generic (lista de parámetros);] [ port (lista de puertos);] [declaraciones] [ begin sentencias] end [ entity ] [nombre];

Las sentencias generic y port son muy importantes a pesar de que son opcionales. Generic sirve para definir y declarar propiedades o constantes del módulo que está siendo declarado en la entidad. Con la palabra clave port , se definen las entradas y salidas del módulo que está siendo definido.

Existen cuatro tipos de terminales que pueden ser declaradas:

1 Entradas simples. 2 Salidas simples. 3 Salidas retroalimentadas. 4 Terminales bidireccionales.

Para ejemplificar la forma de dar de alta las terminales de un circuito, se toma como ejemplo la caja negra que aparece en la figura 2.

Figura 2. Caja negra con terminales de E/S.

La declaración de esta caja negra en VHDL, con sus correspondientes terminales, utilizando los tipos de la librería IEEE con su paquete std_logic_1164 es:

entity Caja_Negra is port ( a ,b : in std_logic; -- Entradas simples. c : out std_logic; -- Salida simple. d : inout std_logic; -- Terminal bidireccional. e : buffer std_logic -- Salida retroalimentada. ); end Caja_Negra;

La descripción de terminales inicia con la palabra reservada entity, continua con el nombre del circuito (en este caso, Caja_Negra) y la palabra reservada is y finaliza con la palabra reservada end y nuevamente el nombre del circuito con punto y coma. Las terminales son declaradas dentro de una estructura que comienza con la palabra reservada port seguida de paréntesis “(“ y termina con otro paréntesis y punto y coma “);”. Las entradas simples se declaran como in , las salidas simples como out , las terminales bidireccionales como inout y las salidas retroalimentadas como buffer.

CAJA NEGRA

b

d

e

a

c

Ejemplo 1. Compuerta NAND de dos entradas.

Realizar la descripción VHDL del circuito de la figura Ej.1.

Figura Ej.1. Circuito simple.

Solución:

-- Libreria estandar

library IEEE; use IEEE.std_logic_1164. all ;

-- Descripcion en caja negra

entity Compuerta_NAND is port ( A, B : in std_logic; -- Entradas simples F: out std_logic -- Salida simple ); end Compuerta_NAND;

-- Descripcion del circuito

architecture simple of Compuerta_NAND is begin F <= A NAND B; -- Compuerta NAND end simple;

Ejemplo 2. Operadores lógicos.

Realizar la descripción VHDL del circuito combinacional de la figura Ej.2.

Figura Ej.2. Circuito combinacional con compuertas básicas.

Solución:

-- Libreria estandar

library IEEE; use IEEE.std_logic_1164. all ;

-- Descripcion en caja negra

entity Compuertas_basicas is port ( A, B : in std_logic; -- Entradas simples F: out std_logic_vector(1 to 7)-- 7 Salidas simples ); end Compuertas_basicas;