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.
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.
¿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.
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.
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.
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: