Está en la página 1de 13

SEP SNEST DGEST

INSTITUTO TECNOLÓGICO DE TOLUCA

Materia: Diseño Digital

Tema: VHDL – UNIDAD VI

Presenta:

 Francisco Arturo Martínez Sánchez

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.

En el lenguaje VHDL el código se compone de dos partes fundamentales: La Entidad


(Entity) y La Arquitectura. En la entidad se declaran los puertos de entrada y salida
que conectan al dispositivo con el mundo exterior.

ELEMENTOS DEL LENGUAJE VHDL

Comentarios

Los comentarios van precedidos de dos guiones. En una línea se ignorará todo
aquello que vaya después de dos guiones seguidos.

Ejemplo: - -Esto es un comentario

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 "_".

Las mayúsculas y minúsculas son consideradas iguales, por lo tanto los


identificadores TMP y tmp representan el mismo elemento. No es posible crear un
identificador que coincida con alguna palabra reservada del lenguaje.

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

Para escribir un número se puede hacer en binario, octal, decimal y hexadecimal.

Para vectores de bits:

"01111" binario

O"17" octal

X"F" hexadecimal
Constantes, señales y variables

En VHDL existen tres tipos de elementos: señales, constantes y variables. Estas


dos últimas tienen un significado similar a cualquier otro lenguaje de programación.

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

Es un elemento que se inicializa con un valor determinado, el cual no puede ser


modificado, es decir siempre conserva el mismo valor. Esto se realiza con la palabra
reservada CONSTANT.

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

Los operadores que proporciona el lenguaje son:

 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.

Operadores: AND, OR, NAND, NOR, XOR, XNOR y NOT.

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.

 * (multiplicación): Multiplica dos números de cualquier tipo.

 / (división): Divide dos números de cualquier tipo.

 ** (exponencial): Eleva un número a una potencia. El número de la izquierda


puede ser entero y real, pero el de la derecha sólo puede ser entero. Ejemplo:
4**2 sería 4².

 ABS() (valor absoluto): Devuelve el valor absoluto de su argumento.


 MOD (módulo): Calcula el módulo de dos números.

 REM (resto): Calcula el resto de la división.

2. Relacionales: Siempre devuelven un valor booleano (true o false).

 ==, /= (igualdad): El primero devuelve verdadero si los operando son iguales


y falso en caso contrario. El segundo indica desigualdad, funcionando al
revés que el anterior.

 >, >=, <, <= (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.

 ROL (ROtate Left) y ROR (ROtate Right), rotación a la izquierda y a la


derecha respectivamente. En este caso los huecos son ocupados por los bits
que van quedando fuera.

Otros:

 & (concatenación): Concatena vectores de manera que la dimensión de la


matriz resultante es la suma de las dimensiones de las matrices con las que
se opera.

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

Como en cualquier lenguaje de programación existen varios tipos de datos, en


VHDL se pueden diferenciar dos: escalares y compuestos.
Tipos escalares

Son tipos simples que contienen algún tipo de magnitud.

 Enteros: Son datos con un valor numérico entero. La forma de definirlos es


con la palabra RANGE. Realmente se dice que un número está en un límite
establecido.

 Físicos: Se trata de datos que corresponden con magnitudes físicas, que


tienen un valor y unas unidades.

 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.

 Matrices: Se trata de un conjunto de elementos del mismo tipo, accesibles


mediante un índice. Los hay de dos tipos: monodimensionales o
multidimensionales.

 Registros: Es equivalente al tipo record de otros lenguajes.

DECLARACIÓN BÁSICA DE OBJETOS

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.

Ejemplo 2-1. Ejemplo de declaración de constantes

constant DEMORA : time:=10 ns;

constant PATRON : std_logic_vector(3 downto 0):="1101";

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;

VARIABLE aux : bit_vector : ( 31 DOWNTO 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.

entity Nombre_Entidad is end

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.

El formato para la declaración de puertos es:


Port( Nombre_puerto1 : [Modo del puerto] [Tipo de dato del puerto];

Nombre_puerto2 : [Modo del puerto] [Tipo de dato del puerto];

Nombre_puerto3 : [Modo del puerto] [Tipo de dato del puerto]);

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

La arquitectura es lo que define cómo se comporta un circuito. En el primer capítulo


también se mostraron varias arquitecturas en las que se describía un multiplexor.

ARCHITECTURE mux_comportamiento OF mux IS

ARCHITECTURE mux_rtl OF mux IS

ARCHITECTURE mux_estructural OF mux IS


Arquitectura Estructural

Una descripción estructural es basada


en su comportamiento en modelos
lógicos establecidos(compuertas,
sumadores, contadores,etc.). En la
siguiente figura podemos observar un
esquema del circuito comparador que
hemos tomado como ejemplo, el cual
esta conformado por compuertas NOR-
exclusivas y una compuerta AND.

Para programar una entidad de


manera estructural tenemos que dividir
todo el diseño en submódulos
(Jerarquizar), los cuales nos permitirán de manera mas practica el circuito, esto
debido a que conocemos la función de entrada/salida. En el caso del comparador, la
salida de las dos compuertas XNOR es conocida (X0 y X1) estas son unidas a la
compuerta AND lo que nos da por resultado la salida C.

Arquitectura Funcional

Cuando utilizamos estilo funcional cuando exponemos la manera en que trabaja el


sistema, es decir las descripciones consideran la relación que hay entre las entradas
y las salidas del circuito, sin importar cómo este organizado en su interior, en este
caso estudiaremos un comparador.

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.

CIRCUITOS COMBINACIONALES EN VHDL

Descripción de circuitos combinacionales

Los circuitos combinacionales son aquellos que no almacenan información. No


utilizan biestables y, por tanto, no requieren señal de sincronismo (reloj) ni señal de
inicio (reset). En estos circuitos se tiene un valor en la salida que depende
exclusivamente del valor actual que hay en las señales de entrada. En los
siguientes apartados se verán algunos de los circuitos combinacionales más
utilizados.

Conexión de varias salidas a una línea bus

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:

 salidas a drenador abierto.

 salidas con control de alta impedancia (tres estados:'0', '1' y 'Z')

Salidas a drenador abierto

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.

El nivel lógico de la línea bus dependerá de la resistencia externa de pull-up (valores


típicos son 4K7 o 10k) y de otras salidas conectadas a dicha línea. Si todas las
salidas conectadas a la línea bus están en alta impedancia, entonces la línea
tomaría el valor lógico alto gracias a la resistencia de pull-up. Basta que una (o
varias) salidas estén activas para que el transistor o transistores correspondientes
fijen la línea bus a nivel lógico bajo.
La función lógica que se obtiene en la línea bus es la AND lógica de las señales de
entrada.
Salidas con control de alta impedancia

El siguiente diseño es de un circuito que gestiona dos señales de salida que se


conectan a una misma línea bus mediante dispositivos que permiten 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

Como ejemplo, se realizará la descripción VHDL de un multiplexor de 4 a 1, cuyas


entradas y salidas son elementos de 4 bits. A continuación se muestra el código
VHDL del circuito y el esquema del circuito. La sentencia más apropiada es la
asignación condicional.
DISPOSITIVOS LÓGICOS PROGRAMABLES

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

Una matriz de puertas programables


o FPGA (del inglés field-
programmable gate array), es un
dispositivo programable que
contiene bloques de lógica cuya
interconexión y funcionalidad puede
ser configurada en el momento,
mediante un lenguaje de descripción
especializado. La lógica programable
puede reproducir desde funciones
tan sencillas como las llevadas a
cabo por una puerta lógica o un
sistema combinacional hasta
complejos sistemas en un chip.

Una FPGA es como bien se describe


un dispositivo que contiene millones
de
«puertas y registros», y una memoria de configuración que define cómo estos
elementos se comportan e interconectan. De esta manera podemos crear cualquier
circuito complejo (o sencillo) utilizando estos recursos. Además al ser esta
interconexión dependiente de una memoria, podemos cargar diferentes
configuraciones
Fuentes
https://sites.google.com/site/logicaprogramable/vhdl/lenguaje-vhdl

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

También podría gustarte