Lenguaje de Programacion VDHL
Lenguaje de Programacion VDHL
Lenguaje de Programacion VDHL
SEMESTRE: V
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:
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.
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
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.
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.
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
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.
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.
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.
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.
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:
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:
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
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.
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/