Aspectos a revisar
1. Introducción al diseño con VHDL.
2. Unidades de diseño en VHDL.
3. Señales.
4. Especificación de la Interfaz.
5. Elementos de la Arquitectura.
6. Especificación del Comportamiento.
7. Múltiples procesos en una arquitectura.
8. Jerarquías de diseño en VHDL.
2 F. Santiago E.
4
VHDL es un lenguaje para la descripción de Hardware. Surge como una necesidad debido a que los métodos clásicos llegan a ser ineficientes en diseños complejos.
Antes de VHDL, los métodos de diseño se basaban en ecuaciones booleanas y esquemáticos.
Con ecuaciones Booleanas requiere de la escritura de una ecuación por cada flip-flop.
Es impráctico para circuitos con cientos de flip-flops.
Teóricamente cualquier sistema puede representarse con ecuaciones booleanas, pero tratar con miles de ellas no es factible.
Antes de VHDL
F. Santiago E.
5
El uso de esquemáticos amplía la capacidad de los métodos basados en ecuaciones, al aceptar bloques con funciones básicas (multiplexores, sumadores, memorias, etc.), además de compuertas y flip-flops.
Con la posibilidad de agregar nuevos módulos, se pueden manejar diseños jerárquicos acomodando más componentes con menos esfuerzo.
Es preferida por muchos diseñadores porque las representaciones gráficas muestran las relaciones entre diferentes bloques del diseño.
Fue considerado como un método óptimo para el diseño de sistemas digitales.
Antes de VHDL . . .
F. Santiago E.
6
El diseño de un sistema comienza con una descripción del comportamiento esperado. Con los métodos tradicionales, el resultado final no muestra los fundamentos sobre los cuales fue creado.
La verificación y modificaciones futuras llegan ser muy complicadas cuando un diseño sólo contiene información de sus interconexiones o se basa en un número grande de ecuaciones.
Tratar con cientos de ecuaciones es difícil, pero factible; sin embargo, si se trata de miles de ecuaciones llega a ser imposible.
Los sistemas actualmente contienen millones de compuertas (y sus densidades continúan creciendo), por lo que los métodos tradicionales ya no son suficientes.
Desventajas de los métodos tradicionales
F. Santiago E.
7
Los lenguajes para la descripción de Hardware eliminan la mayoría de las desventajas.
Su aplicación es directa en diferentes dispositivos programables:
PLD‟s de diferentes complejidades, desde los simples PALs hasta los complejos CPLD‟s.
FPGA‟s : Arreglos de Compuertas Programables en Campo.
Actualmente hay diferentes lenguajes HDL, los más populares son: CUPL, VHDL, Verilog y ABEL.
Lenguajes para la descripción de Hardware
F. Santiago E.
8
Descripción
Informal
Ecuaciones
Booleanas
Esquemático
Sintésis del
Circuito
Especificación en
VHDL
AN
TE
S D
E V
HD
L
CO
N V
HD
L
F. Santiago E.
9
Niveles de Descripción de Sistemas
ESTRUCTURA
SISTEMA
CHIPS
REGISTROS
COMPUERTAS
CIRCUITOS
SILICIO
COMPORTAMIENTO
Leyes de la física Objetos Geométricos
Ecuaciones diferenciales Transistores, R, L, C
Ecuaciones booleanas Compuertas, Flip-Flops
Tablas de transición de estados,
Tablas de verdad
Registros, multiplexores, ALU’s
Algoritmos, micro-operaciones
Respuesta I/O
mProcesadores, memorias,
dispositivos I/O
Especificación del rendimiento Sensores, elementos analógicos
o mecánicos
Se han sombreado los niveles que pueden ser descritos en VHDL.
F. Santiago E.
10
Es un acrónimo: “V” se toma por Very High Speed Integrated Circuit ( Circuito Integrado de muy alta velocidad), y HDL significa Lenguaje para la Descripción de Hardware.
VHDL es un lenguaje estandarizado (IEEE 1076-1993) utilizado para el diseño de sistemas digitales.
El lenguaje VHDL fue desarrollado por el DoD de USA, con el propósito de contar con un estándar para documentación, modelado y simulación de dispositivos electrónicos.
Los simuladores de VHDL surgen en los 90‟s.
VHDL no fue creado para síntesis, esta propiedad se le agregó al buscar formas que ayuden a automatizar los procesos de diseño.
¿ Qué es VHDL ?
F. Santiago E.
12
Cualquier sistema debe poder comunicarse con su ambiente....
Representaciones en VHDL
I / 0 Sistema
INTERFAZ CUERPO
F. Santiago E.
13
Un sistema sin interfaz es INÚTIL.
INTERFAZ CUERPO
La interfaz de un sistema en VHDL es descrita por su Entidad (Entity).
Así como no es posible tener un sistema sin Interfaz; en VHDL tampoco es posible tener un sistema sin una Entidad.
La Entidad de un sistema es Primordial para VHDL.
La Interfaz
F. Santiago E.
14
El Cuerpo
La funcionalidad del sistema se completa con el procesamiento de los datos de entrada, para la generación de resultados. Esta tarea se realiza en el cuerpo del sistema.
El cuerpo de un sistema es conocido en VHDL como su Arquitectura (Architecture).
La funcionalidad puede ser muy simple, como el encendido/apagado de un interruptor, o muy complicada, como el piloto automático de un avión.
Sin embargo, sin importar la sofisticación de un sistema, éste puede ser considerado como una composición de Interfaz y Cuerpo (Entidad y Arquitectura, en VHDL).
F. Santiago E.
15
A algunos sistemas se les pueden incorporar nuevas características por medio de elementos de soporte.
Un paquete ( Package ) incorpora nuevas definiciones o características a varios sistemas. Pueden re-utilizarse, por ello no se consideran como parte del cuerpo del sistema.
En conclusión, se tienen 3 unidades independientes de diseño: La interfaz, el cuerpo y los paquetes.
Paquetes
INTERFAZ
CUERPO
PAQUETE
F. Santiago E.
16
El diseño de un sistema inicia con el análisis de la relación que éste tendrá con su ambiente, es decir, inicia con la descripción de la Entidad.
En VHDL no es posible especificar un sistema si no se ha declarado su Entidad.
Todo lo que se especifique en una entidad es visible para las Arquitecturas asociadas con esa entidad.
El nombre del sistema corresponde con el nombre de la Entidad.
Unidad Principal de Diseño: La Entidad
Disco_duro
Entity Disco_duro is
. . . .
End Entity Disco_duro;
Cámara
Entity Camara is
. . . .
End Entity Camara;
F. Santiago E.
17
La entidad puede contener dos elementos:
Parámetros que serán conocidos por todo el sistema, por ejemplo: El ancho de un bus, la frecuencia máxima de operación, etc.
Conexiones a través de las cuales se transferirá la información hacia el exterior o interior del sistema.
Contenido de la Entidad
D0 D1 D2 D3 D4 D5 D6 D7
CLK
Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7
Entity Registro is
Ancho_Bus = 8
Fmax = 50 MHz
D : entrada ocho_bits
Q : salida ocho_bits
CLK : entrada un_bit
End Entity Registro;
Parámetros
Conexiones
F. Santiago E.
18
Los dos elementos de una interfaz (parámetros y conexiones) se declaran por separado en cada entidad :
Los Parámetros son datos “genéricos” y son conocidos automáticamente por el cuerpo del sistema.
Las Conexiones forman los “puertos” de entrada/salida.
Parámetros y Conexiones
D0 D1 D2 D3 D4 D5 D6 D7
CLK
Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7
Entity Registro is
generic (
Ancho_Bus = 8
Fmax = 50 MHz
);
port (
D : entrada ocho_bits
Q : salida ocho_bits
CLK : entrada un_bit
);
End Entity Registro;
F. Santiago E.
19
El Sistema A contiene 3 subsistemas: B, C y D. Y 8 líneas de conexión: TL1 a TL8:
Comprensión de la Interfaz
A
B
C D
TL7
TL6 TL8 TL5
TL4
TL3
TL2
TL1
1. ¿ Cuáles líneas son parte de la Interfaz de A ?
2. ¿ Qué líneas están en la interfaz de C y no están en la de A ?
3. ¿ Cómo sería la entidad de D ? (notar que no hay parámetros)
F. Santiago E.
20
Entity TVSet is
. . . . .
End Entity TVSet;
Architecture TV2000 of TVSet is
. . . . .
End architecture TV2000;
El cuerpo de un sistema siempre está ligado a su interfaz, similarmente en VHDL cada Arquitectura debe estar ligada con una Entidad.
VHDL le da mayor importancia a la Entidad, de modo que las Arquitecturas se asocian con una Entidad y no viceversa.
La arquitectura
ENTIDAD
ARQUITECTURA
F. Santiago E.
21
Cada sistema puede describirse en términos de su funcionalidad (comportamiento) o estructura (construcción), y en cada caso se requiere diferente información.
Tipos de Arquitectura
¿QUÉ HACE? ¿CÓMO ESTÁ COMPUESTA?
Funcionalidad Estructura
Muchas herramientas de Síntesis trabajan con ambas descripciones.
La descripción estructural es más adecuada para síntesis.
En sistemas jerárquicos, de acuerdo con el nivel de cada módulo, se emplea una u otra descripción (Metodología TOP-DOWN).
F. Santiago E.
22
Descripción Funcional
Entity TVSet is
port (
ON : entrada un_bit
VOL_UP, VOL_DOWN : entrada un_bit
CHAN_UP, CHAN_DOWN : entrada un_bit
. . . .
)
End Entity TVSet;
Architecture TV2000 of TVSet is
. . . .
if ON then enciende al sistema
if not - ON then apaga al sistema
. . . .
if VOL_UP then volumen = volumen + 1
if VOL_DOWN then volumen = volumen - 1
. . . .
if CHAN_UP then canal = canal + 1
if CHAN_DOWN then canal = canal -1 1
. . . .
End architecture TV2000;
Debe especificar lo que el
sistema va a hacer como una
respuesta a los diferentes
eventos que vayan ocurriendo.
En general, es una descripción
de la generación de las salidas,
como una respuesta a los
cambios en las entradas.
Es una descripción algorítmica.
F. Santiago E.
23
Descripción Estructural
Entity TVSet is
port (
. . . .
)
End Entity TVSet;
Architecture TV2000 of TVSet is
. . . .
U1, U5 -> U2
U2 -> U4
U1 -> U3
U3 -> U5
. . . .
End architecture TV2000;
No especifica la funcionalidad
del sistema, en lugar de ello
especifica los componentes
que lo integran y la forma en
que se deben conectar para
alcanzar los resultados
esperados.
En otras palabras, describe la
estructura interna del sistema.
Es para módulos con mayor
jerarquía.
U2
U3 U5
U4 U1
F. Santiago E.
24
Comparación de los tipos de Arquitectura
¿QUÉ HACE? ¿CÓMO ESTÁ COMPUESTA?
Decripción Funcional Descripción Estructural
La descripción estructural es mucho más fácil de sintetizar que la descripción
funcional por que se refiere a componentes físicos concretos.
Sin embargo es más difícil de desarrollar porque requiere de mayor
experiencia del diseñador, para hacer diseños más eficientes.
F. Santiago E.
25
Dado que diferentes tipos de arquitecturas pueden realizar la misma función, la interfaz de un sistema (una entidad) puede especificarse para diversas arquitecturas.
Ejemplo: Si se requiere de un procesador SIXTIUM, éste puede ser de diferentes fabricantes.
Una Entidad: ¿Cuántas Arquitecturas?
Entity Sixtium is
. . . . .
End Entity Sixtium;
Architecture IMTEL of Sixtium is
. . . . .
End IMTEL;
Architecture LYRIX of Sixtium is
. . . . .
End LYRIX;
Architecture AMC of Sixtium is
. . . . .
End AMC;
F. Santiago E.
26
El Concepto de “Paquete”
Los Paquetes incorporan conceptos (tipos de datos, operaciones, etc. ) que no son
estándares.
Se declaran por adelantado, antes de la Entidad, para ello se incluyen las clausulas:
Library y Use.
Con library se indica la biblioteca que será empleada.
Con use se especifica que paquete o unidad de la biblioteca se requiere.
F. Santiago E.
27
Paquetes Predefinidos :
Los tres paquetes más populares definidos por la IEEE son :
STANDARD : Contiene todas las declaraciones y definiciones básicas del lenguaje y está incluido en
todas las especificaciones de VHDL por default.
TEXTIO: Contiene las declaraciones de operaciones básicas de texto. Para usarlo, antes de la entidad
debe declararse:
library std;
use std.TextIO.all;
STD_LOGIC_1164: Contiene extensiones al estandar de VHDL, definidas en el Estandar 1164 de la
IEEE, algunas declaraciones importantes son: Variables y vectores lógicos, extensión de operadores y
algunas funciones. Para usarlo, las declaraciones son:
library IEEE;
use IEEE.std_logic_1164.all;
Nota: Aparte de los paquetes estándares, cada desarrollador de Software incluye sus propios paquetes.
F. Santiago E.
28
-- Las tres unidades de Diseño en VHDL :
-- Paquetes
Library New ConceptLib; -- Biblioteca a Usar
Use NewConceptLib.Arithm.Logarithm; -- Paquete a Usar
-- Entidad
Entity SomeSyst is -- La interfaz: Incluye parámetros
. . . . -- genéricos y puertos
End Entity SomeSyst;
-- Arquitectura
Architecture FirstArch of SomeSyst is -- El cuerpo del sistema:
. . . . -- Puede ser descrito de manera
-- Estructural o Funcional
. . . .
Logarithm -- Concepto no estándar en Uso
. . . .
End Architecture FirstArch;
Resumen . . . .
F. Santiago E.
30
Un fenómeno importante en el mundo es el proceso de comunicación, el cual
involucra transmitir información de un remitente a un destinatario.
Aunque hay muchas formas de establecer la comunicación, siempre tienen
algo en común: Las señales.
Las máquinas también se comunican, por ejemplo, un sensor de
temperatura puede informar a un circuito que este parámetro alcanzó cierto
nivel, para que el circuito encienda el aire acondicionado.
Introducción a las Señales . . .
F. Santiago E.
31
Las señales se pueden clasificar entre aquellas que llevan información dentro de un dispositivo y aquellas que comunican dispositivos (clasificación básica en VHDL).
Físicamente, una señal eléctrica es un flujo de electrones que está sujeto a complicadas leyes físicas, que determinan el tiempo de respuesta de un sistema.
Sin embargo, en VHDL estas leyes son ignoradas porque las herramientas de síntesis automáticamente realizarán el trazado físico del circuito.
El diseñador sólo se ocupa de la funcionalidad y el rendimiento del circuito.
Los diseños electrónicos se basan en componentes y líneas de señales que comunican estos componentes. Las líneas de señales pueden ser conexiones de un solo alambre o múltiples alambres (bus o vector).
Introducción a las Señales . . .
F. Santiago E.
32
Alambres y Buses
Data
Result
Z ExtBus
IntBus
a b c d e f g h i j Alambre : Señal de una sóla línea que
puede tener un valor binario en un
tiempo dado. VHDL adopta el nombre
de “bit” para estas señales.
Bus o Vector: Señal de múltiples
líneas, transmite información como una
combinación de valores binarios. Su
nombre en VHDL es “bit_vector”.
En los buses es importante definir el rango y cual será el bit más significativo
(MSB). El MSB siempre se indica primero:
X bit_vector( 0 to 7) X bit_vector( 7 downto 0)
0 1 2 3 4 5 6 7 7 6 5 4 3 2 1 0
MSB LSB MSB LSB
x y
F. Santiago E.
33
Señales Externas vs. Internas
Externas: Son Señales que conectan
al sistema con el exterior. En otras
palabras, forman la interfaz (entidad)
del sistema.
Internas: Son Señal que no están
visibles desde el exterior, están
completamente empotradas en el
sistema y son parte de su arquitectura
interna.
D
A
T
A
Result Z ExtBus
IntBus
a b c d e f g h i j
x y
Externas: Data, a, b, c, d , e, f, g, h, i, j, Result, Z y ExtBus (Entidad)
Internas: IntBus, X e Y (Arquitectura)
F. Santiago E.
34
Señales Externas
La sintaxis para la declaración de un puerto es: nombre : modo tipo;
Las señales externas se declaran en los puertos de la entidad, la declaración debe
incluir su nombre, tipo y modo. El modo se refiere a la dirección del flujo de datos y
puede ser: entrada (in), salida (out) y bidireccional (inout).
0 - 7
4 - 0
x y
z
R
Q
Sistema_Ejemplo Entity Sistema_Ejemplo is
Port (
Z : in bit;
Q : out bit_vector( 4 downto 0 );
R : inout bit_vector( 0 to 7 )
);
End Entity Sistema_Ejemplo;
Z : Puede ser leído en una arquitectura, pero no escrito.
Q : Puede ser generado (o escrito), pero no leído.
R : Puede ser leído o escrito.
F. Santiago E.
35
Señales Internas
Las señales internas se manejan dentro de la arquitectura, para distinguirlas de otros
objetos de VHDL se utiliza la palabra reservada signal.
0 - 7
4 - 0
x y
z
R
Q
Sistema_Ejemplo Architecture Unica of Sistema_Ejemplo is
Signal x, y: bit;
. . . . .
End Architecture;
La palabra reservada signal no es necesaria en la entidad dentro de la clausula
port, ya que por definición un puerto es una señal.
Las señales internas no requieren modo.
F. Santiago E.
36
Visibilidad de una Señal
Que tan visible es una señal, depende del lugar en donde se declaró:
• Una señal declarada en un paquete es visible en todas las unidades de diseño que
usan este paquete.
Package MyPack is
signal A
. . . .
• Una señal declarada como un puerto de una entidad es visible en todas las
arquitecturas asignadas a esa entidad.
Entity En1 is
port ( B _ _ _ _ )
. . . .
• Una señal declarada en la parte declarativa de una arquitectura es visible solo
dentro de esa arquitectura.
Architecture Arch1 of En1 is
signal C
. . . .
•Una señal declarada en un bloque localizado dentro de una arquitectura es visible
sólo dentro de ese bloque.
Nota: En todos los casos se cumplen con jerarquías, si algo se declara en un nivel jerárquico, será visible
en todas las construcciones de menor nivel jerárquico.
F. Santiago E.
38
Nombre y comentarios
El nombre de la Entidad es un identificador, y como tal tiene las siguientes reglas:
1. No puede ocupar más una línea.
2. Debe iniciar con una letra.
3. Solo puede incluir letras, números y guiones bajos.
4. Los guiones bajos solo pueden ser intermedios.
5. No se permiten espacios.
6. No se distingue entre mayúsculas y minúsculas.
7. No se pueden usar palabras reservadas.
Ejemplos:
Couter_4Bits,
Mux_4_to_1,
etc.
Los comentarios en VHDL inician con
dos guiones y terminan al final de la
línea, ayudan a una adecuada
documentación.
-- Unidad Diseñada : 8086 (Entidad y Arquitectura)
-- Nombre del archivo : P8086.vhd
-- Propósito : Modelo de un microprocesador 8086
-- para un módulo empotrado de un
-- “sistema en un chip”
-- Limitaciones : Se supone una frec. de 33 MHz
-- Errores : Ninguno conocido
-- Biblitecas : Numeric_STD, ALDEC.
-- Autor : - - - - - -
-- Simulador : ActiveVHDL
-- Notas : Modelo sintetizado con las herramien-
-- tas de ALDEC.
F. Santiago E.
39
Puertos
Los puertos son definidos en VHDL como: “Canales para comunicación dinámica
entre un bloque (una entidad) y su ambiente”. La declaración de un puerto contiene
los siguientes elementos:
1. Nombre del puerto seguido de dos puntos
2. El modo del puerto
3. El tipo del puerto
4. El valor inicial precedido por := (opcional, válido para simulación)
5. Un comentario que describa al puerto (opcional)
Cláusula END
Es el último elemento de una Entidad, opcionalmente
es seguido de la palabra reservada Entity y/o el
nombre de la entidad.
Entity Example is
generic ( . . . );
port ( . . . );
end entity Example;
Los puertos se declaran en una lista entre paréntesis, separados por ; y precedidos por la
palabra reservada port.
F. Santiago E.
40
Entity ALU is
Port (
In1 : in bit_vector (3 downto 0); -- Primer Operando
In2 : in bit_vector (3 downto 0); -- Segundo Operando
OpSel : in bit_vector (0 to 2); -- Selector de Operación
Cin : in bit; -- Acarreo de entrada
Result : out bit_vector (3 downto 0); -- Resultado
Cout : out bit; -- Acarreo de salida
Equal : out bit; -- Bandera de igual
Zero : out bit -- Bandera de cero
);
End Entity ALU;
ALU
In1 In2 OpSel
Cin Cout
Result Equal
Ejemplo: Una ALU de 4 bits
Zero
F. Santiago E.
41
Parámetros Genéricos
Los parámetros genéricos son definidos en VHDL como: “Canales de información
estática para ser comunicada a un bloque desde su mismo ambiente, en otras
palabras, son valores constantes para diferentes parámetros”.
Ejemplos de Uso:
1.- Para definir el tamaño de un objeto en VHDL
. . . .
generic ( AnchoBus : Integer := 8 );
port ( DataBus : InOut bit_Vector ( AnchoBus – 1 downto 0 ) );
. . . .
2.- Para determinar el número de Iteraciones en un lazo
. . . .
generic ( NumIt : Integer := 3 );
. . . .
for k in 1 to NumIt loop
. . . .
end loop;
. . . .
F. Santiago E.
42
3.- Para definir intervalos de tiempos
. . . .
generic ( Delay : Time := 5 s );
. . . .
y <= x after Delay;
. . . .
En todos los casos la declaración de parámetros genéricos debe incluir:
- Nombre del parámetro seguido de dos puntos
- Tipo del parámetro
- El valor del parámetro precedido de := (opcional)
- Comentarios de descripción del parámetro (opcional)
Los parámetros se declaran en una lista entre paréntesis, separados por ;
y precedidos por la palabra reservada generic.
Parámetros Genéricos
F. Santiago E.
44
Todos los sistemas digitales manejan la información como bits o vectores de
bits. Sin embargo, no es posible ni conveniente usar sólo estos tipos para
todos los datos.
Tipos de Datos
Por ejemplo, para una memoria:
RAM
1k x 8
Tiempo de
Acceso
10 nS
Convendría usar
números Decimales
o Hexadecimales De
co
dific
ado
r
de
dire
ccio
ne
s
Arreglo
de
bits
Control
Convendría
usar un arreglo
de Bytes
Los tipos bit y
bit_vector no se
ajustan, el tipo
aplicable es Time
(que es un tipo físico)
Por lo tanto, VHDL debe incluir otros tipos de datos.
F. Santiago E.
45
Booleano :
Declarado como:
type BOOLEAN is (false, true);
Descripción:
Los valores Booleanos son TRUE/FALSE que no necesariamente son iguales a 0/1. Es decir , TRUE no es lo mismo que „1‟ y viceversa. Bit y Boolean son dos tipos diferentes.
Ejemplos: True, false
Caracter :
Declarado como:
type CHARACTER is (null, . . ., ‘a’, ‘b’, ‘c’, . . . );
Descripción:
Cubre todos los caracteres definidos en el conjunto que establece la definición ISO 8859-1 (Conocida también como Latín – 1).
Ejemplos: „0‟, „*‟, „¿‟, „A‟, „}‟
Tipos Escalares
F. Santiago E.
46
Entero :
Declarado como:
type INTEGER is range –2147483648 to 2147483647;
Descripción:
Un entero requiere de 32 bits, sin embargo, la mayoría de aplicaciones utilizan enteros con rangos menores. Con la siguiente declaración:
subtype ENTERO_CORTO is integer range 0 to 7;
Se declara un subtipo de entero que ocupa sólo 3 bits, luego pueden declararse señales o variables:
signal A: ENTERO_CORTO;
variable X: ENTERO_CORTO;
Si solo se va a usar una señal, la definición e instanciación pueden hacerse en una solo expresión, por ejemplo:
signal ENT_CORTO2: INTEGER range 0 to 31;
Ejemplos: 12, 0, 2147483646, -100, 16
F. Santiago E.
47
Real :
Declarado como:
type REAL is range 1.0 E`-308 to 1.0 E308;
Descripción:
También es conocido como Punto flotante, por lo general se maneja un sub-rango que depende de la aplicación.
Ejemplos: 0.0, 1.000001, -1.0 e5
Nota: La representación de los números reales es compleja, de manera que no se puede sintetizar directamente.
Bit :
Declarado como:
type BIT is (‘0’, ‘1’);
Descripción:
El tipo Bit es una enumeración que define dos valores lógicos estándares: „0‟ y „1‟. Es el único que puede usarse para operaciones lógicas.
Ejemplos: „0‟, „1‟
F. Santiago E.
48
Enumeraciones: Tipos definidos por el usuario.
Están disponibles para que el diseñador pueda contar con información personalizada, para un mayor entendimiento.
Una aplicación clásica de los Tipos Definidos por el Usuario se presenta en una Máquina de Estados Finitos (FSM), para representar un diseño secuencial, a cada estado se le asigna un nombre.
IDLE
FETCH
DECODE
EXECUTE
type EstadosFSM is (IDLE, FETCH, DECODE, EXECUTE);
signal Edo_Act, Edo_Ant: EstadosFSM;
Durante la síntesis, los estados se codifican con bits que serán manejados con flip-
flops.
F. Santiago E.
49
Tipos Fisicos
Los tipos físicos son únicos en VHDL, ya que no sólo especifican los valores de los
objetos sino también sus unidades.
El estándar de VHDL sólo incluye un tipo físico: El tiempo (Time), pero otros tipos
pueden también definirse.
Type time is range –2147483647 to 2147483647
units
fs; -- Primarias
ps = 1000 fs; -- Secundarias
ns = 1000 ps;
us = 1000 ns;
ms = 1000 us;
sec = 1000 ms;
min = 60 sec;
hor = 60 min;
end units;
Nota: El tipo físico time sólo es utilizado
para simulación, no puede ser sintetizado.
F. Santiago E.
50
Tipos Complejos
Arreglos:
Son tipos complejos con una estructura regular que contiene elementos del mismo tipo. El
número de elementos está especificado en el rango del arreglo.
El rango puede ser ilimitado: range < > (aunque no es lo más conveniente).
Hay dos arreglos pre-definidos en VHDL :
• Bit_Vector – Con elementos del tipo Bit, y
• String – Con elementos de tipo carácter.
Si estos arreglos se declaran con rango ilimitado, difieren en su limite inferior por default
en el bit_vector es 0 y en un string es 1.
F. Santiago E.
51
Arreglos . . .
Ejemplo: Signal DataBus : bit_vector ( 7 downto 0 );
0 1 0 0 1 1 0 1 7 6 5 4 3 2 1 0
MSB LSB
Único elemento (comilla simple):
DataBus( 7 ) = „0‟;
DataBus( 3 ) = „1‟;
Dos o mas elementos (comilla doble):
DataBus = “01001101”;
DataBus( 5 downto 3) = “001”;
Los vectores de bits se puede escribir en binario, octal, decimal y hexadecimal.
“01111” binario
O “17” octal
X “F” hexadecimal
F. Santiago E.
52
Es una especie de Vector de Vectores.
Arreglos . . .
Puesto que los arreglos sólo tienen una dimensión, también son conocidos como
vectores. El usuario puede declarar arreglos con dimensiones mayores, aunque tres o
mas son poco tratables.
Un ejemplo típico es una memoria:
0
1
2
3
1020
1021
1022
1023
1019
Type memory1k4 is Array ( 0 to 1023 ) of
Bit_Vector ( 3 downto 0 );
Signal Memory : memory1k4;
Memoria de 1 K x 4
F. Santiago E.
53
Registros (records)
También son tipos complejos, difieren de los arreglos en que sus elementos pueden ser
de diferentes tipos y son referenciados por su nombre y no por un índice.
Ejemplo :
Type Instr_T is record
mnemonico : String ( 1 to 14 );
opcode : Bit_Vector ( 3 downto 0 );
CiclosEx : Integer;
End record;
Signal Instr1, Instr2, Instr3 : Instr_T;
Instr1.mnemonico = “add reg1 reg2”;
Instr1.opcode = “0010”;
Instr1.CiclosEx = 2;
Instr2.mnemonico = “xor reg1 reg2”;
Instr2.opcode = “0001”;
Instr2.CiclosEx = 1;
Instr3.mnemonico = “mul reg1 reg2”;
Instr3.opcode = “1110”;
Instr3.CiclosEx = 8;
Nota : No todos los records son sintetizables, pero la
mayoría de herramientas que sintetizan cubren los
records que incluyen los tipos: bit, bit_vector, boolean e
integer.
F. Santiago E.
54
Operadores y Expresiones
Aparte de los sistemas triviales, las señales de entrada deben ser transformadas de
alguna forma para generar las señales de salida deseadas.
Outputs <- transformaciones( inputs )
Las transformaciones son realizadas por expresiones : Fórmulas que consisten de
operadores con un apropiado número de operandos.
La especificación del comportamiento de un sistema puede ser vista como un conjunto
ordenado de expresiones aplicadas sobre las señales de entrada.
Operadores Lógicos:
AND, OR, NAND, NOR, XOR y XNOR ( binarios )
NOT ( unario )
Aplicables en los tipos: Bit, Booleano y Bit_Vector (Ambos operandos deben ser del mismo tipo).
F. Santiago E.
55
Operadores Numéricos:
OPERADOR SIMBOLO EJEMPLOS DE USO
Suma + IntX1 + 17, RealX2 + 2.0
Resta - BusWidth – 1
Producto * A * B (ambos enteros o ambos reales),
Mult * 5nS (Mult entero o real)
División / CLK/2 , 10 ns / 2 ns (resultado sin Unidad)
Módulo Mod 6 mod 4 ( = 2 ), (-6) mod 4 ( = 2 ), 6 mod (-4) ( = -2)
Residuo Res 6 res 4 ( = 2 ), (-6) res 4 ( = - 2 ), 6 res (-4) ( = 2)
Exponenciación ** A**2 ( A*A ), B**3 ( B*B*B ), C*0.5 ( Ilegal )
Valor Absoluto Abs Abs 1 ( = 1 ), Abs ( - 1) ( = 1 ), Abs ( 5*(-2) ) ( = 10 )
Enteros Reales Tiempo
Todos +, -, /, abs
** con el 2o. Operando Entero
+, -, / (Ambos de Tiempo)
*, / (Uno entero o real)
Operadores aplicables en cada tipo de datos
F. Santiago E.
56
Operadores Relacionales :
OPERADOR SIMBOLO
Igual a =
No igual a /=
Menor que <
Menor o igual que <=
Mayor que >
Mayor o igual que >=
Estos operadores se aplican sobre los
tipos: Booleanos, Bits, Caracteres,
Enteros, Reales, Tiempo, Cadenas y
Bit_Vector (ambos del mismo tipo).
El resultado siempre es Booleano:
True o False
Operadores de Desplazamientos :
( Aplicables a Bit_Vector o Arreglos Booleanos )
SLL – Desplazamiento lógico a la Izquierda.
SLL
1 0 0 1 1 0 1 0
7 6 5 4 3 2 1 0
0 1 0 0 1 1 0 1
7 6 5 4 3 2 1 0
0
( )
SLR – Desplazamiento lógico a la Derecha.
SLR
0 0 1 0 0 1 1 0
7 6 5 4 3 2 1 0
0 1 0 0 1 1 0 1
7 6 5 4 3 2 1 0
0
( )
A <= B SLL 1;
F. Santiago E.
57
SLA – Desplazamiento Aritmético a la Izquierda.
SLA
1 0 0 1 1 0 1 1
7 6 5 4 3 2 1 0
0 1 0 0 1 1 0 1
7 6 5 4 3 2 1 0
( )
SRA – Desplazamiento Aritmético a la Derecha.
SRA
0 0 1 0 0 1 1 0
7 6 5 4 3 2 1 0
0 1 0 0 1 1 0 1
7 6 5 4 3 2 1 0
( )
ROL – Rotación a la Izquierda.
ROL
1 0 0 1 1 0 1 0
7 6 5 4 3 2 1 0
0 1 0 0 1 1 0 1
7 6 5 4 3 2 1 0
( )
ROR – Rotación a la Derecha.
ROR
0 0 1 0 0 1 1 0
7 6 5 4 3 2 1 0
0 1 0 0 1 1 0 1
7 6 5 4 3 2 1 0
( )
F. Santiago E.
58
Operador de Concatenación :
Facilita la creación de nuevos arreglos a partir de arreglos existentes, los arreglos pueden
ser de cualquier tipo, pero solo de una dimensión.
1 0 1 1 0 0 1 0
0 1 2 3 4 5 6 7
Ejemplo: Data1 : Bit_Vector ( 0 to 7 );
0 0 1 0 1 0 1 0
0 1 2 3 4 5 6 7
Data2 : Bit_Vector ( 0 to 7 );
1 BitOne : bit;
VecRes : Bit_Vector ( 0 to 7 );
VecRes <= ( Data1( 0 to 3 ) & Data2 (3 to 5) & BitOne );
1 0 1 1 0 1 0 1
0 1 2 3 4 5 6 7
F. Santiago E.
59
Asignación de Expresiones a Señales
El operador de asignación es : <=
Señal_Destino <= Expresión
Ejemplos:
k <= „1‟;
m <= “0101”;
n <= m & k;
a <= b or c;
x <= y <= z;
Una asignación puede ser retrasada, la
cláusula “after” permite definir esos retrasos
Retrazo
4 seg
Lamp <= switch after 4s;
RETRASO INERCIAL
La cláusula “after” impone un retraso inercial, es
decir, dos cambios subsecuentes de una entrada
son ignorados si el tiempo entre ellos es más corto
que el retraso especificado.
0 6 10
SWITCH
0 4 10 LAMP
12
0 2 10
SWITCH
0 4 LAMP
F. Santiago E.
60
RETRASO DE TRANSPORTE
El “retraso Inercial” es común en muchos sistemas electrónicos, pero no en todos. Por
ejemplo en una línea de transmisión los retardos en la propagación son independientes
del ancho de los pulsos.
Este tipo de retrasos se les conoce como retrasos de transporte y en VHDL se modelan
con la palabra reservada “transport”.
Retrazo
4 seg
Lamp <= transport switch after 4s;
0 2 10
SWITCH
0 4 LAMP
6 10
F. Santiago E.
61
Comparación de Retrasos
Out1 <= Input after 3s; -- Retraso inercial (default)
Out2 <= transport Input after 3s; -- Retraso de transporte
0 4 10
INPUT
0 3 OUT1
7 10
0 OUT2
10
12
3 7 13 15
Nota: Los retrasos son útiles para modelado y simulación, pero no se pueden sintetizar.
F. Santiago E.
62
Constantes
Juegan el mismo papel que los parámetros genéricos, excepto que las constantes se
declaran en la arquitectura (y no en la entidad).
La declaración de constantes requiere de la Sintaxis siguiente:
• Palabra reservada Constant
• Nombre de la constante (es un Identificador)
• Dos puntos
• Indicación del tipo de constante
• Valor de la constante después de :=
• Punto y coma al terminar la línea
Architecture Arch1 of Ent1 is
Constant t_prop : time := 10nS;
Begin
. . . .
End architecture Arch1;
Block_1 : block
Constant N : integer := 123;
Begin
. . . .
End block Block1;
P1 : process( A, B)
Constant t_hold : time := 5 ns;
Begin
. . . .
End process P1;
F. Santiago E.
63
Las constantes pueden utilizarse para :
• Especificar el tamaño de Objetos complejos (arreglos o buses)
• Controlar ciclos repetitivos
• Definir parámetros de tiempo como : retrasos, tiempos de conmutación, etc.
Nota: No pueden usarse para definir los tamaños de vectores en los puertos , por que los puertos son
declarados en las entidades y las constantes se definen en las arquitecturas (solo se puede hacer si la
constante está en un paquete usado por la entidad).
PARÁMETROS GENERICOS CONSTANTES
UBICACIÓN DE LA
DECLARACION
Sólo en la Entidad
( cláusula generic )
En una arquitectura o
En un paquete
DECLARACION
Es una lista:
Generic ( name : tipo := valor_op;
name : tipo := valor_op );
Una declaración por constante :
Constant name1 : tipo := valor1;
Constant name2 : tipo := valor2;
VISIBILIDAD
En la entidad, incluyendo los puertos y
en todas las arquitecturas asociadas
con esa Entidad
En la arquitectura (si ahí se declaro).
En cualquier Unidad de diseño que use el
paquete (si se declaró en un paquete),
esto incluye entidades y arquitecturas.
F. Santiago E.
65
Introducción
El objetivo de un sistema electrónico es transformar datos de entradas en resultados
como salidas, esta clase de actividad es conocida como Comportamiento o
Funcionalidad del sistema.
La especificación del comportamiento consiste en una lista de operaciones que han de
ejecutarse para obtener el resultado esperado.
KIWI FRUTAS LIMON
Comportamiento de la Máquina:
If hay_moneda then Botones <= habilitados
If Botones = habilitados then
If pres_kiwi then salida <= jugo_kiwi
Else if pres_frutas then salida <= jugo_frutas
Else salida <= jugo_limon
If Bebida_Entregada then
Botones := deshabilitados
El funcionamiento del distribuidor de bebidas depende de una secuencia de operaciones.
Esto es común en muchos sistemas.
F. Santiago E.
66
Procesos
Un proceso es una manera formal de hacer una lista de operaciones secuenciales.
Tiene un formato muy estructurado y representa el comportamiento de una sección de
un diseño.
Reglas para escribir un proceso:
Un proceso se especifica con la palabra reservada Process. Opcionalmente se le
puede asignar un nombre, éste debe ir antes de process seguido de dos puntos.
El fin del proceso se indica con end process y luego puede repetirse el nombre del
proceso.
El cuerpo del proceso está formado por una lista de proposiciones que debe iniciar con
la palabra reservada begin, la lista termina con el fin del proceso.
La declaración de variables o constantes se debe hacer antes de la palabra begin.
Plantilla : nom_op : process
declaración de variables o constantes
begin
proposiciones secuenciales
end process nom_op;
F. Santiago E.
67
Procesos . . .
MUX2_TO1 : process
Constant High : Bit := „1‟;
begin
Y <= A;
if SEL = High then
Y <= B;
end if;
End process MUX2TO1;
A
B
Y
SEL
EJEMPLO : Puesto que VHDL es para representar sistemas, la
terminación de un proceso se debe analizar a
detalle. Un sistema no realiza sus funciones sólo
una vez y termina; más bien, debe repetir sus
actividades en un ciclo infinito.
Por eso, un proceso asegura que terminada la
ejecución de la última proposición,
inmediatamente iniciará nuevamente con la
primera.
Como resultado Un proceso Nunca Termina.
SomeProcess : Process
Begin
Some Statement1;
Some Statement2;
Some Statement3;
Some Statement4;
End process SomeProcess
F. Santiago E.
68
Necesidad de Suspender y Reanudar un Proceso
Los dispositivos electrónicos operan en un ciclo infinito; después de su activación
ejecutan una lista de tareas para después regresar a esperar una condición de
repetición.
En otras palabras, los dispositivos suspenden su operación cuando completan sus
tareas y las reanudan cuando se dan nuevamente las condiciones.
KIWI FRUTAS LIMON
La inserción de una moneda dará inicio a las
actividades de la máquina, que se “suspenderán”
después de que la máquina proporcione el jugo
deseado.
Las actividades se “reanudarán” cuando ocurra la
inserción de otra moneda.
Esta suspensión temporal en VHDL se puede realizar con la sentencia wait.
La sentencia wait sirve para suspender un proceso una vez que ha completado su
tarea y reanudarlo cuando se da la condición que finaliza la espera.
F. Santiago E.
69
Wait puede usarse para:
- Detener incondicionalmente la ejecución temporal de un proceso.
- Listar las condiciones necesarias para que el proceso se reanude.
Si un proceso contiene una sentencia Wait, ejecutará todas sus proposiciones hasta que
el wait sea encontrado, ahí esperará hasta que se cumplan las condiciones establecidas
en el wait.
Tipos de Wait :
1.- Wait for cierto_tiempo : Suspende el proceso por una cantidad específica de tiempo,
el tiempo se puede expresar explícitamente:
Wait for 10 ns;
O bien como una expresión:
Wait for CLK_Periodo / 2;
Sentencia Wait
F. Santiago E.
70
Sentencia Wait
2.- Wait until condición : El proceso se suspende hasta que una condición llega a ser
verdadera, debido a algún cambio en las señales involucradas.
Ejemplos: Wait until CLK = „1‟;
Wait until CE and (not RESET);
Wait until IntData > 16;
3.- Wait on lista de sensibilidad : El proceso se suspende hasta que ocurre un evento en
cualquiera de las señales que integran la lista de sensibilidad
Ejemplos: Wait on CLK;
Wait on Enable, Data;
4.- Wait complejo : Contiene una combinación de más de uno de los 3 tipos mencionados
anteriormente.
Ejemplos: Wait on Data until CLK = „1‟;
Wait until CLK = „1‟ for 10 ns;
F. Santiago E.
71
La sentencia wait puede ubicarse en cualquier parte del proceso, en realidad depende del
comportamiento deseado.
Process
Begin
wait on sigA;
proposiciones 1;
proposiciones 2;
proposiciones 3;
End process;
Process
Begin
proposiciones 1;
proposiciones 2;
proposiciones 3;
wait on sigB;
End process;
El wait sobre la lista de sensibilidad es probablemente la forma más frecuente de reanudar
procesos en VHDL, es por eso que el lenguaje permite colocar la lista de sensibilidad entre
paréntesis, justo después de la palabra process. Su funcionamiento es similar a un wait on
lista al final del proceso.
Process
Begin
proposiciones 1;
proposiciones 2;
proposiciones 3;
wait on señales;
End process;
Process ( señales )
Begin
proposiciones 1;
proposiciones 2;
proposiciones 3;
End process;
F. Santiago E.
72
Un proceso puede tener múltiples wait‟s, pero si tiene una lista de sensibilidad, no es
necesario que tenga un wait explícito para suspender su ejecución.
Cuando la ejecución de un proceso inicia, ésta se realiza una vez, posteriormente el proceso
es suspendido hasta que alguna señal en su lista de sensibilidad cambia de valor.
Aunque sólo una de las señales de la lista cambie, con ello todas las proposiciones del
proceso se ejecutan en forma secuencial, no solo aquellas que involucran a la señal que
cambió.
Process ( signal1, signal2, signal3 )
Begin
signal1 <= expresion 1 ;
signal2 <= expresion 2;
signal3 <= expresion 3;
End process;
F. Santiago E.
73
El propósito de una implementación en VHDL es describir la reacción de las salidas ante las
entradas. Tanto entradas como salidas son señales, de modo que tal reacción básicamente
esta dada por asignaciones de señales.
Las señales y sus asignaciones se manejan en procesos, sin embargo, su uso está
gobernado por 3 restricciones:
Señales en Procesos
1. Las señales no pueden declararse dentro de procesos.
2. Cualquier asignación de una señal tomará efecto cuando el proceso se suspende.
Mientras esto no ocurra, todas las señales mantendrán sus previos valores.
3. Sólo la última asignación de una señal dentro de un proceso es efectivo. No tiene
sentido asignar mas de un valor a una señal en un proceso dado.
Ejemplo: Process ( signal1, signal2, signal3 )
Begin
Proposición 1;
Proposición 2;
signal3 <= signal1 + 3;
End process;
Signal1 = 0 -> 1
Signal2 = 0
Signal3 = 5
F. Santiago E.
74
Las restricciones en el uso de señales impactan en sus aplicaciones prácticas. Dado que
sólo pueden almacenar el valor de su última asignación, no pueden usarse para
almacenamientos intermedios o de datos temporales (dentro de un proceso).
Otro inconveniente es el siguiente, como los nuevos valores se asignan sólo al suspender el
proceso, el análisis llega a ser complicado.
Ejemplo: Process ( C, D )
Begin
A <= 2;
B <= A + C;
A <= D + 1;
E <= A*2;
End process;
A = 1
B = 1
C = 1
D = 1
E = 1
Si D cambia a 2 ¿Qué pasa?
Es necesario contar con otro tipo de objetos que permitan almacenar datos temporales.
Estos objetos son las variables, cuya única diferencia con las señales es que se pueden
utilizar donde una señal no es aplicable.
F. Santiago E.
75
Ejemplo: Process ( C, D )
variable Av, Bv, Ev : integer := 0;
Begin
Av := 2;
BV := Av + C;
Av := D + 1;
Ev := Av*2;
A <= Av;
B <= Bv;
E <= Ev;
End process;
A = 1
B = 1
C = 1
D = 1
E = 1
Av = 0
Bv = 0
Ev = 0
Si D cambia a 2 ¿Qué pasa?
Una señal tiene 3 propiedades asociadas: Tipo, valor y tiempo. Con una relación cerrada
entre valor y tiempo, ya que cada señal tiene una trayectoria de valores a través del tiempo.
Una variable sólo tiene 2 propiedades: tipo y valor, por lo que solo se puede conocer su
valor actual.
Si las señales y variables son del mismo tipo, indistintamente puede haber asignaciones
ente ellas.
F. Santiago E.
76
SEÑALES VARIABLES
Se declaran como puertos en las entidades o en
las partes declarativas de las arquitecturas, pero
no en los procesos.
Como tienen carácter local, solo pueden
declararse en procesos o subprogramas. No
fuera de ellos.
La asignación de un nuevo valor a una señal
solo tiene efecto cuando el proceso es
suspendido. Por lo que sólo la última asignación
es válida. Las auto-asignaciones como:
Sig1 <= Sig1 + 1
Sólo son posibles con señales internas o del
tipo inout, si son externas.
Toman sus nuevos valores inmediatamente.
Todos son efectivos, de modo que en un
proceso puede haber múltiples asignaciones a
una variable. Las auto-asignaciones como:
Var1 := Var1 + 1
Son válidas y muy usadas en ciclos repetitivos.
Es posible retrasar la asignación de una señal
(con la cláusula after ), hay dos tipos de
retrasos: El retraso inercial y el de transporte.
No es posible retrasar la asignación de una
variable.
F. Santiago E.
77
Control de Flujo
Para el control de flujo VHDL tiene las siguientes proposiciones :
- Condicionales : If . . . . Then . . . . .
- Condicionales con alternativas: If . . . . Then . . . . . Else . . .
If . . . . Then . . . . . Elsif . . . Then . . . . . Else . . .
- De elección múltiple: Case . . . . Is
when . . . .
-Ciclos repetitivos: While . . . . Loop . . . . ( Repetitivo por condición )
for . . . . Loop . . . . ( Repetitivo por contador )
Con estas estructuras de control, el flujo de la ejecución de las instrucciones ya no sólo es
secuencial.
F. Santiago E.
78
ExProc : Process ( Lista_de_sensibilidad )
Begin
if Cond1 then
. . . .
case Cond2 is
when val1 => . . . .
when val2 => . . . .
when others =>
for l in 1 to 4 loop
. . . .
end loop;
end case;
else
while Cond3 loop
. . . .
end loop;
. . . .
end if;
. . . .
End process
. . . .
End process
if Cond1
. . .
case Cond2 is
val1 val2
for l in 1 to 4 loop . . . .
others
. . . . . . . .
end case;
end if;
while Cond3 loop . . .
then else
. . . .
F. Santiago E.
79
Ejemplo: Estructura if - then
D
CLK
Q
FLIP FLOP TIPO D
-- Descripción de la Entidad
Entity Flip_flop_D is
port (
D : in Bit;
CLK : in Bit;
Q : out Bit
);
End Flip_flop_D;
-- Descripción de la Arquitectura
Architecture unica of Flip_flop_D is
Begin
process ( CLK )
begin
if CLK = „1‟ then
Q <= D;
end if;
end process;
End unica;
F. Santiago E.
80
if – then
(anidados)
D
CLK
Q
FLIP FLOP TIPO D
CON RESET SÍNCRONO
-- Descripción de la Entidad
Entity FFD_SR is
port (
D , CLK, RST : in Bit;
Q : out Bit
);
End FFD_SR;
-- Descripción de la Arquitectura
Architecture unica of FFD_SR is
Begin
process ( CLK )
begin
if CLK = „1‟ then
if RST = „1‟ then
Q <= „0‟;
else
Q <= D;
end if;
end if;
end process;
End unica;
RST
F. Santiago E.
81
if – then – elsif
-- Descripción de la Entidad
Entity FFD_AR is
port (
D, RST, CLK : in Bit;
Q : out Bit
);
End FFD_AR;
-- Descripción de la Arquitectura
Architecture unica of FFD_AR is
Begin
process ( RST, CLK )
begin
if RST = „1‟ then
Q <= „0‟;
elsif CLK = „1‟ and CLK‟event then
Q <= D;
end if;
end process;
End unica;
D
CLK
Q
FLIP FLOP TIPO D
CON RESET ASÍNCRONO
RST
F. Santiago E.
82
Ejemplo: Estructura de múltiples decisiones
-- Descripción de la Entidad
Entity Gate_Prog is
port (
Dato1, Dato2 : in Bit;
Modo : in Bit_Vector ( 2 downto 0 );
Salida : out Bit
);
End Gate_Prog;
-- Descripción de la Arquitectura
Architecture Gate_Prog of Gate_Prog is
Begin
process ( Modo, Dato1, Dato2 )
begin
case Modo is
when “000” => Salida <= Dato1 and Dato2;
when “001” => Salida <= Dato1 or Dato2;
when “010” => Salida <= Dato1 nand Dato2;
when “011” => Salida <= Dato1 nor Dato2;
when “100” => Salida <= not Dato1;
when “101” => Salida <= not Dato2;
when others => Salida <= „0‟;
end case;
end process;
End Gate_Prog;
Dato1
Salida
Dato2 Modo
COMPUERTA PROGRAMABLE
Modo Salida
0 0 0 Dato1 AND Dato2
0 0 1 Dato1 OR Dato2
0 1 0 Not ( Dato1 AND Dato2)
0 1 1 Not ( Dato1 OR Dato2)
1 0 0 Not ( Dato1 )
1 0 1 Not ( Dato 2 )
1 1 0 o 1 1 1 0
F. Santiago E.
83
Ejemplo: Ciclo repetitivo por Condición
-- Descripción de la Entidad
Entity Conta_Pulsos is
port (
CLK : in STD_LOGIC;
Level : in STD_LOGIC;
Q : out STD_LOGIC_VECTOR ( 3 downto 0 )
);
End Conta_Pulsos;
-- Descripción de la Arquitectura
Architecture Conta_Pulsos of Conta_Pulsos is
Begin
process
Variable cuenta : STD_LOGIC_VECTOR (3 downto 0) := “0000”;
begin
Q <= cuenta;
wait until level = „1‟;
cuenta := “0000”;
while level = „1‟ loop
wait until clk = „1‟;
if level = „1‟ then cuenta := cuenta + 1; end if;
wait until clk = „0‟;
end loop;
end process;
End Conta_Pulsos;
Un contador de Pulsos cuya salida (en
binario) indique cuantos pulsos ocurrieron
mientras una señal (Level) estuvo en alto.
CLK
Level
Contador de Pulsos
Q(0)
Q(1)
Q(2)
Q(3)
0
1
0
0
F. Santiago E.
84
Ejemplo: Ciclo repetitivo por Contador
-- Descripción de la Entidad
library IEEE;
use IEEE.std_logic_1164.all;
entity inv_vec is
generic ( ancho_bus : integer := 8 );
port (
ent: in STD_LOGIC_VECTOR (ancho_bus - 1 downto 0);
sal: out STD_LOGIC_VECTOR (ancho_bus - 1 downto 0)
);
end inv_vec;
-- Descripción de la Arquitectura
Architecture inv_vec of inv_vec is
begin
process ( ent )
variable cont : integer;
begin
for cont in 0 to ancho_bus - 1 loop
sal( cont ) <= ent (ancho_bus - cont - 1);
end loop;
end process;
end inv_vec;
Circuito que invierte un vector (Bit por Bit)
7 - 0 7 - 0 Ent Sal
0 1 0 0 1 1 0 1 7 6 5 4 3 2 1 0
Ent :
0 1 0 0 1 1 0 1 7 6 5 4 3 2 1 0
Sal :
F. Santiago E.
85
Ruptura de ciclos
Los ciclos while y for ejecutarán sus proposiciones siempre que sus condiciones de
evaluación sean verdaderas. Sin embargo, en ocasiones es deseable una salida obligada
del ciclo o bien saltarse una iteración e ir a la siguiente.
Por ejemplo, en un contador de bits con valor „1‟ en un vector, si el bit a evaluar contiene
cero, inmediatamente se puede pasar a la iteración siguiente, esto se hace con la cláusula
next :
process ( DataBus )
variable NumOfOnes : integer := 0;
begin
for Cont in 0 to 7 loop
next when DataBus( Cont ) = „0‟;
NumOfOnes := NumOfOnes + 1;
end loop;
Ones <= NumOfOnes;
end process;
F. Santiago E.
86
Cuando se quiere terminar con el ciclo, la cláusula a usar es exit.
En el proceso mostrado en el anterior ejemplo, si se quisieran contar los 1‟s menos
significativos, antes de que aparezca el primer cero, el proceso cambia a :
process ( DataBus )
variable NumOfOnes : integer := 0;
begin
for Cont in 0 to 7 loop
exit when DataBus( Cont ) = „0‟;
NumOfOnes := NumOfOnes + 1;
end loop;
Ones <= NumOfOnes;
end process;
F. Santiago E.