Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Presenta:
Maestro:
Silvestre Ávila
VHDL
El lenguaje VHDL es utilizado para la programación de dispositivos de lógica
programable como los FPGA y CPLD. Aunque VHDL es un lenguaje de programación
como cualquier otro en cuanto a que tiene las estructuras básicas de programación,
también es importante mencionar que la ejecución de los códigos en VHDL no es igual
a la ejecución de los códigos en microprocesadores y microcontroladores.
Comentarios
Los comentarios van precedidos de dos guiones. En una línea se ignorará todo
aquello que vaya después de dos guiones seguidos.
Identificadores
Son cualquier cadena de caracteres que sirven para identificar variables, señales,
procesos, etc. Puede ser cualquier nombre compuesto por letras (aux) o números y
letras (aux1, aux2, aux3, ...), incluyendo el símbolo de subrayado "_".
Números
Cualquier número se representa en base 10. Aunque es posible poner los números
en otras bases utilizando diferentes símbolos, como se muestra en la siguiente
sección.
Bases
"01111" binario
O"17" octal
X"F" hexadecimal
Constantes, señales y variables
Todos estos elementos son diferentes. Las variables sólo tienen sentido dentro de
los procesos o subprogramas, mientras que las señales pueden ser declaradas en
arquitecturas, paquetes o bloques concurrentes. Las constantes pueden ser
declaradas en los mismos sitios que las variables y señales.
Constantes
Variables
Es lo mismo que una constante, pero con la diferencia que puede ser modificada en
cualquier instante, aunque también es posible inicializarlas. La palabra reservada
VARIABLE es la que permite declarar variables.
Señales
Las señales se declaran con la palabra reservada SIGNAL, a diferencia con las
anteriores este tipo de elementos pueden ser de varios tipos: normal, register o bus.
Es posible asignarles un valor inicial.
Atributos
Los elementos como señales y variables pueden tener atributos, éstos se indican a
continuación del nombre, separados con una comilla simple "'" y pueden incluir
información adicional de algunos objetos desarrollados en VHDL, que servirán a las
herramientas de diseño para obtener información a la hora de realizar una síntesis.
Existen muchos atributos, como LEFT, RIGHT, LOW, HIGH, RANGE, LENGTH...
Pero el atributo más usado es EVENT, que indica si una señal ha cambiado de
valor. Por ejemplo la siguiente sentencia captura un flanco de subida de una señal
(clk).
Operadores
Lógicos: Actúan sobre los tipos bit, bit_vector y boolean. En el caso de utilizar
este tipo de operadores en un vector, la operación se realizará bit a bit.
1. Aritméticos:
+ (suma o signo positivo): Sirve para indicar una suma entre dos números.
También puede actuar como símbolo si se sitúa delante de una expresión.
- (resta o signo negativo): Sirve para indicar la resta entre dos números. Si va
delante de una expresión modifica el signo de la expresión.
>, >=, <, <= (menor mayor): Poseen el significado habitual (mayor que, mayor
o igual que, menor que, menor o igual que, respectivamente). La diferencia
con los anteriores reside en su uso, en este caso los tipos de datos que
pueden manejar son siempre de tipo escalar o matrices.
Desplazamientos:
SLL (Shift Left Logic) y SRL (Shift Right Logic), desplazamiento lógico a la
izquierda y desplazamiento lógico a la derecha, respectivamente, rellenando
de ceros los huecos.
SLA (Shift Left Arithmetic) y SRA (Shift Right Arithmetic), desplazamiento
aritmético a la izquierda y derecha respectivamente.
Otros:
Cadenas de bits
Los tipos bit y bit vector son en realidad 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). Ejemplo: B"11101001", O"126", X"FE".
Tipo De Datos
Reales o coma flotante: Se definen igual que los enteros con la diferencia que
los límites son números reales.
Enumerados: Son datos que puede tomar siempre que se encuentre en una
lista o conjunto finito. Es idéntico a las enumeraciones en C (enum).
Tipos compuestos
Son tipos de datos compuestos por los que se han visto anteriormente.
Declaración de constantes
Su declaración es muy similar a la de una señal, sólo que en lugar de usar signal
usaremos constant. Por otro lado las constantes deben poseer un valor de
inicialización, ya que no pueden ser asignadas. En el Ejemplo 2-1 vemos como
pueden declararse.
Declaración de variables
Es lo mismo que una constante, pero con la diferencia que puede ser modificada en
cualquier instante, aunque también es posible inicializarlas. La palabra reservada
VARIABLE es la que permite declarar variables.
VARIABLE contador : natural : = 0;
DECLARACIÓN DE CONCURRENTES
Declaraciones De Entidades
Para la declaración de una entidad hay que definir un nombre y también el nombre
de los puertos de I/O que utilizara el diseño, a continuación mostramos un esquema
básico para la declaración de entidades. Las entidades que usaremos inicialmente
serán entidades en donde solo se declararan puertos solamente.
Nombre_Entidad;
Dentro de las declaraciones de las entidades, hay que realizar la declaración de los
puertos utilizados en el diseño del dispositivo. Los puertos se declaran utilizando el
comando port en la cual se debe definir los nombres, modo y tipos de las señales
utilizadas como I/O.
Las declaraciones de los puertos se realizan dentro de la instrucción port la cual debe
terminar en un carácter de punto y coma; ademas de que cada declaración de un
puerto debe terminar también en un carácter de punto y coma, con excepción de la
ultima declaración en donde no es necesario. La declaración de los puertos consta
de un nombre del puerto seguido de un carácter de dos punto (:), luego se debe
especificar el modo del puerto y el tipo de dato. A continuación se listan los modo y
tipos de datos mas utilizados para la declaración de puertos.
Declaración de arquitectura
Arquitectura Funcional
Podemos observar que entre las líneas 1 a 7 declaramos tanto las Librerías como la
Entidad, la ejecución del algoritmo (Arquitectura) se puede apreciar entre las líneas
8 a 18, este fragmento describe el funcionamiento del comparador. Para iniciar la
ejecución de la Arquitectura necesitamos definir un nombre arbitrario que podamos
identificar (en nuestro caso fue la palabra Funcional) además debemos incluir la
entidad a la cual lo relacionamos (Comp). En la línea 9 podemos observar el inicio
de la sección donde se declaran los procesos que rigen la manera en que nuestro
sistema se comporta. La declaración del proceso (línea 10) la utilizamos para la
definición de algoritmos y empieza con una etiqueta opcional (Compara) seguida de
dos puntos (:), la palabra reservada process enlaza la lista sensitiva (A y B) que
hace referencia a las señales que determinan el funcionamiento del proceso.
Para finalizar el análisis, notamos que desde las líneas 12 a 17 el proceso ejecuta
usando declaraciones secuenciales if-then-else (si-entonces-si no). Esto podemos
interpretarlo de la siguiente manera: si el valor de la señal de entrada A es igual a la
señal B, entonces C será igual a ‘1’, si no se asigna un ‘0’ (el símbolo <= se lee
como “se asigna a”). Ya terminado el proceso al usar la palabra reservada end
process y opcionalmente el nombre del proceso (Compara), y similarmente
añadimos la etiqueta (Funcional) al finalizar la arquitectura.
Cuando varias salidas se cablean a una misma línea bus existe peligro de
cortocircuito -entre dichas líneas de salida- salvo que dicho cableado se realice con
cierto control. Existen dos posibilidades:
En este caso cualquier salida consta de un transistor nMos que actúa como
interruptor. Si el transistor conduce (valor lógico alto en la puerta; interruptor
cerrado) entonces dicho transistor fija la tensión de la línea bus a tierra (nivel bajo).
En el caso de que el transistor no conduzca (valor lógico bajo en la puerta; transistor
cortado; interruptor abierto), la salida del mismo queda en un estado de alta
impedancia.
La salida toma valor 'Z' (alta impedancia) cuando el habilitador correspondiente toma
el valor ‘0’. El caso de que dos o más habilitadores (si hubiera más dispositivos)
estuvieran activos simultáneamente no puede ocurrir ya que generaría el
cortocircuito de esas salidas. Para este caso se indica que la salida toma valor
indeterminado '-'.
Multiplexor
CPLD
Los CPLD son dispositivo lógicos
programables con una complejidad entre los
dispositivos PLA y FPGA. La característica
principal comun entre los CPLD y PAL, es la
configuración de memoria no-volatil, y con
respecto a los dispositivo FPGA, la
característica común de éste último es que
posee un desarrollo de compuertas de grande
densidades, con la diferencia que los FPGA,
tienen mayor densidad que los CPLD. A modo
general un CPLD es como si se tuviera varios
PLD, tipo PAL, dentro de un sólo chip. el tamaño mas grande los CPLD permite
implementar ecuaciones lógicas o diseños mas complicados. la programación de
estos dispositivos es generalmente en lenguajes de descripción de hardware , por
ejemplo, VHDL o Verilog.
FPGA
https://es.m.wikibooks.org/wiki/Programaci%C3%B3n_en_VHDL/Elementos_b%C3
%A1sicos_del_lenguaje
https://es.m.wikibooks.org/wiki/Programaci%C3%B3n_en_VHDL/Arquitectura
http://ygelectronicaintegrada.blogspot.com/2008/01/vhdl.html?m=0
http://tutosrafaz.blogspot.com/2015/07/tipos-de-arquitecturas-en-vhdl .html?m=1
http://electronicaintegrada.blogspot.com/2008/02/cpld-verilog.html?m=1
https://sites.google.com/site/logicaprogramable/vhdl/lenguaje-vhd