Images

Análisis del código VHDL del proyecto LEDA_blog (III): Breve descripción de la semántica y sintaxis del código.

En esta entrada haremos uso del código del tutorial - que previamente publiqué en 12 entradas - llamado “Introducción al kit Open3S250E”, es decir el código del proyecto creado en XILINX llamado: LEDA_blog.

Con dicho código haremos un breve repaso o introducción (según sean los conocimientos sobre el tema del lector) del léxico y sintaxis básicas de un programa en VHDL con el fin principal de tener los conocimientos necesarios para una futura entrada que tratará del funcionamiento o algoritmo del código en VHDL del proyecto LEDA_blog.


Para ello usaremos el código de colores que usa el editor de XILINX. El programa es el siguiente:


Lo que está en verde en el anterior código, siempre detrás de dos guiones medios “--”, son sólo comentarios que hace el programador para que el código lo puedan entender otros programadores. 

Estos comentarios cuando el programa se sintetice se obvian completamente (podemos decir que en VHDL el proceso de síntesis es equivalente a la compilación en otros lenguajes como el C). Dicho de otra forma, si elimináramos toda la parte del código que está en verde el programa se ejecutaría exactamente igual.

Todo lo que está en verde es completamente prescindible.

Se habrá dado usted cuenta -dama o caballero- que aquí esos comentarios explican poco dado que no son precisamente inteligibles, más bien bastante ilegibles con tantos signos de interrogación... 

¿Por qué?, pues porque con toda probabilidad están escritos con caracteres que mi ordenador (computador o computadora) no entiende, o digamos mejor que el sistema operativo de mi PC  no capta esos caracteres ya que está configurado para el español internacional al igual que el teclado.

Recordemos que este programa en realidad no es mío, ha sido un copia-pega (o copy-paste) de una demo con ligeras modificaciones hechas por mí que se señalan en rojo, a parte de algunos espaciados que he hecho en la escritura de las instrucciones para hacer lo más fácilmente legible.

-------------------------------------------------------------------------------- 

Lo que está en azul si es bastante importante, son las palabras reservadas del VHDL, dicho de otra forma, el léxico que usa el lenguaje. Estás palabras reservadas tienen una funcionalidad muy definida, es por eso que el programador no puede usar esas palabras para otros usos (como identificadores de señales o variables por ejemplo).

También se puede observar que están en mayúsculas, bueno, eso es la preferencia del programador que le gusta así, pero si las hubiéramos escrito en minúsculas el funcionamiento del programa sería igualmente correcto. De hecho verás que en otros códigos que encuentres por ahí, las mismas palabras reservadas están en minúsculas y la ejecución sigue siendo válida. Como reza el dicho en castellano “cada maestrillo tiene su librillo”.

---------------------------------------------------------------------------------

Lo que está en fucsia, morado o rosa oscuro (para ser sincero no se dar nombre a ese color), hace referencia a la biblioteca y los bloques de esa biblioteca que necesitamos en este programa. 

Al principio del código encontramos tres líneas mediante las que se incluyen la librería y los bloques que necesitamos. La librería es la IEEE, y los bloques de ella que usamos son: IEEE.STD_LOGIC1161 e IEEE.std_logic_unsigned.

En este caso IEEE es una biblioteca o librería del VHDL, pero realmente el acrónimo IEEE hace referencia a una asociación de estandarización internacional. 
Para que se haga una idea el lector de que es eso de una asociación de estandarización internacional, hay por ahí un grupo de personas trabajando duro para unificar los criterios de los fabricantes, desarrolladores…etc, y así hacernos la vida más fácil a los demás.

La gente que maneja usualmente la expresión IEEE, no lo suele deletrear como I-E-E-E, sino como I-E-CUBO, me imagino que nos resulta más cómodo decir lo así que deletrear tanta E seguida. Así que si oyes decir a alguien I-E-CUBO ya tienes una idea de a que se refiere.

Para los que hemos dedicado mucho tiempo a esto de la electrónica la expresión IEEE (I-E-CUBO) es algo que no nos suena para nada extraño, más que nada porque encuentras ese acrónimo muchas veces. Pero yo aquí escribo “para todos los públicos” (o al menos lo intento). 

A parte de esas tres primeras instrucciones de al principio, el color fucsia (morado o rosa oscuro), nos lo encontramos más veces en el código, siempre dónde aparece escrito std_logic o std_logic_vector.

Aquí si voy a profundizar un poco más. Estos son identificadores de tipo de datos, y aparecen en el color que no se nombrar debido a que el código que las define está en los bloques IEEE.STD_LOGIC1161 e IEEE.std_logic_unsigned, y estos a su vez dentro de la librería IEEE. 

Esas tres instrucciones -que aparecen al principio del código- están ahí especialmente para que podamos usar estos tipos de datos: std_logic y std_logic_vector.

El std_logic hace referencia a tipos de datos bit, también existe el identificador de tipo de datos nombrado como bit y se podría haber hecho uso de él, pero el programador ha preferido – con buen criterio en mi opinión – hacer uso del std_logic porque es más completo que el tipo bit, y explicaré porqué.

Los datos tipo bit pueden tomar valores 0 o 1, luego el hardware normalmente le asigna un valor de tensión al 1 (que puede ser 3,3 o 5 voltios por ejemplo) y el cero a otro valor de tensión (que puede ser tensión de 0 voltios, pero ojo que no siempre va a ser así, es sólo un ejemplo).

¿Pero qué sucede si resulta que ese punto no está conectado a algún tipo de alimentación (5 o 3,3 voltios) o a tierra (0 voltios)?, ¿y si es un pin que está “al aire”? (a esto normalmente le llamamos estado de alta impedancia). ¿Y si en lugar de obtener un valor de tensión de 3,3 voltios tenemos uno de 2,8 voltios?, ¿y si en lugar de tener 0 voltios tenemos 0,5 voltios?.

Pues bien, para resolver todos estos dilemas se usa el std_logic que cubre este tipo de eventualidades como describe la siguiente tabla:


Descripción
Notación
Sin inicializar.
U
Desconocido.
X
Estado bajo fuerte.
0
Estado alto fuerte.
1
Estado de alta impedancia.
Z
Desconocido débil.
W
Estado bajo débil.
L
Estado alto débil.
H
No importa.
-


El std_logic_vector, es una sucesión de bits (cada uno con las mismas características del std_logic), por eso se suele inicializar como: Std_logic_vector(n-1 downto 0), siendo n el número de bits que quieres que tenga la cadena o vector de bits.

En el caso que nos ocupa se inicializó como std_logic_vector(3 downto 0) porque se pretende que el vector sea de 4 bits. Luego veremos que ese vector se declaró como salida para controlar los 4 LEDs usados en el hardware Open3S250E. 

---------------------------------------------------------------------------------

Lo que está en negro ya es más “cosecha” del programador, e incluye los identificadores que son los caracteres alfanuméricos que uno quiera, por ejemplo count para definir una variable que hará de contador (que también se podría haber escrito en castellano como contador sin ningún problema), operadores de asignación a señales o variables (“:=” o “<=”), operadores aritméticos (+, -, *, /…), relacionales (menor o igual “ <=”, mayor o igual “>=”, igual “=”), atributos del tipo del tipo identificador’event”, como por ejemplo el clk’event -que veremos sirve para detectar un flanco de subida del reloj notado como clk - … y por supuesto los punto y coma “;” que como en otros lenguajes de programación sirven para finalizar las distintas instrucciones (y así definirlas para que el sistema las sintetice/compile bien).

Con esta entrada espero que el lector que se inicia con VHDL se haya quedado con unas ideas básicas (que siempre se puede asentar o completar con otras fuentes como los enlaces que dejé en la penúltima entrada), y quién sabe si puede ser un buen repaso para las personas que tengan ya cierto nivel en VHDL.


0 comentarios: