0% encontró este documento útil (0 votos)
261 vistas7 páginas

Guía Completa de VHDL: Sintaxis y Modelado

VHDL es un lenguaje de descripción de hardware utilizado para modelar sistemas digitales. Fue desarrollado para simulación y síntesis de circuitos digitales de manera similar al lenguaje ADA. VHDL incluye elementos sintácticos como comentarios, identificadores, números, caracteres y cadenas, así como declaraciones de constantes, variables, señales, ficheros y entidades para definir módulos.

Cargado por

Jose Ignacio
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
261 vistas7 páginas

Guía Completa de VHDL: Sintaxis y Modelado

VHDL es un lenguaje de descripción de hardware utilizado para modelar sistemas digitales. Fue desarrollado para simulación y síntesis de circuitos digitales de manera similar al lenguaje ADA. VHDL incluye elementos sintácticos como comentarios, identificadores, números, caracteres y cadenas, así como declaraciones de constantes, variables, señales, ficheros y entidades para definir módulos.

Cargado por

Jose Ignacio
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd

Definición de VHDL

VHDL, viene de VHSIC (Very High Speed Integrated Circuit) Hardware Description Language. VHDL
es un lenguaje de descripción y modelado diseñado para describir (en una forma que los humanos
y las maquinas puedan leer y entender) la funcionalidad y la organización de sistemas hardware
digitales, placas de circuitos, y componentes.

VHDL fue desarrollado como un lenguaje para el modelado y simulación lógica dirigida por eventos
de sistemas digitales, y actualmente se lo utiliza también para la síntesis automática de circuitos. El
VHDL fue desarrollado de forma muy parecida al ADA debido a que el ADA fue también propuesto
como un lenguaje puro pero que tuviera estructuras y elementos sintácticos que permitieran la
programación de cualquier sistema hardware sin limitación de la arquitectura. El ADA tenía una
orientación hacia sistemas en tiempo real y al hardware en general, por lo que se lo escogió como
modelo para desarrollar el VHDL.

VHDL es una lengua je con una sintaxis amplia y exile que permite el modelado estructural, en
uno de datos y de comportamiento hardware. VHDL permite el modelado preciso, en distintos
estilos, del comportamiento de un sistema digital conocido y el desarrollo de modelos de
simulación.

Uno de los objetivos de la lengua je VHDL es el modelado. Modelado es el desarrollo de un


modelo para simulación de un circuito o sistema previamente implementado cuyo
comportamiento, por tanto, se conoce. El objetivo del modelado es la simulación.

Elementos del lenguaje VHDL.

Elementos sintácticos del VHDL.

El lenguaje VHDL es verdaderamente un lenguaje, por lo que tiene sus elementos sintácticos, sus
tipos de datos, y sus estructuras como cualquier otro tipo de lenguaje. El hecho de que sirva para
la descripción hardware lo hace un poco diferente de un lenguaje convencional. Una de estas
diferencias es probablemente la posibilidad de ejecutar instrucciones a la vez de forma
concurrente.

Algunos de estos elementos sintácticos se muestran a continuación:

Comentarios: Cualquier línea que empieza por dos guiones “--" es un comentario.

Identificadores: Son cualquier cosa que sirve para identificar variables, señales, nombres de rutina,
etc. Puede ser cualquier nombre compuesto por letras incluyendo el símbolo de subrayado “_".
Las mayúsculas y minúsculas son consideradas iguales, así que JOSE y jose representan el mismo
elemento. No puede haber ningún identificador que coincida con alguna de las palabras clave del
VHDL.

Números: Cualquier número se considera que se encuentra en base 10. Se admite la notación
científica convencional para números en coma flotante. Es posible poner números en otras bases
utilizando el símbolo del sostenido “#". Ejemplo: 2#11000100# y 16#C4# representan el entero
196.

Caracteres: Es cualquier letra o carácter entre comillas simples: 'l','3','t'.


Cadenas: Son un conjunto de caracteres englobados por comillas dobles: "Esto es una cadena”.

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 especifica que el número se puede
poner un prefijo B (binario), O (octal), o X (hexadecimal). Ejemplo: B"11101001", O"126", X"FE”.

1.1.1 Operadores y expresiones en VHDL.

Las expresiones en VHDL son prácticamente iguales a como pudieran ser en otros lenguajes de
programación o descripción, por lo que se expondrían brevemente los existentes en VHDL y su
utilización.

Operadores varios

& (concatenación) Concatena matrices de manera que la dimensión de la matriz resultante es la


suma de las dimensiones de las matrices sobre las que opera: punto<=x&y mete en la matriz punto
la matriz x en las primeras posiciones, y la matriz y en las últimas.

Operadores aritméticos

** (exponencial) Sirve para elevar un número a una potencia: 4**2 es 4 2. El operador de la


izquierda puede ser entero o real, pero el de la derecha sólo puede ser entero.

ABS() (valor absoluto) Como su propio nombre indica esta función devuelve el valor absoluto de su
argumento que puede ser de cualquier tipo numérico.

* (multiplicación) Sirve para multiplicar dos numeros de cualquier tipo (los tipos bit o bit_vector no
son numéricos).

/ (división) También funciona con cualquier dato de tipo numérico.

MOD (modulo) Calcula en módulo de dos números. Exactamente se define el módulo como la
operación que cumple: a=b*N+(a MOD b) donde N es un entero. Los operandos solo pueden ser
enteros. El resultado toma el signo de b.

REM (resto) Calcula el resto de la división entera y se define como el operador que cumple:
a=(a/b)*b+(a REM b), siendo la división entera. Los operandos solo pueden ser enteros. El
resultado toma el signo de a.

+ (suma y signo positivo) Este operador sirve para indicar suma, si va entre dos operandos, o
signo, si va al principio de una expresión. La precedencia es diferente en cada caso. Opera sobre
valores numéricos de cualquier tipo.

(-) (resta y signo negativo) Cuando va entre dos operandos se realiza la operación de sustracción, y
si va delante de una expresión le cambia el signo. Los operandos pueden ser numéricos de
cualquier tipo.

1.1.3 Tipos de datos.


Como en cualquier lengua je, VHDL tiene dos grupos de tipos de datos. Por un lado, están los
escalares, con los que se pueden formar el otro grupo que son los compuestos.

1.1.4 Subtipos de datos.

VHDL permite la decisión de subtipos que son restricciones o subconjuntos de tipos existentes.
Hay dos tipos. El primero son subtipos obtenidos a partir de la restriccion de un tipo escalar a un
rango. Ejemplos:

SUBTYPE raro IS integer RANGE 4 TO 7;


SUBTYPE digitos IS character RANGE '0' TO '9';
SUBTYPE natural IS integer RANGE 0 TO entero_mas_alto; --Predefinido en VHDL
SUBTYPE positive IS integer RANGE 1 TO entero_mas_alto; --Predefinido en VHDL

El segundo tipo de subtipos son aquellos que restringen el rango de una matriz:

SUBTYPE id IS string(1 TO 20);


SUBTYPE word IS bit_vector(31 DOWNTO 0);

Los subtipos sirven además para crear tipos resueltos que es una clase especial de tipos que se
explicara en detalle en la sección 10.1.

La ventaja de utilizar un subtipo es que las mismas operaciones que servían para el tipo sirven
igual de bien para el subtipo. Esto tiene especial importancia por ejemplo cuando se describe un
circuito para ser sintetizado, ya que si utilizamos integer sin más, esto se interpretara como un bus
de 32 líneas (puede cambiar dependiendo de la plataforma) y lo más probable es que en realidad
necesitemos muchas menos. Otro caso se da cuando tenemos una lista de cosas y les queremos
asignar un entero a cada una, dependiendo de las operaciones que queramos hacer puede
resultar más conveniente definirse un subtipo a partir de integer que crear un tipo enumerado.

1.2 Declaraciones básicas de objetos.

1.2.1 Declaración de constantes.

Una constante es un elemento que se inicializa a un determinado valor y no puede ser cambiado
una vez inicializado, conservando para siempre su valor. Ejemplos:

CONSTANT e: real := 2.71828;


CONSTANT retraso: time := 10 ns;
CONSTANT max_size: natural;

En la última sentencia, la constante max_size no tiene ningún valor asociado. Esto se permite
siempre y cuando el valor sea declarado en algún otro sitio. Esto se hace as para las declaraciones
en packages que se verán más adelante.

1.2.2 Declaración de variables.

Una variable es lo mismo que una constante con la diferencia de que su valor puede ser alterado
en cualquier instante. A las variables también se les puede asignar un valor inicial.
VARIABLE contador: natural := 0;
VARIABLE aux: bit_vector(31 DOWNTO 0);

Es posible, dado un elemento previamente definido, cambiarle el nombre o ponerle nombre a una
parte. Esto se realiza mediante la instrucciónon ALIAS que resulta muchas veces muy útil. Ejemplo:

VARIABLE instruccion: bit_vector(31 DOWNTO 0);


ALIAS codigo_op: bitvector(7 DOWNTO 0) IS instruccion(31 DOWNTO 24);

1.2.3 Declaración de señales.

Las señales se declaran igual que las constantes y variables con la diferencia de que las señales
pueden además ser de varios tipos que son normal, register y bus. Por defecto son de tipo normal.
Al igual que en variables y constantes, a las señales se les puede dar un valor inicial si se quiere.
Ejemplos:

SIGNAL selec: bit := '0';


SIGNAL datos: bit_vector(7 DOWNTO 0) BUS := B"00000000";

1.2.4 Declaración de ficheros.

Ficheros.

Permiten comunicar un diseño VHDL con un entorno externo.

 Útil para introducir estímulos de simulación y salvar resultados de simulación.

Sintaxis:

TYPE identificadorTipoFichero IS FILE OF tipoDatos;

FILE identificador: tipo OPEN read_mode IS “nombre”;

FILE identificador: tipo OPEN write_mode IS “nombre”;

Ejemplo:

TYPE vectores IS FILE OF integer;

FILE datos: vectores OPEN write_mode IS “[Link]”;

1.3 Declaraciones concurrentes.

1.3.4 Declaración de entidad.

La entidad es la parte del programa que define el módulo. Es decir, define las entradas y salidas del
circuito. Además, la entidad es la estructura que permite en VHDL realizar diseños jerárquicos, ya
que un diseño jerárquico es generalmente una colección de módulos interconectados entre si. En
VHDL estos módulos se definen mediante la palabra clave ENTITY:

id_instr:
ENTITY nombre IS
GENERIC(lista de propiedades);
PORT(lista de puertos);
declaraciones
BEGIN
sentencias
END nombre;

Se observa fácilmente que la declaración de entidad es una cosa algo más compleja de lo que se
había visto. La primera cosa que destaca es la palabra id_instr, seguida por dos puntos, delante de
ENTITY. Esto es algo común a todas las instrucciones en VHDL, siempre se puede poner un nombre
para idéntica unas instrucciones de otras. Este nombre es opcional, se puede poner casi en
cualquier instrucción, y permite realizar un mejor seguimiento de la ejecución de un programa
durante la simulación. Esta información extra esta especialmente indicada para estructuras de tipo
PROCESS que de por si no tienen ningún nombre asignado, pero se puede usar en casi cualquier
otro tipo de estructura.

Las partes GENERIC y PORT son las más usadas en la entidad. La instruccion GENERIC sirve para
definir y declarar propiedades o constantes del módulo que está siendo declarado en la entidad.
Las constantes declaradas aquí tienen el mismo sindicado que las constantes declaradas como
parámetros en las funciones y procedimientos que se verán mas adelante. Es decir, a la entidad se
le pueden pasar como parámetros las constantes definidas en GENERIC, si se pasan valores
entonces la constante tomara el valor que se le pasa, y si no se le pasa ningún valor, la constante
tomara el valor que se asigne en GENERIC.

Con la palabra clave PORT, también opcional como el resto de partes de la entidad, se definen las
entradas y salidas del módulo que está siendo definido. Esta forma de declarar estas entradas y
salidas ya se ha visto, y simplemente consiste en un nombre, seguido por el tipo de conexión, y
seguido por el tipo de datos de la lnea. Habamos visto dos tipos de conexiones que eran IN, para
indicar entrada, y OUT para indicar salida.

La diferencia entre IN y OUT es importante: las señales de entrada se pueden leer, pero no
pueden asignárseles ningún valor, es decir, no se puede cambiar su valor en el programa, y vienen
a ser como constantes. Las señales de salida pueden cambiar y se les pueden asignar valores, pero
no pueden leerse, es decir, no pueden ser usadas como argumentos en la asignación de cualquier
elemento del VHDL.

Junto a los tipos IN y OUT existen otros que también pueden ser usados. Estos otros tipos son el
INOUT que sirve tanto de entrada como de salida por lo que pueden ser usados en el programa
como de lectura y escritura. Hay que tener un poco de cuidado con este tipo, ya que su significado
hardware nunca hay que olvidarlo de manera que pueden producirse contenciones en la misma
línea, cuestión que a nivel de programa importa poco, pero que a nivel de hardware puede
destruir un chip. Otro tipo que existe es el BUFFER que es equivalente al INOUT visto con
anterioridad, con la diferencia de que solo una fuente puede escribir sobre él. El ultimo tipo, muy
poco usado, es el LINKAGE que es como el INOUT también pero que solo puede ser usado con
elementos de tipo LINKAGE. Si no se especifica el tipo de puerto se supone el tipo IN por defecto.
Por último, la parte de declaraciones es opcional, como todo lo que va dentro de la entidad, y
sirve para realizar algunas declaraciones de constantes, etc. A continuación le sigue un bloque
BEGIN, también opcional, donde se pueden incluir sentencias. Esta parte no se suele usar casi
nunca. El tipo de sentencias que se pueden usar en esta parte son muy restringidas y se limitan a
sentencias de indicación de errores o comprobación de alguna cosa. Ejemplos de declaración de
entidad:

ENTITY rom IS
GENERIC(tamano, ancho: positive);
PORT(enable : IN bit;
address : IN bit_vector(tamano-1 DOWNTO 0);
data: OUT bit_vector(ancho-1 DOWNTO 0));
END rom;

ENTITY procesador IS
GENERIC(max_freq: frequency := 30 MHz);
PORT(clk: IN bit;
address: OUT integer;
data: INOUT word_32;
control: OUT proc_control;
ready: IN bit);
END procesador;

1.3.5 Declaración de arquitectura

En la arquitectura es donde se define el funcionamiento del módulo definido en la entidad. Una


arquitectura siempre está referida a una entidad concreta por lo que no tiene sentido hacer
declaraciones de arquitectura sin especificar la entidad. Una misma entidad puede tener
diferentes arquitecturas, es en el momento de la simulación o la síntesis cuando se especifica que
arquitectura concreta se quiere simular o sintetizar.

La declaración de la arquitectura se realiza mediante la palabra clave ARCHITECTURE y su


sintaxis completa es:

Id_instr:
ARCHITECTURE nombre OF la_entidad IS
declaraciones
BEGIN
Instrucciones
END nombre;

La estructura de esta declaración es parecida a la que ya se había visto en los ejemplos.

Antes de definir la funcionalidad en el bloque BEGIN...END, hay una parte declarativa donde se
definen los subprogramas (funciones, procedimientos, etc.), declaraciones de tipo, declaraciones
de constantes, declaraciones de señales, declaraciones de alias, declaraciones de componentes,
etc. Es importante destacar que las señales solo pueden ser declaradas dentro de la parte
declarativa de una arquitectura.
La Empresa no está afiliada a ningún partido político, alienta la participación cívica en asociaciones
y organismos ciudadelanos así como el ejercicio responsable de los derechos políticos. La
participación de cualquiera de los empleados en cuestiones políticas, es de forma personal y no
tendrá el apoyo económico, tiempo o recursos de la empresa.

La Empresa da la bienvenida a sus empleados en un curso formal de Inducción donde da a conocer


el entorno laboral en que desarrollará sus funciones y actividades.

También podría gustarte