# Programación en VHDL/Otros conceptos

Hasta este momento se ha ofrecido una visión general del lenguaje VHDL. EN esta sección se verán algunas cosas que resultan interesantes en algunas ocasiones a la hora de diseñar algún sistema.

## Punteros en VHDL

Algunos lenguajes de programación permiten reservar espacio de memoria de manera dinámica mediante punteros. Como es sabido, un puntero es una dirección de memoria que apunta a una variable. En VHDL el tipo de datos que permite reservar memoria es a través de la palabra reservada ACCESS, la forma de definir un puntero es la siguiente.
La variable p corresponde a un puntero que apunta a variables del tipo tipo_elemento. Los punteros sólo pueden ser variables, en ningún caso serán señales, por consiguiente solo podrán estar dentro de un proceso (PROCESS). Por otro lado, la creación de un puntero se realiza mediante la palabra NEW. Un ejemplo para declarar un puntero es el siguiente.
Para acceder al contenido de la drección apuntada se utiliza la palabra ALL, si no se inicializa el valor que toma, por defecto tomará el valor NULL. Si se desea liberar la memoria utilizada por un puntero se hará uso del procedimiento deallocate. Para el caso anterior se realizaría de la siguiente forma.

## Ficheros

En algunas ocasiones es interesante utilizar ficheros para leer información o incluso almacenarla. El uso de ficheros únicamente es válido en la simulación, mientras que en la síntesis no es posible su uso. Estos ficheros no pueden almacenar matrices multidimensionales, punteros o ficheros.

### Abrir y cerrar ficheros

En primer lugar se debe declarar el tipo de datos que contendrá dicho archivo. Mediante las palabras reservadas TYPE y FILE se genera la siguiente estructura.
Cuando se tratan con ficheros en VHDL, la estructura anterior depende del compilador que se utilice (VHDL'87 y VHDL'93). La primeras líneas son iguales en ambos casos, pero a la hora de indicar el acceso al fichero la sintaxis difiere de uno a otro compilador. En VHDL'87 el modo puede ser IN (por defecto) si se va a leer y OUT para escribir. Por otro lado, en VHDL'93 el modo es definido mediante un tipo enumerado declarado en la librería correspondiente (file_open_kind), donde se encuentra write_mode, read_mode (por defecto) o append_mode, que indica escritura, lectura y concatenación respectivamente. A diferencia que en el anterior, en este caso no es necesario abrirlo obligatoriamente en el momento en que se declara. Para posteriormente abrirlo se podría utilizar el siguiente subprograma.
Al realizar la apertura después de la declaración conlleva una flexibilidad mayor, como puede ser la petición del nombre del fichero. También es posible obtener el estado en el cual se quedó el fichero: open_ok, status_error, name_error y mode_error, aunque este parámetro es opcional.
Además de este subprograma existe otro para poder cerrar el fichero abierto.
A continuación se muestra un ejemplo de declaración, apertura y cierre de ficheros.

### Lectura y escritura de ficheros

Una vez que se ha declarado un fichero es posible realizar diferentes operaciones como son la lectura, la escritura o la propia comprobación de fin de archivo. Estas operaciones pueden ser realizadas a través de unos subprogramas que se detallan a continuación.
El siguiente código muestra un ejemplo de como utilizar estos procedimientos.

### Ficheros de texto

Trabajar con ficheros es útil, pero hay que recordar que VHDL codifican los datos de forma binaria, lo que implica que es muy poco legible. Por lo tanto, debe haber una manera de traducir los datos de forma que el lenguaje pueda entenderlos, y para el usuario sea fácil de escribir dichos archivos. El paquete textio permite la conversión de tipos.