Lenguaje de Programacion VDHL

Descargar como docx, pdf o txt
Descargar como docx, pdf o txt
Está en la página 1de 36

UNIVERSIDAD NACIONAL

DEL CENTRO DEL PERU

LENGUAJE DE PROGRAMACION VHDL

FACULTAD: INGENIERÍA ELÉCTRICA Y ELECTRÓNICA

CÁTEDRA: SISTEMAS DIGITALES (055C)

DOCENTE: Ing. Jose Galarza linares

ALUMNO: Pomalaya Avila Alex Romario

SEMESTRE: V

HUANCAYO – PERU - 2019


LENGUAJE DE PROGRAMACION VDHL

Como sabemos el desarrollo de circuitos Integrados Digitales programables con una gran
cantidad de componentes lógicos y la necesidad de sistema digitales para aplicaciones más
complejas, las herramientas de diseño tradicionales se vuelven cada vez más ineficientes y poco
efectivas para lograr desarrollos adecuados, por lo tanto, las empresas fabricantes de circuitos
integrados desarrollan herramientas más útiles, originándose así los HDL o Lenguajes de
Descripción de hardware. Así cada empresa crea el suyo estableciendo una diversidad de
lenguajes muy grande. Para tratar de unificar estas herramientas, entre los años 1984 y 1987, el
IEEE y el Departamento de Defensa de los Estados Unidos (DoD) patrocinan el desarrollo de un
Lenguaje llamado VHDL. Su nombre viene de VHSIC HDL, o sea Lenguaje de Descripción de
hardware para circuitos integrados de muy alta velocidad.
Considerando que un lenguaje de descripción de hardware es una herramienta formal que
permite describir la estructura y comportamiento de un sistema para lograr una adecuada
especificación, documentación y simulación del mismo antes de su realización real; para su
implementación se establecieron ciertas características fundamentales, que aún hoy siguen
siendo válidas, y son:

 Cada elemento de diseño tiene una interfaz única y perfectamente definida, que permite
conectarla con otros elementos.
 Cada elemento tiene un comportamiento preciso y unívocamente definido,
 que permiten su posterior simulación.
 La especificación de comportamiento que permite definir la operatividad puede
realizarse a través de un algoritmo ó de una estructura de hardware real.
 Los diseños mantienen una estructura jerárquica, que permite descomponerlo
adecuadamente.
 Las características concurrentes, temporizadas y de sincronismo (por ejm. reloj) pueden
ser modeladas adecuadamente.
 Se puede simular cualquier operación lógica y de temporización.

Se establece así una herramienta que además tiene amplias características de modelado y
documentación.
De esta forma cualquier circuito digital se puede especificar y simular adecuadamente.

Luego del desarrollo de este lenguaje aparecieron las herramientas adecuadas de síntesis que
completan el panorama de diseño de un sistema digital. Así de esta forma se puede decir que si
utiliza VHDL se puede diseñar, simular y sintetizar cualquier sistema digital, desde el
combinacional más simple hasta la estructura secuencial más compleja. Las nuevas versiones de
HDL permiten también el desarrollo de circuitos analógicos.
2.1 DISEÑO Y ESTRUCTURA
Antes de abocarnos al desarrollo específico del lenguaje, debemos analizar el ambiente y etapas
del proceso de un diseño.

En cualquier diseño basado en VHDL podemos subdividir el flujo de diseño en dos partes bien
diferenciadas:

1. Etapa de Desarrollo: Tiene varios pasos, a saber:

a. Planteo General del Sistema: Consiste en hacer un Diagrama en Blocks funcional y jerárquico
del sistema a desarrollar. Definición de módulos e interfaces generales del sistema.

b. Codificación: Consiste en escribir el código VHDL para todos los componentes planteados,
módulos específicos e interfaces. Se trata de un simple discurso de texto, por lo que puede
realizarse en cualquier editor conocido por el diseñador. Sin embargo, los ambientes de diseño
incluyen un Editor VHDL especializado, por lo que el desarrollo de esta etapa es más sencilla.
Estos editores incluyen características propias del lenguaje, como sangría automática, resaltado
de palabras clave, verificación sintáctica, etc.

c. Compilación: En esta etapa el compilador VHDL transforma el programa fuente en objeto, por
lo cual analiza la sintaxis de lo escrito y verifica la compatibilidad con cualquier otro módulo
ingresados como fuente del presente programa. Junto a esto produce toda la información
necesaria para la posterior simulación del proyecto. Nota: A veces, en proyectos complejos
conviene realizar compilaciones parciales, ganando así tiempo posterior de desarrollo.

d. Verificación: Esta etapa es muy importante, pues permite establecer si el circuito obtenido
funciona como se pretendió al fijar las pautas de diseño. Existen dos características a verificar, y
ellas son las Funcional y la Temporal. En el primer caso se analiza el funcionamiento lógico del
circuito, sin considerar el tiempo como variable. Aquí los elementos lógicos son considerados
como ideales, es decir sin retardos. En la verificación temporal se analizan los resultados del
circuito real, considerando retardos estimados, ya que aún no se han seleccionado los circuitos
reales de síntesis. De esta manera se verifica la funcionalidad temporal de circuitos
combinacionales y especialmente los secuenciales con características de memorización. La
verificación funcional y temporal se realiza a través de un proceso complejo conocido como
simulación, el cual permite detectar errores en el diseño obtenido, y de esta forma hacer las
correcciones adecuadas antes de pasar a la etapa de síntesis.

Simulación: Este procedimiento de verificación permite definir entradas y aplicarlas al prototipo


de software, analizar el comportamiento de los diversos módulos definidos y observar las salidas.
Todo esto sin tener que realizar el prototipo físico con circuitos reales. Para proyectos pequeños
se pueden generar entradas y verificar salidas en forma manual; pero en grandes sistemas se
crean “bancos de prueba” con la capacidad de establecer entradas, verificar salidas y realizar las
comparativas con los valores esperados. La simulación funcional es completa y precisa, sin
embargo, la temporal sólo es aproximada pues se basa en valores estimados, y sirve para
establecer que vamos en el camino correcto. Esto es así pues es muy dependiente de la síntesis,
dónde se establecen los circuitos específicos y es allí dónde salen los verdaderos valores de
retardos de acuerdo al circuito, a la tecnología, al layout, tipo de componentes discretos, etc.
2.2 Etapa de Realización:
Las características y herramientas son algo diferentes de la anterior. Tiene varios pasos, a saber:
a. Síntesis: Convierte el modelo descripto por VHDL en un conjunto de primitivas o componentes
que se articularán en un circuito real en una tecnología adecuada. Generalmente estas
herramientas presentan la posibilidad de establecer filtros, premisas o restricciones específicas del
tipo de circuito o tecnología. Por ejemplo, en los circuitos lógicos programables, como PAL, GAL,
CPLD, FPGA las herramientas de síntesis pueden generar ecuaciones booleanas; y en el caso de
ASIC ó ASSP generar una lista de compuertas y la malla que fija el cableado correspondiente de
interconexión.
b. Ajuste y Enrutamiento: Son herramientas que mapean las ecuaciones o componentes de
acuerdo a los recursos disponibles de cada dispositivo. Como en el paso anterior, el diseñador
puede especificar restricciones o asignaciones específicas para lograr el módulo correcto.
c. Verificación temporal y total del circuito: Este es la etapa crucial ya que establece la
funcionalidad temporal correcta basada en todos los parámetros reales introducidos en el diseño,
como circuitos integrados reales, longitud de los buses incorporados, longitud de los alambres,
cargas de los elementos físicos, etc. Generalmente se aplican las mismas señales o bancos de
prueba utilizadas en la etapa de desarrollo.
Como vemos en el diagrama de flujo de diseño planteado, aparecerán muchos avances y
retrocesos, hasta lograr el diseño adecuado. Lo importante es no dejarse llevar solo por el uso de
herramientas automáticas, sino poner en cada paso la experiencia adquirida en los diseños
anteriores.
El lenguaje de descripción en hardware VHDL se estructura en módulos o unidades funcionales,
identificados mediante una palabra reservada y particular de este lenguaje (véase figura 1.2). En
tanto, a su vez, cada módulo tiene una secuencia de instrucciones o sentencias, las cuales, en
conjunto con las declaraciones de las unidades involucradas en el programa, permiten la
descripción, la comprensión, la evaluación y la solución de un sistema digital. Al interior de la
estructura de un programa, las unidades Entidad (Entity) y Arquitectura (Architecture) que en
conjunto forman la columna vertebral de este lenguaje. Por su parte, los módulos restantes, no
necesariamente utilizados en la búsqueda de una solución, sirven entre otras cosas para optimizar
y generalizar la aplicación en futuros desarrollos, como se verá cuando la ocasión se presente. Sin
embargo, en este momento nuestra atención se centra en describir la función de la entidad y la
arquitectura.

Entidad (entity)

Una entidad básicamente representa la caracterización del dispositivo físico; es decir, exhibe las
entradas y las salidas del circuito (llamados pins) que el diseñador ha considerado pertinentes para
integrar su idea o aplicación; en la figura 1.3, se puede observar con detalle la secuencia de
desarrollo. Con base en esta idea, una entity —por la palabra reservada del programa— constituye
un bloque de diseño que puede ser analizado y programado como un elemento individual, ya sea
como una compuerta, un sumador o un decodificador, entre otros, incluso ser considerado como
un sistema a través de su relación entre entradas y salidas, las cuales representan los puntos de
observación o de conexión a elementos periféricos propios de la aplicación.
Puertos de entrada–salida

Cada una de las señales de entrada y salida en una entidad es referida como un puerto, el cual es
equivalente a una terminal (pin) de un símbolo esquemático. Todos los puertos que son
declarados deben tener un nombre, un modo y un tipo de dato. El nombre es utilizado como una
forma de llamar al puerto; el modo permite definir la dirección que tomará la información,
mientras que el tipo precisa qué clase de información se transmitirá a través del puerto. aquellos
que son de entrada están indicados por las variables a y b; mientras que el puerto de salida se
representa por la variable c. Por otra parte, el tipo de dato será tratado más adelante.

Modos
Como se mencionó antes, un modo permite definir la dirección hacia donde el dato es transferido.
Un modo puede tener uno de cuatro valores: in (entrada), out (salida), inout (entrada/salida) y
buffer (ver la figura).

 Modo in. Se refiere a las señales de entrada a la entidad. El modo in es solo unidireccional
y únicamente permite el flujo de datos hacia dentro de la entidad.
 Modo out. Indica las señales de salida de la entidad.
 Modo inout. Permite declarar a un puerto de forma bidireccional, es decir como de
entrada/salida, además hace posible la retroalimentación de señales dentro o fuera de la
entidad. rModo buffer. Permite realizar retroalimentaciones dentro de la entidad; pero, a
diferencia del modo inout, el puerto declarado se comporta como una terminal exclusiva
de salida.

Tipos de datos
Los tipos son los valores (datos) que el diseñador establece para los puertos de entrada y salida
dentro de una entidad, y que son asignados de acuerdo con las características de un diseño en
particular. Algunos de los tipos más utilizados son el bit, el cual tiene valores de 0 y 1 lógico; el tipo
boolean (booleano) define valores de verdadero o falso en una expresión; el bit_vector (vectores
de bits), el cual representa un conjunto de bits para cada variable de entrada y/o salida, y el tipo
integer (entero), que representa a un número entero. Los anteriores son solo algunos de los tipos
que maneja VHDL, aunque no son los únicos.1 Los tipos de datos y su uso se introducirán
conforme se vayan requiriendo y empleando a lo largo del texto.
Declaración de entidades
La declaración de una entidad consiste en describir las entradas y las salidas de un circuito
identificado como Entity (entidad); en otras palabras, la declaración señala las terminales o los
pines de entrada y de salida con los que cuenta el circuito. Por ejemplo, considérese la tabla de
verdad que se muestra en la figura; como se puede observar, esta tiene tres entradas, A, B y C, y
dos salidas, F0 y F1. En este caso, a la entidad se le ha identificado con el nombre de TABLA, tal y
como se muestra.

La descripción de este programa se muestra en el listado anterior, donde los números de las líneas
(1, 2, 3, 4, 5) no son parte del código y serán utilizadas como referencia para explicar alguna
sección en particular. En tanto, las palabras en negritas están reservadas para el lenguaje de
programación, es decir, tienen un significado especial para el programa.

Ahora comencemos con el análisis del código línea por línea. Así, la línea 1 inicia con dos guiones (-
-), los cuales indican que el texto que está a la derecha es un comentario; estos se usan
únicamente con el fin de documentar el programa, ya que todos los comentarios son ignorados
por el compilador. En la línea 2 se empieza la declaración de la entidad utilizando la palabra
reservada entity, seguida del identificador o nombre de la entidad “Tabla” (para este ejemplo) y la
palabra reservada is.
Los puertos de entrada y salida (port) son declarados en las líneas 3 y 4, respectivamente; en este
caso, los pines de entrada son A, B y C, mientras que los puertos de salida están representados por
F0 y F1. Si se observa con atención la tabla de verdad de la figura 1.7, es posible apreciar que en su
descripción solo se utilizan valores lógicos (‘0’ y ‘1’); por tanto, es de suponer que el tipo de dato
empleado en la declaración es bit. Por último, en la línea 5 termina la declaración de entidad con
la palabra reservada end, seguida del nombre de la entidad Tabla.
Aspectos importantes a considerar
Como en cualquier lenguaje de programación, es importante hacer notar que VHDL también sigue
una sintaxis y una semántica en el código de programación, las cuales es necesario respetar lo
siguiente.
 Punto y coma (;): se utiliza para cerrar y finalizar declaraciones.
 Dos puntos (:): en este caso se usan como separador entre el nombre de los puertos y los
modos de entrada.
 El paréntesis: después del modo de salida out bit cierra la declaración de los puertos
(port).
 El uso de las mayúsculas o las minúsculas en la declaración es irrelevante para el
compilador.

EJEMPLO N°01:
Declarar la entidad del circuito lógico que se muestra en la figura

SOLUCIÓN
Como se puede advertir en la figura, las entradas y salidas del circuito se encuentran claramente
identificadas.
 Modo in: clk, Reset
 Modo out: Q3, Q2, Q1 y Q0
 Entidad: Contador

Entonces, la declaración de la entidad sería de la siguiente forma:


EJEMPLO N° 02:
Declarar la entidad del circuito lógico mostrado en la figura:

SOLUCIÓN
Como se puede observar, las entradas y salidas están claramente identificadas.

 Modo in: a, b, c, d, e, f, g, h
 Modo out: F1
 Entidad: Circuito

Aquí, el diseñador deberá identificar los pines de entrada y de salida para establecer la entidad.
Recuérdese que la escritura del código mediante letras mayúsculas o minúsculas es irrelevante en
la edición del programa.

EJEMPLO N° 03:
Declarar la entidad del circuito lógico mostrado en la figura.
SOLUCIÓN
En este caso se puede notar que existen varios módulos individuales, los cuales en conjunto
forman una entidad general. Además, las salidas C3, C2, C1, C0 deben considerase como inout, es
decir señales de entrada-salida, dado que en la estructura interna se observa que la salida de cada
una de estas retroalimenta, a la entrada, al siguiente módulo:
 Modo in: A3, A2, A1, A0, B3, B2, B1, B0
 Modo out: S3, S2, S1, S0
 Modo inout: C3, C2, C1, C0
 Entidad: Proyecto
Identificadores
Los identificadores son simplemente los nombres o las etiquetas que se usan para hacer referencia
a variables, constantes, señales, procesos, etc. Estos identificadores pueden ser números, letras
del alfabeto y/o guiones bajos que separan caracteres. Es importante resaltar que no existe una
restricción en cuanto a su longitud. Todos los identificadores deben seguir ciertas especificaciones
o reglas para que puedan ser compilados sin errores.

Regla Incorrecto Correcto


El primer carácter siempre debe ser una letra mayúscula o una minúscula. 4suma Suma4

El segundo carácter no puede ser un guión bajo. S_4bits S4_bits

No se permite el uso de dos guiones juntos. Resta 4 Resta_4_

Un identificador no puede utilizar símbolos. Clear#8 Clear_8

Declaración de entidades utilizando vectores


La entidad Proyecto se muestra en la figura 1.13 a), y por comodidad nuevamente se representa en
la figura mediante sus bits individuales: A3, A2…, etcétera. La entidad puede esquematizarse
mediante la señalización, que se muestra con claridad en la figura 1.3 b), donde se indican,
mediante un bus (grupo de cables de conexión), los cuatro bits de entrada y/o salida de cada una de
las variables involucradas.

El acomodo de los bits —vector— que componen el bus puede ser ordenado de forma ascendente
o descendente, por ejemplo, para las entradas A y B se escribiría de la siguiente manera:
Arreglo descendente: A(A3,A2,A1,A0)
B(B3,B2,B1,B0)
Arreglo ascendente: A(A0,A1,A2,A3)
B(B0,B1,B2,B3)

En VHDL, el conjunto bits ordenados pueden considerarse como vectores de bits, los cuales deben
tomarse en cuenta en grupo y no como bits individuales. Asimismo, en VHDL la manera de
describir una configuración que use vectores radica en la utilización de la sentencia bit_vector; así,
la forma en la que se ordenan se indica como ascendente “to” o como descendente “downto”. Por
su parte, el rango o el número de bits que utiliza el vector se representa en la notación siguiente:

Así, por ejemplo, la sentencia 3 downto 0 involucra un vector de 4 bits (3:0). Para su
ejemplificación, consideremos la entidad proyecto y el código de programación mostrado en la
figura.

La descripción de este ejemplo es la siguiente.


 En la línea 3, las entradas A y B se declaran como vectores de entrada de 4 bits ordenados
de forma descendente (3:0).
 En la line 4, la variable C se declara como un verctor de entrada salida de 4 bits ordenado
de forma descendente (3:0).
 En la línea 5, la variable de salida S es un vector de 4 bits ordenado de forma descendente;
en esta línea considérese el doble paréntesis al final de la instrucción. El primero es parte
del rango del vector y el Segundo marca el cierre de la declaración de los puertos (port).

EJEMPLO N° 04:
Describir en VHDL la entidad del circuito que se muestra en la figura, considerar el uso de vectores
para la solución.

SOLUCIÓN
En este caso, nótese que existen cuatro señales de entrada: Q3, Q2, Q1, Q0, las cuales pueden
agruparse como un vector al que llamaremos (Q); en tanto, podemos integrar las señales de salida
de F0 hasta F7 en un vector denominado (F). Para la solución, el vector Q se ordenará de forma
descendente y el vector F de manera ascendente, es decir:
 Modo in: Q (3 downto 0). El vector considera 4 bits de entrada.
 Modo out: F(0 to 7). El vector considera 8 bits de salida.
 Entidad: Control

Declaración de entidades utilizando librerías y paquetes


Un aspecto importante en la programación con VHDL radica en el uso de librerías y paquetes que
permiten declarar y almacenar estructuras lógicas, seccionadas o completas, y que facilitan el
diseño. Una librería (biblioteca) es un lugar al cual se accede para emplear las unidades de diseño
predeterminadas por el fabricante de la herramienta (paquete), y que se aplican para agilizar el
diseño, además de que también permiten almacenar el resultado obtenido de la compilación de
un diseño, con el fin de que este pueda ser utilizado dentro de uno o varios programas.
En VHDL se encuentran definidas diversas librerías; su cantidad depende de las herramientas que
el fabricante del software ha instalado. Por lo general, siempre hay dos librerías: ieee y work
“Cypress Semiconductor Ver 5.2” (véase figura). Al interior de la librería ieee se ubica el paquete
std_logic_1164, mientras que en la librería work se localizan los paquetes numeric_std, std_arith y
gates.

Un paquete es una unidad de diseño que permite desarrollar un programa en VHDL de manera
ágil, debido a que en este se encuentran algoritmos preestablecidos (sumadores, restadores,
contadores, etc.) que ya tienen optimizado un determinado comportamiento. Por esta razón, el
diseñador no necesita caracterizar paso a paso una nueva unidad de diseño si ésta ya se ubica
almacenada en algún paquete; en este caso, solo basta llamarlo y especificarlo dentro del
programa.
Por tanto, un paquete no es más que una unidad de diseño formada por declaraciones,
programas, componentes y subprogramas que incluyen los diversos tipos de datos (bit, booleano,
std_logic) empleados en la programación en VHDL, y que por lo general forman parte de las
herramientas en software. Cuando en el diseño se utiliza algún paquete, es necesario llamar a la
librería que lo contiene, lo cual se lleva a cabo a través de la siguiente declaración:

Esta declaración permite el empleo de todos los componentes incluidos en la librería ieee. En el
caso de la librería de trabajo (work), su uso no requiere de la declaración library, dado que la
carpeta work siempre está presente al desarrollar un diseño.

Paquetes
El paquete std_logic_1164 (estándar lógico_1164), que se encuentra dentro de la librería ieee,
contiene todos los tipos de datos comúnmente utilizados en VHDL, como: std_logic_vector,
std_logic, std_signed y std_unsigned, entre otros. La forma en que se accede a la información
contenida dentro de un paquete es mediante la sentencia use seguida del nombre de la librería y
del paquete, respectivamente; esto es:

Por ejemplo:

En este caso, ieee es la librería, std_logic_1164 es el paquete y all es la palabra reservada, la cual
indica que todos los componentes almacenados dentro del paquete pueden ser utilizados. A
continuación se listan algunos de los paquetes más importantes al interior de las librerías de VDHL,
así como sus características principales.
 El paquete numeric_std define funciones para la realización de operaciones entre
diferentes tipos de datos; en este, los tipos pueden representarse con y sin signo.
 El paquete numeric_bit determina tipos de datos binarios con y sin signo.
 El paquete std_arith define funciones y operadores aritméticos como: más (+), menos (-),
división (/), multiplicación (*), igual (=), mayor que (>), menor que (<), entre otros.

A reserva de ir introduciendo los diversos paquetes contenidos en VHDL, conforme la


programación lo requiera. En lo sucesivo, se efectuará un uso extensivo de las librerías y de los
paquetes dentro de los programas desarrollados en el texto.

EJEMPLO N° 05:
Realizar la declaración de la entidad Bloque mostrada en la figura mediante el uso de librerías y
paquetes.

SOLUCIÓN
En esta entidad se utiliza la biblioteca ieee y el paquete std_logic_1164. Las entradas y salidas se
manejan de forma individual y en tipo vector. Es decir:
 Modo in: X vector de 2 bits.
 Modo in: A, B entradas individuales de un bit.
 Modo out: Z salida vector de 4 bits.
 Entidad: Bloque

EJEMPLO N° 05:
En la figura se representa una entidad con capacidad para realizar una suma de 2 bits, A y B, que
da como resultado la operación SUMA= A+B. Realizar la declaración de la entidad correspondiente
mediante el uso de paquetes y librerías.

SOLUCIÓN
Como se puede observar, en la línea 3 la librería work utiliza el paquete std_arith, requerido para
que la operación SUMA= A+B se pueda efectuar; este paquete permite el uso del operador (+),
mismo que hace posible esta operación. En el caso de que la librería no esté dentro del programa
al momento de su ejecución, el compilador enviará un mensaje de error.
La librería de trabajo work es el lugar preestablecido por el software para almacenar los
programas que el usuario va realizando; por tanto, esta siempre se encuentra presente en la
compilación de un diseño. Así, mientras no sea especificada otra librería, los diseños
invariablemente se guardarán dentro de ella; por dicha razón no requiere el uso de la declaración
library. Operadores aritméticos. Como su nombre lo indica, estos permiten realizar operaciones
del tipo aritmético, tales como suma, resta, multiplicación, división, cambios de signo, valor
absoluto y concatenación. Dichos operadores generalmente son utilizados en el diseño lógico para
la descripción de sumadores y restadores o para las operaciones de incremento y decremento de
datos. Los operadores aritméticos predefinidos en VHDL se muestran a continuación.

Arquitectura (architecture)
Una arquitectura define el algoritmo o la estructura de solución de una entidad, en esta se
describen las instrucciones o los procedimientos “programa” que deben llevarse a cabo para
obtener la solución deseada por el diseñador. La gran ventaja que presenta VHDL con respecto a
los compiladores tradicionales de diseño PALASM, OPAL, PLP, ABEL y CUPL (véase apéndice A),
entre otros disponibles para la programación de Dispositivos Lógicos Programables, es la extensa
variedad de formatos con los que cuenta y que utiliza en la descripción de una entidad. Es decir,
en VHDL es posible describir en diferentes niveles de abstracción, que van desde el uso de
ecuaciones y estructuras lógicas, la descripción mediante la simbología de la transferencia de
registros RTL, hasta la simplicidad que puede representar una caja negra —sistema—, cuya
interpretación “función de transferencia”, la relación entre entradas y salidas, describe el
funcionamiento de la entidad. No obstante, en VHDL no existe de manera formal un
procedimiento de diseño. Como ya se mencionó, la versatilidad en la abstracción y la descripción
de una entidad permiten al usuario la tarea de planear la estrategia por utilizar para una solución
en particular. Sin duda, la experiencia en programación puede ser un factor importante de diseño,
sin embargo, VHDL posee una estructura de programación tan amigable que es muy fácil de
entender, aun por personas que no han tenido relación alguna con lenguajes de programación. De
manera general y con base en cómo se presenta la entidad (entity), a primera vista, en VHDL se
pueden distinguir los siguientes estilos de programación.
 Estilo por flujo de datos.
 Estio funcional.
 Estilo Estructural.

Descripción por flujo de datos


La descripción por flujo de datos muestra con detalle la transferencia de información entre las
entradas y las salidas de una entidad. Este estilo, totalmente comprensible para el usuario, se
recomienda para quienes recién se inician en la programación en VHDL, en materias como diseño
lógico, donde las tablas de verdad y las ecuaciones lógicas son parte fundamental en la descripción
de un circuito lógico. Para una mejor comprensión de la descripción por flujo, considérese la tabla
de verdad de la figura 1.21; como se puede observar la tabla tiene dos entradas, A y B, y dos
salidas, F0 y F1. Para fines explicativos, también se ha agregado el minitérmino correspondiente
(m) a cada combinación de entrada. Por ejemplo, el minitérmino m0 hace referencia a la
combinación cero de entrada A=0 y B=0.

A continuación, se realiza la descripción del código línea por línea. En las líneas 2 y 3 se escriben la
librería y el paquete respectivamente. En tanto, de las líneas 4 a la 7 se escribe la entidad. Como se
puede ver, las entradas y las salidas se utilizaron de manera individual; nótese que en estas se
mezcló el uso de letras mayúsculas y minúsculas, lo cual resulta “irrelevante para el compilador”.
En la línea 7 se escribe la arquitectura identificada como flujo; la sentencia se lee:

Para ejemplificar considérese otra vez la tabla de verdad de la entidad anterior, que se presenta
nuevamente en la figura anterior.

Las ecuaciones lógicas para las salidas F0 y F1 son:

Su declaración utilizando los operadores lógicos incluidos en el lenguaje son:

En consecuencia, el programa queda como se muestra a continuación:


Como se puede ver, el diseño que resulta de la utilización de los operadores lógicos del álgebra
booleana o de la declaración mediante la estructura when-else se utiliza con mucha frecuencia en
entidades o proyectos donde el diseñador puede acceder con facilidad al formato de tabla de verdad.

EJEMPLO N° 06:
Describir, mediante la declaración when-else y con base en la tabla de verdad, el funcionamiento
de la siguiente compuerta AND.

SOLUCIÓN
Si consideramos la salida igual a 1 para f1, el programa quedaría como sigue:

EJEMPLO N° 07:
Describir mediante ecuaciones booleanas el circuito mostrado a continuación:
SOLUCIÓN
Primero, obtenemos las ecuaciones de salida de la compuerta or y and, y después utilizamos el
operador xnor.

Operadores lógicos
Los operadores lógicos que se utilizan en la descripción con ecuaciones booleanas y que están
definidos dentro de los diferentes tipos de datos —bit, boolean o std_logic— son los operadores:
and, or, nand, xor, xnor y not. Las operaciones que se efectúen entre estos (excepto not) deben
realizarse con datos que tengan la misma longitud o palabra de bits.
Los operadores lógicos presentan el siguiente orden y prioridad al momento de ser compilados:
1. Expresiones entre paréntesis.
2. Complementos.
3. Función and.
4. Función or.
Las operaciones xor y xnor son transparentes al compilador, el cual las interpreta mediante la
suma de productos correspondiente a su función.

Aspectos importantes por considerar


Como ejemplo de uso de operadores lógicos en VHDL, veamos la tabla

Descripción funcional
En una descripción funcional lo más importante es el conocimiento global del sistema, razón por la
cual las entidades diseñadas bajo este estilo son programadas como una caja negra; es decir, no
importa la organización o la estructura interna de la entidad, solo se requiere que el programador
conozca lo que espera obtener en la salida y la forma en que operan las pins de entrada. Por
ejemplo, considérese una entidad en la cual existe una salida C que adopta el valor C=1 cuando las
señales de entrada, A y B, son iguales; en caso contrario, la salida C toma el valor de cero C=0.
Entonces, la síntesis del problema sería la siguiente:

A continuación, se muestra el código que representa la descripción del circuito:

Nótese que la declaración de la entidad (entity) se encuentra descrita entre las líneas 4 y 7; en
tanto que de las líneas 8 a la 18 se desarrolla el algoritmo (architecture) que describe el
funcionamiento de la entidad. Para iniciar la declaración de la arquitectura (línea 8), es necesario
definir un nombre arbitrario con el que esta declaración de la arquitectura pueda ser referenciada.
En este caso, el nombre asignado es caja, además de incluir a la entidad con  la cual está
relacionada (funcional).
Por su parte, en la línea 9 se observa el inicio (begin) de la sección donde se comienzan a declarar
los procesos que rigen el comportamiento del sistema.
Una declaración funcional utiliza una nueva sentencia denominada process, la cual se aprecia en la
línea 10. La declaración del proceso (process) está acompañada de una lista sensitiva entre
paréntesis (A,B), que hace referencia a las señales que determinan el funcionamiento del proceso
—el cual debe entenderse como el hecho de que el algoritmo es sensible al cambio de valor de
estas variables—. En la línea 11 inicia le ejecución del proceso mediante la palabra reservada
begin.
Siguiendo con el análisis, se puede advertir que de la línea 12 a la 16 el proceso se ejecuta
mediante la declaración del tipo if-then-else (si-entonces-sino). Esto se interpreta como sigue
(línea 12): si el valor de la señal A es igual al valor de la señal B, entonces el valor de ‘1’ se asigna a
la variable C, sino se asigna a C el valor de cero ‘0’. En la línea 16 se cierra el if de la línea 12.
Entonces, el proceso se termina con la palabra reservada end process y la arquitectura se cierra de
la forma acostumbrada end caja.
Como se puede observar, la descripción funcional se basa de manera principal en el uso de
procesos y de declaraciones secuenciales, las cuales permiten de forma rápida el modelado de la
función.
Con la finalidad de reforzar este tipo de programación, considérese la figura, en la cual se ha
detallado la compuerta OR, cuya función de transferencia es bien conocida, además de que puede
distinguirse en la tabla de verdad que se muestra en la figura 1.29. De esta manera, una
descripción funcional sería de la forma siguiente:

A partir del texto anterior se distingue cómo la compuerta or solo produce el valor cero f1 = 0
cuando a y b son iguales; en caso contrario, la salida es 1, f = 1 línea 14. Nótese que la línea 11
tiene una descripción muy similar al estilo flujo de datos.

Descripción estructural
Como su nombre lo indica, una descripción estructural basa su comportamiento en modelos
lógicos ya establecidos (compuertas, sumadores, contadores, proyectos especiales, etc.). Es
importante destacar que estas estructuras pueden ser diseñadas por el usuario y guardadas para
su posterior utilización o extraídas de los paquetes contenidos en las librerías de diseño del
software que se esté utilizando, como se verá más adelante. En la figura 1.31 se muestra una
representación esquemática de una entidad que cuenta con dos variables de entrada de 2 bits (a0,
a1 y b0, b1). En su construcción se han empleado dos compuertas nor exclusivas y una compuerta
and.

se conoce la función de salida de las dos compuertas xnor, por lo que al unirlas a la compuerta
and, la salida c es solo el resultado de la operación and efectuada internamente a través de las
señales “signal” x0 y x1. El siguiente listado muestra el código del programa de esta entidad,
donde desde la línea 3 hasta la 6 se detalla la entidad denominada estructura, la cual considera
dos variables de entrada de dos bits cada una, a (0:1) y b (0:1), como vector y la salida c
individualmente.
De modo que los componentes xnor y and no se declaran, debido a que se encuentran incluidos
en el paquete gatespkg, el cual a su vez está contenido dentro de la librería de trabajo (work), en
la línea 7. En la línea 8 se inicia con la declaración de la arquitectura nombrada estructural. En la
línea 9 se declara signal x, que involucra las señales (x0 y x1), que se declaran dentro de la
arquitectura y no en la entidad, debido a que no representan a una terminal (pin) y solo se usan
para conectar bloques de manera interna a la entidad. La conectividad de los bloques o
submódulos se describe de la línea 11 a la 13. Cada compuerta se maneja como un bloque lógico
independiente (componente) del diseño original, al cual se le asigna una variable temporal (U0, U1
y U2); en tanto, la salida de los bloques U0, U1 se maneja como una señal. De forma que la
compuerta and2 recibe las dos señales provenientes de x (x0 y x1), ejecuta la operación y asigna el
resultado a la salida c del circuito (línea 13).

EJEMPLO N° 08:
Realizar el programa correspondiente para programar la entidad que se muestra en la figura 1.33,
mediante el uso de una declaración estructural.

SOLUCIÓN
Como se observa, el circuito considera cuatro submódulos denominados:

 U0:and2 con entradas y salidas: B,C, signal x0


 U1:and2 con entradas y salidas: C, A, signal x0
 U2:and2 con entradas y salidas: A, B, signal x0
 U3: or 3 con entradas y salidas: x0, x1, x2, F
Es importante resaltar que en la línea 9 se ha declarado la señal x como un vector ascendente de
tres bits: (x(0), x(1) y x(2)).

ALGUNOS EJEMPLOS MAS:


El objetivo es crear un sumador que dadas dos entradas de datos devuelva la suma de estos.

 Entradas:
o a: operando 1.
o b: operando 2.
 Salidas:
o salida: suma de las entradas.
Multiplexor

El objetivo es crear un sistema que devuelva un valor dependiente de otra señal de entrada, la
cual será la encargada de seleccionar la salida. Además se definirán varias entradas de datos
que actuarán como salidas. Cuando la señal de selección este a cero no se producirá ninguna
salida, es decir el valor será cero.

 Entradas:
o a, b, c: entradas de datos.
o sel: señal que indica la señal que va a ser devuelta.
 Salidas:
o salida: salida de datos.
Sumador

El objetivo es crear un sumador que dadas dos entradas de datos devuelva la suma de estos.

 Entradas:
o a: operando 1.
o b: operando 2.
 Salidas:
o salida: suma de las entradas.

Contador

El objetivo es crear un contador con reset asíncrono, señal de habilitación y salida con un
número de bits configurable, con la siguiente definición de interfaz:

 Entradas:
o reset: Reset del sistema.
o clk: Reloj del sistema.
o enable: Activación-Desactivación del contador.

 Salidas:
o count: Salida del contador.

Biestable-Latch

El objetivo es crear un dispositivo capaz de reproducir en cada tic de reloj la entrada en la


salida. Para ello será necesario diponer del reloj y reset del sistema.

 Entradas:
o rst: Reset del sistema.
o clk: Reloj del sistema.
o a: Entrada de datos.
 Salidas:
o b: Salida de datos.
Máquinas de estados

El objetivo es crear un sistema que genere unas salidas determinadas, dependiendo de los
estados por donde va fluyendo la ruta de datos. Por consiguiente, hará falta el reset y reloj del
sistema como entradas del sistema. También se añade una señal para sacar el estado al
exterior.

 Entradas:
o rst: Reset del sistema.
o clk: Reloj del sistema.
 Salidas:
o a: Salida de datos.
o b: Salida de datos.
o estado: Salida del estado.
Máquinas de estados

El objetivo es crear un sistema que genere unas salidas determinadas, dependiendo de los estados
por donde va fluyendo la ruta de datos. Por consiguiente, hará falta el reset y reloj del sistema
como entradas del sistema. También se añade una señal para sacar el estado al exterior.

 Entradas:
o rst: Reset del sistema.
o clk: Reloj del sistema.
 Salidas:
o a: Salida de datos.
o b: Salida de datos.
o estado: Salida del estado.
PROGRAMAS PARA LA SIMULACION DE CIRCUITOS
DIGITALES
Cuando se están realizando trabajos con circuitos electrónicos, siempre se desea poder estar
seguro que todo el diseño del circuito funciona de una manera adecuada antes de llevar a cabo el
montaje físico, es por esta razón que por lo general se realizan simulaciones de los circuitos con
software especializado para tal fin como lo pueden ser los tan conocidos proteus o multisim.
 
Sin embargo, cuando se trata de hacer simulaciones de códigos escritos en lenguaje VHDL los dos
simuladores mencionados, aunque permiten simular elementos como CPLD, GAL o FPGA que son
programados en lenguaje VHDL, no brindan la sencillez suficiente para realizar dichas
simulaciones, dificultando el proceso a las personas más inexpertas en el campo de la electrónica y
el uso de software de simulación.
 
Pero proteus y multisim no son los únicos simuladores de circuitos electrónicos que existen, en el
mercado existe una gran cantidad de software especializado en la simulación, uno de estos
programas y el cual facilita el proceso de simulación de código VHDL es TINA 8.
 
TINA 8 es un simulador de circuitos electrónicos desarrollado por Texas Instruments, en este
simulador se puede crear una macro que va a hacer la función de circuito electrónico y a dicha
macro se le asocia el código VHDL que se quiere simular, luego de hacer esto ya se puede
comprobar el funcionamiento del código facilitando mucho el proceso de simulación de este tipo
de códigos y circuitos.

PROTEUS simulador digital y analógico


Se trata de un completo programa que permite diseñar y simular circuitos electrónicos de forma
práctica y accesible.
A todos aquellos que trabajen en el ámbito de la electrónica les interesará la aplicación Proteus. Se
trata de un completo programa que permite diseñar y simular circuitos electrónicos de forma
práctica y accesible. Proteus está formado por dos utilidades principales: ARES e ISIS, y por los
módulos Electra y VSM. Si necesitas crear componentes con Proteus e ISIS será una tarea fácil.
Prueba las herramientas ARES e ISIS de Proteus al descargar el programa.

Principales características
 La aplicación ISIS permite generar circuitos reales, y comprobar su funcionamiento en un
PCB (printed circuit board).
 Mediante el uso del lenguaje de programación VHDL es posible realizar eficientes circuitos
lógicos que ayuden a simular el circuito para corroborar su funcionamiento antes del armado
en físico.
 Entorno de simulación con la tecnología exclusiva de Proteus de modelación de sistemas
virtuales (VSM).
 Herramienta ARES para el enrutado, ubicación y edición de componentes, utilizado para la
fabricación de placas de circuito impreso.
 Interfaz intuitivo y atractivo estandarizado para todos los componentes de Proteus.
Proteus cuenta con una gran cantidad de funciones para trabajar con circuitos electrónicos. Por
ejemplo, permite generar pistas de cobre de forma automática. Además, permite la simulación de
PICs casi a tiempo real, de forma que podemos comprobar si el circuito creado funciona de la
forma que esperábamos.
No esperes más para probar ARES e ISIS de Proteus. Descarga la aplicación y comprueba sus
múltiples ventajas.

REFERENCIAS:
[1] https://ladecadence.net/trastero/VHDL%20Maxinez.pdf

[2] https://edg.uchicago.edu/~tang/VHDLref.pdf
[3]https://www.academia.edu/36393080/David_G._Maxinez_Programaci
%C3%B3n_de_sistemas_digitales_con_VHDL

[4] https://es.scribd.com/doc/135925672/8-Programacion-de-Sistemas-Digitales-Con-Vhdl
[5] http://www1.frm.utn.edu.ar/tecnicad1/_private/Apuntes/VHDL.pdf
[6] http://www.cartagena99.com/recursos/electronica/apuntes/Manual%20VHDL.pdf
[7]https://es.wikibooks.org/wiki/Programaci%C3%B3n_en_VHDL/Ejemplos/M
%C3%A1quinas_de_estados
[8] http://www.ni.com/example/13663/es/

También podría gustarte