ORGANIZACIÓN Y
ARQUITECTURA DE VHDL
Dispositivos lógicos programables (PLD)
Los dispositivos lógicos programables (o PLD, por sus siglas en inglés)
favorecen la integración de aplicaciones y desarrollos lógicos mediante el
empaquetamiento de soluciones en un circuito integrado.
El resultado es la reducción de espacio físico dentro de la aplicación; es
decir, se trata de dispositivos fabricados y revisados que se pueden
personalizar desde el exterior mediante diversas técnicas de
programación.
El diseño se basa en bibliotecas y mecanismos específicos de mapeado
de funciones, mientras que su implementación tan sólo requiere una fase
de programación del dispositivo que el diseñador suele realizar en unos
segundos.
En la actualidad, el diseño de ASIC (circuitos integrados desarrollados para
aplicaciones específicas) domina las tendencias en el desarrollo de
aplicaciones a nivel de microelectrónica. Este diseño presenta varias opciones
de desarrollo, como se observa en la tabla 1.1. A nivel de ASIC los desarrollos
full y semi custom ofrecen grandes ventajas en sistemas que emplean
circuitos diseñados para una aplicación en particular.
Sin embargo, su diseño ahora sólo es adecuado en aplicaciones que requieren
un alto volumen de producción; por ejemplo, sistemas de telefonía celular,
computadoras portátiles, cámaras de video, etcétera.
Los FPGA (arreglos de compuertas programables en campo) y CPLD
(dispositivos lógicos programables complejos) ofrecen las mismas ventajas
de un ASIC, sólo que a un menor costo; es decir, el costo por desarrollar un
ASIC es mucho más alto que el que precisaría un FPGA o un CPLD, con la
ventaja de que ambos son circuitos reprogramables, en los cuales es posible
modificar o borrar una función programada sin alterar el funcionamiento
del circuito.
Tabla 1.1 Tecnologías de fabricación de circuitos integrados.
En la actualidad existe una gran variedad de dispositivos lógicos programables, los cuales se
usan para reemplazar circuitos SSI (pequeña escala de integración), MSI (mediana escala de
integración) e incluso circuitos VLSI (muy alta escala de integración), ya que ahorran espacio
y reducen de manera significativa el número y el costo de los diseños. Estos dispositivos,
llamados PLD (tabla 1.2), se clasifican por su arquitectura —la forma funcional en que se
encuentran ordenados los elementos internos que proporcionan al dispositivo sus
características.
Estructura interna de un P L D
Los dispositivos PROM, PLA, PAL y GAL están formados por arreglos o
matrices que pueden ser fijos o programables, mientras que los CPLD y FPGA
se encuentran estructurados mediante bloques lógicos configurables y celdas
lógicas de alta densidad, respectivamente.
La arquitectura básica de un PLD está formada por un arreglo de compuertas
AND y OR conectadas a las entradas y salidas del dispositivo. La finalidad de
cada una de ellas se describe a continuación.
Figura 1.1 Arreglos AND:
a) no programado y
b) programado
Figura 1.2 Estructura
básica de PLD.
De acuerdo con lo anterior, observemos en la tabla 1.3 la estructura de los
dispositivos lógicos programables básicos.
Tabla 1.3 Dispositivos lógicos programables.
• La PROM no se utiliza como un dispositivo lógico, sino como una
memoria direccionable, debido a las limitaciones que presenta con las
compuertas AND fijas.
• En esencia, el PLA se desarrolló para superar las limitaciones de la
memoria PROM. Este dispositivo se llama también FPLA (arreglo lógico
programable en campo), ya que es el usuario y no el fabricante quien lo
programa.
• El PAL se desarrolló para superar algunas limitaciones del PLA, como
retardos provocados por la implementación de fusibles adicionales, que
resultan de la utilización de dos arreglos programables y de la
complejidad del circuito.
En la figura 1.3 se muestra la arquitectura
interna del PAL16L8.
Arreglo Lógico Genérico (GAL)
El arreglo lógico genérico (GAL) es similar al PAL, ya que se forma con
arreglos AND programable y OR fijo, con una salida lógica programable. Las
dos principales diferencias entre los dispositivos GAL y PAL radican en que el
primero es reprogramable y contiene configuraciones de salida
programables.
Los dispositivos GAL se pueden programar una y otra vez, ya que usan la
tecnología E2 CMOS (Ellectrically Erasable CMOS: CMOS borrable
eléctricamente), en lugar de tecnología bipolar y fusibles (Fig. 1.4).
Figura 1.4 Diagrama de bloques del arreglo GAL.
Programación de un arreglo G A L
A diferencia de un PAL, el GAL está formado por celdas programables, las
cuales se pueden reprogramar las veces que sea necesario. Como se observa
en la figura 1.5, cada fila se conecta a una entrada de la compuerta AND y
cada columna a una variable de entrada y sus complementos.
Cuando se programa una celda, ésta se activa mediante la aplicación de
cualquier combinación de las variables de entrada o sus complementos a la
compuerta AND. Esto permite la implementación de cualquier función
(producto de términos) requerida.
Figura 1.5 Programación del dispositivo GAL.
Arquitectura de un
dispositivo G A L
Figura 1.6a Arquitectura del GAL22V10.
Dispositivos lógicos programables de alto nivel de
integración
Los PLD de alto nivel de integración se crearon con el objeto de integrar mayor
cantidad de dispositivos en un circuito (sistema en un chip SOC). Se
caracterizan por la reducción de espacio y costo, además de ofrecer una
mejora sustancial en el diseño de sistemas complejos, dado que incrementan
la velocidad y las frecuencias de operación.
Además, brindan a los diseñadores la oportunidad de enviar productos al
mercado con más rapidez y les permiten realizar cambios en el diseño sin
afectar la lógica, agregando periféricos de entrada/salida sin consumir una
gran cantidad de tiempo, dado que los circuitos son reprogramables en el
campo de trabajo.
Dispositivos lógicos programables complejos (CPLD)
Un circuito CPLD consiste en un arreglo de múltiples PLD agrupados como
bloques en un chip. En algunas ocasiones estos dispositivos también se
conocen como EPLD (Enhanced PLD: PLD mejorado), Super PAL, Mega PAL,
etc. Se califican como de alto nivel de integración, ya que tienen una
gran capacidad equivalente a unos 50 PLD sencillos.
En su estructura básica, cada CPLD contiene múltiples bloques lógicos
(similares al GAL22V10) conectados por medio de señales canalizadas desde
la interconexión programable (PI). Esta unidad PI se encarga de interconectar
los bloques lógicos y los bloques de entrada/salida del dispositivo sobre las
redes apropiadas (Fig. 1.8).
Figura 1.8 Arquitectura básica de un CPLD.
Figura 1.9 Bloque lógico programable
VHDL: su organización y arquitectura
Introducción
Tal como lo indican sus siglas, VHDL (Hardware Description Language) es un
lenguaje orientado a la descripción o modelado de sistemas digitales; es decir,
se trata de un lenguaje mediante el cual se puede describir, analizar y evaluar
el comportamiento de un sistema electrónico digital.
VHDL es un lenguaje poderoso que permite la integración de sistemas
digitales sencillos, elaborados o ambos en un dispositivo lógico programable,
sea de baja capacidad de integración como un GAL, o de mayor capacidad
como los CPLD y FPGA.
Unidades básicas de diseño
La estructura general de un programa en VHDL está formada por módulos o
unidades de diseño, cada uno de ellos compuesto por un conjunto de
declaraciones e instrucciones que definen, describen, estructuran, analizan y
evalúan el comportamiento de un sistema digital.
Existen cinco tipos de unidades de diseño en VHDL: declaración de entidad
(entity declaration), arquitectura (architecture), configuración
(configuration), declaración del paquete (package declaration) y cuerpo del
paquete (package body). En el desarrollo de programas en VHDL pueden
utilizarse o no tres de los cinco módulo
s, pero dos de ellos (entidad y arquitectura) son indispensables en la
estructuración de un programa.
Las declaraciones de entidad, paquete y configuración se consideran
unidades de diseño primarias, mientras que la arquitectura y el cuerpo del
paquete son unidades de diseño secundarias porque dependen de una
entidad primaria que se debe analizar antes que ellas.
Unidades básicas de diseño
La estructura general de un programa en VHDL está formada por módulos o
unidades de diseño, cada uno de ellos compuesto por un conjunto de
declaraciones e instrucciones que definen, describen, estructuran, analizan y
evalúan el comportamiento de un sistema digital.
Existen cinco tipos de unidades de diseño en VHDL: declaración de entidad
(entity declaration), arquitectura (architecture), configuración (configuration),
declaración del paquete (package declaration) y cuerpo del paquete (package
body). En el desarrollo de programas en VHDL pueden utilizarse o no tres de
los cinco módulos, pero dos de ellos (entidad y arquitectura) son
indispensables en la estructuración de un programa.
Las declaraciones de entidad, paquete y configuración se consideran unidades
de diseño primarias, mientras que la arquitectura y el cuerpo del paquete son
unidades de diseño secundarias porque dependen de una entidad primaria
que se debe analizar antes que ellas.
Entidad
Una entidad (entity) es el bloque elemental de diseño en VHDL, Las
entidades son todos los elementos electrónicos (sumadores, contadores,
compuertas, flip-flops, memorias, multiplexores, etc.) que forman de manera
individual o en conjunto un sistema digital.
La entidad puede representarse de muy diversas maneras; por ejemplo, la
figura 2.1a)
figura 2.1a
muestra la arquitectura de un sumador completo a nivel de compuertas; ahora
bien, esta entidad se puede representar a nivel de sistema indicando tan sólo
las entradas (Cin, A y B) y salidas (SUMA y Cout) del circuito: figura 2.1b).
figura 2.1b
De igual forma, la integración de varios
subsistemas (medio sumador) puede
representarse mediante una entidad [Fig.
2.1c)]. Los subsistemas pueden conectarse
internamente entre sí; pero la entidad sigue
identificando con claridad sus entradas y
salidas generales.
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; se asignan de acuerdo con las
características de un diseño en particular. Algunos de los tipos más utilizados
en VHDL son:
• Bit, el cual tiene valores de 0 y 1 lógico.
• Boolean (booleano) que define valores de verdadero o falso en una
expresión.
• Bit_vector (vectores de bits) que representa un conjunto de bits para
cada variable de entrada o salida.
• Integer (entero) que representa un número entero.
Los anteriores son sólo algunos de los tipos que maneja VHDL, pero no son
los únicos.
Declaración de entidades
Como se mencionó en la (Unidades básicas de diseño), los módulos
elementales en el desarrollo de un programa dentro del lenguaje de
descripción en hardware (VHDL) son la entidad y la arquitectura.
La declaración de una entidad consiste en la descripción de las entradas y
salidas de un circuito de diseño identificado como entity (entidad); es decir, la
declaración señala las terminales o pines de entrada y salida con que cuenta
la entidad de diseño.
Por ejemplo, la forma de declarar la entidad correspondiente al circuito
sumador de la figura. se muestra a continuación:
Los números de las líneas (1, 2, 3, 4, 5) no son parte del código; se usan como
referencia para explicar alguna sección en particular. Las palabras en negritas
están reservadas para el lenguaje de programación VHDL; esto es, tienen un
significado especial para el programa; el diseñador asigna los otros términos.
Ahora comencemos a analizar el código línea por línea. Observemos que la
línea 1 inicia con dos guiones (--), los cuales indican que el texto que está a la
derecha es un comentario cuyo objetivo es documentar el programa, ya que el
compilador ignora todos los comentarios.
En la línea 2 se inicia la declaración de la entidad con la palabra reservada
entity, seguida del identificador o nombre de la entidad (sumador) y la palabra
reservada is. Los puertos de entrada y salida (port) se declaran en las líneas 3 y
4 , respectivamente —en este caso los puertos de entrada son A, B y Cin—,
mientras que SUMA y Cout representan los puertos de salida.
El tipo de dato que cada puerto maneja es del tipo bit, lo cual indica que sólo
pueden manejarse valores de '0' y '1' lógicos. Por último, en la línea 5 termina
la declaración de entidad con la palabra reservada end, seguida del nombre de
la entidad (sumador).
Debemos notar que como cualquier lenguaje de programación, VHDL sigue
una sintaxis y una semántica dentro del código, mismas que hay que respetar.
En esta entidad conviene hacer notar el uso de punto y coma (;) al finalizar una
declaración y de dos puntos (:) al asignar nombres a las entradas y salidas.
Declare la entidad del circuito lógico de la siguiente figura
Identificadores
Los identificadores son simplemente los nombres o etiquetas que se usan
para referir variables, constantes, señales, procesos, etc. Pueden ser
números, letras del alfabeto y guiones bajos ( _ ) que separen caracteres y no
tienen una restricción en cuanto a su longitud. Todos los identificadores
deben seguir ciertas especificaciones o reglas para que se puedan compilar
sin errores, mismas que aparecen en la siguiente tabla.
Diseño de entidades mediante vectores
La entidad sumador realizada en el circuito del listado anterior, usa bits
individuales, los cuales sólo pueden representar dos valores lógicos (0 o 1). De
manera general, en la práctica se utilizan conjuntos (palabras) de varios bits; en
VHDL las palabras binarias se conocen como vectores de bits, los cuales se
consideran un grupo y no como bits individuales.
Como ejemplo considérense los
vectores de 4 bits que se muestran a
continuación:
En la figura siguiente se observa la entidad del sumador analizado antes, sólo
que ahora las entradas A, B y la salida SUMA incorporan vectores de 4 bits en
sus puertos. Obsérvese cómo la entrada Cin y la salida Cout son de un bit.
La manera de describir en VHDL una configuración que utilice vectores consiste
en la utilización de la sentencia bit_vector, mediante la cual se especifican los
componentes de cada uno de los vectores utilizados. La parte del código que se
usa para declarar un vector dentro de los puertos es el siguiente:
port (vector_A, vector_B: in bit_vector (3 downto 0);
vector_SUMA: out bit_vector (3 downto 0));
Esta declaración define los vectores (A, B y SUMA) con cuatro componentes
distribuidos en orden descendente por medio del comando:
3 downto 0 (3 hacia 0)
los cuales se agruparían de la siguiente manera.
Una vez que se ha establecido el orden en que aparecerán los bits enunciados
en cada vector, no se puede modificar, a menos que se utilice el comando to:
0 to 3 (0 hasta 3)
que indica el orden de aparición en sentido ascendente.
Ejemplo 2.2 Describa en VHDL la entidad del circuito sumador representado
en la figura. Observe cómo la entrada Cin (Carry in) y la salida Cout (Carry out)
se expresan de forma individual.
Ejemplo 2.3
Declare la entidad del circuito lógico mostrado en la figura , mediante
vectores.
Declaración de entidades mediante librerías y paquetes
Una parte 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 que facilitan el diseño.
Una librería o biblioteca es un lugar al que se tiene acceso para utilizar las
unidades de diseño predeterminadas por el fabricante de la herramienta
(paquete) y su función es agilizar el diseño.
En VHDL se encuentran definidas dos librerías llamadas ieee y work (Fig.).
Como puede observarse, en la librería ieee se encuentra el paquete
std_logic_l 164, mientras que en la librería work se hallan numeric_std,
std_arith y gatespkg.
En una librería también se permite almacenar el resultado de la compilación
de un diseño, con el fin de utilizar en uno o varios programas. La librería work
es el lugar establecido donde se almacenan los programas que el usuario va
generando.
Esta librería se encuentra siempre presente en la compilación de un diseño y
los diseños se guardan en ella mientras no se especifique otra. La carpeta otra
mostrada en la figura representa esta situación.
Un paquete es una unidad de diseño que permite desarrollar un programa en
VHDL de una manera ágil, debido a que contiene algoritmos preestablecidos
(sumadores, restadores, contadores, etc.) que ya tienen optimizado su
comportamiento.
Por último, cuando en el diseño se utiliza algún paquete es necesario llamar a
la librería que lo contiene. Para esto se utiliza la siguiente declaración:
library ieee;
Lo anterior permite el uso de todos los componentes incluidos en la librería
ieee. En el caso de la librería de trabajo (work), su uso no requiere 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 en la
librería ieee contiene todos los tipos de datos que suelen emplearse en
VHDL (std_logic_vector, std_logic, entre otros).
El acceso a la información contenida en un paquete es por medio de la
sentencia use, seguida del nombre de la librería y del paquete,
respectivamente:
use nombre_librería.nombre_paquete.all;
por ejemplo:
use ieee.std_logic_1164.all;
En este caso ieee es la librería, std_logic_l 164 es el paquete y la palabra
reservada all indica que se pueden usar todos los componentes
almacenados en el paquete.
• El paquete numeric_std define funciones para realizar operaciones
entre diferentes tipos de datos (sobrecargado); además, los tipos
pueden representarse con signo o sin éste (vea el Apéndice A).
• El paquete numeric_bit define tipos de datos binarios con signo o sin
éste.
• El paquete std_arith define funciones y operadores aritméticos, como
igual (=), mayor que (>), menor que (<), entre otros (vea el Apéndice A).
Ejemplo 2.4
En la figura se muestra el bloque representativo de un circuito multiplicador
de 2 bits. La multiplicación de (XI, XO) y (Y1,Y0) producen la salida Z3, Z2, Zl,
ZO .
Declare la entidad del circuito utilizando la librería ieee y el paquete
std_logic_1164.all.
Arquitecturas
Una arquitectura (architecture) se define como la estructura que describe el
funcionamiento de una entidad, de tal forma que permita el desarrollo de
los procedimientos que se llevarán a cabo con el fin de que la entidad
cumpla las condiciones de funcionamiento deseadas.
De manera general, los estilos de programación utilizados en el diseño de
arquitecturas se clasifican como:
• Estilo funcional
• Estilo por flujo de datos
• Estilo estructural
Descripción funcional
En la figura se describe funcionalmente el circuito comparador. Se trata de
una descripción funcional porque expone la forma 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 esté organizado en su interior. Para
este caso:
Descripción funcional de un comparador de igualdad de dos bits.
El código que representa el circuito de la figura anterior se muestra en el siguiente listado:
Listado 2.2 Arquitectura funcional de un comparador de igualdad de 2 bits.
Ejemplo2.5
Describa mediante declaraciones del tipo if-then-else el funcionamiento de
la compuerta OR mostrada en la figura con base en la tabla de verdad.
Como puede observarse, la declaración de
la librería y el paquete se introducen en
las líneas 2 y 3, respectivamente. La
declaración de la entidad se define entre
las líneas 4 a 7 inclusive. Por último, la
arquitectura se describe en las líneas 8 a
17.
Descripción por flujo de datos
La descripción por flujo de datos indica la forma en que los datos se
pueden transferir de una señal a otra sin necesidad de declaraciones
secuenciales (if-then-else).
Este tipo de descripciones permite definir el flujo que tomarán los datos
entre módulos encargados de realizar operaciones. En este tipo de
descripción se pueden utilizar dos formatos: mediante instrucciones
whenelse (cuando-si no) o por medio de ecuaciones booleanas.
a) Descripción por flujo de datos mediante when-else
A continuación se muestra el código del comparador de igualdad de dos
bits descrito antes. Nótese que la diferencia entre los listados anteriores
radica en la eliminación del proceso y en la descripción sin declaraciones
secuenciales (if-then-else).
Listado 2.3: Arquitectura por flujo de datos.
En VHDL se manejan dos tipos de declaraciones: secuenciales y
concurrentes. Una declaración secuencial de la forma if-then-else se halla
en el listado 2.2 dentro del proceso, donde su ejecución debe seguir un
orden para evitar la pérdida de la lógica descrita.
En cambio, en una declaración concurrente esto no es necesario, ya que no
importa el orden en que se ejecutan. Tal es el caso del listado 2.3.
Ejemplo 2.6: Con base en la tabla de verdad y mediante la declaración
when-else, descri ba el funcionamiento de la siguiente compuerta AND.
b) Descripción por flujo de datos mediante ecuaciones booleanas
Otra forma de describir el circuito comparador de dos bits es mediante la
obtención de sus ecuaciones booleanas figura. En el listado 2.4 se observa
este desarrollo.
Figura: a) Entidad del comparador de dos bits, b) Comparador de dos bits realizado con compuertas.
El interior del circuito comparador de la figura. a) puede representarse por
medio de compuertas básicas [Fig.b)] y este circuito puede describirse
mediante la obtención de sus ecuaciones booleanas.
Listado 2.4 Arquitectura de forma de flujo de datos construido por medio de ecuaciones booleanas.
La forma de flujo de datos en cualquiera de sus representaciones describe
el camino que los datos siguen al ser transferidos de las operaciones
efectuadas entre las entradas a y b a la señal de salida c.
Ejemplo 2.7 : Describa mediante ecuaciones booleanas el circuito
mostrado a continuación.
Descripción estructural
Como su nombre indica, una descripción estructural basa su comportamiento
en modelos lógicos establecidos (compuertas, sumadores, contadores, etc.).
Según veremos más adelante, el usuario puede diseñar estas estructuras y
guardarlas para su uso posterior o tomarlas de los paquetes contenidos en las
librerías de diseño del software que se esté utilizando.
En la figura 2.8 se encuentra un esquema
del circuito comparador de igualdad de 2
bits, el cual está formado por compuertas
ñor-exclusivas y una compuerta AND.
Figura 2.8 Representación esquemática de
un comparador de 2 bits.
En nuestro caso, cada compuerta (modelo lógico) se encuentra dentro del
paquete gatespkg, del cual se toman para estructurar el diseño. A su vez, este
tipo de arquitecturas estándares se conoce como componentes, que al
interconectarse por medio de señales internas (xO, x l ) permiten proponer
una solución.
En VHDL esta conectividad se conoce como netlist7 o listado de
componentes.
Para iniciar la programación de una entidad de manera estructural, es
necesario la descomposición lógica del diseño en pequeños submódulos
(jerarquizar), los cuales permiten analizar de manera práctica el circuito, ya
que la función de entrada/salida es conocida.
En nuestro ejemplo 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 el resultado de la
operación and efectuada en el interior a través de las señales xO y xl (Fig. 2.8).
Es importante resaltar que una jerarquía en VHDL se refiere al procedimiento
de dividir en bloques y no a que un bloque tenga mayor jerarquía (peso) que
otro.
Esta forma de dividir el problema hace de la descripción estructural una
forma sencilla de programar. En el contexto del diseño lógico esto es
observable cuando se analiza por separado alguna sección de un sistema
integral.
En el listado 2.5 se muestra el código del programa que representa al
esquema de la figura 2.8.
Listado 2.5 Descripción estructural de un comparador de igualdad de 2 bits.
Ejercicios 2,8 .- Realice el programa correspondiente en VHDL para el circuito
mostrado en la figura E2.8. Utilice descripción estructural.
Figura E2.8
Diseño lógico combinacional mediante VHDL
Introducción
En este capítulo se diseñan los circuitos combinacionales más utilizados en el
diseño lógico a través del lenguaje de descripción en hardware. Esto permite
introducir nuevos conceptos, palabras reservadas, reglas, algoritmos, etc.,
que muestran la potencia y profundidad del lenguaje VHDL.
El desarrollo de cada una de las entidades de diseño descritas en este capítulo
se puede optimizar mediante el uso adecuado de las declaraciones
secuenciales, concurrentes o ambas, utilizando en esta descripción cualquiera
de los tres tipos de arquitectura —funcional, por flujo de datos y estructural—
vistos en el capítulo anterior.
Sin embargo y dada la filosofía que queremos manejar en este texto, nos
parece conveniente presentar soluciones que incluyan nuevas declaraciones,
nuevos tipos de datos y nuevos algoritmos de análisis; es decir, no se pretende
presentar la mejor opción de diseño para un problema; por el contrario, se
propone brindar la mayor cantidad de soluciones (modelos) que le permitan
deducir y construir sus estrategias de diseño para optimizar sus resultados.
Programación de estructuras básicas mediante
declaraciones concurrentes
Como se mencionó antes, las declaraciones concurrentes se encuentran fuera
de la declaración de un proceso y suelen usarse en las descripciones de flujo
de datos y estructural.
Esto se debe a que en una declaración concurrente no importa el orden en
que se escriban las señales, ya que el resultado para determinada función
sería el mismo.
En VHDL existen tres tipos de declaraciones concurrentes:
• Declaraciones condicionales asignadas a una señal (when-else)
• Declaraciones concurrentes asignadas a señales
• Selección de una señal (with-select-when)
Declaraciones condicionales asignadas a una señal (when'else)
La declaración when'else se utiliza para asignar valores a una señal,
determinando así la ejecución de una condición propia del diseño. Para
ejemplificar, consideremos la entidad mostrada en la figura 3.1, cuyo
funcionamiento se define en la tabla de verdad.
Figura 3.1 Declaraciones when-else.
La entidad se puede programar mediante declaraciones condicionales (when-
else), debido a que este modelo permite definir paso a paso el
comportamiento del sistema, según se muestra en el siguiente listado1.
La ventaja de la programación en VHDL en comparación con el diseño lógico
puede intuirse considerando que la función de salida f mediante álgebra
booleana se representa con:
en el diseño convencional se utilizarían inversores, compuertas OR y
compuertas AND; en VHDL la solución es directa utilizando la función lógica
and. Como ejemplo, observemos que de la línea 10 a la 14 las instrucciones
se interpretarían de la siguiente manera:
Operadores lógicos.
Los operadores lógicos más utilizados en la descripción de funciones
booleanas, y definidos en los diferentes tipos de datos bit, son los
operadores and, or, nand, xor, xnor y not. Las operaciones
que se efectúen entre ellos (excepto not) deben realizarse con datos que
tengan la misma longitud o palabra de bits.
En el momento de ser compilados los operadores lógicos presentan el
siguiente orden y prioridad:
1) Expresiones entre paréntesis
2) Complementos
3) Función AND
4) Función OR
Las operaciones xor y xnor son transparentes al compilador y las
interpreta mediante la suma de productos correspondiente a su función.
Como ejemplo del uso de operadores lógicos en VHDL, observemos la
siguiente comparación:
Ejemplo.- Una función F depende de cuatro variables D, C, B, A, que representan un número
binario, donde A es la variable menos significativa. La función F adopta el valor de uno si el
número formado por las cuatro variables es inferior o igual a 7 y superior a 3. En caso
contrario la función F es cero.
• Obtenga la tabla de verdad de la función F y realice el programa correspondiente en VHDL
(utilice estructuras del tipo when-else y operadores lógicos).
Solución
Primero analizamos el enunciado y estructuramos la
siguiente tabla de verdad según las especificaciones
indicadas.
A partir de la tabla anterior, se puede programar
la función F utilizando declaraciones condicionales
when-else. El código VHDL es el siguiente:
Declaraciones concurrentes asignadas a señales
En este tipo de declaración encontraremos las funciones de salida mediante la
ecuación booleana que describe el comportamiento de cada una de las
compuertas. Obsérvese que ahora el circuito de la figura 3.2 cuenta con tres
salidas (x1, x2 y x3) en lugar de una.
Figura 3.2 Circuito lógico realizado con compuertas.
El programa correspondiente al circuito de la figura 3.2 se muestra en el listado
Listado Declaraciones concurrentes asignadas a señales.
Ejemplo.- Dada la tabla de verdad mostrada a continuación, halle las
ecuaciones X, Y, Z, de la forma suma de productos y prográmelas en VHDL,
utilizando declaraciones concurrentes asignadas a señales
Solución
Las ecuaciones de la forma suma de productos
para X, Y y Z se muestran a continuación:
1) X = A´B´C´ + A´B´C + A´BC + ABC
2) Y = A´B´C + AB´C + ABC´
3) Z = A´B´C´ + A´BC´ + A´BC
Forma de implementar estas ecuaciones por medio de operadores lógicos.
Selección de una señal (with*select>when)
La declaración w i t h ' S e l e c t - w h e n se utiliza para asignar un
valor a una señal con base en el valor de otra señal previamente
seleccionada.
Por ejemplo, en el listado correspondiente a la figura se muestra el código que
representa a este tipo de declaración.
Como puede observarse, el valor de la salida
C depende de las señales de entrada
seleccionadas a(0) y a(1), de acuerdo con la
tabla de verdad correspondiente.
Figura Tabla de verdad.
Ejemplo : Se requiere diseñar un circuito combinacional que detecte
números primos de 4 bits. Realice la tabla de verdad, elabore un descripcion
para su función. Utilice instrucciones del tipo with - select - when.
Solución:
La tabla de verdad que resuelve la
función es la siguiente:
Si se considera que la entrada X es un
vector de 4 bits y que F es la función de
salida, el programa en VHDL quedaría de
la siguiente manera.
Programación de estructuras básicas mediante declaraciones secuenciales
Como ya se mencionó, las declaraciones secuenciales son aquellas en las que
el orden que llevan puede tener un efecto significativo en la lógica descrita. A
diferencia de una declaración concurrente, una secuencial debe ejecutarse
en el orden en que aparece y formar parte de un proceso (process).
Declaración if-then-else (si-entonces-si no). Esta declaración sirve para
seleccionar una condición o condiciones basadas en el resultado de
evaluaciones lógicas (falso o verdadero). Por ejemplo, observemos que en la
instrucción:
Un ejemplo que ilustra este tipo de declaración se encuentra en la figura
Notemos cómo en este tipo de ejemplos sólo son necesarias dos condiciones
por evaluar, pero no en todos los diseños es así. Por tanto, cuando se
requieren más condiciones de control, se utiliza una nueva estructura
llamada elsif (si no-si), la cual permite expandir y especificar prioridades
dentro del proceso. La sintaxis para esta operación es:
Comparador de magnitud de 4 bits
La forma de utilizar las declaraciones secuenciales se ilustra en el diseño de un
comparador de dos números de 4 bits, figura.
Figura : a) Comparador de 4 bits, b) Comparador expresado con vectores de 4 bits.
Ejemplo: Diseñe un comparador de dos números A y B, cada número formado
por dos bits ( A1 A0 ) y ( B1 B0 ) la salida del comparador también es de dos
bits y está representada por la variable Z ( Z1 Z0 ) de tal forma que si:
La tabla de verdad
correspondiente a este
comparador es la
siguiente.
Diseño lógico secuencial con VHDL
Introducción
Los circuitos digitales que hemos manejado con anterioridad han sido de
tipo combinacional; es decir, son circuitos que dependen por completo de
los valores que se encuentran en sus entradas, en determinado tiempo.
Diseño lógico secuencial
Un sistema secuencial está formado por un circuito combinacional y un
elemento de memoria encargado de almacenar de forma temporal la historia
del sistema.
En esencia, la salida de un sistema secuencial no sólo depende del valor
presente de las entradas, sino también de la historia del sistema, según se
observa en la figura.
Figura: Estructura de un sistema secuencial.
Básicamente hay dos tipos de sistemas secuenciales: síncronos y
asíncronos; el comportamiento de los primeros se encuentra sincronizado
mediante el pulso de reloj del sistema, mientras que el funcionamiento
de los sistemas asíncronos depende del orden y momento en el cual se
aplican sus señales de entrada, por lo que no requieren un pulso de reloj
para sincronizar sus acciones.
Flip-flops
El elemento de memoria utilizado indistintamente en el diseño de los
sistemas síncronos o asíncronos se conoce como flip-flop o celda binaria.
La característica principal de un flip-flop es mantener o almacenar un bit
de manera indefinida hasta que a través de un pulso o una señal cambie
de estado.
Los flip-flops más conocidos son los tipos SR, JK, T y D. En la figura se
presenta cada uno de estos elementos y la tabla de verdad que describe su
comportamiento.
Figura Flip-flops y tablas de verdad características
Es importante recordar el significado de la notación Q y Q(t+1);
Q = estado presente o actual
Qt+1 = estado futuro o siguiente
Por ejemplo, consideremos la tabla de verdad que describe el
funcionamiento del flip-flop tipo D, mostrado en la figura a.
Figura a) Diagrama y tabla de verdad del flip-flop D, b) Flujo de información en el dispositivo.