Está en la página 1de 210

VHDL

INTRODUCCION

 Se estudiará como VHDL es usado en


proyectos de diseño.
 Se analizarán las aplicaciones de VHDL y
los diferentes estilos para usar el lenguaje.
 Se aprenderán sus elementos básicos, sus
ventajas y sus desventajas.
 Se discutirán los principales conceptos del
lenguaje y los principales constructos.
DEFINICION

 VHDL es un doble acrónimo:


 Very High Speed Integrated Circuit.
 Hardware Description Languaje.

 Fue desarrollado a principios de los 80´s para el


departamento. de los EEUU, como una
implementación, realizada por computadora para
describir sistemas electrónicos.
 En 1987 es Estandarizado por la IEEE (Std
1076)
 1993: Una nueva versión fue definida.
 Para los constructos comúnmente usados hay pocas
diferencias entre las dos versiones.
VHDL permite

 VHDL como lenguaje de alto nivel permite:


1. El modelado de ensambles electrónicos complejos.
2. La simulación de los modelos de componentes.
3. La síntesis lógica.
4. La portabilidad entre herramientas de síntesis y
entre arquitecturas.
VHDL permite

 Definir los “ports” de entrada y salida del conjunto


lógico descripto (entity).
 Definir una arquitectura usando el juego de
instrucciones soportado por las herramientas de
síntesis (escritura RTL).
 Unir los diferentes módulos descritos separadamente
(VHDL estructural)
EL PROCESO DE DISEÑO ELECTRONICO
LIMITACIONES

 VHDL es principalmente un
lenguaje para diseño digital.
Actualmente tiene capacidades
muy limitadas en el área
analógica, pero existen
trabajos para crear una versión
analógica del lenguaje.
 El estándar 1076 define un
estándar y su sintaxis, sin
describir ningun “estilo” para
usarlo en un diseño. Hay otros
estándares que usan, o que
requieren definir un “estilo”
antes de usar el lenguaje en
ciertas áreas.
VENTAJAS

 Notación formal: permite su uso en cualquier circuito


electrónico.
 Disponibilidad pública: no esta sometido a una patente o
fábrica.
 Independencia Tecnológica: soporta varias tecnologías
de diseño y distintas funcionalidades.
 Capacidad descriptiva: Permite el diseño en varios
niveles de abstracción
 Reutilización de Código: Sin importar la tecnología
(CMOS, Bipolar, etc.) o la implementación (FPGA, PLD,
etc.)
SOPORTE PARA
LENGUAJE DE SINTESIS

 Solo es posible
sintetizar lógicamente
desde un subgrupo del
lenguaje de VHDL.
Cada compañia tiene
su herramienta que
tienen su propio
subgrupo ligeramente
distinto de los demás.
SINTAXIS

 Los archivos VHDL llevan la extensión “----.VHD


 Minúsculas y mayúsculas no son diferenciadas en VHDL. Un objeto puede
ser indiferentemente llamado:
 MODULE, Module, moDulE o module
 Lo mismo ocurre con las palabras clave.

 Los comentarios pueden ser colocados en cualquier lugar dentro del


código.
 Ellos no afectan en nada los resultados de síntesis ni de simulación.
EJEMPLO:
- - este es un comentario
archtecture ARCHI of EJEMPLO is -- este también
begin
Los archivos VHDL llevan la extensión “----.VHD”
SINTAXIS
 Separadores: los separadores utilizados son:
 “ ; ” (Punto y coma, entre dos declaraciones o al fin de
una instrucción).
 “ , “ (coma, entre dos nombres de señal dentro de una
misma declaración).
 “ : “ (dos puntos, dentro de una declaración entre el
nombre de un objeto y su tipo).
 “ “ (espacio).
 El número de espacios entre dos palabras es indiferente,
siempre que el mínimo sea respetado.
 Retorno carro: Una misma instrucción o declaración puede
ser escrita en varias líneas consecutivas.
 Los comentarios pueden ser insertados al final de las
líneas sin afectar la integridad del código.
 A_IN, B_IN : in bit; - -puede también escribirse :
 -- A_IN,
 --B_IN : in bit;
CONCEPTOS
SINTESIS

 Proceso de transformar instrucciones lógicas de


software en circuitos hardware que desarrollen estas
instrucciones.
ABSTRACCION

 Cada abstracción define los detalles del diseño


especificados en una descripción particular de el.
 Los diferentes estilos de escribir código VHDL
tienen que ver con la abstracción.
NIVELES DE ABSTRACCION

1. LAYOUT: Especifica información acerca de


la verdadera implementación del diseño en
silicio.
2. LOGICO: se interconectan compuertas
lógicas y registros.
3. RTL: (transferencia de registros):se define
cada registro en el diseño, y la lógica entre
ellos.
4. COMPORTAMIENTO: describe la función
del diseño, sin especificar la arquitectura de
los registros.
SENTENCIAS

 CONCURRENTES  SECUENCIALES
ocurren en paralelo se ejecutan una después
de la otra.
FUNCION
 Es una rutina que hace una tarea particular.
 Cuando el programa pasa el control a una función.

 Ésta realiza la tarea y devuelve el control a la instrucción


siguiente a la que llamo.

 Ejecutan esta tarea utilizando valores específicos, denominados


argumentos, en un orden determinado.

 Los argumentos pueden ser números, texto, valores lógicos


como VERDADERO o FALSO, matrices, valores de error (con
#N/A ) o referencias de celda.

 El argumento que se designe deberá generar un valor válido


para el mismo. Los argumentos pueden ser también constantes,
fórmulas u otras funciones.
PRODECIMIENTO

 Su interés radica en las acciones que se realizan


durante su invocación.
 Siempre se invocan de forma aislada.
 Ejemplo:
println(...)

Éste siempre se invoca en forma aislada.


Las acciones que realiza la invocación de println
consisten en desplegar en pantalla el argumento que
recibe. Es ilegal escribir asignaciones como:
x= println( ... ); porque println no retorna ningún valor.
DIFERENCIA ENTRE PROCEDIMIENTO Y FUNCION

 La diferencia entre un procedimiento y una función es


que la función regresa al termino de la ejecución un
valor específico
PROCESO

 El proceso es una parte del código VHDL dentro del


cual las sentencias se ejecutan en secuencia. Un
proceso existe dentro de una arquitectura, y múltiples
procesos interactúan unos con otros de manera
concurrente.
 Hay procesos:
 combinatorios
 sÍncronos
PROCESO

 Un proceso es una parte de código en la cual las


instrucciones se ejecutan en secuencia.
 Una arquitectura puede contener varios proceso .
Todos los proceso se ejecutan en paralelo.
 El orden de escritura de las instrucciones afecta los
resultados de simulación y síntesis.
Sintaxis del Proceso

Etiqueta Lista de sensitividad

Mux: process (A,B,SEL)


begin
if SEL = '1' then
Z <= A; Sentencias
else secuenciales
Z <= B;
end if;

end process MUX;


Eventos en la lista de sensibilidad

 Un proceso no se ejecuta continuamente, el proceso


empieza a ejecutarse cuando una de las señales en
su lista de sensibilidad cambia de valor o, en el
lenguaje VHDL tiene un evento.

Mux: process (A,B,SEL)


begin
if SEL = '1' then
Z <= A;
else
Z <= B;
end if;
end process MUX;
Múltiples procesos concurrentes

 Mientras que cada proceso ejecuta sus sentencias


en secuencia, múltiples procesos interactúan con los
demás de manera concurrente al producirse un
evento en las señales de la lista de sensibilidad.

Proceso Proceso

Proceso
Múltiples procesos en una arquitectura

architecture A of E is
begin
-- Sentencias Concurrentes
P1: process
begin
-- Sentencias Secuenciales Proceso 1
end process P1;
-- Sentencias Concurrentes
P2: process
begin
-- Sentencias Secuenciales Proceso 2
end process P2;
-- Sentencias Concurrentes
end A;
Ejecución de procesos

Concurrente: 2 drivers
 Cuando estas 2 señales son concurrentes, definen 2
drivers sobre la señal Z.

architecture CONCURRENT of MULTIPLE is


A
signal Z,A,B,C,D: std_logic; B
begin ? Z
Z <= A & B; C
Z <= C & D; D
end CONCURRENT;
Ejecución de procesos

Secuencial: 1 driver, última asignación


 Cuando estas 2 señales son secuenciales, el valor con
el cual la señal es actualizada es el último valor que se
le asigna durante el proceso de ejecución.

architecture SEQUENTIAL of MULTIPLE is


signal Z,A,B,C,D: std_ulogic;
begin
process (A,B,C,D)
C
begin D Z
Z <= A & B;
Z <= C & D;
end process;
end SEQUENTIAL ;
Señal actualizada cuando el proceso se suspende

 Las señales asignadas dentro de un proceso son


actualizadas hasta cuando el proceso termina y
queda suspendido.

architecture SEQUENTIAL of MULTIPLE is


signal Z,A,B,C,D: std_ulogic;
begin
process (A,B,C,D)
begin
Z <= A & B;
Z <= C & D;
end process;
end SEQUENTIAL ;
Noción de process

 Un process es una parte de código en la cual


las instrucciones se ejecutan en secuencia.
 Una arquitectura puede contener varios
process .
 Todos los process se ejecutan en paralelo.
 El orden de escritura de las instrucciones
afecta los resultados de simulación y síntesis.
Implementación de Procesos

 Lógica combinatoria.
 Lógica sincrónica.
 Lógica sincrónica con inicialización asincrónica.

Procesos dormidos, se les llama así a los procesos mientras


las señales que los activan no cambian su estado.
Estructura de Proceso

[ etiqueta: ] process ( lista de sensibilidad )


-- declaraciones
-- variables eventuales
Begin
-- parte operatoria
-- instrucciones secuenciales
-- (if, case, loop)
End process;

Lista de sensibilidad, cambia la asignación de señales


asignadas en el proceso.
Metodología de Procesos.

 Lista de sensibilidad consistente.


 Dominación de comportamiento e implementación de
la lógica.
 Diseños sintetizados, sin asincronismos.
Proceso Combinatorio

[ etiqueta: ] process ( lista de sensibilidad )


-- declaraciones
Begin
-- instrucciones secuenciales
-- (if, case, loop)
End process [ etiqueta];

• Lista de sensibilidad con señales que activan el proceso.


• Parte declaratoria que puede contener variables.
• Variable con ámbito de proceso.
Ejemplo Combinatorio.

Mux: process (A, B,SEL )


Begin
if SEL=‘0’
then SALIDA<=A;
else SALIDA<=B;
end if;
End process;
Estructura Proceso Síncrono

[ etiqueta: ] process
-- declaraciones
Begin
wait until (CK’ event and CK=‘1’);
End process [etiqueta];

• El flanco de subida provoca el cambio en el estado.


• wait until evalúa la condición.
Ejemplo síncrono.

Process
Begin
wait until ( CK’ event and CK=‘1’ );
COUNT <= COUNT + 1;
End process;

• COUNT es construida por flip flops


• No debe haber señales combinatorias.
Proceso Síncrono

[ etiqueta: ] process ( CK )
-- declaraciones
Begin
if (CK’ event and CK=‘1’)
then --instrucciones secuenciales.
end if;
End process [etiqueta];
Proceso Síncrono con Inicialización Asíncrona

[ etiqueta: ] process ( CK , RST)


-- declaraciones
Begin
if RST=‘1’
then --acción asíncrona
elseif (CK’ event and CK=‘1’)
then --instrucciones secuenciales.
end if;
End process [etiqueta];

Cambio de prioridad por condición asíncrona


Ejemplo Síncrono

Process ( CK )
Begin
if ( CK’ event and CK=‘1’ )
then COUNT <= COUNT + 1;
end if;
End process;

• COUNT es construida por flip flops


• Todas las señales deben ser combinatorias.
SENSITIVIDAD

 La sensitividad es el conjunto de entradas de un


bloque que cada vez que tengan un cambio en su
estado activan el sistema y producen una salida.
Lista de Sensitividad

MUX: process (A , B, SEL)


SEL
begin
if SEL = '1' then
A
Z <= A;
else
Z <= B; B
end if;
Z
end process MUX;
Lista de Sensitividad

Falta SEL
SEL
MUX: process (A , B)
begin A
if SEL = '1' then
Z <= A;
B
else
Z <= B;
Z
end if;

end process MUX;


Variables y Señales:

•Las Señales:
•Objetos que pueden ser declarados en el interior de
una entidad (ports) o de una arquitectura (señales
internas).
•La asignación de un valor a una señal se hace con un
retardo (infinitesimal).
•Variables
•Son objetos que pueden ser declarados dentro de un
process (u otras entidades secuenciales).
Ejemplo sobre las señales:

Entity SIG is
port ( A, B, C, CK : in std_logic; S, T: out std_logic );
End SIG;
Architecture ARCHI of SIG is signal TMP : std_logic;
begin
process
begin
wait until CK’event and CK = ‘1’ ;
TMP <= A or B; -- Esta línea será ignorada
S <= TMP;
TMP <= A and C; -- anula la asignación precedente
T <= TMP; -- sobre la señal TMP
end process;
End ARCHI;
Ejemplo utilizando una variable:

Entity VAR is
port ( A, B, C, CK : in std_logic; S, T: out std_logic );
End VAR;
Architecture ARCHI of VAR is
begin
process
variable TMP : std_logic;
begin
wait until CK’event and CK = ‘1’ ;
TMP := A or B;
S <= TMP;
TMP := A and C;
T <= TMP;
end process;
End ARCHI;
Instrucciones secuénciales: frecuentemente utilizadas.

•-IF…THEN… ; [ELSIF… THEN…];[ELSE…]; END IF;


•Similar a la asignación de señales por selección.

•-CASE … END CASE;


•Similar a la asignación de señales por selección.

•-FOR … LOOP END LOOP;


•Similar a la instrucción FOR … GENERATE
La Sentencia IF
Sintaxis if- then – else.

if CONDITION then
--- Sentencias secuenciales
end if;

if CONDITION then
--- Sentencias secuenciales
else
--- Sentencias secuenciales
end if;
Estructura if – elsif.

if CONDITION then
--- Sentencias secuenciales
elsif CONDITION then
--- Sentencias secuenciales
elsif CONDITION then
--- Sentencias secuenciales
.
.
.
else
--- Sentencias secuenciales
end if;
IF-ELSIF
if CONDITION then
•El orden de las -- sentencias secuenciales
sentencias en la elsif CONDITION then
estructura if-elsif es muy -- sentencias secuenciales
importante. Más de una
elsif CONDITION then
condición puede ser
-- sentencias secuenciales
verdadera, y es la
primera condición else
verdadera la que provoca -- sentencias secuenciales
que se ejecuten el grupo end if;
de sentencias que le
siguen
Ejemplo de IF-ELSIF

process (A,B,C,X)
•Si X tiene el valor “0000”, la
begin
condición X=0000 es
If (X=“0000”) then
probada primero, entonces a
Z<=A;
Z se le asigna el valor de A.
elsif (X<=“0101”) then
Z<=B;
else
Z<=C;
end if;
end process;
IF… THEN… ;[ELSIF… THEN…];[ELSE…]; END IF;

Sintaxis:

Todo IF debe terminarse por END IF.


IF esta en general seguido por ELSE
Varios IF pueden estar enlazados.
La contracción ELSIF permite simplificar la
escritura
Ejemplo 2 de IF-ELSIF
process (A,B,C,D,SEL) process (A,B,C,D,SEL)
begin begin
If SEL = “00” then MUX <=A;
If SEL = “00” then MUX <=A;
else if SEL = “01” then MUX <= B;
elsIf SEL = “01” then MUX <=B;
else if SEL = “10” then MUX <=C;
elsif SEL = “10” then MUX <=C;
else MUX <=D;
end if; else MUX<=D;
end if; end if;
end if; end process;
end process;
Utilización de Clock_Enable

architecture ARCHI of SECUENCE is


begin
process
begin
wait until CK’event and CK = ‘1’ ;
If ENABLE = ‘1’ then COUNT<=COUNT+1;
end if;
end process;
end ARCHI;
Utilización de Clock_Enable

architecture ARCHI of SECUENCE is


begin
process(CK)
begin
if CK’event and CK = ‘1’ then
If ENABLE = ‘1’ then COUNT<=COUNT+1;
end if;
end process;
end ARCHI;
Riesgos de inserción de lógica combinatoria en la
línea del reloj
GESTION DE LA JERARQUIA
Modelo de un proceso

 El modelo de ____ ____


___ ___
____ ____
simulación en VHDL __
___
__
___
____ ____
consiste de múltiples
procesos que se Proceso Proceso
encuentran
ejecutándose
secuencialmente.
____
___
____
__
___
____

Proceso
Concurrentes vs. Secuencial

architecture A of E is
 Este modelo puede tener begin
cualquier numero de -- concurrent statements
procesos. P1: process
begin
-- sequential statements
 El proceso es visto como end process P1;
una sola sentencia -- concurrent statements
concurrente. P2: process
begin
-- sequential statements
 Se puede tener n número end process P2;
de sentencias -- concurrent statments
concurrentes y por lo end A;
tanto cualquier número
de procesos.
Asignación de señales en un proceso
Procesos concurrentes: múltiples drivers.

Architecture CONCURRENT of MULTIPLE is  Tenemos dos


signal A, B, C ,D : std_ulogic; asignaciones a la señal
signal Z : std_logic;
Begin
Z, realizadas fuera de un
Z <= A and B; proceso. Las sentencias
Z <= C and D; fuera de un proceso son
End CONCURRENT; concurrentes y por lo
A tanto Z tiene dos drivers
B
? Z
C
D
Dentro de un proceso: un solo driver.

architecture SEQUENTIAL of
MULTIPLE is
 Dentro de este ejemplo signal Z, A, B, C, D : std_ulogic;
similar, las dos begin
asignaciones a Z se process(A, B, C, D)
begin
encuentran dentro de Z <= A and B;
un proceso. (Un Z <= C and D;
proceso puede definir end process;
únicamente un driver en end SEQUENTIAL;
una señal)
C
Z
D
Última asignación

architecture SEQUENTIAL of MULTIPLE


 El lenguaje define que is
en un proceso, la última signal Z, A, B, D : std_ulogic;
asignación hecha a una begin}
process (A, B, C, D) Tiene efecto
señal tiene efecto, pero begin
únicamente cuando el Z <= A and B;
proceso se suspende Z <= C and D;
end process; cuando se suspende
(final del proceso)
end SEQUENTIAL;
Diferente significado

process (A, B, C, D)
 Estas mismas dos
begin sentencias tienen
Z <= A and B;
Z <= C and D;
significado muy distinto,
end process; dependiendo si se
ejecutan dentro o fuera
= de un proceso.

Architecture X of MULTIPLE is

begin
Z <= A and B;
Z <= C and D;
end X;
¿Llamadas a múltiples procesos?

 Un proceso puede ser potencialmente ejecutado varias


veces antes de que todas las señales sean actualizadas.
Ejemplo Proceso llamado

SEÑALES ASIGNADAS EJEMPLO: process (A, B, M) Evento en B


begin
DESPUES DE UNA A: 0
LECTURA. Y <= A; B:1
M:0
Tenemos un proceso con M <= B;
Z:0
Z <= M;
asignación a la señal M,
y el valor de M es end process EJEMPLO;
también leído en el
proceso
B cambia de 0 a 1.
Actualización de valores

La asignación no
es inmediata!
Ejemplo: process(A,B,M)
begin
Y <= A;
M <=B;
Z <=M; En este punto Z
sigue teniendo
end process Ejemplo; valor 0!
Actualización de valores

Z no ha sido actualizada!

A
B
T1process: Tiempo que
M tarda en ejecutarse el
Z bloque “process”

T1process

El proceso termina la primera ejecución


Debido a que M ha cambiado de 0 a 1 (por la asignación M<=B), el
proceso vuelve a ejecutarse

Al ejecutarse esta
Segunda ejecución del proceso línea Z no es
afectada!
Ejemplo: process(A,B,M)
Begin A
Y <= A; B
M <=B; M
Z <=M; Z
end process Ejemplo;

T1process
Actualización de valores

A
B
M
Z

T1 T2
process process

Termina la segunda ejecución del proceso


ENTRADA Y SALIDA
Definición de entrada/salida

 Se necesitan dos pasos para definir las


entradas/salidas.

 A) El tipo buffer (entrada, salida, tres estados ,etc.)

 B) La asignación de pins (pin particular del circuito)


Definición del tipo en el código

 Inferir o instanciar la entrada y salida.

 La herramienta de síntesis Xilinx es capaz de inferir


automáticamente los tipos de entrada/salida.
Jerarquía separada para entrada/salida
 Existen herramientas que
no infieren en la
Nivel Superior entrada/salida básica.
 Para poder instanciarlos
consultar el manual de
Instanciación de los
uso del fabricante.
componentes
de la lógica del núcleo

Buffer E/S
Definición del tipo en la herramienta de síntesis

 Se puede realizar de forma separada la definición de


entrada/salida.

 Se selecciona los tipos de buffer y se asignan a los


puertos de la lógica del núcleo.
Asignación de los pins de entrada/salida

Asignación de pins en las  Con las herramientas de


Herramientas de Xilinx, la asignación de
Foundation. los pins es a través del
archivo (.UCF).

User Control File (.UCF)


Tres estados y entrada/salida bidireccional

 Dentro de la familia Xilinx es capaz de soportar


entrada/salida bidireccional, de tres estados o con
registros, etc.
Salida de 3 estados

Código VHDL  Las herramientas de


síntesis tienen la
Síntesis habilidad de inferir
automáticamente celdas
de entrada/salida tanto
EN salidas de 3 estados
EN como bidireccionales.
OUT ‘Z’
IN
OUT
‘Z’
Estilo de código para inferir 3 estados.

if (EN = ‘0’) then


OUT_PAD <= BUS_OUT;
 El uso de la asignación
else de Z es la que permite a
OUT_PAD <= ‘Z’; la herramienta de síntesis
end if;
inferir en el buffer de tres
estados.
Síntesis

EN

BUS _OUT OUT_PAD


Código para inferir entradas y salidas bidireccionales

CORE_IN <= BIDI;


process (CORE_OUT, BIDI)
if (EN=‘0’) then Sentencia
BIDI <= CORE_OUT; concurrente
else
BIDI <= ‘Z’;
end if;
end process;

Síntesis Uso de la asignación


al valor Z

EN
CORE_OUT BIDI

CORE_IN
Entrada/Salida con registro

 La implementación es
automática utilizando un
registro en la celda de
entrada/salida apropiada
D si esta disponible.
Q  Debe soportar el uso
Terminal de implícito de enable y
Salida reset síncronos en la
celda.

CLK
Inserción de registros durante MAP

 Además las herramientas de implementación de Xilinx


tiene un interruptor que les permite poner registros
en las celdas de entrada/salida donde sea apropiado.
Pull-up

 Xilinx en su mayoría de
dispositivos permite el uso de
pull-up/down, en las terminales
de entrada/salida.
Requerimentos de ruteo
especiales

 En ocasiones, se requiere que las señales de reset y del


reloj, tengan mejor velocidad y desempeño.
 Sucede cuando alguna señal se distribuye en una red de
elementos (alto fanout).
 Si la herramienta de síntesis no infiere esta red, se debe
especificar con STARTUP, una red llamada GSR (Global
set/reset)
Redes para reloj

 Al sintetizar Xilinx, instancia buffers globales


automaticamente en redes de reloj.
 Si esto no sucede, entonces debe instanciarse una
celda de buffer global para manejar la red del reloj
 Los Buffers Genéricos son:

XC3000 BUFG
XC5200 BUFG
XC4000E BUFGP,BUFGS
BUFG

 Puede ser aplicado sobre un IBUF (buffer de entrada), o


sobre redes internas que manejan señales de CLK.
 El efecto que tiene es conectar una señal, por la ruta
mas corta, a la red sobre la que se aplica el BUFG
Ejemplos:
BUFG = CLK: mapea hacia una línea global de reloj
(GCK)
BUFG = OE: mapea hacia una línea global de control 3-
estado.
BUFG = SR: mapea a una linea global de control
set/reset
Sintaxis BUFG

 attribute BUFG: string;


 attribute BUFG of signal_name: signal is
“{CLK|OE|SR|DATA_GATE}”;
Señales internas de 3 estados

 El uso de buffers internos ayuda en ocasiones a


simplificar el diseño
 Estos buffers pueden ser implementados de tres
maneras:
- tres estados
- and cableada
- or-and cableada
 Para el uso de un mux 5-1, el uso de estos elementos
simplifica el diseño
Mux 5-1 con Buffers internos
Xilinx infiere cuando instanciar
automáticamente buffer, (BUFT)
Decodificadores amplios(Wide Edge Decoder)

 En ocasiones es de mucha utilidad contar con un


decodificador de direcciones, por ello Xilinx tiene
circuiteria dedicada sobre el contorno del dispositivo, por
lo que las señales de entrada pueden ser decodificadas.
Estos decoficadores son implementados con celdas and
y pull-up.
 Existe el tipo WAND, que permite instanciar este tipo de
decodificadores.
TIEMPO

 VHDL nos permite


modelar el tiempo, que es
una parte importante al
describir sistemas
electrónicos.
ESTRUCTURA

 Composición de
elementos.
ENTIDAD

 La entidad en VHDL
describe la interfase de
un bloque jerárquico, sin
describir su
comportamiento.
 La entidad es equivalente
a un “símbolo” en un
diseño basado en una
estructura esquemática.
 Es la porción de código
que permite definir en
particular Entradas y
Salidas
ENTIDAD:
Informaciones Complementarias

- Equivalente a símbolos en los esquemas.


- Los “ports” de entrada/salida deben imperativamente
estar declarados dentro de la entidad y definir su modo:
in, out, inout, buffer.
Modo por defecto:in
- Los “ports” pueden igualmente ser declarados en forma
de “señales” simples (ej. Bit) o en forma de bus (ej:
bit_Vector).
EJEMPLO DE ENTIDAD

 Ejemplo:
entity Ejemplo is
port(
A,B:in bit_vector(7 downto 0);
SEL:in bit; Símbolo Ejemplo
Mux_OR:out bit );
end Ejemplo; A[7:0]
B[7:0] MUX_OR
Equivalencia
Sel
Esquemática
ENTIDAD: Sintaxis de declaración

entity EJEMPLO is
port(Lista puertos de entrada/Salida comprimiendo:
Nombre_de_señal:modo y tipo.);
end [EJEMPLO];

--Los corchetes “[]” indican que es opcional usar de


--nuevo el nombre de la entidad después de la palabra
-- clave end.
- El nombre dado a la entidad puede ser cualquiera. (excepto las
palabras reservadas).
- Dar de preferencia el mismo nombre a la entidad y al fichero VHDL
(En este caso EJEMPLO.vhd)
- La lista de puertos está comprendida entre dos paréntesis y seguida
de un punto y coma.
- Nombre de la entidad opcional después de la palabra “end”.
ARQUITECTURA

 Porción de descripción
del comportamiento del
dispositivo a sintetizar.
 La arquitectura describe
el comportamiento de la
entidad.
• Esta asociada a una
entidad
• (dentro del mismo
fichero)
• Posee una parte
declaratoria y una
parte operatoria.
Entidad y Arquitectura

 Una entidad puede tener


mas de una arquitectura.

 Una aplicacion es útil, esto


es cuando un diseño es
descrito a varios niveles de
abstracción: pueden existir
descripciones a nivel de
comportamiento, RTL y de
compuertas, del mismo
diseño, o varias formas de
describir el mismo circuito.
PAQUETE

 Un paquete tiene una colección de definiciones que


pueden ser referenciados por varios diseños al mismo
tiempo.
ARREGLOS

 Son elementos del mismo tipo.


 VHDL define dos tipo de arreglo estándar: bit_vector y string.
Un arreglo en VHDL tiene las siguientes tres características
1.-El tipo de elementos en el arreglo (tienen que ser del mismo tipo)
2.-La longitud de el arreglo
3.-Los índices del arreglo
bit_vector representa un tipo especial de arreglo en el cual el numero de bits o la
longitud del arreglo no es restringida y es puesta en la declaración del objeto

Declaraciones legales 1 2 3 4
signal Z_BUS: bit_vector (3 downto 0) Signal
signal C_BUS: bit_vector (1 to 4) C_BUS

Declaraciones ilegales
signal Z_BUS: bit_vector (0 downto 3) 3 2 1 0
Signal
signal C_BUS: bit_vector (3 to 0)
Z_BUS
bit string literal.

signal SIG_A: bit_vector (7 downto 0)


7 6 5 4 3 2 1 0
SIG_A <= B”1110_0011” --(22710)
SIG_A 1 1 1 0 0 0 1 1

B”11111010” B”1111_1010” Designación Base


B Binaria
X”FA” B”11111010”
O Octal
O”372” B”011111010”
X Hexadecimal

 Es una notación para especificar el valor de un


bit_vector.
Asignación por posición.

 Dos objetos de tipo arreglo pueden ser asignados uno al otro,


mientras sean del mismo tamaño y del mismo tipo:
 Notar que la asignación es por posición y no por número de índice.
El concepto de bit más significativo no esta definido en VHDL.
signal Z_BUS: bit_vector(3 downto 0); 1 2 3 4
signal C_BUS: bit_vector(1 to 4); Signal

Z_BUS <= C_BUS; C_BUS

Z_BUS(3) <= C_BUS(1);


Z_BUS(2) <= C_BUS(2); 3 2 1 0
Z_BUS(1) <= C_BUS(3); Signal
Z_BUS(0) <= C_BUS(4);
Z_BUS
Parte de un arreglo. (Slices)

 Una parte de un arreglo unidimensional, en general, y un bit_vector en


particular puede ser referenciado, inclusive por un solo elemento. La
dirección de esta parte (es decir, to o downto) debe corresponder con la
dirección del arreglo declarado.
signal Z_BUS: bit_vector(3 downto 0);
signal C_BUS: bit_vector(1 to 4);
Los slices de vectores de bit son útiles
legal debido a que a menudo pueden ser
Z_BUS (3 downto 0) <=“00” vistos como colecciones de campos,
C_BUS:(2 to 4) <= Z_BUS (3 downto 1); donde cada campo lleva una pieza de
información.
Por ejemplo un vector de bit que
ilegal represente la instrucción de una
Z_BUS (0 to 1) <=“111” computadora puede contener un
campo representando el tipo de
instrucción.
Concatenación y agregados.

 Ahora se discuten dos conceptos conocidos como


concatenación y agregado. Estos son dos métodos
que sirven para asociar señales entre ellos y
asignarlas a un arreglo de objetos.
Concatenación

 VHDL tiene la habilidad de asociar bits individuales y


vectores para formar una estructura de arreglo. Esto es
conocido como concatenación y utiliza el operador
“ampersand” (&). Los ejemplos muestran que bits
individuales y vectores de bits pueden ser concatenados
para formar nuevos vectores
signal Z_BUS: bit_vector(3 downto 0);
signal A,B,C,D: bit;
signal BYTE: bit_vector(7 downto 0);
signal A_BUS: bit_vector(3 downto 0);
signal B_BUS: bit_vector(3 downto 0);

Z_BUS<= A & B & C & D


BYTE<=A_BUS & B_BUS
Agregados.

signal Z_BUS: bit_vector(3 downto 0);


 Otro método de signal A,B,C,D: bit;
asignación a
elementos de un Z_BUS<=(A, B, C, D);
arreglo es conocido
como agregado.
Un agregado esta Z_BUS(3)<=A;
Z_BUS(2)<=B;
contenido entre Z_BUS(1)<=C;
paréntesis y las Z_BUS(0)<=D;
asignaciones a cada
elemento son
separadas por
comas.
Especificando los elementos por nombre.

 Es posible asignar a los signal X: bit_vector(3 downto 0);


elementos de un arreglo signal A,B,C,D: bit;
signal BYTE:bit_vector(7 downto 0)
por nombre o por
posición.
X<= (3=>’1’, 1 downto 0 =>’1’, 2=>B)
 Este ejemplo demuestra
que también un rango
del arreglo puede ser nombre rango nombre
asignado, siempre y
cuando el mismo valor
sea asignado a cada
elemento del rango.
Others, soporte para síntesis.

 Los agregados tienen la


habilidad de usar la signal Z_BUS: bit_vector (3 downto 0);
sentencia others, la cual signal A,B,C,D: bit;
signal BYTE:bit_vector(7 downto 0);
asignará un valor a todos los
otros elementos de un X<= (3=>’1’, 1 =>’0’, others=>B)
arreglo que no han sido
especificados. Finalmente,
no todas las herramientas de
síntesis soportan el uso de
agregados, por lo que puede
ser necesario usar
concatenación para realizar
manipulaciones sobre
arreglos.
Necesidad de mas que el “0” y el “1”
 El tipo bit tiene unas limitaciones, puede solo representar el 0 y el 1. En
simulación puede ser útil el poder representar otros valores, por ejemplo:
desconocido, no inicializado, alta impedancia. Mientras para la síntesis
puede ser útil representar una condición: don’t care
Unknown El valor era conocido pero ya no lo es. A menudo denota
dos compuertas manejando el mismo nodo de salida, con
conflicto entre valores.
Un-initialised El valor nunca fue conocido (prepower-up)
High Impedance La red no tiene driver

Drive strengths Maneja diferentes drivers de salida

Don’t care Implementación en sintesis. No estamos interesados en el


comportamiento de la entrada/salida, la salida no esta
siendo monitoreada bajo ciertas condiciones de entrada o
ciertas condiciones de entrada que nunca se espera que
ocurran
Lógica de valores múltiples

 La idea de una lógica de valores múltiples, o un sistema


LVM lleva un tipo de señal enumerado definido por todos
los valores, junto con un grupo de funciones que
realizan operaciones lógicas tales como: AND y OR
sobre objetos de ese tipo.

Logic 0 Logic 1 Unknown


“0” “1” “X”

Don’t care Un-initialised High impedance


“-” “U” “Z”
Compuerta inversora NMOS Estática

VDD
0 1

?
c Output
c
1
input

0
Compuerta inversora NMOS Estática

VDD VDD

RONP
U

Output=Vdd ROFFP H
=H
Input=L ROFFPD + RONP
ROFFPD U

VDD
RONP
U
Output=Vdd RONP L
D =L
Input=H RONPD + RONP
RONP U
D
Compuerta inversora NMOS Estática

0 1

1 VDD

c Output
c
input
OBJETOS MANIPULABLES

 Los objetos que se pueden manipular en VHDL son:

1 SEÑALES: Los “ports” declarados dentro


de una entidad son señales.
2 CONSTANTES: permiten definir valores
permanentes
3 VARIABLES: utilizados solamente dentro de los
procesos(instrucciones secuénciales).
4 ARCHIVOS (FICHEROS)
Declaraciòn de Objetos
La formula de declaraciòn de constantes,
variables y señales es:

Tipo_de_Objeto Nombre_de_Objeto Tipo_de_Dato:=Valor Inicial

Por ejemplo:

SIGNAL nodno1: BIT:='1';


VARIABLE var1:BIT;
CONST pi: REAL:=3.14159;
Señales

 Son objetos que permiten simular la interconexión de


componentes dentro de la arquitectura de diseño.

 Permiten representar entradas o salidas de entidades.


Señales

 X0 y x1 no tienen asignada una terminal en la entidad de


diseño (funcionan como un medio de interconexión).
Sintaxis general de una señal

signal id {,...} : tipo [:= expresion ];


port ( { id {, ...} : direccion tipo [:= expresion];}]

Signal Reloj : std _logic :='0';


signal Comparacion: bit;
signal Resultado : integer range 0 to 7;
port ( a,b : in integer range 0 to 7;
c : out integer range 0 to 7;
d : inout std_logic );
Señales

 Forma de declarar una señal:


signal identificator: tipo: [rango];

Ejemplo:
signal vcc: bit: ´1´;
signal suma: bit_vector: (3 downto 0);
Señales

 las señales pueden declararse en una entidad,


en una arquitectura o en un paquete.
 si se quiere inicializar una señal hay que indicar
un valor en [:=expression]
 por ejemplo: signal s: bit:='1';
 de otra manera, el valor es inicializado al valor
mas bajo del tipo de variable definido.
Señales

 Escalar: signal name(s):=type


[range_contraint][:=expression];
 Vectorial: signal name(s): array_type[index_constraint]
[:=expression];
 Entidad: port (name(s): direction type
[range_constraint][:=expression]);
Señales

Ejemplos:
 signal count: integer range 1 to 50; (el valor inicial será
1)
 signal GROUND: BIT:='0';
 signal YS_BUS std_logic_vector (7 downto 0);
 port (B,A: in integer range 0 to 9);
 signal bogus: bit_vector; (Errónea, no hay dimensión)
Driver de señal

• Un conductor (driver) para una señal se define por el


proceso que asigna valores a la señal.
• Los valores que viajan por los caminos de datos en un
tiempo dado están contenidos en dicho conductor, el
cual consta de una colección de parejas (tuplas)
valor/tiempo llamadas transacciones.
Asignación múltiple o concurrente

 Los “conductores” son creados por sentencias de


asignación de señales.
 Una asignación concurrente de señal dentro de una
arquitectura produce un “conductor” para cada
asignación de señal. Asignaciones múltiples producirán
“conductores” múltiples de señal.
Creación de un driver

ARCHITECTURE t1 OF d1 IS
BEGIN
a <= b AFTER 10 ns ;
a <= c AFTER 10 ns ;
END t1;
Función de resolución

 La señal ´”a” está siendo manejada por dos fuentes, b y


c.
 Cada asignación concurrente creará un conductor para
la señal a, esto no es admitido a menos que se defina
una función de resolución (resolved signals).
 La forma en que esto se resuelve queda a cargo del
diseñador.
Atributos función de las señales
S´EVENT Retorna verdadero si ocurrió un evento
en S durante el corriente delta, de lo
contrario devuelve falso.
S´ACTIVE Retorna verdadero si ocurrió una
transición en S durante el
corriente delta, else falso.
S´LAST_EVENT Retorna el tiempo transcurrido
desde la transición previa de la
señal S.
S´LAST_VALUE Retorna el valor previo de S
antes del último evento.
S´LAST_ACTIVE Retorna el tiempo transcurrido
desde la transacción previa de la
señal.
Señales de tipo definido

 Habiendo definido el tipo, podemos definir señales de


este tipo. Aquí hemos declarado la señal STATE de tipo
MY_STATE. Debemos observar las reglas estrictas
cuando usemos estas señales: no podemos asignar
nada a la señal STATE que no sea del tipo MY_STATE
type MY_SATE is
(RESET, IDLE, RW_CYCLE, INT_CYCLE);

Signal STATE: MY_STATE;
Signal TWO_BIT: bit_vector (0 to 1);

STATE<=RESET;
STATE<=“00”;
STATE<=TWO_BIT;
CONSTANTES

Una constante es un objeto que se inicializa


a un determinado valor y no puede ser cambiado una vez
inicializado.

Sintaxis general de una constante

constant id {,...} : tipo [:= expresion];


Ejemplos

Constant Pi: real : =3.1415;


constant BitsPalabra : integer :=8;
constant NumPalabras : integer :=64;
constant NumBits : integer :=BitsPalabras * NumPalabras;
constant RetardoAND2 , RetardoOR2 : time := 2 ns
VARIABLES

Una variable es un objeto que se inicializa a un


determinado valor y a diferencia de una constante
su valor puede ser alterado en cualquier instante.

Sintaxis general de una variable

variable id {,....} : tipo [expresion];


Ejemplos

Variable Indice1, Indice2, Indice3 : integer := 0;


variable Comparacion : boolean;
variable Resultado : real;
ARCHIVOS (FICHEROS)

Permiten comunicar un diseño VHDL con el exterior, el modelo


lee y escribe datos persistentes.

En el paquete texti o de la biblioteca standar hay


tipos de datos y operaciones de lectura/escritura de archivos de
texto.

VHDL soporta subprogramas para leer y escribir


archivos en forma secuencial.
Sintaxis general de un archivo

file id {,....} : tipo [is direcciòn “nombre” ;]


file id {,....} : tipo [ [ open tipo_acceso] is “nombre”;]

Ejemplos

file Estimulos : FicheroEnteros open read_mode is “datos.in”;


file Salida : FicheroEnteros open write_mode id “datos.out”;
ASIGNACION DE UN VALOR

 A una señal se le asigna


un valor, en VHDL, por
medio de una sentencia
de Asignación de señal.
 Una Asignación a una
señal define un driver
sobre esa señal.
 Se pueden tener
multilples drivers.
DEFINICION DE PUERTOS

Señales que relacionan una entidad


con otra
Forma genérica de designar un puerto

nombre_variable: modo tipo;

Ejemplos:

puertoa: in bit;
puertob: in bit_vector(0 to 7);
puertoc: out bit_vector(3 downto 0);
puertod: buffer bit;
puertoe:inout std_logic;
Modo de Puerto
in
Un puerto es de modo in si la información correspondiente al mismo, entra a la entidad y se suele
usar para relojes, entradas de control (como las típicas load, reset y enable), y para datos de
entrada unidireccionales.

out
Un puerto es de modo out si la información fluye hacia fuera de la entidad.
Este modo no permite realimentación ya que al declarar un puerto como out estamos indicando al
compilador que el estado lógico en el que se encuentra no es leíble.

buffer
Este modo es similar al modo out, pero además, permite la realimentación y no es bidireccional,
y solo puede ser conectado directamente a una señal interna, o a un puerto de modo buffer de
otra entidad. Una aplicación muy común de este modo es la de salida de un contador, ya que
debemos saber la salida en el momento actual para determinar la salida en el momento
siguiente.

inout
Es usado para señales bidireccionales, es decir, si necesitamos que por el mismo puerto fluya
información tanto hacia dentro como hacia afuera de la entidad. Este modo permite la
realimentación interna y puede reemplazar a cualquiera de los modos anteriores, pudiéndose
usar este modo para todos los puertos.
Tipos Nativos para VHDL

boolean
Puede tomar dos valores: verdadero/true o falso/false. Un ejemplo típico es la salida de un comparador
que da verdadero si los números comparados son iguales y falso si no lo son

bit
Puede tomar dos valores: 0 ó 1 ( o también "low" o "high", según se prefiera). Es el tipo más usado
de los nativos

bit_vector
Es un vector de bits. Debemos tener cuidado al definir el peso de los bits que lo integran, ya que
según pongamos la palabra reservada downto o to estaremos diciendo que el bit más significativo es
el número más alto o el más bajo del vector, respectivamente..

numero : bit_vector (0 to 7);


numero : bit_vector (7 downto 0);

integer
Para mantenerr números enteros. Hay que advertir que el uso de enteros consume muchos recursos
del dispositivo de lógica programable, siempre y cuando sea sintetizable, debido a que está
prácticamente creado para la simulación.
• Definir un modelo de comportamiento sintetizable (ARCHITECTURE)
Usando el juego de instrucciones soportado por las herramientas de síntesis

architecture archpro of programa is

-- Declaración de señales y otros accesorios

Begin

-- Núcleo del programa

End archpro;

Para describir una arquitectura podremos usar cuatro estilos


Estilo behavioral
Estilo dataflow
Estilo structural
Estilo mixto
Estilo behavioral Estilo dataflow

entity compa is architecture dataflow1 of compa is


port ( begin
a,b: in bit_vector(3 downto 0); igual<='1' when (a=b) else '0';
igual: out bit end dataflow1;
);
end compa;

architecture dataflow2 of compa is


architecture behavioral of compa is begin
begin igual<= not(a(0) xor b(0))
comp: process (a, b) and not(a(1) xor b(1))
begin and not(a(2) xor b(2))
if a= b then and not(a(3) xor b(3));
igual<='1'; end dataflow2;
else
igual<='0';
end if;
end process comp;
end behavioral;
Estilo structural
Estilo mixto

architecture struct of compa is


signal x: bit_vector(0 to 3);

Component xnor2
Port (e1,e2:in bit; y:out bit);
End component;

Component and4
Port (e1,e2,e3,e4:in bit; y:out bit);
End component;

begin
u0: xnor2 port map (a(0),b(0),x(0));
u1: xnor2 port map (a(1),b(1),x(1));
u2: xnor2 port map (a(2),b(2),x(2));
u3: xnor2 port map (a(3),b(3),x(3));
u4: and4 port map (x(0),x(1),x(2),x(3),igual);
end struct;
Estilo de Escritura RTL (Register Transfer Level)

Netlist Describe los componentes que posee y las conexiones


entre ellos (Estilo Estructural)

RTL Describe el comportamiento de cada entidad


CONCEPTO DE TIPO DE DATO

 Todos los objetos en VHDL son de un tipo dado.


 Un tipo de dato se caracteriza por el conjunto de
 valores que puede tomar y los operadores que
 se le puede aplicar a un objeto.
TIPO

 El tipo define un conjunto de valores y una asignación a


esa señal debe ser un valor definido por ese conjunto.
 Cuando hacemos una asignación a una señal, los tipos
en ambos lados del operador de asignación de señal
deben corresponder.
Declaraciòn de tipos de datos
Sintaxis general

type id is definiciòn_tipo;

Ejemplos

type DiaMes is range 1 to 31 ;


type Dela31 is range 1 to 31;
type Orientacion is (norte,sur,este,oeste);

Uso

constant DiasEnero : DiasMes :=31;


variable DiaHoy : DiaMes;
signal Direcciòn : Orientacion;
Los tipos deben corresponder

 Cuando hacemos una asignaciòn a una señal,


 los tipos en ambos lados del operador de
 asignaciòn de señal deben corresponder.

Ejemplo:
 Entity HALFADD is
 port (A,B : in bit;
 SUM, CARRY : out bit);
 end HALFADD;
Tipos predefinidos

 Escalares
 Enumerados
 BOOLEAN,BIT,CHARACTER
 Enteros
 INTEGER
 Físicos
 TIME
 Flotantes
 REAL

 Compuestos
 Arrays
 STRING,BIT_VECTOR

• Otros
Puntero
ACCESS
Archivos
FILE
TIPO BOOLEAN

Este tipo de dato puede tomar un valor


falso o verdadero

 TRUE
 FALSO

Cuando se comparan dos valores de tipo boolean


el resultado también es de tipo boolean.
TIPO BIT

El tipo BIT sirve para modelar niveles lógicos.


Conjunto de valores ‘0’ y ‘1’

Operaciones definidas sobre el:


 Lógicas: not,and,nand,or,nor,xor y xnor
 Comparación: ‘=‘, ‘/=‘,’<‘, ‘<=‘, ‘>’, ‘>=‘
 Concatenación: &

type bit is (‘0’, ‘1’)


TIPO CHARACTER

Se utiliza para definir un solo carácter.

‘A’
‘b’
‘x’
TIPO INTEGER
Un tipo integer es un dato cuyo contenido es un
valor numerico entero que esta dentro del siguiente rango :
2,147,483,647 a +2,147,483,647.

Ejemplos
+1
682
-139
+239

TYPE Integer IS 0 TO 255;


TYPE index IS RANGE 7 DOWNTO 1;
TIPO TIME
El tipo TIME sirve para especificar valores de
tiempo en los modelos

Se define la unidad básica y las derivadas de ellas.

type time is orange -2147483647 to 2147483647


units
fs;
ps = 1000 fs;
ns = 1000 ps;
us = 1000 ns;
min = 60 sec;
end units;
TIPO REAL

Conocidos también como coma flotante,


son los tipos que definen un numero
real. Al igual que los enteros se definen
mediante la palabra clave RANGE, con la
diferencia de que los límites son números
reales.
TIPO STRING

El tipo string se define como un arreglo


de cadenas de caracteres.

Ejemplos

“error en sincronia”
“Hola Mundo”
TIPO BIT_VECTOR

El tipo bit_vector es un arreglo de bit:


 Permite modelar buses con un solo driver
 Solo admite valores ‘0’ y ‘1’

"0101_1001"
x"00AF"

type bit_vector is array (natural range <>) of bit;


SUBTIPOS DE DATOS

VHDL permite la definición de subtipos


que son restricciones o subconjuntos de
tipos existentes.
Hay dos tipos, el primero son subtipos
obtenidos a partir de la restricción de un
tipo escalar a un rango.
Ejemplo:

SUBTYPE raro IS integer RANGE 4 TO 7;


SUBTYPE digitos IS character RANGE '0' TO
'9';

El segundo tipo de subtipos son aquellos que


restringen el rango de una matriz:

Ejemplo:

SUBTYPE id IS string(1 TO 20);


SUBTYPE word IS bit_vector(31 DOWNTO 0);
Tipos enumerated.

 Un tipo de datos definido


por el usuario es conocido
en VHDL como un tipo
enumerated. Lo más
común es definir los tipos
dentro de un paquete,
arquitectura o proceso, y la
mayoría de las
herramientas de síntesis
son capaces de sintetizar
VHDL que contiene tipos
enumerated.
Síntesis de tipo enumerated
 La mayoría de las herramientas de síntesis pueden construir
lógica desde una señal del tipo enumerated. Usualmente la
señal tiene el número mínimo de bits requerido para
representar el número de valores posibles. Este ejemplo
muestra cada como cada valor es usualmente codificado en
la implementación del hardware.
type MY_SATE is
(RESET, IDLE, RW_CYCLE, INT_CYCLE);

Codificación de derecha a izquierda en secuencia binaria


RESET “00”
IDLE “01”
RW “10”
INT_CYCLE “11”
Mínimo número de bits
TIPO PREDEFINIDO (enumerated)

 Son especificados como código fuente de VHDL, y se


encontran en un paquete llamado STANDARD:
 Boolean
 Time
 Bit  Character
 Bit_vector  String
 Integer
 real
STANDARD_LOGIC

 El Estándar 1164 está


definido en código fuente
VHDL puro y describe un
tipo de dato llamado
“std_ulogic”, el cual
define los nueve estados
posibles.
TIPO STD_ULOGIC

 El tipo std_ulogic es un tipo de dato unresolved, y puede


tener un solo driver. De hecho, la “u” se refiere al hecho
de que es de tipo unresolved.
TIPO STD_LOGIC

 Hay otro tipo definido, llamado “std_logic”.


 el cual es una versión tipo resolved de std_ulogic y
puede tener mas de un driver.
 El tipo std_logic tiene los mismos nueve estados de
std_ulogic.
VECTORES TIPO STD_LOGIC Y STD_ULOGIC
 El paquete también contiene la definición de los arreglos
de std_logic y std_ulogic, conocidos como
std_logic_vector y std_ulogic_vector. estos tipos tienden
a ser usados para describir estructuras de bus en la
forma como el tipo bit_vector.
 Los tipos std_logic y std_logic_vector, son los
recomendados para usar en los diseños.
 La razón para esto es que hay otros estandares para
usar VHDL que están basados en estos tipos en lugar
de std_ulogic y std_ulogic_vector.
Asignar std_logic a std_ulogic.

 Como se muestra en el diagrama es posible


asignar objetos de tipo std_logic a objetos del tipo
std_ulogic, y viceversa.

s
i
g
n
a
l
A
std_logic para drivers múltiples

 Si hay múltiples drivers en una señal se debe usar el


tipo std_logic, ya que no es valido tener mas de un
driver en un tipo de dato unresolved.

signal A,B,Z: std_ulogic;


signal RES_Z: std_logic;
Z o RES_Z ?

Z<= A; RES_Z<= A;
Z<= B; RES_Z<= B;
Cláusulas library y use

 El paquete de definiciones está contenido en una


biblioteca llamada IEEE. Es necesario hacer referencia
tanto a la biblioteca como al paquete, como es mostrada
en el diagrama. Se deben usar estas líneas de código
antes de describir las entidades que usan en el Standard
Logic.
library IEEE; --hace visible la biblioteca
use IEEE.Std.Logic_1164.all; --hace todo el contenido del paquete visible

entity MVLS is
port (A,B: in std_ulogic;
Z: out std_ulogic);
end MVLS;
OPERADORES LOGICOS

 Tienen la misma precedencia, y se ejecutan de


izquierda a derecha en la sentencia.
OPERADORES RELACIONALES

 Los operadores deben ser del mismo tipo, pero el


número de bits comparados puede ser diferentes.
OPERADORES ARITMETICOS

 Operan sobre objetos de


tipo INTEGER.

 Pueden igualmente
operar sobre
STD_LOGIC_VECTOR
utilizando los paquetes
STD_LOGIC_UNSIGNED
y STD_LOGIC_ARITH.
OPERADORES DE DESPLAZAMIENTO

 rol ( rotate left )


 ror ( rotate right )
 sll ( shift left logical )
 srl ( shift rigth logical )
 sla ( shift left arithmetic )
 sra ( shift right arithmetic )

 Operan sobre objetos de tipo:


 bit_vector
 std_logic_vector, std_ulogic_vector
INSTRUCCIONES
SECUENCIALES Y
CONCURRENTES
Sentencias secuenciales y concurrentes

 Sentencias concurrentes. Se ejecutan al mismo tiempo.


En paralelo.

 Sentencias secuenciales. Se ejecutan una a la vez.


En secuencia.
Instrucciones concurrentes

Las operaciones se efectúan al mismo tiempo (en


paralelo) :
 El orden de escritura de las instrucciones no afecta el
resultado de la síntesis o simulación.

 El estilo de escritura es comparable a los lenguajes de


programación de los PALs (ecuaciones lógicas).
Ejemplo

Entity CONCURRENT is
port(A, B, C : in bit;
S, T : out bit); end CONCURRENT;
Architecture ARCHI of CONCURRENT is
begin
S <= (A and B) and not(C);
T <= B xor C;
end ARCHI;
Ejecución en paralelo orden independiente

 El comportamiento de sentencias concurrentes es


independiente del orden en el cual sean escritas.

X <= A + B;
Z <= C + X;

Z <= C + X;
X <= A + B;
Asignación concurrente
 Los diseños esquemáticos son usados para representar
hardware, por lo que son concurrentes por naturaleza.

X <= A + B;
Z <= C + X;
Z <= C + X;
X <= A + B;

A
B +
C + Z
Asignación Concurrente

 Consideremos la sentencia x <= x + y.


X <= x + y;

En Software;

Registro X Registro X

+
No para Hardware
 Siendo una sentencia concurrente, esta misma línea de
código está describiendo un sumador, sin registros de
almacenamiento implícitos.

X <= x + y;

En Hardware;
x y

+
x
Instrucciones secuenciales

Las operaciones se efectúan en secuencia.


 El orden afecta los resultados de simulación y sintésis.
 Estilo de escritura parecido a los lenguajes de
informática de alto nivel.
 Las instrucciones secuenciales se usan en partes
específicas del código: PROCESO o subprogramas.
Ejemplo

Architecture ARCHI of SECUENCIA is


begin
process begin
wait until CK’event and CK = ‘1’;
if ENA = ‘1’ then COUNT <= COUNT+1;
end if;
end process;
end ARCHI;
Utilización del Clock_Enable
Dedicado de los Flip Flops Xilinx
Instrucciones concurrentes

Asignación de señales por condición: WHEN…ELSE


 Sintaxis:
Signal_x <= valor_x when signal_y = valor_y
else valor_z;
 Notar que el valor_z es indicado directamente después
de “else”. (El símbolo de asignación “<=” es implícito)
Ejemplo

entity CONCURRENT is
port (A, B, C : in bit; S, T : out bit);
end CONCURRENT;
architecture ARCHI of CONCURRENT is
begin
S <= A when C = ‘1’ else B;
T <= B xor C;
end ARCHI;
Ejemplo
entity CONCURRENT is
port (A, B, C : in bit; S, T : out bit);
end CONCURRENT;
architecture ARCHI of CONCURRENT is
Begin
if (c = ‘1’) then S <= A
else S <= B;
T <= B xor C;
end ARCHI;
Ejemplo

Entity CONCURRENT is
port (A, B, C : in bit; S, T : out bit);
end CONCURRENT;
architecture ARCHI of CONCURRENT is
begin
S <= A when C = ‘1’ else B;
T <= not B;
end ARCHI;
 Las dos instrucciones (o asignaciones) son
concurrentes. El orden de escritura no afecta los
resultados.
 Estas instrucciones generan:

A
S B T
B
C
Ejemplo

Entity TRISTATE is
port (A, B, C, : in std_logic; S : out std_logic );
end TRISTATE
Architecture ARCHI of TRISTATE is
begin
S <= A when C = ‘0’ else ‘Z’;
S <= B when C = ‘1’ else ‘Z’;
end ARCHI;
B S

A
Entity is
port (A, B : in std_logic_vector(15 downto 0);
C : in std_logic;
S : out std_logic_vector(15 downto o));
end TRISTATE;
Architecture ARCHI of TRISTATE is
begin
S<=A when C=‘0’ else “ZZZZZZZZZZZZZZZZ”;
S<=B when C=‘1’ else “ZZZZZZZZZZZZZZZZ”;
End ARCHI;
B[ 15:0]
S[ 15:0]

A[ 15:0]
Asignación de señales por selección.
with - select

 Ejemplo:

with signal_x select


signal_y <= valor_y1 when “00”,
valor_y2 when “01”,
valor_y3 when “10”,
valor_y4 when others;
 Ejemplo 2:

architecture archi of muxAndNot is


begin
with SEL select
S <= A when “00”,
B when “01”,
C when “10”,
D when others;
T <= not B,
end archi

A
B S
C
D B T
SEL[1:0
]
Ciclos con:
for - in – to - generate

 Sintaxis:

LABEL: for i in enteroA to enteroB generate


--Instrucciones concurrentes
end generate;

 i No necesita declararse previamente y no puede


modificarse su valor dentro del ciclo.
 enteroA y enteroB definen el número de iteraciones.
 LABEL es de uso obligatorio.
 generate puede ajustarse empleando range.
Decodificador.
Hexadecimal – 7 Segmentos.
 Tabla de verdad:
A B C D a b c d e f g
0 0 0 0 0 1 1 1 1 1 1 0
1 0 0 0 1 0 1 1 0 0 0 0
a
2 0 0 1 0 1 1 0 1 1 0 1
3 0 0 1 1 1 1 1 1 0 0 1
4 0 1 0 0 0 1 1 0 0 1 1
f b
5 0 1 0 1 1 0 1 1 0 1 1
g
6 0 1 1 0 1 0 1 1 1 1 1
7 0 1 1 1 1 1 1 0 0 0 0
8 1 0 0 0 1 1 1 1 1 1 1
e c
9 1 0 0 1 1 1 1 1 0 1 1
A 1 0 1 0 1 1 1 0 1 1 1
d
B 1 0 1 1 0 0 1 1 1 1 1
C 1 1 0 0 1 0 0 1 1 1 0
D 1 1 0 1 0 1 1 1 1 0 1
E 1 1 1 0 1 0 0 1 1 1 1
F 1 1 1 1 1 0 0 0 1 1 1
Decodificador BCD – 7 Segmentos
with BCDIN select
display <= “0000000” when x “0”,
“0000000” when x “1”,
“0000000” when x “2”,
“0000000” when x “3”,
“0000000” when x “4”,
“0000000” when x “5”,
“0000000” when x “6”,
“0000000” when x “7”,
“0000000” when x “8”,
“0000000” when x “9”,
“0000000” when x “a”,
“0000000” when x “b”,
“0000000” when x “c”,
“0000000” when x “d”,
“0000000” when x “e”,
“0000000” when x “f ”,
“0000000” when others;
CONFIGURACION

 La configuración es como
una lista de partes,
especificando cual
arquitectura debe ser
usada para cada entidad
del diseño.
 Permitir una
configuración por default
permite que el código sea
más portable.
CONFIGURACION
 Es el enlace entre cada
nivel de la jerarquía, y la
especificación de cual
arquitectura es la que
debe ser usada
COMPILACION
 Después de que se ha
escrito el código de
VHDL en un archivo de
texto, el código es
analizado para
determinar si tiene
errores de sintaxis, y se
crea un archivo binario.
 Este proceso es realizado
por unas de las
herramientas para
compilación y por otras
herramientas para
análisis.
MAPEO DE BIBLIOTECAS
 Las herramientas de
simulación y síntesis de
VHDL acceden a un
archivo que tiene un
mapa de los nombres de
las bibliotecas de VHDL
con los directorios físicos
en la computadora.

 VHDL también permite


definir una biblioteca
llamada WORK como la
biblioteca en la cual las
unidades de diseño son
compiladas sino se
especifica una biblioteca
Como se ejecuta
una simulación
Mecanismo de Cola
En un momento dado dentro de una simulación se generan 2
colas:
 Cola de señales a actualizar
 Cola de procesos a ejecutar

Actualización de la
Ejecución del proceso
señal
Proceso puesto en la cola
 Cuando una señal es actualizada en un punto específico
del tiempo de simulación, todos los procesos que son
sensitivos a esa señal son puestos en una cola de
procesos en ejecución.
Instrucción: M <= B;
Proceso puesto
en la cola
B actualizada

Actualización de la
Ejecución del proceso
señal
Una cola de señales actualizadas
Las señales que son asignadas en cada
proceso no son actualizadas
inmediatamente después de que el proceso
se suspende, son puestas en una cola de
señales actualizadas.
Las señales son actualizadas cuando
todos los procesos han sido ejecutados.
CicloComoDelta
 resultado de la actualización de las señales, otros procesos
pueden ser ejecutados en la cola de procesos en ejecución.

 Un ciclo que cubre esta secuencia es conocido como un ciclo Delta.

Ejemplo: process(A,B,M)
Begin
Y <= A;
M <=B;
Z <=M;
end process Ejemplo;

Actualización de Ejecución del


la señal proceso
Ejecución sobre el
tiempo
Múltiples deltas en cada punto de
tiempo de simulación
 Varios ciclos delta en una simulación
 En cada punto del tiempo de simulación se
ejecuta el ciclo delta, hasta que no haya mas
asignaciones o procesos en ejecución
Avanza a la siguiente actividad

Actualización Ejecución Actualización Ejecución


de la señal del proceso de la señal del proceso

Tiempo de simulación
La cláusula “after”
 La asignación de una señal es colocada en
una cola de “señales actualizadas” en un
tiempo en el futuro, en lugar del tiempo actual

Z <= A after 5ns; Z puesta en esta cola

5 ns
Tiempo de simulación
La cláusula “wait for”
Z <= A;
Z puesta en esta cola
wait for 5 ns;

5 ns
Tiempo de simulación

También podría gustarte