Programación en VHDL/Otros conceptos

← Organización del código Otros conceptos Bancos de pruebas →


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

editar

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.

     TYPE tipo_puntero IS ACCESS tipo_elemento;
     VARIABLE p : tipo_puntero;

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.


     TYPE punteroA IS ACCESS integer RANGE 0 TO 255;
     VARIABLE p : punteroA;
              ....
     p := NEW integer RANGE 0 TO 255;
     p.ALL := 45;

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.


     Deallocate(p);

Ficheros

editar

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

editar

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.

     TYPE fichero_tipo IS FILE OF tipo;
     FILE nombre :
       fichero_tipo IS [modo] "fichero":        -- VHDL'87
       [fichero_tipo [OPEN modo] IS "fichero"]  -- VHDL'93

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.

     PROCEDURE file_open(status: OUT file_open_status;
                         FILE f: file_type;
                         external_name: IN string;
                         open_kind: IN file_open_kind:=read_mode);

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.

     PROCEDURE file_close(FILE f: file_type);

A continuación se muestra un ejemplo de declaración, apertura y cierre de ficheros.


     TYPE arch_integer IS FILE OF integer;

     -- Declaración y apertura a la vez
     FILE datos: arch_integer OPEN read_mode IS "input.txt";

     -- Declaración y apertura posterior
     FILE datos: arch_integer;
             .....
     file_open(datos, "input.txt",read_mode);

     -- Cerrar
     file_close(datos);

Lectura y escritura de ficheros

editar

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.

     PROCEDURE read(FILE f: tipo_archivo; value: OUT tipo);
     PROCEDURE write(FILE f: tipo_archivo; value: IN tipo);
     PROCEDURE endfile(FILE f: tipo_archivo) RETURN boolean;

El siguiente código muestra un ejemplo de como utilizar estos procedimientos.


     TYPE type_arch IS FILE OF integer;
     FILE arch : type_arch OPEN read_mode IS "arch.txt";
     VARIABLE n : integer;
                 .....
     WHILE NOT endfile(arch) LOOP
       read(arch, n);
           ....
     END LOOP;

Ficheros de texto

editar

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.

← Organización del código Otros conceptos Bancos de pruebas →