Integracin de entidades en
VHDL
Ing. Diego Barragn Guerrero
http://www.matpic.com
Introduccin
Una de las fortalezas de VHDL es la facilidad de
integrar sistemas digitales que contienen una
gran cantidad de subsistemas electrnicos con el
fin de minimizar el tamao de la aplicacin.
La integracin de entidades puede realizarse
mediante el diseo individual de cada bloque
lgico a travs de varios procesos internos que
posteriormente pueden unirse mediante un
programa comn.
Otra posibilidad es observar y analizar de
manera global todo el sistema evaluando su
comportamiento solo a travs de sus entradas y
salidas.
Programacin de entidades
individuales: Contador y decodificador
Reporte de uso de recursos.
Contador y decodificador: usando
seales.
Teclado, codificador, registro,
decodificador
Teclado, codificador, registro,
decodificador: TEST BENCH
Teclado, codificador, registro,
decodificador: uso de SEALES.
Teclado, codificador, registro,
decodificador: TEST BENCH.
SIGNAL y VARIABLES
VHDL provee con dos objetos para trabajar con valores de datos no estticos:
seales y variables.
Constantes y seales pueden ser globales (usadas en tipos de cdigo
concurrente o secuencial).
Una variable es local, usada solo en cdigos secuenciales: procesos.
SIGNAL
Una seal sirve para pasar valores de entrada o salida de un circuito, as como
entre sus unidades internas.
Todos los puertos de una entidad son seales por defecto.
Sintaxis:
SIGNAL name : type [range] [:= initial_value];
Ejemplos:
SIGNAL control: BIT := '0';
SIGNAL count: INTEGER RANGE 0 TO 100;
SIGNAL y: STD_LOGIC_VECTOR (7 DOWNTO 0);
Una seal puede modificar su valor mediante la sentencia de asignacin de
seales, que es <= (ejm: count<=35;)
Un aspecto muy importante de las seales, cuando se usa en un seccin
secuencial de cdigo (proceso), es que su actualizacin no es inmediata, sino
SIGNAL
Otro aspecto a tener en cuenta en las seales es la asignacin mltiple hecha a una
seal. El compilador puede indicar un aviso o bien no completar el chequeo de sintaxis,
o inferir un circuito errneo (considerando solo la ltima asignacin, por ejemplo).
Contador de unos (1)
El cdigo tiene mltiples
asignaciones a la misma seal
-temp- (temp <= 0; y temp
<= temp + 1;). Sin embargo,
debido a que el valor de una
seal no se actualiza de
inmediato, ambas
asignaciones entran en
conflicto, ya que el valor de la
primera asignacin no se
cumple sino hasta el final del
proceso, de tal modo que un
valor errneo se asigna en la
segunda asignacin.
VARIABLES
Contrario a un seal o constante, una variable representa solo
informacin local.
Solo puede usarse dentro de un proceso (cdigo secuencial) y
su valor no puede transferirse de forma directa.
Su actualizacin es inmediata, as el nuevo valor puede ser
usado inmediatamente en la siguiente lnea del cdigo.
Para declarar una variable se usa la siguiente sintaxis:
VARIABLE name : type [range] [:= init_value];
Ejemplos:
VARIABLE control: BIT := '0';
VARIABLE count: INTEGER RANGE 0 TO 100;
VARIABLE y: STD_LOGIC_VECTOR (7 DOWNTO 0) := "10001000";
Debido a que una variable solo puede usarse en cdigo
secuencial, debe colocarse en la parte declarativa del proceso.
VARIABLES
Contador de unos (1)
Debido a que la actualizacin de
una variable es inmediata, el
valor inicial se establece
correctamente y no hay conflicto
de asignaciones mltiples.
SIGNAL versus VARIABLE
SIGNAL
VARIABLE
Asignaci
n
<=
:=
Utilidad
Representa interconexin
de circuitos (cableado)
Representa informacin local
Global
Local (visible solo dentro del
proceso)
Visin
Entorno
En cdigo secuencial, la
actualizacin no es
inmediata (el nuevo valor
por lo general solo es
disponible a la finalizacin
del proceso).
Actualizacin inmediata (el
nuevo valor puede ser usado en
la siguiente lnea del cdigo)
Uso
En Paquetes, entidades,
arquitecturas. En una
entidad, todos los puertos
son seales por defecto.
Solo en cdigo secuencial
(dentro de un proceso, en su
parte declarativa)
SIGNAL versus VARIABLE
Recordar: la asignacin a una variable es inmediata, lo que no es
el caso de un seal. En general, el nuevo valor de una seal ser
solo disponible al finalizar del proceso. Por lo general, solo una
asignacin a seal es permitida dentro de un proceso.
Un error comn al usar seales es
olvidar que se necesita una cierta
cantidad de tiempo para actualizar
la seal. As, la asignacin
sel<=sel+1 en el cdigo resultar
en uno ms cualquier valor que haya
sido previamente propagado a sel,
SIGNAL versus VARIABLE
Recordar: la asignacin a una variable es inmediata, lo que no
es el caso de un seal. En general, el nuevo valor de una seal
ser solo disponible al finalizar del proceso. Por lo general, solo
una asignacin a seal es permitida dentro de un proceso.
Cuando se usa variables, la
asignacin de variables es
siempre inmediata.
Asignacin a SIGNAL
Recordar que un puerto es una seal por
defecto.
La asignacin q<=d y qbar<=NOT
q son ambas sncronas, de tal
modo que sus nuevos valores
sern disponibles solo al finalizar
el proceso. Esto es un problema
para qbar, debido a que el nuevo
valor de q no se ha propagado
todava. Por lo tanto, qbar tomar
el valor anterior a q, de tal modo
que el valor de qbar estar un
ciclo de reloj retardado.
Resultando en un mal
funcionamiento del circuito.
Asignacin a SIGNAL
DFF
En este ejemplo, se coloca
la asignacin qbar<=NOT q
fuera del proceso, de tal
forma que opera como una
expresin concurrente.
Divisor de frecuencia: uso de
seales y variables.
Circuito que divide la frecuencia de reloj por 6.
Divisor de frecuencia: uso de seales
La declaracin generic es una
Reset
Asncro
no
herramienta muy til cuando se
necesita varios valores de prueba
en una entidad. La lnea
GENERIC(N : INTEGER := 5);define
una variable entera N igual a 5,
que determina la divisin de
frecuencia del reloj por 6 (N+1,
debido al conteo del 0). De este
modo, para cambiar la divisin de
frecuencia a otro valor, solo es
necesario cambiar N.
Nmero de registros
Una seal genera un FF siempre que una asignacin se
hace en la transicin de otra seal, esto es, cuando
ocurre una asignacin sncrona.
Tal asignacin, siendo sncrona, solo puede suceder
dentro de un proceso (usualmente luego de la
declaracin "IF signal'EVENT..." o "WAIT UNTIL").
Una variable, por otro lado, no necesariamente
generar un FF si su valor nunca deja un proceso.
Sin embargo, si el valor es asignado a una variable en
la transicin de otra seal, y tal valor es
eventualmente pasado a un seal (la cual deja el
proceso), se inferirn FF.
Una variable genera tambin un registro cuando se
usa antes de un valor que ha sido asignado a ella.
Nmero de registros
Ejemplos:
En el precedente proceso, tanto output1 como output2
son almacenadas (esto es, infieren un FF), debido a que
a ambas se les asigna valores a la transicin de otra
seal (clk).
Nmero de registros
Ejemplo 2:
En el ejemplo precedente, solo output1 se
almacenar (output2 har uso de compuertas
lgicas).
Nmero de registros: DFF con q and qbar
Ambas soluciones funcionan adecuadamente. La diferencia
entre ellas reside en el nmero de FF necesarios en cada caso.