Escolar Documentos
Profissional Documentos
Cultura Documentos
Introduccin al VHDL
Rv. 15
Pg. 1/50
INTRODUCCIN.................................................................................................................3
ESQUEMA TPICO DE UN DISEO CAD ..........................................................................3
CONSTRUCCIONES BSICAS EN VHDL:.........................................................................4
Las Entidades (ENTITY): ............................................................................................................4
Las Arquitecturas (ARCHITECTURE): .......................................................................................4
Las Bibliotecas (LIBRARIES):.....................................................................................................5
Las Configuraciones (CONFIGURATION):.................................................................................6
Ejemplo 1: diseo de una compuerta And de 2 entradas. ................................................................................. 6
Puertos: ....................................................................................................................................................7
Modos:......................................................................................................................................................7
TCNICAS DIGITALES 1
Introduccin al VHDL
Rv. 15
Pg. 2/50
DISEO ESTRUCTURAL :
Ejemplo 19: describir un Mux de 2 canales en base a instancias de una Nand de 2 entradas........................ 37
Otro ejemplo con una instanciacin ms amplia se ve a continuacin. ........................................................... 38
Ejemplo 20: describir un Mux de 16 entradas en base a instancias de un Mux de 4 entradas ..................... 38
TCNICAS DIGITALES 1
Introduccin al VHDL
Rv. 15
Pg. 3/50
INTRODUCCIN
El avance del desarrollo tecnolgico en electrnica, determinante del incremento de componentes
que se integran en chips de silicio conduce a la creacin de circuitos integrados cada vez mas
complejos y que permiten a su vez la obtencin de mltiples y complejas funciones lgicas en un
slo dispositivo integrado.
Esto a su vez determina la necesidad de expresar esas funciones lgicas de una manera ms
cmoda y a la vez, proceder al diseo de los circuitos lgicos cambiando las maneras tradicionales
por otras acordes al volumen de componentes y expresiones. La herramienta para lograrlo, como
no podra ser pensado de otra manera, es recurrir a desarrollos de software. Se comenz a
comprobar lo engorroso de obtener descripciones de circuitos digitales complejos mediante
esquemas y se pens en la conveniencia de lograr tambin mediante programas, la manera de
obtener descripciones circuitales (hardware).
Por otra parte, la complejidad de los circuitos que se van logrando hacen necesario a la vez
incorporar procesos que permitan al diseador verificar si lo que se est desarrollando cumple lo
que se pretende, para lo cual, un camino es poder simular comportamientos.
Estos antecedentes, sintticamente, marcan la aparicin de lenguajes descriptores de hardware
(Hardware Description Languages). As, en la dcada del 80 el Departamento de Defensa de los
EE.UU de Norteamrica promovi el desarrollo del VHDL, luego normalizado por el IEEE. cuya
sigla corresponde a VHSIC HDL, esto es Very High Speed Integrated Circuits HDL (lenguaje
descriptor de hardware para circuitos integrados de muy alta velocidad)
Este lenguaje, a la vez de utilizarse para el modelado y sntesis de circuitos, sirve tambin como
documentacin de desarrollos.
Especificacin
del circuito
S
Ajuste
Sntesis
Anlisis y
Simulacin
temporal
Simulacin
Funcional
No
No
Diseo
es OK?
Cumple requisitos
temporales?
S
Programacin y
Configuracin
fig. 1
TCNICAS DIGITALES 1
Introduccin al VHDL
Rv. 15
Pg. 4/50
En el mismo, se ve como primer estado la especificacin del circuito deseado, el cual se puede
hacer por medio de un diagrama esquemtico o bien por una descripcin mediante un lenguaje de
Hardware como Verilog o VHDL.
De ella se pasa a la sntesis (realizacin) del circuito, que se concreta mediante una lista de
elementos lgicos necesarios para realizarlo y tambin un detalle de sus interconexiones.
Para ver que todo est bien, se recurre en tercer instancia a una simulacin, que en principio no
toma en cuenta cuestiones temporales (retardos, etc.)
De estos pasos se hace una primer evaluacin para ver si todo funciona ok y si es as se contina.
El programa de diseo debe tener herramientas para hacer corresponder los elementos lgicos
que se encontraron necesarios en la sntesis con el chip (FPGA) que contiene las unidades fsicas.
De aqu se pasa a analizar las propagaciones de tiempo que esas unidades fsicas reales
presentarn a las distintas seales del circuito que se disea y se cotejar si cumplen con
expectativas previas de performance del circuito, si las hubiera. Se lo prueba y se verifica que as
sea.
Si esto anda bien, se pasa a la ltima etapa en que se programa la configuracin de cableado
interno de los elementos lgicos de la FPGA, que materializan las seales que se acaban de
simular.
Archivo de diseo n
Archivo de diseo k
Unidad 1
Unidad
Unidad
1
2
Circuito
3
Unidad
2
Circuito
n
Circuito
3
Circuito n
Package NNN
Package
NNN
......................
Archivo de diseo......................
1
Entity PPP is ...
Entity
PPP is ...
Circuito 1
...................
Circuito 2
...................
Architecture XX
Circuito 3
Circuito n Architecture
XX is
of Entity PPP
of Entity
PPP is
...................
Package NNN
.........................................
Entity PPP is ...
...................
Architecture XX
of Entity PPP is
...................
fig. 2
TCNICAS DIGITALES 1
Introduccin al VHDL
Rv. 15
Pg. 5/50
fig. 3
fig. 4
Las Bibliotecas (LIBRARIES):
Lugar donde se almacenan determinados componentes y elementos que se van a utilizar en los
diseos. Segn las caractersticas de esos elementos, se agrupan en paquetes (PACKAGES) 2
que son (grupos de) declaraciones e informaciones que los bloques anteriores toman como
referencia para armar el modelo. Tiene dos partes:
- Package Declaration (declaracin del paquete)
- Package Body (cuerpo del paquete)
A continuacin se muestra una parte del "cuerpo" de la librera Standard de la norma IEEE 1076.93
TCNICAS DIGITALES 1
Introduccin al VHDL
package standard is
type boolean is (false,true);
...
type character is (
nul, soh, stx, etx, eot, enq, ack, bel,
...
' ', '!', '"', '#', '$', '%', '&', ''',
...
'@', 'A', 'B', 'C', 'D', 'E', 'F', 'G',
... ;
type severity_level is (note, warning, error, failure);
type integer is range -2147483647 to 2147483647;
...
end standard;
Rv. 15
Pg. 6/50
+
**
/
Compuertas
Funciones
Bloques
fig. 5
Circuitos
Tipos
de la
IS
IN
IN
OUT
entidad
BIT;
BIT;
BIT);
-- Definicin de la arquitectura
ARCHITECTURE comportamiento OF and2in IS
BEGIN
y<= a AND b;
END comportamiento;
TCNICAS DIGITALES 1
Introduccin al VHDL
Rv. 15
Pg. 7/50
Como cabecera se definen las seales a, b como entradas (IN) e y como salida (OUT) y el tipo de
datos (tema que se desarrollar en el punto 3 del tema Elementos del Lenguaje) asociados a
ambas, en este ejemplo es BIT. ste significa que la seal slo puede adoptar valores 0 y 1.
Declaraciones: en esta seccin se formulan tipos, subtipos y otros elementos del lenguaje que se
vern oportunamente. A veces se incluye la declaracin de parmetros especiales para mejorar
ciertos aspectos de diseo, versatilidad, etc.
Se introduce mediante la palabra reservada
GENERIC (ver anexo Sintaxis VHDL).
Sentencias: es un espacio en el que se incluyen un tipo especial de sentencias.
a, b, y son los identificadores
IN es el modo de las seales a, b (modo entrada), OUT es el de y (modo salida).
Al definirse puertas (sentencia PORT) inmediatamente corresponde asignarle un modo.
Modos: se refieren a la direccin que tienen las seales con que el circuito se comunica con el
exterior. Se enumeran a continuacin y se detalla tambin las caractersticas que permiten la
conexin entre puertas, segn sea su modo:
- In: (entrada) corresponde a aqullas que slo pueden ser ledas pero no pueden ser modificadas
(corresponde a terminales de entrada de un circuito). Es un modo por defecto, esto es, se adjudica
si no se especifica. Se puede conectar a otros puertos de modo in, inout o buffer.
- Out: (salida) corresponde a las que pueden ser modificadas pero no ledas por el circuito. Puede
conectarse a puertos out o inout
- Inout, (entrada/salida) corresponde a un puerto de tipo bidireccional (asociado a una salida tristate, por ejemplo); puede ser ledo y modificado. Puede asociarse slo a otros puertos del
mismo modo.
- Buffer, es una puerta de salida que est siempre activa. Puede ser leda y modificada. Slo
admite una sola fuente de escritura y puede asociarse slo a otro puerto buffer.
- Linkage, es un modo de lectura y escritura, pero solo puede ser asociado a puertos del mismo
modo. (no se lo usar)
TCNICAS DIGITALES 1
Introduccin al VHDL
Rv. 15
Pg. 8/50
TCNICAS DIGITALES 1
y<= a AND b
Introduccin al VHDL
Rv. 15
Pg. 9/50
A=B=Y=0
A=1
B=1
Y=A.B
SECUENCIAL
CONCURRENTE
TCNICAS DIGITALES 1
Introduccin al VHDL
Rv. 15
C.A
Y
C
B
Pg. 10/50
C.B
Y = C.B + C.A
fig. 6
Para representar los procesos de la realidad, el VHDL utiliza tres tpos de objetos, las constantes,
las variables, y las seales . stas dos ltimas pueden variar su valor mientras se ejecuta el
programa, son las designadas por el lenguaje para manipular la informacin del circuito o sistema
en diseo. Pero tendrn una caracterstica distintiva: las seales pueden utilizarse dentro de
cualquier parte del programa (son globales) mientras que las variables lo hacen dentro de un
"proceso" (son locales).
Surge entonces la pregunta: Cmo hace el VHDL para darle aspecto concurrente a sentencias
secuenciales? Y la respuesta es mediante los procesos explcitos, que se declaran como tales.
Procesos
Los procesos son estructuras concurrentes que se elaboran con sentencias de ejecucin
secuencial. Esa concurrencia determina que dentro de l las variables que intervienen se evalan
en forma inmediata, pero recin se actualizan cuando finaliza el proceso. Se materializan con la:
Sentencia Process (proceso)
Suele ir acompaada de una lista de sensibilidad (se escribe entre parntesis luego de su
declaracin). Dicha lista define las seales que al cambiar activan la ejecucin del proceso. Esta
lista es opcional. De no utilizarse, debe incorporarse dentro del proceso la sentencia wait.
Identificadores
Objetos
Tipos de datos
Delimitadores
Comentarios
Literales
Operadores
1.- Identificadores:
reservadas.
TCNICAS DIGITALES 1
Introduccin al VHDL
Rv. 15
Pg. 11/50
VHDL (se las utiliza en sentencias, objetos, tipos, etc) y por lo tanto no pueden ser utilizadas por el
usuario para otra funcin que la prevista en el lenguaje.
En el ejemplo aparecen en letras maysculas (slo para resaltar; en las bibliografas se las podr
encontrar en negrita. El AHDL Altera HDL- las muestra en color azul a medida que se las tipea)
2.- Objetos:
Son los elementos que define y utiliza el lenguaje para almacenamiento de informacin de un tipo
determinado. En funcin de ste, se le podrn efectuar determinadas operaciones. No es posible
realizar operaciones entre dos objetos que pertenezcan a tipos distintos salvo que se le aplique a
alguno de ellos un programa de conversin de tipos. En VHDL existen cuatro clases de objetos:
1. constantes
2. variables
3. seales
4. archivos
Constantes:
Una constante es aquel objeto que mantiene el mismo valor a lo largo de la descripcin del circuito y
del proceso de simulacin. Se inicializan en el momento de su declaracin (excepto en el caso de las
denominadas constantes diferidas o aplazadas). Su sintaxis es:
CONSTANT constant_name : type := constant_value;
Un ejemplo es :
Variables:
Una variable es un dato en memoria de la computadora. Slo pueden ser declaradas y utilizadas en
estructuras secuenciales (procesos Process - o subprogramas); son locales a ellos (salvo las de tipo
compartido o globales). No tiene relacin directa con el hardware (como lo tiene la seal). Se le
puede asignar un valor inicial explcito al declarar su tipo. No tiene valores futuros. Cuando se
ejecuta la sentencia, se evala y se actualiza su valor, y ste puede ser utilizado por la lnea siguiente
de sentencias del programa. No se puede utilizar una variable fuera del Process (si se necesita su
valor o estado, se usar una seal a quien la variable le transfiere el mismo).
Si a una variable no se le asigna un valor inicial lo hace el simulador por default (para las de tipo
enumerado, el valor con que se inicializa es el del primer elemento del mismo)
Se les asigna un valor mediante el operador compuesto :=
Su sintaxis es:
Ejemplo:
VARIABLE
Seales:
Una seal representa las conexiones o terminales fsicos de un circuito. Se la puede ver como uno o
ms cables. No se circunscribe al proceso. Puede utilizarse para interconectar componentes y activar
o detener procesos. Toma su valor luego de finalizado el ciclo de simulacin (no cuando se ejecuta la
sentencia, como la variable).
Las seales se declaran en sentencias de tipo concurrentes aunque se las puede usar en las
secuenciales, tambin. En este caso irn dentro de un Process pero no se actualizan en el momento
en que se ejecuta(n) la(s) sentencia(s) que las invoca(n) (no se puede usar su nuevo valor en las
lneas siguientes del programa) sino al finalizar el Proceso.
En las Arquitecturas, las seales se declaran antes de BEGIN.
Se les asigna un valor mediante el operador compuesto <= , pej. r <= 1
Atencin! tambin se puede utilizar el operador de asignacin usado para variables, pero slo para
inicializar el valor de una seal.
Su sintaxis es:
TCNICAS DIGITALES 1
Introduccin al VHDL
Rv. 15
Pg. 12/50
signal_declaration ::=
signal identifier_list : subtype_indication [ signal_kind ] [ := expression ] ;
C.A
Y
C
B
C.B
Y = C.B + C.A
A
Proceso 1
Proceso 3
Proceso 2
Archivos (files):
se usan para el intercambio de info con el ambiente externo. A este objeto se le asigna un archivo de
todos los que pertenecen al sistema.
file <identificador>: tipo [:=expresin]
TCNICAS DIGITALES 1
Introduccin al VHDL
Rv. 15
Pg. 13/50
referenciarlo, y entre parntesis y separados por comas se adjuntan todos los valores legales del tipo.
TYPE vocales IS ('a', 'e', 'i', 'o', 'u');
TYPE semforo IS (rojo, amarillo, verde);
Esta forma de especificar un tipo de dato hace que cuando se opere con un objeto de este tipo, si no
se lo inicializa (si no se le da un valor inicial) asumir el valor ms a la izquierda de los especificados
en la declaracin del tipo. Esto es, si se trabaja con un objeto tipo semforo va a asumir que est en
rojo, a falta de una asignacin distinta cuando se lo invoque por primera vez.
En el ejemplo de la And, el tipo es BIT, cuyos componentes por enumeracin son 0 y 1. Otro es:
TYPE std_logic IS ('X','0','1','Z','W','L','H','U',-);
El tipo std_logic es uno de los ms usados en VHDL y se encuentra en el paquete STD_LOGIC_1164.
Una seal de este tipo puede tomar uno de varios estados, mientras que si fuera del tipo bit slo
podra tener dos (0 1). El significado de cada tipo es.
* X : desconocido fuerte
* 0 : cero fuerte
* 1 : uno fuerte
* Z : alta impedancia
* W : desconocido dbil
* L : cero dbil
* H : uno dbil
* U : no inicializado
* - : indiferente
Tipos enteros / reales: En VHDL vienen definidos el tipo integer (entero), que corresponde a valores
comprendidos entre -2147483674 y 2147483674, y el tipo real (desde -1.0e38 hasta 1.0e38). Si se
quiere crear o definir un tipo o subtipo de esta naturaleza se debe especificar un rango de valores que
podr asumir los objetos que a l pertenezcan o se quieran adjudicar:
TYPE hora IS range (0 to 23);
TYPE dias IS range (31 downto 0);
--utilizacin
a<=10cm;
b<=1m;
c<=a+b; --c valdra 110cm
El uso da unidades no tiene mucho sentido en los tipos de descripcin vistos anteriormente. Pero s
son muy tiles a la hora de las simulaciones y para ayudar a la depuracin.
Los tipos compuestos son aqullos que se forman con el agregado de varios elementos. Estos
pueden ser del mismo tipo o de distinto tipo. En el primer caso se dice que es un tipo homogneo y se
denomina array. El otro, es de tipo heterogneo y se llama record. Un elemento de tipo array, tiene
un ndice que es entero.
Un array sera:
TCNICAS DIGITALES 1
Introduccin al VHDL
Rv. 15
Pg. 14/50
RANGO DE VALORES
Natural
0 a Maxint *
Positive
1 a Maxint
Integer
- Maxint a Maxint
Real
-Maxreal a Maxreal **
Bit
0,1
Bit_vector
conjunto de bits
Boolean
True, False
Character
(variado) ***
String
conjunto de caracteres
Time
- Maxint a Maxint [unidad]
*
**
***
Qu representa?
nmeros naturales
nmeros positivos
nmeros enteros
nmeros reales
valores binarios
cadenas de bits
valores booleanos
caracteres
cadenas de caracteres
nros. reales con unidades de tiempo
fig. 7
4.- Delimitadores: son smbolos especiales que se utilizan con funciones diferentes y especficas,
Algunos de ellos se los va a utilizar como Operadores (ver ms adelante). Otros tienen diversas
funciones como por ejemplo el smbolo "- -" que, como en el ejemplo visto, se utiliza para marcar la
zona del programa que es empleada para que el usuario introduzca comentarios. Otro, que es
fundamental, y causa de errores frecuentes al compilar un programa es el ; con el cual debe
concluir cada sentencia y algunos renglones intermedios de algunas de ellas.
Los delimitadores en VHDL son:
5.- Comentarios: son oraciones libres y sin ninguna sintaxis preestablecida, como no sea que deben
comenzar con - -;
se hacen para que el usuario logre mayor claridad, orientacin, etc en el
desarrollo de su programa; para establecer los pasos que va dando, reconocer distintas etapas,
sirven para documentacin, etc. El programa omite su procesamiento al detectar - - y salta a la
siguiente sentencia vlida del lenguaje. En el ejemplo visto, se lo utiliz como ttulo.
6.- Los Literales pueden ser:
nmeros, caracteres
o strings
Los nmeros son un texto que representa un valor numrico. Pueden ser enteros (5, -33, etc), reales
(2.71828
0.69), admiten notacin exponencial (3.23E-4; 8.43E9), admiten representacin en una
base distinta de 10 utilizando dos caracteres # (uno para la base y el otro para el nmero -en
decimal- ). y tambin la separacin con guiones bajos para mayor claridad de nmeros grandes en
lugar del punto reservado para los reales- (10_983_145 ; 3.141_592_7)
TCNICAS DIGITALES 1
Introduccin al VHDL
Rv. 15
Pg. 15/50
Los caracteres son literales que se encierran entre comillas simples. Son los caracteres ASCII que
son imprimibles:
Ejemplo: A, _, 9
Mientras que los nmeros tienen una descripcin implcita (su valor numrico), los caracteres se
describen en VHDL por enumeracin en el denominado package STANDARD, que es el paquete de
datos nativo del lenguaje.
Los strings (cadenas) son un conjunto de caracteres. Si los strings son constantes se los encierra
entre comillas dobles ():
Ejemplo: VHDL, Horario, etc
Tambin hay bit_strings o cadenas de bits (los bits valen 0 1): Ejemplo: 0110 1011
Se los puede representar en forma binaria, octal o hexadecimal. Segn sea sta, se colocan los
caracteres B, O, X respectivamente a la izquierda del string: B0110 1011, O153 y X6b.
Atencin: un nmero expresado en octal es asociado a 3 bits, mientras que uno en hexa, se asocia a
4, por lo cual las expresiones anteriores, como nmeros, no son equivalentes.
7.- Los operadores pueden ser de cinco tipos:
* aritmticos
* relacionales
* lgicos
* de desplazamiento
OPERACIN
suma
resta
producto
cociente
exponente
MOD
REM
ABS
mdulo
resto
valor absoluto
* otro tipo
OPERADOR
=
/=
>
>=
<
<=
fig. 8
OPERACIN
igualdad
distinto
mayor que
mayor o igual
menor que
menor o igual (y
asign seales)
fig. 9
fig. 10
OPERADOR
OPERACIN
SLL
desplazamiento lgico a la izquierda
SRL
desplazamiento lgico a la derecha
SLA
desplazamiento aritmtico a la izquierda
SRA
desplazamiento aritmtico a la derecha
ROL
rotacin a la izquierda
ROR
rotacin a la derecha
fig. 11
TCNICAS DIGITALES 1
Introduccin al VHDL
Rv. 15
Pg. 16/50
Ejemplos con los operadores de desplazamiento: dado un dato A cuyo valor inicial es 1100 1101, se
ver qu resultado arroja la compilacin en VHDL al ejecutarse las sentencias que se ilustran:
A SLL 4 --el resultado es 1101 0000 (se desplazan 4 bits a izquierda: 1100 salen de la palabra; 1101
se mueven a izquierda y sus lugares son ocupados por ceros que ingresan por la derecha)
A SRL 4 --el resultado es 0000 1100 (1101 salen; 1100 a la derecha; ingresan 4 ceros por izquierda)
A SLA 4 --el resultado es 1101 1111 (extensin del ltimo bit: similar a SSL pero el lugar de los bits
que se desplazan es ocupado por rplicas del ltimo bit que que se desplaz en negrita- )
A SRA 4 --el resultado es 1111 1100 (anlogo a SLA, en sentido contrario)
A ROL 4 --el resultado es 1101 1100 (cada bit desplazado sale de la palabra por la izquierda e ingresa
a ocupar los lugares dejados en blanco por la derecha)
A ROR 4 --el resultado es 1101 1100 (anlogo a ROL, en sentido contrario)
y finalmente, los otros operadores son:
OPERADOR OPERACIN
+
signo positivo
signo negativo
&
concatenacin
1.
2.
3.
4.
5.
6.
Atributos
Son caractersticas aplicables a algunos elementos del lenguaje que permiten obtener de ellos
informacin adicional. Entre los elementos que pueden tener atributos estn:
Entidades
Arquitecturas
Configuraciones
Paquetes
Subprogramas
Tipos y subtipos
Objetos
Componentes
Etiquetas
Literales
Unidades de un tipo fsico
TCNICAS DIGITALES 1
Introduccin al VHDL
Rv. 15
Pg. 17/50
devuelve
devuelve
devuelve
devuelve
devuelve
devuelve
devuelve
gray
sucesor
bcd
predecesor
bcd
equivale a izquierda
Johnson equivale a derecha
1 (*)
(las posiciones se numeran de izq a der empezando en 0)
xs3 (*) valor en la posicin 3
5
largo: cantidad de componentes del tipo
TCNICAS DIGITALES 1
Introduccin al VHDL
Rv. 15
Pg. 18/50
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
6
7
8
9
10
11
-entity comod is
port (dato : in std_logic_vector (3 downto 0);
dato_ham : out std_logic_vector (6 downto 0));
end comod;
--
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
begin
process (dato)
begin
ma(1)<=dato and "1101";
ma(2)<=dato and "1011";
ma(3)<=dato and "1110";
lazo_bitpar:
FOR i IN 1 TO 3 LOOP
paridad(i)<= ma(i)(3) xor ma(i)(2) xor ma(i)(1) xor ma(i)(0);
END LOOP lazo_bitpar;
dato_ham <= dato & paridad;
end process;
zona de paquetes: lo
que hay ac puede ser
visto por las entidades
y las arquitecturas
entidades: lo
declarado en ellas
se ve en las
arquitecturas
arquitecturas: lo
declarado en ellas es
visible slo en ellas
los procedimientos
declarados ac no
son infludos por
asignacin a seales
proceso: las
declaraciones en l slo
se ven en su interior
proceso: los
procedimientos
declarados en l slo
pueden influir en seales y
puertos del circuito
fig. 12
TCNICAS DIGITALES 1
Introduccin al VHDL
Rv. 15
Pg. 19/50
Se vern a continuacin diversos ejemplos donde se pondrn de manifiesto los diferentes tipos de
sentencias (concurrentes y secuenciales) y de descripciones.
C.A
Y
C
B
C.B
Y = C.B + C.A
1
2
3
4
5
6
7
8
9
10
11
C
0
0
0
0
1
1
1
1
fig. 13
B
0
0
1
1
0
0
1
1
A
0
1
0
1
0
1
0
1
C.B /C.A
1
1
1
1
comentario (ttulo)
bloque de "packages"
entidad
arquitectura
La lnea 10 muestra la asignacin simple. Una seal (en este caso un puerto del circuito) se le
asigna el estado que debe tomar por medio de una expresin lgica.
Este es un ejemplo de descripcin por comportamiento.
Algunas preguntas
- por qu se ponen C and B entre parntesis ?
- qu sucedera si se hubiera definido la salida Y como tipo BIT?
Una vez compilada la descripcin anterior, el
Quartus II entrega un esquema circuital a nivel de
Transferencia entre registros (RTL) de cmo
interpret las sentencias includas en ella. La
misma adems es funcin de los componentes
que tiene el dispositivo programable seleccionado
cuando se corri la compilacin.
0
1
Aparecen en este ejemplo un nuevo tipo de datos que es std_logic. stos estn definidos en la:
TCNICAS DIGITALES 1
Introduccin al VHDL
Rv. 15
Pg. 20/50
donde expresin_j representa tanto un valor, como una expresin lgica o de otro tipo que permita
generar un valor o estado que se asigna a la seal en cuestin.
boolean expresin_j es la condicin que debe cumplirse para tal asignacin. Es booleana pues lo que
dice la expresin admite slo dos posibilidades: es Verdadera o Falsa. Si es verdad, se produce la
asignacin. De no cumplirse, se evala(n) la(s) expresin(es) que sigue(n). Es decir, hay una
priorizacin en la consideracin de las condiciones.
La estructura de la sentencia presentada arriba tiene un correlato ms entendible en el siguiente:
signal
El tipo de sentencias condicionales en VHDL, es conveniente que contemplen todas las posibilidades
de valores o estados que pueda tomar una variable (en este caso, la expresin_j) Por ello no debe
omitirse el else.
Las condiciones no necesariamente deben ser excluyentes entre ellas; se ejecutan slo las
sentencias que involucran el valor correspondiente a la primer condicin satisfecha. Por ello el orden
en que se ordenan las condiciones es el que da la prioridad con que se asignar valor a la seal.
TCNICAS DIGITALES 1
Introduccin al VHDL
Rv. 15
Pg. 21/50
Ejemplo 5:
-- Suma de Productos sencillo en forma concurrente condicional
library ieee; use ieee.std_logic_1164.all;
-entity sum_prod is --mux_2in_concucond.txt
port (A,B,C : in std_logic;
Y: out std_logic);
end sum_prod;
-architecture concucondi of sum_prod is
begin
Y <= A when C='0' else B;
end concucondi;
C
0
0
0
0
1
1
1
1
B
0
0
1
1
0
0
1
1
A
0
1
0
1
0
1
0
1
Y
0
1
0
1
0
0
1
1
C=0
X=A
C=1
X=B
Tratndose de puertos que manejan seales del tipo std_logic, los estados que pueden asumir no se
limitan a 0 y 1. Una posibilidad es la que se plantea en la pregunta. En este caso se puede asignar
un valor desconocido a la salida, para lo cual al ejemplo anterior se lo debera modificar as:
-architecture concucondi of sum_prod is
begin
Y <= A WHEN C='0' ELSE
B WHEN C='1' ELSE 'X';
end concucondi;
Las condiciones a cumplir pueden ser una expresin o valor simple, un rango de valores o un grupo
de valores distintos sin ningn orden entre ellos. La sentencia WHEN en ese caso puede adoptar las
siguientes formas:
- When valor ... (es lo visto hasta ahora)
- When valor1 a valor n (cuando la condicin toma un rango de valores contnuos)
- When valor 1 | valor 3 | valor k (cuando la condicin toma unos valores especficos)
* Procesos concurrentes con asignacin seleccionada
Se utiliza la sentencia WITH .... SELECT ... WHEN cuya estructura es:
WITH expressin SELECT
signal <= expression1
expression2
expressionN
que significa que de acuerdo al valor constante_j que toma una expresin, se asigna a una seal la
expresin_j de entre varias diferentes.
Otra forma de presentar el formato de esta sentencia es:
WITH expresin SELECT
signal <= valor1 WHEN valor de expresin1
valor2 WHEN valor de expresin2
valorN WHEN valor de expresinN
TCNICAS DIGITALES 1
Introduccin al VHDL
Rv. 15
Pg. 22/50
Ejemplo 6:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Ejemplo 7: se introduce una variante que contempla el caso de que C no sea slo 0 1.
Por ello la sentencia with .... select cambia como se ver:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
En este ejemplo, la lnea 14 utiliza la palabra others para denotar todos los otros 8 valores de C que
no sean el ya considerado C=0 (cual es C=1, o bien cualquiera de los otros estados previstos en el
std_logic como 0 y 1 dbiles, desconocidos fuertes y dbiles, etc)
WITH .... SELECT ... WHEN se aplica a casos donde los valor de expresin_j son mutuamente
excluyentes. Esto lo hace til para representar tablas de verdad.
TCNICAS DIGITALES 1
Introduccin al VHDL
Rv. 15
Pg. 23/50
Y
1
1
arch. sumaprod_cba_y.vwf
C
B
A
Y~0
C
B
Mux0
A
ABC[0..2]
SEL[2..0]
8' hCA --
DATA[7..0]
OUT
MUX
Como se vi ms arriba se puede abreviar la asignacin a Y que se repite para varias combinaciones
de CBA utilizando el operador | (operador o)
13.
14.
17.
Si en este ejemplo se hubiera utilizado la notacin binaria, tambin la hubiera interpretado bien:
12. with CBA select
13.
Y <= '0' when B"000", '1' when B"001", --etctera
TCNICAS DIGITALES 1
Introduccin al VHDL
Rv. 15
Pg. 24/50
[process_label:]
[POSTPONED] PROCESS [(signal1, signal2, signal3)] [IS]
-- Local variables
VARIABLE variable1 : STD_LOGIC;
VARIABLE variable2 : STD_LOGIC;
BEGIN
-- Signal Assignment Statement (optional)
-- Variable Assignment Statement (opt.)
-- Procedure Call Statement (optional)
-- If Statement (optional)
-- Case Statement (optional)
-- Loop Statement (optional)
END [POSTPONED] PROCESS [process_label];
Entre parntesis aparece la denominada lista sensible; es el conjunto de seales que disparan el
proceso: cuando una de ellas cambia, se ejecutan las instrucciones contenidas en l. Las variables,
como se ve en la plantilla, se declaran dentro del process. Cuando se ejecuta la sentencia, se evalan
y se actualizan sus valores, y stos pueden ser utilizados por la lnea siguiente de sentencias del
programa. No se puede utilizar una variable fuera del Process (no son visibles fuera de l; si se
necesita su valor o estado, se usar una seal a quien la variable le transfiere el mismo).
Si se utilizan seales dentro de un process, se actualizan al finalizar el mismo. Si se hacen mltiples
lineas de asignacin a una misma seal, se actualizan todas a la vez al finalizar el proceso, (no como
las variables que lo hacen en cada rengln de sentencia) por lo tanto asumirn el estado de la ltima
asignacin. Las seales se declaran en la arquitectura antes del process y antes del begin. A
diferencia de las variables, una seal en un process es visible fuera de l.
Uso de la sentencia WAIT dentro de un Process
Si un proceso no tiene lista sensible, debe incorporarse una sentencia WAIT (espera) que detiene el
proceso hasta que:
- se produzca un cambio en una o ms seales dadas en una lista.
- se produzca una condicin o
- transcurra un tiempo
TCNICAS DIGITALES 1
Introduccin al VHDL
Rv. 15
Pg. 25/50
[identificador:]
WAIT [ON lista sensible] [UNTIL condicin] [FOR lapso de tiempo]
Ejemplo:
WAIT ON clock;
WAIT UNTIL clock =1 ;
WAIT FOR 10 us ;
Se pueden usar combinadas:
TCNICAS DIGITALES 1
Introduccin al VHDL
Rv. 15
Pg. 26/50
Otro ejemplo: Ahora considrese a d como variable. Suponer los mismos valores iniciales antes del
inicio de un ciclo de simulacin: b=2, c=3, d=1
...
architecture secuencia of ejemplo is
signal s1, s2, b, c : integer;
-- se declaran cuatro seales integer
begin
proce1:
-- esta es una etiqueta
process (b,c)
-- no aparecen las variables en la lista sensible
begin
d :=c;
-- d toma el valor de c (=3); aunque se actualice al final, ya queda
disponible para su uso en las siguientes sentencias
s1<= d+5;
-- se asigna el valor 3+5 = 8 a s1 (se actualiza al final del ciclo)
d :=b;
-- d cambia su valor a 2 (se sobreescribe) y queda disponible para
su uso en las siguientes sentencias
s2 <= d+1;
-- se asigna el valor 2+1 = 3 a S2 (se actualiza al final del ciclo)
end process proce1;
al terminar el proceso se actualizan las seales s1, s2; la
variable d queda con el ltimo valor asignado (=2) que se
utiliz para asignar a s2, pero se hizo uso de la primer
asignacin (d=3) para calcular s1. Por ello s1 = 2+5 = 7 y
s2 = 2+1 = 3. Finalizado el ciclo b y c no cambian por lo
tanto se termina la simulacin ya que las seales de la lista
sensible no cambian y no vuelve a ejecutarse el Process.
Multiplexor de 2 canales en forma secuencial seleccionada: Un multiplexor es un dispositivo que
permite volcar las informaciones que llegan por mltiples canales de entrada a una nica salida,
mediante entradas adicionales denominadas de seleccin.
En la figura de la izquierda se esquematiza un Multiplexor
(Mux) de dos entradas.
Mediante la entrada S se selecciona cul de las entradas
pasa a la salida. Si S=0 se puede ver que la columna Y
replica a A, o sea A pasa a la salida. En cambio si S=1, es
B la que pasa a la salida.
Ahora bien, si se denominara C la entrada S, queda la tabla
que se ha venido analizando hasta ac (a la derecha), de
donde se desprende que el circuito ya visto representa el
esquema interno de un multiplexor de dos canales.
MUX
B
Y
A
C.B
S
0
0
0
0
1
1
1
1
B
0
0
1
1
0
0
1
1
A
0
1
0
1
0
1
0
1
Y
0
1
0
1
0
0
1
1
C.A
C
0
0
0
0
1
1
1
1
B
0
0
1
1
0
0
1
1
A
0
1
0
1
0
1
0
1
Y
0
1
0
1
0
0
1
1
TCNICAS DIGITALES 1
Introduccin al VHDL
Rv. 15
Pg. 27/50
CASE cba IS
WHEN "000" => Y <='0'; -- el smbolo => significa se hace
WHEN "001" => Y <='1'; --(se us sumaprod_2niv_secusele.txt en el
WHEN "010" => Y <='0'; -- proyecto sumaprod_2niv que aparece como
WHEN "011" => Y <='1'; -- comod en el quartus y comod_mux2in.qwf para
WHEN "100" => Y <='0'; -- simular)
WHEN "101" => Y <='0';
WHEN "110" => Y <='1';
WHEN others => Y <='1'; -- notar el uso de when others para cubrir los 722 valores
END CASE;
-- restantes que pueden tomar las entradas
end process keis ;
end secusele;
se puede comparar este ejemplo con el equivalente hecho con sentencias concurrentes (Ejemplo 8)
la simulacin arroja:
Mux0
Mux0~0
CBA[2..0]
SEL[2..0]
8' hCA --
DATA[7..0]
OUT
CBA[0..2]
MUX
2) el post-mapping es:
Mux0~0
CBA[0..2]
DATAB
DATAC
COMBOUT
DATAD
LOGIC_CELL_COMB (F3C0)
CASE expressin IS
WHEN constant_value1 => statement1;
statement2;
WHEN constant_value2 => statement3;
statement4;
WHEN OTHERS => statement5;
statement6;
END CASE;
Case es ms potente que el WITH ... SELECT pues cada valor evaluado de la expresin puede
derivar en ms de una instruccin, mientras que en la sentencia concurrente derivaba en una sola.
En el CASE no se pueden duplicar los casos pues se produce error. Tambien como se ve, al igual
que con With ... select, deben contemplarse todos los casos posibles de la expresin, por lo cual es
conveniente el uso del Others para agrupar en uno solo todos los casos no considerados
previamente.
TCNICAS DIGITALES 1
Introduccin al VHDL
Rv. 15
Hay diversas formas para escribir los casos en base a los cuales se seleccionan el
grupo de instrucciones a ejecutar. Si la seleccin se hace en base a un dato o
condicin nica, se consigna sta.
Cuando los datos o condiciones son mltiples se puede utilizar un rango de valores
(creciente o decreciente mediante el uso de las palabras TO o DOWNTO)
Ejemplo genrico: sea un circuito de una entrada ent y una salida Y, que debe
cumplir lo indicado en la TdeV siguiente
ejem_case:
CASE ent IS
when 0 to 2 => y <= 0;
when 3 | 4 => y <= E;
when 5
=> y <= 0;
when 9 downto 6 => y <= 1;
when others => y <= Z;
END CASE ejem_case;
Pg. 28/50
ent
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Y
0
0
0
E
E
0
1
1
1
1
Z
Z
Z
Z
Z
Z
begin
mux: process (A, B, C) is
begin
CASE C IS
WHEN '0' => Y<=A;
WHEN others => Y<=B;
END CASE;
end process mux;
end sec_sel;
library ieee;
use ieee.std_logic_1164.all;
entity sum_prod is
port (A,B,C : in std_logic;
Y: out std_logic);
end sum_prod;
architecture secucondi of sum_prod is
begin
process (A, B, C) is -- no tiene etiqueta el proceso
begin
IF C='0' THEN Y<=A;
ELSIF C ='1' THEN Y<=B;
ELSE Y <= 'X';
END IF;
end process;
-- no lleva etiqueta al final tampoco
end secucondi;
Nota: a propsito de los renglones 12 y 13, hay que prestar atencin al escribir las sentencias. Un
error muy comn es confundir el operador de relacin (=) con los operadores de asignacin a seales
o variables (<= o :=) . Otra equivocacin se produce al confundir C = 0 (C es un bit o un std_logic)
con C = 0 (sin entrecomillar), donde C es un integer.
TCNICAS DIGITALES 1
Introduccin al VHDL
Rv. 15
Pg. 29/50
IF expression1 THEN
statement1;
statement2;
ELSIF expression2 THEN
statement3; statement4;
ELSE
statement5;
statement6;
END IF;
V
Y
C
B
Y = V + W = C.B + C.A
TCNICAS DIGITALES 1
Introduccin al VHDL
Rv. 15
Pg. 30/50
Un par de preguntas:
*que tipo de proceso es? R= implicito
fig. 14
En sntesis:
op1 & op2 = op1
op1 = uns (sig) ; op2 = uns, nat (sig, int)
op1 # op2 = boolean
& operaciones + - * / rem y mod (los dems smbolos, son los ya vistos)
TCNICAS DIGITALES 1
Introduccin al VHDL
Rv. 15
Pg. 31/50
Los tipos signed representan valores numricos signados que pueden ser positivos, cero o negativos.
El compilador interpreta cada tipo signed como una representacin binaria en complemento a 2; el bit
extremo izquierdo indica si el valor es positivo o negativo.
Ejemplos:
signed("0110") representa +6 ;
signed("1010") representa -6
- UNSIGNED (sig)
- SIGNED (slv)
- UNSIGNED (slv)
- Std_Logic_Vector (arg)
TCNICAS DIGITALES 1
Introduccin al VHDL
Rv. 15
Pg. 32/50
(std_logic_vector)
nat
aik
Proceso 1
Proceso 2
num_bcd
(integer)
Proceso 3
num_aik
(integer)
Entity
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
D
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
Natural
C B A
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
V
0
0
0
0
0
1
1
1
1
1
X
X
X
X
X
X
Aiken
X Y
0 0
0 0
0 1
0 1
1 0
0 1
1 0
1 0
1 1
1 1
X X
X X
X X
X X
X X
X X
Z
0
1
0
1
0
1
0
1
0
1
X
X
X
X
X
X
Esta arquitectura se basa en convertir las palabras de entrada al equivalente numrico del vector de
entrada para generar un dato intermedio que sea la suma de ese valor a 6 cuando el dato de entrada
vale ms de cuatro. Pero luego es necesario pasar el valor entero obtenido a formato vector de bits,
pues as est definida la salida.
1 --uso del paquete numeric_std
2 library ieee;
3 use ieee.std_logic_1164.all;
4 use ieee.numeric_std.all;
5 entity bnat2aik is
6 port ( nat : in std_logic_vector (3 downto 0);
7
aik : out std_logic_vector (3 downto 0));
8 end bnat2aik;
9 architecture num_std of bnat2aik is
10 signal num_bcd, num_aik : integer;
11 begin
12 num_bcd <= to_integer (unsigned (nat));
13 num_aik <= num_bcd when num_bcd < 5 else (num_bcd+6);
14 aik <= std_logic_vector (to_unsigned(num_aik,4));
15 end num_std;
TCNICAS DIGITALES 1
Introduccin al VHDL
Rv. 15
Pg. 33/50
nat[3..0]
31' h00000003 --
B[30..0]
num_aik~[2..0]
SEL
DATAA
DATAB
OUT0
aik[3..0]
ADDER
LessThan0
32' h00000005 --
B[31..0]
MUX21
<
LESS_THAN
y la vista tecnolgica:
num_aik~2
nat[0..3]
aik[0..3]
num_aik~1
num_aik~0
TCNICAS DIGITALES 1
Introduccin al VHDL
Rv. 15
Pg. 34/50
Ejemplo 16: Conversor BCD natural a Aiken con creacin de tipo de datos
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Los elementos no especificados en la entidad que forman parte de la arquitectura deben declararse
en sta antes de comenzar (begin) a construirla. En este caso se declara un tipo de datos (codigo) y
un objeto (la constante Aiken).
Comentarios sobre algunos renglones de la descripcin:
10: se cre el tipo cdigo: es un array de vectores (array de dos dimensiones 1D x 1D) = 16
palabras por 4 elementos std logic. En sntesis, es una tabla.
11: se define una constante Aiken, como tipo cdigo. O sea Aiken es una tabla de los 16 nmeros
binarios naturales que se forman con 4 bits.
- Ex-profeso, se escriben sus valores como string y en notacin hexadecimal.
- Atencin: como cdigo es un tipo de datos de 16 valores, al escribir la constante aiken, deben
escribirse 16 valores. Se quiso asignar a las 6 palabras no Aiken el valor 0000. Una forma simple
emplea la instruccin others => que significa a los restantes (otros) se les asigna el valor
TCNICAS DIGITALES 1
Introduccin al VHDL
Rv. 15
Pg. 35/50
13: la salida sal toma el valor de aiken en la posicin dada por un entero igual al binario
representado por el array con valor numrico que surge de pasar a unsigned el vector de std_logic de
la seal de entrada (ent); p.ej, si ent = 0110, al ejecutarse (unsigned(ent) el compilador lo lee como
el nmero natural 6; luego aiken en la posicin 6 es el dato hexadecimal B, que es el array 1011,
o sea es un array de bits, que es la caracterstica que tiene un std_logic_vector.
Manejo de datos
Se presentan a continuacin algunos datos que se expresan en una dimensin (el caso de un vector
de elementos), en una dimensin por una dimensin (sera el caso de un vector de vectores) y en dos
dimensiones (tienen la apariencia del anterior pero los elementos se ubican individualmente en funcin
de dos coordenadas). Para hacer un ejemplo se crean los siguientes tipos:
type word is array (3 downto 0) of std_logic;
2
1
1
1
0
0
0
0
0
0
0
0
0
0
1
0
1
0
G, H
1
1
1
1
0
1
14
G15 H0
0
...
1
1
1
0
0
0
0
1
0
1
1
1
0
1
G0 H15
G(1) = H(14) ;
G(3) = F ;
G(3)(1) = H(12)(1) = F(1) ;
H(1) = E ;
G(14) = E ;
H(1)(0) = E(0) = J(14,0) ;
0
0
1
1
1
2
0
0
...
1
1
1
1
2
15
0
1
13
14
15
Gray =
Binario = 0 =
0 = 1 = 1
TCNICAS DIGITALES 1
Introduccin al VHDL
Rv. 15
Pg. 36/50
Para identificar un bit en particular de un vector, se lo invoca con el nombre y entre parntesis la
posicin del bit buscado: ent(2) = bit del vector ent en la posicin 2 (como fue definido es la 2da.
ms significativa).
Al simular la descripcin anterior se obtiene::
Haciendo un repaso de aspectos vistos, podr el lector indicar por qu son equivalentes estas:
10
11
12
13
14
15
begin
ssal (3) <= ent(3);
ssal (2) <= ent(2) xor ssal(3);
ssal (1) <= ent(1) xor ssal(2);
ssal (0) <= ent(0) xor ssal(1);
sal <= ssal;
10
11
12
13
14
15
begin
ssal (0) <= ent(0) xor ssal(1);
ssal (1) <= ent(1) xor ssal(2);
ssal (2) <= ent(2) xor ssal(3);
ssal (3) <= ent(3);
sal <= ssal;
R = Porque se trata de asignaciones simples que son concurrentes y como tal se ejecutan
simultneamente, y no una despus de otra. Supngase ahora hacer lo mismo pero con variables:
architecture comporta of gray2bin is
signal ssal : std_logic_vector (3 downto 0);
begin
process(ent)
variable vsal : std_logic_vector (3 downto 0);
begin
vsal(3) := ent(3);
vsal(2) := ent(2) xor vsal(3);
vsal(1) := ent(1) xor vsal(2);
vsal(0) := ent(0) xor vsal(1);
end process;
sal<=vsal;
Ejemplo 18: Conversor de Cdigo Gray a Cdigo binario operando sobre vectores
TCNICAS DIGITALES 1
Introduccin al VHDL
DISEO ESTRUCTURAL :
Rv. 15
Pg. 37/50
A3
A2
A1
A0
B3
B2
B1
B0
A.B=
Instanciacin de componentes
Para algunos diseos puede ser de utilidad definir un componente que se va a reiterar en la
descripcin y llamarlo cuantas veces sea necesario adaptando eventualmente los nombres de las
seales que van a corresponder a sus entradas y salidas.
Ejemplo 19: describir un Mux de 2 canales en base a instancias de una Nand de 2 entradas
--Multiplexor con instanciacin de componentes
LIBRARY ieee;
USE ieee.std_logic_1164.all;
-------ENTITY mux_2ent is
PORT (A, B, C : IN std_logic;
Y: OUT std_logic);
END mux_2ent ;
-------ARCHITECTURE instancia OF mux_2ent is
COMPONENT Nand2pref
PORT (i1,i2 : IN std_logic;
o : OUT std_logic);
END component;
SIGNAL Cneg, V, W : std_logic;
BEGIN
Cneg <= NOT C;
Nand1 : Nand2pref
PORT MAP (i1=>A, i2=>Cneg, o=>V);
Nand2: Nand2pref
PORT MAP (i1=>B, i2=>C, o=>W);
Nand3: Nand2pref
PORT MAP (i1=>V, i2=>W, o=>Y);
END instancia;
i1
o
i2
Nand2pref
A
C
B
i1 Nand1
o
i2
V i1
o Y
i2
i1
o
Nand3
i2
W
Nand2
Y = C.B + C.A
i1
i2
i1
i2
C
V i1
i2
o Y
o
W
Y = C.B + C.A
TCNICAS DIGITALES 1
Introduccin al VHDL
Rv. 15
Pg. 38/50
-- Definicin de la entidad
ENTITY Nand2pref IS
PORT (i1, i2 : IN
std_logic;
o : OUT std_logic);
END Nand2pref;
ARCHITECTURE comportamiento OF Nand2pref IS
BEGIN
o <= i1 NAND i2;
END comportamiento;
Cmo se entienden algunas sentencias de la arquitectura:
Nand1 : Nand2pref
significa que se abre la primer instancia del componente Nand2pref y se la llama Nand1.
Luego debe establecerse como se conectan las entradas y salidas de ese componente.
Para ello se incorpora la sentencia Port Map (mapa de puertos)
PORT MAP (i1=>A, i2=>Cneg, o=>V);
Mux_16ent
Mux4pref
ent(15)
I3
I2
I1 3 O
I0
A1 A0
Out3
sal
TCNICAS DIGITALES 1
Introduccin al VHDL
Rv. 15
Pg. 39/50
Sentencias iterativas
En algunos casos puede ser til disponer de sentencias que permitan la reiteracin de pasos o de
partes del programa una determinada cantidad de veces. Las hay del tipo concurrente y tambin
secuenciales, o sea van escritas dentro de un Proceso.
Ejemplo 21:
TCNICAS DIGITALES 1
Introduccin al VHDL
Rv. 15
Pg. 40/50
Esta sentencia genera la repeticin de la porcin de cdigo comprendida entre FOR ... GENERATE y
END GENERATE, un nmero de veces dado por el rango de la sentencia (igual a la diferencia de
valores extremos del rango). Lleva necesariamente un rtulo, etiqueta o label.
Precauciones del For Generate: generalmente no es sintetizable. Hay que prestar atencin de no
hacer mltiples asignaciones a una misma seal. El rango puede ir de menos a ms o viceversa. No
pueden utilizarse valores no estticos como extremos del rango (por ejemplo el valor de una seal,
variable, o puerto). S se puede utilizar un generic (ver ejemplo ms adelante).
el diagrama RTL del diseo es:
mux4_pref:Muxn3
mux4_pref:Muxn4
ent[15..0]
dir[3..0]
I[3..0]
A[1..0]
O
I[3..0]
mux4_pref:Muxn2
I[3..0]
A[1..0]
A[1..0]
mux4_pref:Muxn1
I[3..0]
A[1..0]
Cada rectngulo
contiene:
O
Mux0
A[1..0]
I[3..0]
mux4_pref:Muxn0
I[3..0]
A[1..0]
sal
SEL[1..0]
DATA[3..0]
OUT
MUX
TCNICAS DIGITALES 1
Introduccin al VHDL
Rv. 15
Pg. 41/50
Se propone un ejemplo de uso en la descripcin de otros circuitos que surgen como una aplicacin
especfica de lgica combinacional.
Codificadores
Un codificador es un dispositivo lgico que
detecta una seal activa en una de sus
entradas (numeradas decimalmente) y coloca
en sus salidas el cdigo binario correspondiente
al nmero de esa entrada. (1)
Un codificador ms completo debe incluir lo
siguiente (2):
I3
I2
I1
I0
I3
I2
I1
I0
O1
O0
CODER
Ei
O1
O0
CODER
I3 I2 I1 I0 O1 O0
(1)
0
0
0
1
0
0
1
0
0
1
0
0
1
0
0
0
0
0
1
1
0
1
0
1
Eo
GS
Ei I3 I2 I1 I0 O1 O0 GS Eo
(2)
0
1
1
1
1
1
X
0
0
0
0
1
X
0
0
0
1
X
X
0
0
1
X
X
X
0
1
X
X
X
0
0
0
0
1
1
0
0
0
1
0
1
0
0
1
1
1
1
0
1
0
0
0
0
Comentarios:
El lazo while (15) establece que
mientras el bit en la posicin (i) del
vector de entrada sea cero, ejecute
las instrucciones del lazo, (una en
este caso -16-) que consiste en
decrementar el valor de la variable i y
vuelve a ejecutar el lazo, en este
caso examinando ahora la entrada (i1). En cuanto encuentre un bit = 1 considrese en un paso j - como el
orden en que la descripcin
considera a las entradas es de mayor
a menor, tendr prioridad respecto de
otros 1 que pudieran aparecer en
los pasos siguientes, por lo que debe
proceder a sallir del lazo (17) y
colocar a la salida el cdigo binario
correspondiente a j (19).
TCNICAS DIGITALES 1
Introduccin al VHDL
Rv. 15
Pg. 42/50
Funciones de Resolucin
Cuando dos seales std_logic se asignan simultneamente a una tercera, puede haber conflicto entre
ellas (como interconectar la salida de dos compuertas entre ellas, cuando una est en uno y la otra en
cero). El VHDL soluciona estos inconvenientes definiendo funciones de resolucin, que pautan el
estado que tomar una seal cuando se produce un conflicto en su asignacin. El resultado se
puede ilustrar en la tabla que se muestra a continuacin. Para entenderla, se parte de la base de que
una seal no inicializada (U) tendr preeminencia sobre cualquier otra con la que confluya. Con una
prioridad menor estarn las seales asignadas con un valor desconocido (X). Se puede entender esto
si se pregunta: Qu estado surge en un circuito en el que confluyen al mismo cable un estado
desconocido y un 1 (o un 0) lgico? La respuesta es: no se
U X 0 1 Z W L H puede asegurar, es decir, resulta en otro estado desconocido, o
U
U U U U U U U U U
sea ste prevalece al uno (o al cero). Resulta aceptable que
X
U
X X X X X X X X
los estados fuertes (X, O, 1) prevalecern sobre los dbiles (W,
0 U X 0 X 0 0 0 0 X
L, H). Por otra parte, el estado de alta impedancia (Z) ser el
1 U X X 1 1 1 1 1 X
ms dbil de todos.
Z U X 0 1 Z W L H X
Finalmente, el dont care (-), o no importa el valor que tome,
W U X 0 1 W W W W X
en colisin con cualquier otro, genera una situacin similar a la
L U X 0 1 L W L W X
colisin que provoca un estado desconocido (X).
H U X 0 1 H W W H X
-
U X
TCNICAS DIGITALES 1
VARIABLES
Son datos en memoria, se usan para proceso
de informacin
Se declaran dentro del Process antes del begin
Cuando se ejecuta una sentencia, se evalan y
se actualizan sus valores y pueden ser
utilizados por la lnea siguiente de sentencias
Son locales al Process; no se pueden usar
fuera de l (debe copiarse su valor a una seal)
Si se hacen mltiples lineas de asigna cin a la
misma variable, vale la ltima
Introduccin al VHDL
Rv. 15
Pg. 43/50
SEALES
Estn asociadas al hardware. Son lneas de
conexin
Se declaran en la arquitectura antes del begin
Las seales dentro de un process, se
actualizan al finalizar el mismo (no pueden ser
usadas en lineas subsiguientes dentro de l)
Son visibles fuera del process (de hecho se
usan para transferir los valores de las variables)
Si se hacen mltiples lineas de asignacin a
una misma seal, vale la ltima
Atencin: mltiples asignaciones a una misma
seal fuera de un process = ERROR
-- (en la entidad se declararon a, b entradas y sal, sal0 salidas todas tipo std_logic)
architecture concu_vs_secu of comod is
signal s1, s2 : std_logic;
-- se declaran un par de seales
begin
proce1:
-- esta es una etiqueta
process (a, b) is
-- se inicia una sentencia concurrente
variable v1, v2 : integer range 2 to 15;
--se declaran 2 variables
begin
v1 := 3; v2 := 4;
-- se inicializan las variables
v1 := v1 + 2;
-- v1 valdr 5 luego de ejecutarse esta sentencia
v2 := v1 + v2;
-- v2 valdr 9 luego de ejecutarse esta sentencia
s1 <= a;
-- se asigna un valor a S1
s1 <= b;
-- se asigna otro valor a s1 (valdr este ltimo, no hay conflicto)
end process proce1;
proce2:
process (a,b) is
-- arranca un nuevo proceso
begin
s2 <= a;
-- se asigna un nuevo valor a s1. Al ejecutarse proce2
s1 <= s2;
-- surgir conflicto con el valor asignado
end process proce2;
sal <= s1;
sal0 <= s1 and s2;
end concu_vs_secu;
TCNICAS DIGITALES 1
Introduccin al VHDL
Rv. 15
Pg. 44/50
Finalmente, cmo se procede si se quiere extraer fuera de un Process el valor de una variable?
Las variables se resuelven dentro de un Process. No pueden ser ledas fuera de ellos. De ser
necesario, debe asignarse su valor a una seal creada o a crear a tal efecto.
Ejemplo 24:
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
-- (en la entidad se declararon sal1, sal2 salidas tipo integer y sal3 salida tipo std_logic)
architecture concu_vs_secu of algo is
-- se declaran un par de seales
signal s1, s2 : std_logic;
-- se declaran dos nuevas seales
signal sig1, sig2: integer range 0 to 15;
begin
--(sigue prxima hoja)
proce1: process (a, b) is
-- se inicia una sentencia concurrente
-- se declaran un par de variables
variable v1, v2 : integer range 0 to 15;
begin
v1 := 3; v2:= 4
-- se inicializan las variables
v1 := v1 + 2 ;
-- v1 valdr 5 luego de ejecutarse esta sentencia
v2 := v2 + v1;
-- v2 valdr 9 luego de ejecutarse esta sentencia
s1 <= a;
-- se asigna valor a S1
s1 <= b;
-- se asigna otro valor a s1 (valdr este ltimo, no hay conflicto)
sig1 <= v1;
-- se transfiere el valor de V1 a la seal sig1
-- al terminar el proceso se actualizan los valores de v1, v2, s1 y sel1
end proce1;
-- se transfiere el valor que tena v1, a travs de sig1, a la salida sal1
sal1 <= sig1;
sal2 <= v2;
-- habr indicacin de error. Fuera del process no se reconoce a V2
sal3 <= s1;
-- s1 es una seal, puede leerse fuera de un process (igual que sig1)
...
access
after alias all
and
architecture array asser attribute
begin block body buffer bus
case component configuration constant
disconnect downto
else elsif end entity exit
file
for
function
generate
generic
guarded
if
in
inout is
label library linkage
loop
map mod
nand new next nor
not
null
of
on
open or
others out
package
port procedure
process
range record register
rem report return
select severity
signal subtype
then to
transport
type
units until use
variable
wait when while with
xor
TCNICAS DIGITALES 1
Introduccin al VHDL
Rv. 15
Pg. 45/50
Paquete
Numeric_std
sig, int
vs.
sig
Std_logic_unsigned
slv
uns,
nat
boolean
sig, int
+
slv
slv
boolean
vs significa operacin de
comparacin
op1, slv
int (*)
sul/sl
vs.
slv
int
Std_logic_arith
uns,sig
sig
slv=std_logic_vector
sul=std_ulogic
sl = std_logic
uns
sig
uns,sig
int,
sul, sl
op1, slv
uns,sig
vs.
op.1,
int
boolean
int = integer
uns= unsigned
sig = signed
nat = natural
op1 = tipo de dato del operando
del lado izquierdo
TCNICAS DIGITALES 1
Introduccin al VHDL
Rv. 15
Pg. 46/50
Secuenciales
Asignacin a seal
Signal <= expression;
Asignacin a seal seleccionada
- With ... Select
label:
WITH expressin SELECT
signal <= expression1 WHEN constant_value1,
expression2 WHEN constant_value2,
expressionN WHEN constant_valueN;
CASE expressin IS
WHEN constant_value1 => statement1; stamt2;
WHEN constant_value2 => statement3; stamt4;
WHEN OTHERS => statement5; statement6;
END CASE;
Asignacin condicional
When ... Else
- If then elsif/else
Lazos iterativos
- For ... Loop
loop_label:
generate_label:
FOR index_variable IN range_low TO range_high FOR index_variable IN range_low TO range_high
LOOP
GENERATE
statement1; statement2;
statement1; statement2;
END LOOP loop_label;
END GENERATE;
- If generate
generate_label:
IF expressin GENERATE
statement1;
statement2;
END GENERATE;
loop_label:
WHILE boolean_expressin LOOP
statement1;
statement2;
END LOOP loop_label;
Lazo simple
- Loop
LOOP
expresiones ;
END LOOP;
(necesita una sentencia exit para salir del lazo)
TCNICAS DIGITALES 1
Introduccin al VHDL
Rv. 15
Pg. 47/50
numeric_std
- TO_INTEGER (uns)
- TO_INTEGER (sig)
- TO_UNSIGNED (nat,n)
- TO_SIGNED (int,n)
Expresiones o valores entre parntesis representan los argumentos de la funcin de que se trate. Al presentar un
tipo de datos se incluye tambin la abreviatura con que se lo simboliza entre parntesis y con el signo =, para
diferenciarlo. P.ej. signed (=sig) [No confundir funcin SIGNED con tipo signed !!]. Cuando se presentan las
funciones de conversin se lo hace en maysculas; para los ejemplos pueden aparecer en minsculas.
TCNICAS DIGITALES 1
Introduccin al VHDL
Rv. 15
Pg. 48/50
numeric_std (cont.) - SIGNED (uns) => da un array de bits que equivale a un nmero entero
(argumento conserva valor numrico)
- signed (1110) => 1100 4 la apariencia es igual pero
diferente la forma en que es tomado por el programa
(pej se aprecia si se lo convierte a entero)
- UNSIGNED (sig) => da un array de bits que equivale a un nmero natural
(argumento conserva valor numrico)
- unsigned (1110) => 1100 (vale comentario anterior)
- SIGNED (slv)
=> convierte un vector en un entero
- signed (1110) => 1100 (idem)
- UNSIGNED (slv) => convierte un vector a su magnitud
- unsigned (1110) => 1100 (idem)
- STD_LOGIC_VECTOR (uns/sig) => pasa magnitud o entero a forma vector
- std_logic_vector (1110) => 1100 (idem)
Ejemplo: Sea CONSTANT A1 : std_logic_vector := 1110
B1 = unsigned (A1)
B2 = signed (A1)
=> B1 = 1110;
=> B2 = 1110;
Si se hace:
C1 = To_integer (B1) => C1 = 14
C2 = To_integer (B2) => C2 = -2
Si se hace:
B3 = signed (B1)
=> B3 = 1110 ;
B4 = unsigned (B2) => B4 = 1110 ;
Si se hace:
B5 = std_logic_vector (A2) => B5 = 1101
Si se hace:
C5 = To_integer (B5)
=> error
Si se hace:
B6 = Conv_integer (B5)
=> B6 = - 3
Si se hace:
B7 = std_logic_vector (A3) => B7 = 1101
Si se hace:
B8 = Conv_integer (B7)
=> B6 = - 3
Por qu los dos ltimos ejemplos dan igual? Porque al hacer la conversin de las constantes (de distinto
tipo) a std_logic_vector, se uniformiza su tipo: dejan de tener valor numrico para pasar a ser array de bits.
Debe quedar claro que: un dato tipo std_logic_vector es un vector de datos std_logic (datos lgicos que asumen
uno de nueve estados posibles); un vector de bits es un array de bits, que tienen significado lgico; un signed es
un array de bits con significado numrico como entero (el unsigned, como nmero natural pues es sin signo).
TCNICAS DIGITALES 1
Introduccin al VHDL
Rv. 15
Pg. 49/50
-----
TCNICAS DIGITALES 1
Introduccin al VHDL
Rv. 15
Pg. 50/50
======================================
TYPE enumerated_type_name IS (enum1, enum2,enum3);
TYPE range_type_name IS RANGE low_range TO high_range;
TYPE array_type_name IS ARRAY (INTEGER RANGE <>) OF type;
TYPE array_type_name IS ARRAY (high_range DOWNTO low_range) OF type;
==========================================
COMPONENT component_name
GENERIC(parameter1 : string := default_value1;
parameter2 : integer := default_value2);
PORT(input1, input2 : IN STD_LOGIC;
bidir1, bidir2 : INOUT STD_LOGIC;
output1, output2 : OUT STD_LOGIC);
END COMPONENT;
===========================================
instance_name : component_name
GENERIC MAP(parameter1 => value1,
parameter2 => value2)
PORT MAP(component_port1 => signal1,
component_port2 => signal2);
===========================================
label:
WITH expressin SELECT
signal <= expression1 WHEN constant_value1,
expression2 WHEN
constant_value2,
expressionM WHEN constant_valueM;
==========================================
label:
signal <= expression1 WHEN boolean_expression1 ELSE
expression2 WHEN boolean_expression2 ELSE
expression3;
==========================================
IF expression1 THEN
statement1;
statement2;
ELSIF expression2 THEN
statement3; statement4;
ELSE
statement5; statement6;
END IF;
==========================================
CASE expressin IS
WHEN constant_value1 => statement1;
statement2;
WHEN constant_value2 => statement3;
statement4;
WHEN OTHERS => statement5;
statement6;
END CASE;
==========================================
loop_label:
FOR index_variable IN range_low TO range_high LOOP
statement 1;
statement n;
END LOOP loop_label;
=========================================
loop_label:
WHILE boolean_expressin LOOP
statement1; statement2;
END LOOP loop_label;
================================================
Nota: recordar que estas son copias de plantillas modelo; sirven para abreviar la escritura. las sentencias que
en la arquitectura ms arriba comienzan con - - significa que son opcionales, y se muestran como ejemplo de
las que pueden integrar una arquitectura. Los modos de las seales de entrada salida y/o los tipos de datos,
tambin se ilustran como ejemplo, debiendo aplicarse los convenientes al diseo correspondiente.