Sei sulla pagina 1di 50

Hot Lab Support Initiative

VHDL: Lenguaje de
descripcin de hardware
XII Asamblea General del ISTEC, UTP, Panam, Noviembre de 2002

Qu es un HDL?
Hot Lab Support Initiative

Hot Lab Support Initiative

VHDL

Description Language) es una herramienta formal para describir


el comportamiento y la estructura de sistemas (usualmente

electrnicos pero a veces tambin de otros tipos) usando un

Very High Speed Integrated Circuits


Hardware Description Language

esquema textual

sistema con diferentes niveles de abstraccin (o estilos):


describiendo QU es lo que el sistema debe hacer

detallando CON QU hacerlo (flujo de datos y estructural)

Hot Lab Support Initiative

(CONCURRENCIA)
Permite describir mdulos con acciones que sern evaluadas en

Como herramienta de especificacin


es posible su uso para la de especificacin general de un
sistema, tanto a nivel de hardware como de software

ig
ht
G.
Ja

forma secuencial (procedural), donde todo el mdulo ser visto


como una accin concurrente ms

Posibilita la construccin de una estructura jerrquica, donde es


posible combinar descripciones estructurales y de flujo de datos
con descripciones de comportamiento (BEHAVIOR)

Permite modelizar el concepto de tiempo, fundamental para la


descripcin de sistemas electrnicos

G.Jaquenod 2002, All Rights Reserved.

Funciona de acuerdo a lo
deseado?

Co
py
r

Hot Lab Support Initiative

Los procesos de Sntesis y de Place & Route, son slo una parte menor de la
tarea de diseo
Ms all de que un diseo quepa dentro de un dispositivo, y de que satisfaga
los tiempos de operacin necesarios, la pregunta clave es: Funciona de
acuerdo a lo deseado?
Es justamente este tema algo que la actual industria de herramientas EDA
an no ha resuelto satisfactoriamente, y que puede llevar la mayor parte del
tiempo de diseo:
EL PROBLEMA NO ES CMO DISEAR Y SINTETIZAR UN
DISPOSITIVO DE VARIOS MILLONES DE COMPUERTAS
CORRIENDO A CIENTOS DE MEGAHERTZ, SINO CMO
VERIFICARLO!!!

Es ac donde la comprensin del proceso de simulacin y los mtodos de


escritura de Test-Bench se hace imprescindible

G.Jaquenod 2002, All Rights Reserved.

Qu ventajas da el uso de
HDLs?

permite describir el hardware, tanto a nivel de sistemas y


subsistemas, como de componentes

Como herramienta de diseo


Mejor documentacin y facilidad de reuso
Posibilidad de parametrizacin
Portabilidad de un diseo. Independencia tecnolgica
Como herramienta de simulacin
Disponibilidad de modelos de distintos componentes de
fabricantes variados en HDLs normalizados
Facilidad para la generacin de vectores de test complejos
G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

Verificacin funcional en
distintas etapas de un diseo

Modelo VHDL de tipo


Behavioral

Simulador VHDL

Informacin de
estmulos y repuestas

Modelo VHDL de tipo


RTL

Simulador VHDL

Informacin de
estmulos y repuestas

Modelo VHDL postsntesis y P&R

Simulador VHDL

Informacin de
estmulos y repuestas

Dispositivo

Equipamiento de test
automtico
Boundary Scan Testing

Informacin de
estmulos y repuestas

SOFTWARE

Describe actividades que ocurren en forma simultnea

G.Jaquenod 2002, All Rights Reserved.

HARDWARE

Caractersticas de un HDL
Hot Lab Support Initiative

(comportamiento)

describiendo CMO hacerlo (algortmico)

qu
en
od

G.Jaquenod 2002, All Rights Reserved.

20

Usando HDL el diseador puede describir la operacin del

Breve visin sobre su uso para tareas de sntesis.


Anlisis de casos usando ALTERA FLEX10K
y el ambiente de diseo MAX+plus II de ALTERA
Nota sobre Copyright: muchas lminas de este curso han sido influenciadas, en mayor o menor medida, por
los libros que se mencionan en la bibliografa, de los cuales se han tomado a veces ejemplos textuales, o en
otros casos ideas para la elaboracin de ejemplos propios. Esta mltiple influencia hace casi imposible
referenciar la fuente en cada caso, aunque se ha tratado de hacerlo para honrar a los respectivos autores.

02

Un lenguaje HDL para descripcin de hardware (HDL: Hardware

G.Jaquenod 2002, All Rights Reserved.

Copyright Guillermo Jaquenod, 2002

VHDL: Lenguaje de
descripcin de hardware

Hot Lab Support Initiative

XII Asamblea General del ISTEC, UTP, Panam, Noviembre de 2002

La necesidad de poder
simular

Hot Lab Support Initiative

Hot Lab Support Initiative

Dado el carcter concurrente de los sistemas simulados, la resolucin


de la simulacin debe hacerse en dos pasos:

02

La simulacion es actualmente la unica herramienta de uso efectivo


para el debug y verificacin de sistemas de alta complejidad
Un simulador de eventos discretos modeliza la relacion entre
entradas y salidas a lo largo del tiempo, donde toda modificacion
del estado de alguna de esas senales (internas o externas) es
llamada evento

20

1: En funcin del valor actual de las seales se administra para


cada una de ellas una lista ordenada (cola) de los prximos
valores futuros, inmediatos y/o demorados; en el caso de un
cambio inmediato se considera que el mismo se realizar en un
tiempo infinitesimal posterior (llamado delta delay)

A causa de un evento pueden generarse nuevos eventos, tanto en


forma inmediata o con un determinado retardo hacia el futuro (por
ejemplo, por el tiempo de propagacion de una compuerta)

2: Una vez analizadas todas las seales del sistema se sabe cul
es el instante prximo en que deber producirse un cambio; el
reloj de simulacin es avanzado hacia l (en caso del delta delay
el reloj permanece sin cambios), se realiza el/los cambios, se
actualizan las colas de todas las seales y se vuelve al paso 1;

G.Jaquenod 2002, All Rights Reserved.

qu
en
od

En tanto no haya eventos el sistema no cambia, por lo que el


analisis del sistema solo tiene sentido cuando los hay; por ello el eje
tiempo (reloj de simulacion) es avanzado en forma discontinua

Qu HDLs existen?
Hot Lab Support Initiative

PALASM, CUPL, ABEL

Estandarizado por el IEEE (IEEE standard 1076-1987), fu creado


por iniciativa del Departamento de Defensa de USA desde los inicios

ig
ht
G.
Ja

AHDL (ALTERA Hardware Description Language)

De alto nivel: superset de los previos, no slo posibilitan mayor nivel


de abstraccin, sino que tambin son usados para la simulacin,
para la sntesis del generador de estmulos y el monitor de salidas

VHDL, VERILOG HDL


G.Jaquenod 2002, All Rights Reserved.

10

desarrollos de ASICs. Por este origen, copia muchas caractersticas


del lenguaje ADA

Fu actualizado y corregido en 1993 (VHDL93)


Permite la descripcin en alto nivel del comportamiento del hardware,
ya sea a nivel de comportamiento (behavior) o de registros (RTL)
Especialmente til en diseos MUY complejos, aunque su elevada
abstraccin a veces oscurece la relacin final entre la especificacin
de un diseo y los recursos que terminan siendo empleados
G.Jaquenod 2002, All Rights Reserved.

Flujo de diseo con VHDL

Co
py
r

Hot Lab Support Initiative

Fase del desarrollo

Resultado

Documentacin

Anlisis

Especificacin

Descripcin de qu
debe hacerse

Diseo

Cdigo VHDL

Mapeo a una dada


tecnologa

Netlists

Simulacin

Validacin
simulada

Test-Bench y vectores

Prototipo

Detalle del
funcionamiento

Prototipado

HDLs estndar de alto nivel:


VHDL

de la dcada del 80, como medio de documentacin de sus

De nivel medio: superset de los previos, permiten definir un circuito


en modo jerrquico, as como la generacin condicional/iterativa de
hardware; en ciertos permiten el uso de descripciones de
comportamiento (funciones aritmticas, mquinas de estado).

G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

De bajo nivel: permiten definir un circuito a nivel de arquitectura


(FlipFlops, compuertas bsicas, ecuaciones lgicas)

Simulacin de eventos
discretos

Elaboracin de cmo
llegar a los resultados

Hot Lab Support Initiative

Qu es un estilo de
descripcin de hardware?

Es la manera en que el diseador describe el sistema. Puede ser:


Comportamiento (Behavioral): detalla la funcin entrada-salida
del diseo, sin profundizar la arquitectura o los registros empleados
Algoritmico: detalla las acciones a realizar para alcanzar los
objetivos, a modo de un algoritmo de software

SINTESIS!!

Flujo de datos a nivel de registros: describe la solucin en forma


de una mquina secuencial, detallando los registros y la lgica que
los une, sin incluir cmo resolver esa lgica. Es una descripcin de
SINTESIS!!

la arquitectura del sistema, pero no de la tecnologa


Estructural, a nivel de registros: describe una red de compuertas

VHDL for Synthesis comprende a slo un subconjunto de las aplicaciones de


VHDL, y emplea slo parte de las facilidades del lenguaje.

y registros, incorporando posibles esquemas de conexin

El diseador de hardware debe estar plenamente conciente de esas diferencias

11

G.Jaquenod 2002, All Rights Reserved.

12

G.Jaquenod 2002, All Rights Reserved.

Copyright Guillermo Jaquenod, 2002

VHDL: Lenguaje de
descripcin de hardware

Hot Lab Support Initiative

Modelado por
comportamiento (behavior)

Modelado estructural
Hot Lab Support Initiative

Se describen la funcionalidad y la estructura del circuito


Se aproxima a la descripcin del hardware
Se usan seales a las que se asigna valores mediante
ecuaciones lgicas
Es usado mayormente para la sntesis

02

Slo se describe la funcionalidad del sistema, pero ningn


circuito o estructura
No se hace ningn intento de especificar hardware
Sirve tanto para especificacin y simulacin, como para sntesis
(aunque en este caso hay limitaciones)
Es usual el empleo de sentencias de modelado del tiempo

input1

output1, .., outputn


IF input1 THEN
FOR j IN high DOWNTO low+1 LOOP
shft(j) := shft(j-1);
END LOOP;
output1 <= shft AFTER 5ns

output1

Componente1
de menor nivel

Componente1
de menor nivel

qu
en
od

input1, .., inputn

Componente de mayor nivel

20

Hot Lab Support Initiative

XII Asamblea General del ISTEC, UTP, Panam, Noviembre de 2002

outputn

inputn

13

G.Jaquenod 2002, All Rights Reserved.

Fuente: ALTERA

Estructura jerrquica
Hot Lab Support Initiative

subdiseo 2

subdiseo 3

15

.....

.....

G.Jaquenod 2002, All Rights Reserved.

Esta facilidad permite generar estructuras


jerrquicas sin restricciones de anidamiento,
as como el reuso de subdiseos

16

Encapsulamiento de
mdulos

Co
py
r

Hot Lab Support Initiative

Como elementos constructivos de su


comportamiento, un mdulo puede incluir
dentro de s bloques de menor nivel (otros
mdulos) definidos separadamente, los que
sern usados a travs de sus puertas,
excitando sus entradas y utilizando los
valores que aparezcan en sus salidas

La interfase de un mdulo con los


dems se realiza mediante puertas,
que pueden ser de entrada, de
salida, o bidireccionales, y esta
interfase es la nica parte visible del
mdulo por el resto del diseo

El comportamiento interno de un
mdulo puede ser definido mediante
diferentes estilos, y slo puede ser
observado desde el exterior del
mdulo por los efectos que provoca
en la interfase

INTERFASE

instancia del
mdulo C

otra instancia
del mdulo B

G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

Generalidades
Identificadores
Tipos y objetos
Atributos
Operadores

COMPORTAMIENTO
INTERNO

G.Jaquenod 2002, All Rights Reserved.

mdulo B
mdulo C

Bases de VHDL

PUERTAS

Este tipo de operacin permite el


encapsulamiento del diseo

17

modulo A
instancia del
mdulo B

La inclusin de un mdulo dentro de otro de


mayor nivel se llama crear una INSTANCIA
de ese mdulo

subdiseo 4

.....

Fuente: ALTERA

Instancias y Jerarquas

ig
ht
G.
Ja

subdiseo tope

.....

G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

diseo de jerarqua tope

subdiseo 1

14

18

G.Jaquenod 2002, All Rights Reserved.

Copyright Guillermo Jaquenod, 2002

VHDL: Lenguaje de
descripcin de hardware

Hot Lab Support Initiative

XII Asamblea General del ISTEC, UTP, Panam, Noviembre de 2002

Elementos de lxico:
identificadores

Generalidades sobre VHDL


Hot Lab Support Initiative

Hot Lab Support Initiative

Un identificador es una palabra usada para nombrar objetos o items en un


modelo VHDL, y de este modo ayudar a identificar su funcionalidad. Los
identificadores deben cumplir ciertas reglas:

02

VHDL es Strongly typed: los objetos deben ser definidos (nombre y


tipo) antes de ser usados, y las operaciones deben respetar
estrictamente el tipo de operandos y resultados

No deben coincidir con las palabras reservadas (keywords) del lenguaje

VHDL es Case Insensitive, no diferenciando entre mayusculas y


minusculas (excepto en los llamados extended identifiers)
VHDL permite usar texto a modo de comentario en los programas, el
que luego es ignorado por el compilador; los comentarios comienzan
en cualquier parte de una linea con dos guiones sucesivos (--) y
terminan con el final de la linea

hello_world
VHDL1993

VHDL-93 define 97 palabras de uso reservado (keywords), tales como


abs, access, after, alias, all, and, architecture, array, assert,
attribute, begin, block, body,...,wait, when, while, with, xnor, xor
G.Jaquenod 2002, All Rights Reserved.

Es un texto que representa un valor numrico, expresado en la forma de entero (sin punto
decimal), o real (con punto decimal):
enteros: son nmeros positivos y negativos

29

-5

999

3.1415927

0.68

99.99E9

Enteros y reales pueden ser expresados usando una base distinta a 10, entre 2 y 16.
Para ello se indica la base en decimal, un #, el nmero expresado en esa base y otro
#. En los reales el exponente debe ser siempre expresado en decimal
2#1011# 4#13#e2 16#B#

2#0.1#

8#0.4#

12#0.6#

Tambien es posible incluir undescores en los numeros para facilitar su lectura


987_899
21

3.141_592_7

G.Jaquenod 2002, All Rights Reserved.

FLEX_10k

G.Jaquenod 2002, All Rights Reserved.

22

a Z 1

Los caracteres han sido descriptos en VHDL por enumeracin, en el


package STANDARD:
type CHARACTER IS (NUL,SOH,STX,ETX,EOT,ENQ,ACK,BEL,BS,HT,LF,VT,
FF,CR,SO,SI,DLE,DC1,DC2,DC3,DC4,NAK,SYN,ETB,CAN,EM,SUB,
ESC,FSP,GSP,RSP,USP,' ','!','"','#','$','%','&',''','(',')','*','+',',','-','.','/',
'0','1','2','3','4','5','6','7','8','9',':',';','<','=','>','?','@','A','B','C','D','E','F',
'G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','[','\',
']','^','_','`','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t',
'u','v','w','x','y','z','{','|','}','~',DEL,

....y asi sucesivamente


G.Jaquenod 2002, All Rights Reserved.

Elementos de lxico: strings

Co
py
r

Hot Lab Support Initiative

Un string es un objeto compuesto por un conjunto de caracteres:


Un string constante se indica con caracteres encerrados entre comillas dobles:
A los fines de la escritura, un string debe caber en una lnea. De ser
necesario un string tan largo que no quepa en una lnea se lo puede
fraccionar en varios substrings y concatenarlos mediante el operador &.

Es importante notar que si se expresa un numero en base octal, cada


nmero (incluso el 0) es asociado a 3 bits. De igual modo cada smbolo
hexadecimal ocupa 4 bits.Por ejemplo, B11 no es lo mismo que O3 o
que X3

SI es necesario incluir una comilla doble en un string, eso se hacer


colocando DOS comillas dobles juntas

Es posible incluir undescores en el string para facilitar su lectura

Doble Comilla

Si el string no entra en una sola lnea,


& se lo arma concatenando dos strings en lineas sucesivas

23

G.Jaquenod 2002, All Rights Reserved.

Elementos de lxico:
bit_strings

Esta secuencia de bits puede ser representada un forma binaria, octal o


hexadecimal, mediante una letra que indica la base (B, O o X), y luego por
el nmero deseado expresado en esa base, entre comillas dobles.

Un string puede estar compuesto por ningn carcter (string nulo )

Hot Lab Support Initiative

En muchas ocasiones los nmeros son representados internamente en forma


binaria, como cadenas de bits que valen 0 o 1.

type STRING is array (POSITIVE range <>) of CHARACTER;

VHDL Altera Max+Plus II

Elementos de lxico:
caracteres

Los caracteres son literales que se escriben en VHDL encerrndolos


entre comillas simples. Corresponden a los caracteres ASCII
imprimibles:

Los reales pueden usar notacin exponencial, donde el nmero es seguido por la
letra E (o e) y el exponente (siempre usando base 10)
2.7E-6

digital_design

Hot Lab Support Initiative

ig
ht
G.
Ja

punto flotante: deben incluir un punto decimal, y al menos un dgito antes y uno
despus de l.

2k_efecto

schematics!

Adems existen los identificadores extendidos, que son una secuencia


encerrada entre dos caracteres \, a veces usados por herramientas EDA

20

Elementos de lxico:
nmeros

Hot Lab Support Initiative

X__FPGAs

myemail@net

cod1997_

qu
en
od

19

20

Slo pueden contener letras del alfabeto (A hasta Z, a hasta z), los nmeros
decimales (0 a 9) y el caracter underscore o underline (_).
Deben comenzar con una letra del alfabeto.
No pueden terminar con un underscore
No pueden tener dos o ms undescore sucesivos

B0110_1101

24

O537 XF5AA

G.Jaquenod 2002, All Rights Reserved.

Copyright Guillermo Jaquenod, 2002

Hot Lab Support Initiative

VHDL: Lenguaje de
descripcin de hardware
XII Asamblea General del ISTEC, UTP, Panam, Noviembre de 2002

Tipos, y Subtipos en VHDL

Tipos, y Subtipos en VHDL

Hot Lab Support Initiative

Hot Lab Support Initiative

En VHDL se requiere necesariamente especificar el tipo (type) de cada


objeto, existiendo cuatro clases de tipos:

02

por enumeracion!
Ejemplos de tipos:
type word is array (0 to 31) of BIT;
type byte is array (NATURAL range 7 downto 0) of BIT;
type arcoiris is (rojo,naranja,amarillo,verde,azul,ndigo,violeta);
type complejo is record real:INTEGER; imag : INTEGER; end record;
type MVL4 is (X, 0, 1, Z);

escalares: pueden ser por enumeracin, enteros, de punto flotante,


fsicos. Los 2 primeros se llaman discretos, los 3 ltimos numricos.,
en tanto los tipos fsicos corresponden a tiempo, voltajes, , etc.

20

compuestos:
un caso muy usual en una matriz o vector (is array ... of)
aunque tambin existe el agrupamiento (is record ...end record;)

Ejemplos de subtipos:
subtype nibble is byte (3 downto 0);

de acceso: punteros
archivos: para manejo de I/O en archivos

Si defino type caso1 is (1,2,3,4) y type caso2 is (1,2,3,4) no


puedo asignar una variable tipo caso1 a otra de tipo caso2, aunque
compartan los mismos posibles valores. Son dos tipos distintos!!!!

G.Jaquenod 2002, All Rights Reserved.

25

Hot Lab Support Initiative

Declaracin de objetos en
VHDL

En VHDL existen cuatro clases de objetos: constant, variable, signal y file, cuya
declaracin se hace en conjunto con una especificacin de tipo

Una constante es un objeto que mantiene siempre su valor inicial


CONSTANT <nombre> : <tipo> [:= <expresion>];

26

Las variables slo pueden ser declaradas en estructuras secuenciales


(procesos o subprogramas) antes de BEGIN; puede pensarse que una variable
es un dato en memoria de la computadora que calcula la sintesis y no tiene
analoga directa con el hardware como una seal. A una variable se le puede
asignar un valor inicial explicito cuando se declara su tipo
VARIABLE <nombre> : <tipo> [:= <expresion>];
Por ejemplo: VARIABLE largovar : INTEGER := 16;

27

G.Jaquenod 2002, All Rights Reserved.

28

Declaracin de objetos en
VHDL

Co
py
r

Hot Lab Support Initiative

Las seales (signal) slo pueden ser declaradas en la seccin de


arquitectura, antes de BEGIN.
Puede pensarse que un objeto tipo signal representa uno o varios
cables de conexionado, y por eso su alcance no est restringido al
interior de un proceso, sino que puede ser usado para inteconectar
componentes, y activar o suspender la ejecucin de procesos
Durante la simulacin, una seal no se actualiza cuando se analiza la
sentencia sino al fin de cada ciclo de simulacin, o en momentos
futuros que se registran en una cola de eventos
default
SIGNAL <nombre> : <tipo> [:= <expresion>];
Cuando una seal/variable es tipo INTEGER es importante definir su
rango: XX : INTEGER RANGE uu DOWNTO dd (o dd TO uu). Si esto no
se hace el compilador asignar 32 bits para su representacin, y en el caso
de inferirse registros ello resultar en el uso innecesario de una importante
cantidad de recursos !!!.
G.Jaquenod 2002, All Rights Reserved.

Declaracin de atributos
Hot Lab Support Initiative

TYPE coord IS RECORD X,Y:INTEGER; END RECORD;

-- declaro ubicacion como un atributo de tipo coordenada.

La declaracin de un objeto de clase file pueden incluir su modo


de apertura

ATTRIBUTE ubicacion: coord;

-- asigno el atributo a mi_variable y le doy valor

y en general VHDL ofrece funciones para la lectura y escritura de


datos desde/hacia un objeto clase file

ATTRIBUTE ubicacion OF mi_variable:otrotipo IS (10,15);

si tengo definida una variable posic de tipo coord, le puedo asignar


el atributo ubicacin de mi_variable mediante:
posic := mi_variableubicacion

FILE file_name: file_type_name [[OPEN mode] IS <string>];

G.Jaquenod 2002, All Rights Reserved.

Declaracin de objetos en
VHDL

Un atributo es una caracterstica posible de asociar a un objeto, y


debe tener un tipo especificado en su declaracin. Ejemplo:
-- defino el tipo coordenada

Las variables de clase file permiten el manejo de archivos desde


VHDL; aunque en general no son sintetizables en hardware,
pueden servir para el generador de estimulos del testbench

29

G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

ig
ht
G.
Ja

Por ejemplo: CONSTANT largocte : INTEGER := 16;

qu
en
od

Dado un type, es posible declarar un nuevo tipo (como rango restringido


del primero), llamado subtype

El uso de atributos puede ser til para asignar a una dada seal
ciertas caractersticas requeridas para su posterior sntesis. Por
ejemplo, definir la codificacin a usar para un tipo enumerado
30

G.Jaquenod 2002, All Rights Reserved.

Copyright Guillermo Jaquenod, 2002

VHDL: Lenguaje de
descripcin de hardware

Hot Lab Support Initiative

Hot Lab Support Initiative

XII Asamblea General del ISTEC, UTP, Panam, Noviembre de 2002

Atributos predefinidos en
VHDL

Hot Lab Support Initiative

Ciertos atributos ya estn predefinidos en VHDL. Por ejemplo, dada una


seal muestra definida por:

02

Ciertos atributos predefinidos de VHDL estn pensados para seales.


Por ejemplo, dada una seal S:

muestra : IN STD_LOGIC_VECTOR(7 DOWNTO 0)

SDELAYED (T) genera una nueva seal que copia el valor de S con una
demora T
SSTABLE (T) devuelve TRUE si S no ha cambiado durante el lapso previo
de tiempo T
SQUIET (T) devuelve TRUE si no se han asignado nuevos valores a S
durante el lapso previo de tiempo T
STRANSACTION es TRUE si se ha asignado un nuevo valor a S
SLAST_EVENT devuelve el tiempo pasado desde el ltimo evento
SEVENT devuelve TRUE si S ha cambiado

Los atributos definidos para rangos de vectores son

31

Recordarlos!
Son MUY
usados!

G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

32

Atributos predefinidos para


tipos enumerados

Ciertos atributos se acomodan especialmente a tipos enumerados


(aunque tambin sirven para otros tipos). Por ejemplo, dado un tipo:
TYPE colores IS (rojo,amarillo,azul,verde,negro,blanco,rosa);

coloresSUCC (amarillo) devuelve azul


coloresPRED (amarillo) devuelve rojo
coloresLOW devuelve rojo
coloresHIGH devuelve rosa
coloresPOS (amarillo) devuelve 1
coloresVAL (3) devuelve verde
coloresLENGTH devuelve 7

G.Jaquenod 2002, All Rights Reserved.

Atributos definidos por el


usuario

El usuario puede definir nuevos atributos que pueden ser asociados a cualquier
elemento del lenguaje. Para ello son necesarios dos pasos:
Se define el atributo:
ATTRIBUTE <identificador> : <tipo del identificador>;

Cuidado con POS y VAL! Dependen del tipo del objeto al que se aplican!
Para enumerados, POS devuelve 0 para el primer trmino
33

Recordarlos!
Son MUY
usados!

G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

ig
ht
G.
Ja

se tiene:

20

muestraHIGH valdr 7
muestraLOW valdr 0
muestraRIGHT valdr 0
muestraLEFT valdr 7
muestraRANGE valdr 7 DOWNTO 0
muestraREVERSE RANGE valdr 0 TO 7
muestraLENGTH valdr 8
muestraASCENDING ser falso

qu
en
od

Atributos predefinidos en
VHDL

34

Se asocia el atributo al objeto


ATTRIBUTE <identificador> OF <objeto:tipo> IS <expresin>;

Por ejemplo, para un objeto CONTROL de tipo alguntipo pueden definirse:


TYPE SALIDA IS (pushpull,opendrain,tristate);
ATTRIBUTE tipo_de_salida : SALIDA;
ATTRIBUTE numero_de_pata : NATURAL;
ATTRIBUTE numero_de_pata OF CONTROL:alguntipo IS 23;
ATTRIBUTE tipo_de_salida OF CONTROL:alguntipo IS pushpull;

Y luego preguntar:

IF (CONTROLnumero_de_pata = 23) THEN..ELSE..

G.Jaquenod 2002, All Rights Reserved.

VHDL: Operadores

Co
py
r

Hot Lab Support Initiative

Hot Lab Support Initiative

VHDL ofrece un conjunto de operadores predefinidos slo para los tipos


primitivos de VHDL(definidos en el package Standard):

Bases de VHDL

logicos: AND, OR, NAND, NOR, XOR, XNOR, NOT, para tipos BIT, BOOLEAN, y
arrays de ellos
relacionales: =, /=, <, <=, >, >=, donde los operandos deben ser del mismo tipo, y el
resultado es BOOLEAN

Construcciones bsicas:
Entidad
Arquitectura
Package
Configuracin

de shift: SLL, SRL, SLA, SRA, ROL, ROR, donde el operando izquierdo debe ser un
array de BIT o BOOLEAN, y el derecho un INTEGER
suma y resta: + y -. Estos operadores estn predefinidos para el tipo numricos
INTEGER y sus subtipos; para trabajar con BITs o BIT_VECTORs debe usarse el
operador de concatenacin & o hacer el overload de + o -.
de multiplicacin y divisin: *, /, MOD, REM, con * y / predefinidos para los tipos
numricos enteros y flotante, y MOD y REM slo para enteros; un objeto fsico puede
ser multiplicado o dividido por un tipo numrico, dando como resultado un valor fsico
miscelaneos: exponenciacin (**), y valor absoluto (ABS )
Texto remarcado: Operadores definidos en VHDL 1993
Los de shift no son soportados por MAX+plus II VHDL

35

G.Jaquenod 2002, All Rights Reserved.

36

G.Jaquenod 2002, All Rights Reserved.

Copyright Guillermo Jaquenod, 2002

XII Asamblea General del ISTEC, UTP, Panam, Noviembre de 2002

Estructuras de VHDL:
organizacin

Estructuras de VHDL
Hot Lab Support Initiative

Hot Lab Support Initiative

La estructura de mayor nivel en VHDL


se llama design file.

Un diseo en VHDL emplea cuatro grandes bloques constructivos:


Entity

Un design file se compone de una


o ms design units, y cada una se
compone a su vez de varios campos:

Para definir la vista externa de un modelo (puertas y parmetros).


Architecture

una posible referencia al uso de otras


libraries y packages

Package

Un campo primario, asociado a la


declaracin de una entidad (entity),
y/o de un package

Coleccin de informacin que puede ser referenciada en modelos de


VHDL, consiste en dos partes: Package Declaration y Package Body.

Usado para asociar Architectures con Entities, no disponible en varios

Un ejemplo en VHDL
a
b

AND

-- descripcion del nombre y


-- las puertas

c
d

Es posible definir distintas


arquitecturas de un mismo
bloque funcional

ENTITY ejemplo_1 IS
PORT (
a,b,e : IN BIT;
c,d
: OUT BIT );
END ENTITY ejemplo_1;
- -y del comportamiento

ARCHITECTURE comporta
OF ejemplo_1 IS
BEGIN
c <= a AND b;
d <= e;
END ARCHITECTURE comporta;

G.Jaquenod 2002, All Rights Reserved.

40

Co
py
r

Entidades en VHDL: datos


genricos

Agregado
Agregado
en
enVHDL93
VHDL93

La sintaxis es: ENTITY <identificador> IS

[GENERIC(...);] [PORT(...);]
END [ENTITY] [<identificador>] ;

Por ejemplo: ENTITY half_add IS

identificador
identificador

PORT (x,y:IN BIT :=0; sum,cout: OUT BIT);


END ENTITY half_add ;
G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

modo
modo

tipo
tipo

Entidades en VHDL: las


puertas

Cada seal (o grupo de seales de igual tipo) se compone de su


<identificador>, su modo de operacin (in, out, inout, buffer), su tipo,
y un eventual valor por defecto para seales de tipo in o inout que
queden sin conectar.

ENTITY <nombre de la entidad> IS


GENERIC(CONSTANT tplh,tphl:time := 5 ns; --se asume CONSTANTE
tphz, tplz : time := 3 ns;
MODULUS: NATURAL := 0;
DIRECTION: STRING := "UNUSED";
VALUE: STRING := "UNUSED";
default_value : integer := 1;
identificador:tipo[:=default];
cnt_dir : string := up;
identificador:tipo[:=default];
);
PORT ... - descripcin de las puertas de la entidad
END ENTITY <nombre de la entidad>;

G.Jaquenod 2002, All Rights Reserved.

Una entidad (entity) corresponde a la definicin de un diseo a


manera de caja negra, o smbolo, donde slo se declara su interfase:
las conexiones de esa caja (puertas) capaces de transportar
informacin cambiante entre entidades
valores genricos, capaces de transportar parametros o informacin
esttica (constante) entre entidades

Las puertas de una entidad se declaran con la palabra port, seguida de


una listal formal de seales

El campo GENERIC de una entidad define ciertos valores propios de


la entidad cuyo valor puede ser cambiado durante la compilacin.
Es un mtodo til para definir parmetros, en megafunciones
parametrizadas

41

design unit
design unit

Entidades en VHDL

ig
ht
G.
Ja

Se define separadamente el
comportamiento desde el
punto de vista externo
(ENTITY) a la realizacin
interna (ARCHITECTURE)

Hot Lab Support Initiative

END..;

Hot Lab Support Initiative

ejemplo_1

39

END..;

G.Jaquenod 2002, All Rights Reserved.

38

Hot Lab Support Initiative

design unit

END..;

qu
en
od

paquetes de sntesis (P.Ej: Max+Plus II)

G.Jaquenod 2002, All Rights Reserved.

ARCHITECTURE..OF..IS..
...
BEGIN
...
END..;
design unit

Un campo secundario, con la descripcin


de una entre varias posibles
arquitecturas (ARCHITECTURE..OF..
IS..) de la entidad o del package.

Configuration

37

LIBRARY..USE...
LIBRARY..USE...
ENTITY..IS
...
END...;

20

Para definir una posible funcionalidad de un modelo

DESIGN FILE

02

Hot Lab Support Initiative

VHDL: Lenguaje de
descripcin de hardware

Las puertas corresponden a seales fsicas (signals) y, para los modos


definidos en STANDARD:
una puerta in puede ser leda (estar en el lado derecho de una asignacin
RHS) pero no puede ser modificada (LHS)
una puerta out puede ser modificada (LHS) pero no leda (RHS)
una puerta buffer es una puerta de salida siempre activa, en tanto una
puerta inout se asocia a una puerta bidireccional (por ejemplo: con TRISTATE). Ambas pueden ser ledas y modificadas
42

G.Jaquenod 2002, All Rights Reserved.

Copyright Guillermo Jaquenod, 2002

VHDL: Lenguaje de
descripcin de hardware

Hot Lab Support Initiative

Hot Lab Support Initiative

XII Asamblea General del ISTEC, UTP, Panam, Noviembre de 2002

La arquitectura de una entidad


VHDL

Hot Lab Support Initiative

La resolucin interna de la funcin asociada a una dada entidad es


resuelta en el bloque ARCHITECTURE., que podra asociarse al
schematic que describe qu hay dentro de un smbolo

43

02

20

Si la descripcin de una entidad y su arquitectura se mantienen en


archivos separados, es necesario un modo de interconectar entre
s estos bloques, llamado bloque CONFIGURATION, que asocia
el nombre de una entidad a una descripcin de un componente, as
como los nombres de las puertas de la entidad con las puertas
locales del componente
Este esquema de vinculacin facilita el reuso del cdigo y el
cambio de LIBRARIES.
Una entidad, sus posibles arquitecturas y los eventuales bloques
de configuracion se denominan DESIGN UNITS

Agregado
Agregado
en
enVHDL93
VHDL93

G.Jaquenod 2002, All Rights Reserved.

44

Estructura bsica de
modelado en VHDL

Hot Lab Support Initiative

La separacin entre la declaracin de una entidad y su arquitectura


simplifica cambiar el modo de realizacin de una funcin sin afectar
a quienes usen ese mdulo desde un nivel de mayor jerarqua

qu
en
od

ARCHITECTURE <identificador> OF <entidad> IS


Declaracin de seales locales
Declaracin de constantes locales
Declaracin de tipos y subtipos locales
Declaracin de Componentes
Declaracin de atributos
Declaracin y cuerpo de Subprogramas
BEGIN
Instanciacin de componentes
Asignaciones concurrentes a seales
Procesos
Activacin de procedimientos concurrentes
Sentencias Generate
END ARCHITECTURE <identificador> ;

LIBRARY nombre_de library;


USE nombre_de library .nombre_de_package.componentes_o_subprogramas;
ENTITY nombre_entidad IS
generics
declaracin de port
END ENTITY nombre_entidad;

G.Jaquenod 2002, All Rights Reserved.

Fuente: ALTERA

46

Una library unit puede corresponder al diseo en curso


(working library), a diseos previos del usuario, o a diseos
realizados por otra empresa.Est asociada a un subdirectorio
Un package es el nombre dado a un conjunto de subprogramas,
definiciones de tipo y subtipo, constantes, operadores complejos, de
seales, de componentes, etc., y forma parte de una library.
El uso de un package se indica con la secuencia:
LIBRARY <nombre de la library>; USE <nombre del
package.funciones o procedimientos usados de ese package>;

G.Jaquenod 2002, All Rights Reserved.

Packages del VHDL

Los Packages en VHDL

Co
py
r

Hot Lab Support Initiative

Los Packages son una forma conveniente para almacenar y usar


innformacin til para todo un modelo.
Los Packages estn formados por una declaracin de Package
(necesaria), y un cuerpo Package Body opcional
PACKAGE <package_name> IS
Declaracin de Constantes
Declaracin de tipos
Declaracin de seales
Declaracin de subprogramas
Declaracin de Componentes
--y otras Declaraciones
END PACKAGE <package_name> ;

Standard: donde se definen los tipos lgicos y numricos bsicos


TEXTIO: este package, que forma parte de la library STD, define tipos
asociados a la creacion de lneas de texto (LINE, TEXT) a partir del tipo
STRING (definido en el package STANDARD de STD), as como
procedimientos para el ingreso e impresin de textos usando los streams
de entrada y salida. Es de uso importante para elaborar el generador de
estmulos y el monitor de salidas del Test_Bench

Packages matemticos: suministrados por algunas compaias,


resuelven funciones de conversin, trigonomtricas, de punto
flotante, estadsticas, etc..

Agregados
Agregados
en
enVHDL-93
VHDL-93

G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

El VHDL estndar tiene dos Packages nativos en la Library STD:

Packages de sntesis: estos packages usualmente permiten que la


herramienta de sntesis pueda detectar ciertas funciones y
sintetizarlas de modo ptimo para su tipo especial de tecnologa

PACKAGE BODY <package_name> IS


Declaracin de Constantes
Declaracin de tipos
Cuerpo de los Subprogramas
END PACKAGE BODY <package_name> ;

47

Estructuras de VHDL:
libraries y packages

Una library unit es un conjunto de bloques elementales de


diseo (entidades, arquitecturas y configuraciones: design units)

ig
ht
G.
Ja

Estas tres secciones son


soportadas por todos los
programas de diseo
La seccin de configuracin
es aceptada en pocos casos

G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

ARCHITECTURE nombre_arquitectura OF nombre_entidad IS


declaracin de tipos y subtipos locales
declaracin de seales locales
declaracin de componentes
BEGIN
sentencias de asignacin a seales
sentencias de procesos
instanciacin de componentes
END ARCHITECTURE nombre_arquitectura;
45

La dupla VHDL
Entidad + Arquitectura

48

G.Jaquenod 2002, All Rights Reserved.

Copyright Guillermo Jaquenod, 2002

VHDL: Lenguaje de
descripcin de hardware

Hot Lab Support Initiative

La library STD
y el package STANDARD

Esta library y package, y los


tipos que define son
inherentes al VHDL y no
necesitan ser declarados

Fuente: ALTERA MAX+plus II

Ejemplo de un Package
cualquiera

LIBRARY ieee; USE ieee.std_logic_1164.all;

De
De acceso
acceso

Discretos
Discretos
Enteros
Enteros

Fsicos
Fsicos

Enumerados
Enumerados

Natural
Natural
Positive
Positive

Boolean
Boolean
FALSE,
FALSE,TRUE
TRUE

Carcter
Carcter

PACKAGE BODY filt_cmp IS


FUNCTION compare (variable a,b: integer) IS
VARIABLE temp : boolean;
Begin
If a < b then temp := true ;
else
temp := false ;
end if;
RETURN temp ;
END compare ;
END PACKAGE BODY filt_cmp ;
G.Jaquenod 2002, All Rights Reserved.

Archivos
Archivos

Compuestos
Compuestos

Punto
Punto
flotante
flotante

Records
Records

Arrays
Arrays

Reales
Reales

Strings
Strings

Bit-Vector
Bit-Vector

Tiempo
Tiempo

fs,ps,ns,us,ms,sec,min,hr
fs,ps,ns,us,ms,sec,min,hr

Bit
Bit

0,1
0,1

Severity
Severity Level
Level

NOTE,
NOTE,WARNING,
WARNING,ERROR,
ERROR,FAILURE
FAILURE

Declaracin
Declaracin
del
delPackage
Package

Fuente: ASHENDEN

Las Libraries en VHDL

Hot Lab Support Initiative

Cuerpo
Cuerpodel
del
Package
Package

Fuente: ALTERA

G.Jaquenod 2002, All Rights Reserved.

50

Una Library puede ser asociada a un subdirectorio, donde se almacena


uno o ms packages.

Existen Libraries de donde se copian elementos de referencia estndar


(llamadas Resource Libraries), tales como:
STD: contiene al Standard Package y es inherente al VHDL
IEEE: packages desarrollados por el IEEE
ALTERA, LPM: Packages desarrollados por un dado fabricante
VITAL: package que define ciertos modelos temporales

Pero adems existe la llamada Working Library, indicada por WORK, que
es aquel directorio donde el diseo actual est siendo procesado

visitar los dems subdirectorios disponibles en

C:\MAXPLUS2\VHDL93
G.Jaquenod 2002, All Rights Reserved.

52

La Library IEEE

Co
py
r

Hot Lab Support Initiative

02

Escalares
Escalares

ig
ht
G.
Ja

PACKAGE filt_cmp IS
TYPE state_type IS (idle, tap1, tap2, tap3, tap4);
COMPONENT acc
port(xh : in std_logic_vector(10 downto 0);
clk, first: in std_logic;
yn : out std_logic_vector(11 downto 4));
END COMPONENT;
FUNCTION compare (variable a , b : integer)
RETURN boolean;
END PACKAGE filt_cmp;

51

Tipos
Tipos

revisar
revisar STANDARD.VHD
STANDARD.VHD en
en C:\maxplus2\vhdl93\std
C:\maxplus2\vhdl93\std

G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

Hot Lab Support Initiative

20

package STANDARD is
....
type BOOLEAN is (FALSE,TRUE);
type BIT is (0,1);
subtype NATURAL is INTEGER
range 0 to INTEGERHIGH;
subtype POSITIVE is INTEGER
range 1 to INTEGERHIGH;
type BIT_VECTOR is array (NATURAL range <>)
of BIT;
subtype DELAY_LENGTH is TIME
range 0 fs to TIMEHIGH;
type TIME is range <....> units fs; ps = 1000 fs;
ns = 1000 ps; us = 1000 ns; ms = 1000 us;
sec = 1000 ms; min = 60 sec; hr = 60 min;
end units;
....
end package STANDARD;

Tipos definidos en el
package STANDARD

qu
en
od

Hot Lab Support Initiative

En la library STD el package


STANDARD, a partir de
ciertos elementos implcitos
dependientes de la
implementacin (como
INTEGER y REAL, o la
forma de contabilizacin del
tiempo) se declara la
implementacin de varios
tipos de variable

49

XII Asamblea General del ISTEC, UTP, Panam, Noviembre de 2002

La Library IEEE es muy usada en VHDL, pues no slo define


nuevos tipos de seales, sino tambin el comportamiento de los
operadores aritmticos y lgicos sobre esos nuevos tipos.
La Library IEEE contiene los siguientes packages:
std_logic_1164:
tipos STD_LOGIC, STD_LOGIC_VECTOR y overload de las
funciones relacionadas con estos tipos
std_logic_arith:
overload de funciones aritmticas, de conversin, y los tipos SIGNED
y UNSIGNED
std_logic_signed:
funciones aritmticas para STD_LOGIC_VECTOR con signo
std_logic_unsigned:
funciones aritmticas para STD_LOGIC_VECTOR sin signo

Hot Lab Support Initiative

Fuente: ALTERA

El package
IEEE.Std_logic_1164

El package STANDARD define slo los valores lgicos 0y 1 para objetos


tipo BIT y BIT_VECTOR.

La necesidad de contar con la posibilidad de modelizar los estados de alta


impedancia y el estado desconocido llev a la creacin por el IEEE de un
package llamado Std_logic_1164 o MVL9
Alli se define el tipo STD_ULOGIC con 9 posibles valores lgicos:
fuertes: U : sin inicializar, X : desconocido, 0 : cero,1 : uno, Z : alta
impedancia
dbiles:W : desconocido, L : cero,H : uno,- : sin importancia.

Este package a su vez redefine (overload) los valores de retorno de los


operadores lgicos sobre este tipo de variables

STD_LOGIC, es un subtipo de STD_ULOGIC resuelve los conflictos entre


seales fuertes y dbiles
library IEEE; use IEEE.std_logic_1164.all;

buscar en C:\MAXPLUS2\VHDL93\IEEE\

53

G.Jaquenod 2002, All Rights Reserved.

Fuente: ALTERA

54

G.Jaquenod 2002, All Rights Reserved.

Copyright Guillermo Jaquenod, 2002

VHDL: Lenguaje de
descripcin de hardware

Hot Lab Support Initiative

XII Asamblea General del ISTEC, UTP, Panam, Noviembre de 2002

Estructuras de VHDL:
configuracion

Hot Lab Support Initiative

Hot Lab Support Initiative

02

CONFIGURATION E1A3 OF E1 IS FOR Arq3


END FOR;
END CONFIGURATION;

Entidad E1

Bases de VHDL

Entidad E2

Arq3
Arq1

Al asociar una Entidad con una Arquitectura se


definen dos tipos de vinculos:

Entidad E3

Entre una entidad y la arquitectura elegida


para resolverla en una dada aplicacin
Entre una arquitectura y una entidad usada
como parte de esa arquitectura

Arq1

Arq2

Arq3

G.Jaquenod 2002, All Rights Reserved.

55

Hot Lab Support Initiative

Tipos de descripciones en
VHDL

Sin embargo en VHDL aparece la nocin de procesos, que si bien describen


eventos que acontecen como cualquier otra sentencia concurrente, son
analizados internamente en forma secuencial para su sntesis y/o simulacin.

Es por eso que en VHDL se encuentran sentencias de asignacin propias de


acciones concurrentes y otras exclusivas para procesos secuenciales
Concurrentes y
secuenciales

Asignacin a seales
Declaracin de tipos y
constantes
Declaracion de atributos de
seales
Invocacin a funciones y
procedimientos
Sentencia ASSERT
Retardos (AFTER)

58

Co
py
r

Cmo se asignan valores


a las seales?

Dada una seal se usa el operador <= para asignarle un valor


Dado un array de seales, hay varias formas de asignarles valores. Por
ejemplo, sea:
SIGNAL

temp

Para asignar valores a todos los elementos del array:


temp <= 10101010; temp <= xAA ; (VHDL93)
Para asignar un valor a un nico elemento del array:
temp(7) <= 1;
Para asignar valores slo a ciertos elementos del array (slicing):
temp (7 downto 4) <= 1010;
Para asignar un valor similar a todos los elementos del array:
temp <= (others => 1);

signals

G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

Fuente: ALTERA

Las seales,como elementos


de interconexin
r
OR

qa

t
AND

qb

XOR

r, t, g, h, y qb son seales (default)


qa es una seal interna (buried) que
debe ser declarada en el bloque
ARQUITECTURA

END ARCHITECTURE logic;

Debe notarse que la referencia a un elemento aislado emplea comillas


simple (), en tanto a un grupo emplea comillas dobles ()

59

signals

Bloque signals Bloque


Funcional
Funcional

qa <= r OR t;
qb <= (qa AND NOT(g XOR h));

Para asignar valores en forma mixta:


temp <= (7=>0,4=>0, others => 1);

process

process
signals

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY simp IS
PORT(r, t, g, h : IN std_logic;
qb : OUT std_logic);
END ENTITY simp;
ARCHITECTURE logic OF simp IS
SIGNAL qa : std_logic;

BEGIN

STD_LOGIC_VECTOR (7 downto 0);

G.Jaquenod 2002, All Rights Reserved.

Qu son las seales (Signals)


en VHDL

Las seales representan vnculos fsicos que comunican


informacin entre procesos concurrentes
Las seales pueden ser declaradas en los bloques:
Packages: al describir componentes
Entity: al describir las puertas de una entidad
Architecture: al definir lneas internas

Secuenciales

Declaracin de variables
Asignacin a variables
Sentencia IF..THEN..ELSE
Sentencia CASE
Sentencia LOOP
Sentencia RETURN
Sentencia NULL
Sentencia WAIT

G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

Hot Lab Support Initiative

ig
ht
G.
Ja

Cualquier HDL, inevitablemente describe sucesos que son inherentemente


concurrentes, y VHDL no es una excepcin, pues en la arquitectura de una
entidad (entre BEGIN y END) se definen sentencias concurrentes.

Concurrentes

G.Jaquenod 2002, All Rights Reserved.

56

Declaracin de seales
Sentencia WHEN..ELSE
Sentencia WITH..SELECT
Sentencia PROCESS
Sentencias BLOCK

57

Concurrencia y Secuencialidad
Seales y Variables
Sentencias de asignacin

Arq2

20

Arq2

qu
en
od

Arq1

asignacin simple de seales!


60

G.Jaquenod 2002, All Rights Reserved.

Fuente: ALTERA

Copyright Guillermo Jaquenod, 2002

10

VHDL: Lenguaje de
descripcin de hardware

Hot Lab Support Initiative

XII Asamblea General del ISTEC, UTP, Panam, Noviembre de 2002

Asignaciones simples a
seales

Asignaciones concurrentes
Hot Lab Support Initiative

Hot Lab Support Initiative

Formato: <nombre de seal> <= <expresin>;

02

VHDL ofrece tres posibles tipos de asignaciones concurrentes:

qa <= r OR t ;
qb <= (qa AND NOT(g XOR h));

Asignaciones simples (<=)


Condicionales, usando (..<= WHEN..ELSE..)

Selecciones, usando (WITH..SELECT..<= WHEN,..)

OR

61

G.Jaquenod 2002, All Rights Reserved.

G.Jaquenod 2002, All Rights Reserved.

G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

y0

sel0

y1

sel1

y2
y3

Fuente: DUECK

64

Asignacion condicional
concurrente: WHEN..ELSE

c
q <=

a WHEN sela = 1
ELSE b WHEN selb = 1
ELSE c;

proceso implcito

Hot Lab Support Initiative

G.Jaquenod 2002, All Rights Reserved.

cada salida es
funcin combinatoria
de 3 entradas
requiere ocho
macroceldas, una
por cada salida

ARCHITECTURE usowhen
OF prioriencod IS
BEGIN
priori <= 3 WHEN max = '1'
ELSE 2 WHEN med = '1'
ELSE 1 WHEN min = '1'
ELSE 0;
END ARCHITECTURE usowhen;
Fuente del grfico:
SYNPLIFY HDL Analyst

66

b
selb

0
0
1

sela

G.Jaquenod 2002, All Rights Reserved.

Porqu?

ENTITY prioriencod IS
PORT (
max,med,min : IN BIT;
priori : OUT INTEGER
RANGE 0 TO 3);
END ENTITY prioriencod;

65

Asignacin condicional
concurrente: WHEN..ELSE

[label:] <seal> <= <expresin> WHEN <expresin booleana>


ELSE <expresin> WHEN <expresin booleana>
....
ELSE <expresin> WHEN <expresin booleana>
ELSE <expresin>;

-- codificador de prioridad

dos funciones combinatorias de 3 entradas


solo requiere dos macroceldas

Fuente: ALTERA

Si dos o ms expresiones booleanas son ciertas, la asignacin a


realizarse corresponde a la primera que sea vlida ( prioridad!! )

Co
py
r

Hot Lab Support Initiative

Ms all de su simplicidad o complejidad, el trmino de la derecha de la


sentencia de asignacin genera una lista de uno o ms valores a ser
asignados al trmino de la izquierda instantneamente y/o en momentos
posteriores. Por eso se los llama procesos implcitos.

ig
ht
G.
Ja

ENTITY decod2a4 IS PORT(


sel1,sel0: IN std_logic; y0,y1,y2,y3: OUT std_logic);
END ENTITY decod2a4;

63

qb

XOR

Permite asignar a una dada seal resultados variables en funcin de


la validez o no de expresiones booleanas (parecido a un IF)

LIBRARY ieee; USE ieee.std_logic_1164.ALL;

ARCHITECTURE logica OF decod2a4 IS


BEGIN
y0 <= (NOT sel1) AND (NOT sel0);
y1 <= (NOT sel1) AND (sel0);
y2 <= (sel1) AND (NOT sel0);
y3 <= (sel1) AND (sel0);
END ARCHITECTURE logica;

AND

g
h

62

Ejemplos: decodificador
2 a 4 estilo RTL

Hot Lab Support Initiative

procesos
implcitos

qu
en
od

Las asignaciones concurrentes suelen ser usadas para modelar


lgica de tipo combinatorio, y son resueltas de forma concurrente,
por lo que no importa el orden en que son escritas en el campo de
la ARQUITECTURA

qa

20

Asignacion condicional
concurrente: WHEN..ELSE

-- multiplexor 2:1 de buses de 8 bits


LIBRARY
ieee; USE
ieee.std_logic_1164.ALL;
ENTITY octal_mux2to1 IS
PORT (
sel: IN std_logic;
busA,busB: IN std_logic_vector (7 DOWNTO 0);
salida: OUT std_logic_vector (7 DOWNTO 0));
END ENTITY octal_mux2to1;
ARCHITECTURE usowhen OF octal_mux2to1 IS
BEGIN
salida <= busB WHEN sel='1' ELSE busA;
END ARCHITECTURE usowhen;

G.Jaquenod 2002, All Rights Reserved.

Fuente del grfico:


SYNPLIFY HDL Analyst

Copyright Guillermo Jaquenod, 2002

11

VHDL: Lenguaje de
descripcin de hardware

Hot Lab Support Initiative

XII Asamblea General del ISTEC, UTP, Panam, Noviembre de 2002

Ejemplo: codificador de
prioridad 7:3

Hot Lab Support Initiative

Hot Lab Support Initiative

Asignacion condicional
concurrente: WITH..SELECT

Parecida a CASE, slo que los posibles valores constantes de una


expresin slo controlan una nica asignacin, y no la ejecucin de
sentencias varias como en CASE

02

ENTITY prioricoder8 IS PORT(


d : IN BIT_VECTOR(7 DOWNTO 1);
q : OUT INTEGER RANGE 0 TO 7);
END prioricoder8 ;

20

[label:] WITH <expresin> SELECT


<seal> <= <expresin> WHEN <constante>,
...,
<expresin> WHEN <constante>,
<expresin> WHEN OTHERS;

ARCHITECTURE usowhen OF prioricoder8 IS


BEGIN
d(7)
q <=
7 WHEN d(7)='1
d(6)
ELSE
6 WHEN d(6)='1
d(5)
ELSE
5 WHEN d(5)='1'
d(4)
ELSE
4 WHEN d(4)='1'
d(3)
ELSE
3 WHEN d(3)='1'
d(2)
ELSE
2 WHEN d(2)='1'
d(1)
ELSE
1 WHEN d(1)='1'
ELSE
0;
END usowhen ;

qu
en
od

WITH sel SELECT


q <= a WHEN 00,
b WHEN 01,
c WHEN 10,
d WHEN OTHERS;

a
b
c
d
sel

00
01
10
?

WHEN OTHERS considera los 78 casos restantes. Porqu 78?

67

G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

Asignacion condicional
concurrente: WITH..SELECT
cada salida es funcin
combinatoria de 4 entradas
requiere siete macroceldas,
una por cada salida
0));

LIBRARY ieee; USE ieee.std_logic_1164.ALL;

ARCHITECTURE usoselect OF bcd7seg IS


BEGIN
Los
LosBIT_VECTOR
BIT_VECTORllevan
llevanlalaletra
letraBBalalinicio!
inicio!
WITH codbcd SELECT
sevsegs <= B"1111110" WHEN 0,B"0110000" WHEN 1,
B"1101101" WHEN 2,B"1111001" WHEN 3,
B"0110011" WHEN 4,B"1011011" WHEN 5,
B"1011111" WHEN 6,B"1110000" WHEN 7,
B"1111111" WHEN 8,B"1111011" WHEN 9,
B0000000 WHEN OTHERS;
END ARCHITECTURE usoselect;
G.Jaquenod 2002, All Rights Reserved.

70

Ejemplo: decodificador
BCD a 7 segmentos

Co
py
r

Hot Lab Support Initiative

ENTITY bcd7seg IS PORT (


codbcd : BIT_VECTOR (3 DOWNTO 0); a,b,c,d,e,f,g : OUT BIT);
END ENTITY bcd7seg;
ARCHITECTURE usowith OF bcd7seg IS
SIGNAL seg: BIT_VECTOR (6 DOWNTO 0);
BEGIN
WITH codbcd SELECT
seg <= B"0000001" WHEN X"0",B"1001111"
B"0010010" WHEN X2",B"0000110"
B"1001100" WHEN X4",B"0100100"
B"1100000" WHEN X6",B"0001111"
B"0000000" WHEN X8",B"0001100"
B"1111111" WHEN OTHERS;
a <= seg(6); b <= seg(5); c <= seg(4);
e <= seg(2); f <= seg(1); g <= seg(0);
END ARCHITECTURE usowith;

71

WHEN
WHEN
WHEN
WHEN
WHEN

codbcd

X"1",
X3",
X5",
X7",
X9",

ENTITY decod2a4 IS PORT (


sel : IN std_logic_vector (1 DOWNTO 0);
y : OUT std_logic_vector (3 DOWNTO 0)); sel(0)
sel(1)
END ENTITY decod2a4 ;

y(0)
y(1)
y(2)
y(3)

ARCHITECTURE usowith OF decod2a4 IS BEGIN


WITH sel SELECT
Quines
y <= "1000" WHEN 11",
son los
OTHERS?
"0100" WHEN 10",
"0010" WHEN 01",
"0001" WHEN 00",
"0000" WHEN others;
END ARCHITECTURE usowith;
G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

Usando SELECT:
el uso de WHEN OTHERS

Deben considerarse TODOS los casos, y en STD-LOGIC cada seal puede


tener 9 valores distintos!
WHEN OTHERS permite considerar todos los casos restantes de una vez

a
b
c
d
e
f
g

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY mux2a1_sig IS
PORT ( a,b,sel:IN std_logic;
z : OUT Std_logic;
END ENTITY mux2a1;

Quines
son los
OTHERS?

ARCHITECTURE logic OF mux2a1 IS


BEGIN
-- selected signal assignment
WITH sel SELECT
z <= a WHEN '0',
b WHEN '1',
'0' WHEN OTHERS;
END ARCHITECTURE logic;

d <= seg(3);

G.Jaquenod 2002, All Rights Reserved.

Ejemplo: decodificador
2 a 4 usando WITH

Hot Lab Support Initiative

ig
ht
G.
Ja

--- decodificador BCD a 7 segmentos


ENTITY bcd7seg IS
port (
codbcd : IN INTEGER RANGE 0 TO 9;
sevsegs : OUT BIT_VECTOR (6 DOWNTO
END ENTITY bcd7seg;

69

G.Jaquenod 2002, All Rights Reserved.

68

72

sel es de tipo STD_LOGIC !!

WHEN OTHERS considera


los 7 casos restantes

G.Jaquenod 2002, All Rights Reserved.

Copyright Guillermo Jaquenod, 2002

12

VHDL: Lenguaje de
descripcin de hardware

Hot Lab Support Initiative

XII Asamblea General del ISTEC, UTP, Panam, Noviembre de 2002

Hot Lab Support Initiative

Hot Lab Support Initiative

02

Un proceso se comporta como una nica sentencia, resuelta en forma


concurrente con otros procesos, compuesto internamente por un
conjunto de sentencias que son analizadas en forma secuencial, en
vez de concurrente

Bases de VHDL

Esta descripcin secuencial de la resolucin facilita la realizacin de


descripciones algortmicas, o behaviorales. Sin embargo, no implica
que una vez en hardware esto signifique una jerarqua temporal, sino
slo un ordenamiento de dependencias

20

pasando de la concurrencia a la
secuencialidad:
los procesos
las variables
las asignaciones secuenciales

Un proceso conforma un loop infinito, que comienza luego de


PROCESS..BEGIN, llega hasta END PROCESS y vuelve al inicio
Para que un proceso pueda resolverse en cada ciclo de simulacin se
requiere algn medio de detencin y activacin, que puede ser una
lista de sensibilidad o alguna de las 3 posibles variantes de la
sentencia WAIT.

G.Jaquenod 2002, All Rights Reserved.

74

Sentencias concurrentes:
PROCESOS

Hot Lab Support Initiative

Los modos posibles (excluyentes entre si) son:


la lista de sensibilidad: es un conjunto de seales adjunto a la
palabra PROCESS, cuyo cambio (ya sea de valor numrico o lgico)
activa la ejecucin del proceso por un barrido

[(nombre de seal/es)]

Un bloque combinatorio puede ser entonces visto como un proceso implcito


donde todas las variables en juego estn en la lista de sensibilidad.
Por ejemplo

[IS]

[declaraciones locales: seales,variables,constantes,etc.]


BEGIN

<sentencias secuenciales>;...;<>;
END PROCESS [label];

q <= a WHEN x=1 ELSE b WHEN y=1 ELSE c;

equivale a
PROCESS (a,b,c,x,y) IS BEGIN
IF x=1 THEN q<=a; ELSIF y=1 THEN q<=b; ELSE q<=c; END IF;
END PROCESS;

De igual modo, hay similitud entre la construccin concurrente WITH..SELECT


y la construccin secuencial CASE..END CASE;
E incluso para una asignacin simple qb <= (qa and not(g xor h));
Hay un proceso explcito:

G.Jaquenod 2002, All Rights Reserved.

Sentencias de control
asociadas a eventos: WAIT

Co
py
r

Hot Lab Support Initiative

76

[label:] WAIT ON <lista de sensibilidad>; la resolucin del proceso se


detiene hasta que alguna de las seales en la lista de sensibilidad cambia,
no importa de qu valor a qu valor
[label:] WAIT UNTIL <condicin>; el proceso se detiene hasta el momento
en que la condicin cambia de FALSA a VERDADERA

indica las reglas que debe cumplir un conductor frente al semforo en una
interseccin.
A la vez: WAIT FOR 2 ns; puede ser usada en procesos de simulacin.

[label:] WAIT ON <lista de sensibilidad>;


[label:] WAIT UNTIL <condicin>;
[label:] WAIT FOR <expresin temporal>;

No
Nosintetizable!!!
sintetizable!!!

Las 3 variantes pueden combinarse entre s, y la sentencia


WAIT
ON x1
UNTIL x2=1
FOR x3 ns;
se satisface (se sale de WAIT) si alguna de las 3 condiciones es vlidas

Un WAIT UNTIL al comienzo de un proceso es el


nico tipo de WAIT soportado por MAX+plus II VHDL
Fuente: ALTERA

Ejemplos del uso de WAIT


Hot Lab Support Initiative

Por su lado, la sentencia


IF luz=(rojo OR ama) WAIT UNTIL luz=verde; END IF;

[label:] WAIT FOR <expresin temporal>; la resolucin se detiene por un


dado tiempo. ATENCION: WAIT FOR no es sintetizable!

77

G.Jaquenod 2002, All Rights Reserved.

Dada una variable luz, definida mediante:


TYPE semforo IS (rojo,ama,verde); SIGNAL
luz:semforo;
la sentencia:
WAIT ON luz; detiene el proceso hasta que cambie alguna
luz.

La sentencia WAIT ofrece 3 variantes para detener la resolucin de un


conjunto de sentencias secuenciales (un proceso, un procedimiento, un
lazo LOOP) hasta el cumplimiento de un dado evento:

G.Jaquenod 2002, All Rights Reserved.

PROCESS (qa,g,h) IS BEGIN


qb<=(qa AND NOT(g XOR h)); END PROCESS;

El label es opcional!
75

Asignaciones concurrentes
y procesos implcitos

Se ha visto que el cambio de valor de cualquiera de las variables definidas en


la lista de sensibilidad de un procesos activa su evaluacin

lista
lista de
de
sensibilidad
sensibilidad

La sintaxis de un proceso es:

G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

ig
ht
G.
Ja

una sentencia WAIT (aceptada con restricciones por las


herramientas de sntesis)

[label:] PROCESS

qu
en
od

73

Otras acciones concurrentes:


los PROCESOS

78

G.Jaquenod 2002, All Rights Reserved.

Copyright Guillermo Jaquenod, 2002

13

VHDL: Lenguaje de
descripcin de hardware

Hot Lab Support Initiative

XII Asamblea General del ISTEC, UTP, Panam, Noviembre de 2002

Ejemplos de WAIT

Un Flipflop usando WAIT

Hot Lab Support Initiative

Hot Lab Support Initiative

a,b,c,d:
a,b,c,d: eventos
eventos para
para WAIT
WAIT ON
ON
a,c:
a,c: eventos
eventos para
para WAIT
WAIT UNTIL
UNTIL
e,f,g,h:
e,f,g,h: eventos
eventos para
para WAIT
WAIT FOR
FOR

a b

X2

PROCESS BEGIN
WAIT ON X; X3 <= NOT(X);
END PROCESS;

X3

PROCESS BEGIN
WAIT UNTIL X=1; X4 <= NOT(X);
END PROCESS;

X4

PROCESS BEGIN
X5 <= NOT(X);
WAIT UNTIL X=1 FOR 10 ns;
END PROCESS;

X5

ENTITY wdff IS PORT (


d,reloj : IN std_logic;
q : OUT std_logic );
END ENTITY wdff;

No
Nosintetizable!!!
sintetizable!!!

79

10 20 30 40

G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

ARCHITECTURE usowait OF wdff IS


BEGIN
PROCESS
BEGIN
WAIT UNTIL reloj='1';
q <= d;
END PROCESS;
END ARCHITECTURE usowait;

50 60 70
Fuente: SJOHOLM

Asignaciones a variables
en un proceso

Las sentencias de asignacin a variables son de la forma

[label:] <nombre de variable> := <expresin>;

80

si se intercambia el orden el resultado final es distinto


...SON SECUENCIALES!

G.Jaquenod 2002, All Rights Reserved.

82

Asignaciones condicionales
en procesos: IF

Co
py
r

Hot Lab Support Initiative

Opera como una nica sentencia que habilita el procesamiento


secuencial o no de otras sentencias, definiendo una prioridad de hecho

Por ejemplo:

SIGNAL data_alu:INTEGER;
PROCESS BEGIN
IF
nclr=0 THEN data_alu <= 0;..;..;..;
ELSIF pass=1 THEN data_alu <= data_A;..;..;..;
ELSE ..;..;..;
END PROCESS;

Fuente: ALTERA

En este caso no importa cul de las


sentencias se escribe primero

PROCESS
SIGNAL s1, s3: INTEGER := 0; SIGNAL s2: INTEGER := 1;
BEGIN
s1 <= s2;
s2 <= s1; -- hasta ac s1 sigue en 0 y s2 en 1
WAIT FOR 1 ns; -- recien antes del wait s2 va a 0 y s1
s3 <= s1;
WAIT FOR 1 ns; -- ac s3 pasa a uno un nanosegundo despus
END PROCESS;

G.Jaquenod 2002, All Rights Reserved.

IF - THEN: Ejemplo
Hot Lab Support Initiative

Proceso implcito

Es una sentencia secuencial, slo usable dentro de PROCESOS, y resulta en


circuitos con codificacin de prioridad cuando es sintetizada en hardware
G.Jaquenod 2002, All Rights Reserved.

WAIT UNTIL espera a que la


condicin pase de falsa a
verdadera => flanco positivo!

Asignaciones a seales
en un proceso

PROCESS(a,b,r,s,t)
BEGIN
IF a = 1 THEN
q <= r;
ELSIF b = 1 THEN q <= s;
ELSE
q <= t;
END IF;
END PROCESS;

IF
<expressin> THEN <sentencia>;..; <sentencia>;
ELSIF <expressin> THEN <sentencia>;..; <sentencia>;
ELSE
<sentencia>; ..; <sentencia>;
END IF;

83

...no hay lista de sensibilidad!

Las sentencias de asignacin a seales se efectivizan recien al final de


cada ciclo de simulacin, cuando los valores a asignar en TODAS las
asignaciones ya han sido resueltos.

PROCESS
VARIABLE v1,v2: INTEGER := 0; -- valor inicial
BEGIN
v1 := v1 + 1; -- luego de esta sentencia v1 vale 1
v2 := v1 + 1; -- luego de esta sentencia v2 vale 2
...
END PROCESS;

81

G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

ig
ht
G.
Ja

Estas asignaciones son SIEMPRE secuenciales, y la actualizacin de


la variable con el valor de la expresin es realizada inmediatamente
Ejemplo:

MAX+plusII slo
soporta una instruccin
wait until para una seal
simple
Otras variedades de wait
(ej: wait on) o seales
complejas no son
toleradas para la sntesis

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;

20

X1

PROCESS BEGIN
X2 <= NOT(X); WAIT ON X;
END PROCESS;

qu
en
od

PROCESS (X) BEGIN


X1 <= not (X);
END PROCESS;

02

84

G.Jaquenod 2002, All Rights Reserved.

Las sentencias son analizadas


secuencialemente, por lo que
a tiene prioridad sobre b

q <= (a and r)
or ((not a) and b and s)
or ((not a) and (not b) and t)
Fuente del grfico:
SYNPLIFY HDL Analyst

Copyright Guillermo Jaquenod, 2002

14

Hot Lab Support Initiative

Hot Lab Support Initiative

VHDL: Lenguaje de
descripcin de hardware
XII Asamblea General del ISTEC, UTP, Panam, Noviembre de 2002

Uso de IF en
PROCESOS combinatorios

Hot Lab Support Initiative

-- multiplexor 2:1 de buses de 8 bits como PROCESO


LIBRARY
ieee; USE
ieee.std_logic_1164.ALL;
ENTITY octal_mux2to1 IS
PORT (sel: IN std_logic;
busA,busB: IN std_logic_vector (7 DOWNTO 0);
salida: OUT std_logic_vector (7 DOWNTO 0));
END ENTITY octal_mux2to1;

85

G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

02

LIBRARY ieee; USE ieee.std_logic_1164.ALL;


ENTITY bufferts IS
PORT (
oe, data:IN std_logic;
triout : OUT std_logic);
oe
END ENTITY bufferts;

Fuente del grfico:


SYNPLIFY HDL Analyst

Asignaciones condicionales
en procesos: CASE

Opera a partir de una nica sentencia que habilita el procesamiento o no de


ciertas otras sentencias; su uso es habitual al describir mquinas de estado.

ARCHITECTURE a OF bufferts IS
data
BEGIN
PROCESS (oe, data)
BEGIN
IF oe = '0' THEN triout <= 'Z';
ELSE triout <= data;
END IF;
END PROCESS;
END ARCHITECTURE a;

86

[label:] CASE <expresin> IS


WHEN <constante> => <sentencia>;...;<sentencia>;
...
WHEN <constante> => <sentencia>;...;<sentencia>;
WHEN OTHERS <sentencia>;...;<sentencia>;
END CASE;

87

G.Jaquenod 2002, All Rights Reserved.

88

Asignaciones con CASE


usando rangos u OR

Co
py
r

Hot Lab Support Initiative

ENTITY case_rango IS
PORT (a: IN INTEGER RANGE 0 TO 30;
b: OUT INTEGER RANGE 0 TO 3);
END ENTITY case_rango;

PROCESS(sel, a, b,
BEGIN
CASE sel IS
WHEN 00
=> q
WHEN 01
=> q
WHEN 10
=> q
WHEN OTHERS => q
END CASE;
END PROCESS;

c, d)

<=
<=
<=
<=

a;
b;
c;
d;

00

b
c
d

01

sel

10
11

2
requiere slo 2
macroceldas
operando en
Cascade Chain

a
b
sel0
sel1

c
d

G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

Ejemplo: demux 3:8 negado


tipo TTL 74138

ARCHITECTURE a OF dmux8 IS
BEGIN
PROCESS (d,s) IS
VARIABLE sal : BIT_VECTOR(0 to 7);
BEGIN
IF (d = '1') THEN sal := "11111111";
ELSE CASE s IS
WHEN 0 => sal := B"01111111";
WHEN 1 => sal := B"10111111";
WHEN 2 => sal := B"11011111";
WHEN 3 => sal := B"11101111";
WHEN 4 => sal := B"11110111";
WHEN 5 => sal := B"11111011";
WHEN 6 => sal := B"11111101";
WHEN OTHERS => sal := B"11111110";
END CASE;
END IF;
y <= sal ;
END PROCESS;
END a;

Para ello se usa el


carcter | que
considera el OR de
esos casos

G.Jaquenod 2002, All Rights Reserved.

Asignaciones condicionales
en procesos: CASE

ENTITY dmux8 IS PORT(


s: IN INTEGER RANGE 0 TO 7; d: IN BIT; y: OUT BIT_VECTOR(0 TO 7));
END dmux8;

Dentro de cada WHEN


de un CASE es posible
incluir varios casos

ARCHITECTURE rangovar OF case_rango IS


BEGIN
micase: PROCESS(a)
Tambin puede
BEGIN
especificarse un rango
OR
OR
CASE a IS
de valores
WHEN 0|28
=> b <= 0;
WHEN 1 to 15
=> b <= 1;
Rango
Rango
WHEN 24 DOWNTO 16|27 => b <= 2;
WHEN OTHERS
=> b <= 3;
Rango
Rango++OR
OR
END CASE;
END PROCESS micase;
Distintas
END ARCHITECTURE rangovar;
Distintasformas
formasde
deincluir
incluir
mltiples
mltiplescasos
casosen
enuna
una
sola
solalnea
lnea

89

Fuente: ALTERA

Ejemplo: un multiplexor 4:1

La sentencia final WHEN OTHERS permite definir la accin ante los posibles
valores aun indefinidos del campo constante, y evitar la inferencia de
elementos de memoria

triout

G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

ig
ht
G.
Ja

En el campo <constante> cada posible valor debe figurar una y slo una vez,
pudiendo emplearse | (el operador OR) para agrupar posibles valores, o TO
(o DOWNTO) para expresar un rango.

20

cada salida es
funcin combinatoria
de 3 entradas
requiere ocho
macroceldas, una
por cada salida

qu
en
od

ARCHITECTURE usoif OF octal_mux2to1 IS


BEGIN
PROCESS (sel,busA,busB)
BEGIN
IF sel='1' THEN salida <= busB;
ELSE
salida <= busA;
END IF;
END PROCESS;
END ARCHITECTURE usoif;

Uso de IF en
PROCESOS combinatorios

90

msb sal7
sal6
..
sal5
lsb
sal4
sal3
sal2
sal1
ena sal0

y7
y6
y5
y4
y3
y2
y1
y0

Quines son los


OTHERS? Para qu
puse RANGE?

G.Jaquenod 2002, All Rights Reserved.

Copyright Guillermo Jaquenod, 2002

15

XII Asamblea General del ISTEC, UTP, Panam, Noviembre de 2002

Comparacin entre CASE y


WITH..SELECT

Hot Lab Support Initiative

IF-ELSE versus CASE


Hot Lab Support Initiative

Ambas sentencias comparan una expresin contra una tabla de valores


CONSTANTES y operan en consecuencia
Pero CASE permite describir varias sentencias en cada caso, y adems
es de tipo secuencial (permite usar asignaciones mltiples para definir
defaults)

91

El uso de sentencias CASE es ms conveniente:


No induce prioridades

El uso de hardware es ms evidente y predecible

20

00
01
10
11

PROCESS(sel, a, b, c, d)
BEGIN
CASE sel IS
WHEN 00 => q <= a;
WHEN 01 => q <= b;
WHEN 10 => q <= c;
WHEN OTHERS => q <= d;
END CASE;
END PROCESS;

G.Jaquenod 2002, All Rights2Reserved.

Hot Lab Support Initiative

generar circuitos de complejidad innecesaria (prioridades indeseadas)

Proceso Explcito

WITH sel SELECT


q <= a WHEN 00,
b WHEN 01,
c WHEN 10,
d WHEN OTHERS;
a
b
c
d
sel

la posibilidad de inferir registros (IF incompletos)

El compilador obliga a definir todos los casos, evitando la inferencia


indeseada de registros
Ms prximo al comportamiento de una tabla de verdad

Usado por el MAX+plus II para definir la tabla de transicin de estados


en mquinas de estado

Recomendacin: donde pueda reemplace IF por CASE

qu
en
od

Proceso Implcito

El uso de sentencias IF debe ser controlado cuidadosamente, por:

92

Iteraciones usando LOOP,


FOR LOOP y WHILE LOOP

[label:] LOOP
<sentencia>;...;<sentencia>;
END LOOP label;

[label:] FOR <variable local> IN <rango>


LOOP
<sentencia>;...;<sentencia>;
END LOOP label;
[label:] WHILE <expresin booleana>
LOOP
<sentencia>;...;<sentencia>;
END LOOP label;
93

G.Jaquenod 2002, All Rights Reserved.

94

Generador de paridad:
LOOP de rango abierto

Co
py
r

Hot Lab Support Initiative

ENTITY generador_paridad_impar IS PORT (


entra: IN BIT_VECTOR; -- vector de rango abierto
Slo
paridad: OUT BIT);
Slose
sedice
diceque
queentra
entraes
es
BIT_VECTOR,sin
sinindicar
indicarsu
surango!
rango!
END ENTITY generador_paridad_impar; BIT_VECTOR,

G.Jaquenod 2002, All Rights Reserved.

Fuente: ALTERA

Ejemplo: iteraciones usando


LOOP

-- cuento la cantidad de unos en una palabra d


ENTITY proc IS
PORT (d :IN BIT_VECTOR (2 DOWNTO 0);
cada salida es
q :OUT INTEGER RANGE 0 TO 3 );
funcin combinatoria
END ENTITY proc;
de un vector de 3
entradas.
ARCHITECTURE maxpld OF proc IS
requiere solo dos
BEGIN
macroceldas, una
PROCESS ( d )
VARIABLE num_bits : INTEGER;
por cada salida
BEGIN
num_bits := 0;
FOR i IN d'RANGE LOOP
IF d(i) = '1 THEN num_bits := num_bits + 1;
END IF;
END LOOP;
q <= num_bits;
END PROCESS;
END ARCHITECTURE maxpld;
Behavioral o
Structural?

G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

Fuente: ALTERA

Ejemplo: AND(N)
con parametros y LOOP

ENTITY and_parametrizada IS
GENERIC (retardo: TIME := 10 ns; fanin: POSITIVE := 4);
PORT (entradas : IN BIT_VECTOR (fanin-1 DOWNTO 0);
salida: OUT BIT);
END ENTITY and_parametrizada;

ARCHITECTURE usoloop OF generador_paridad_impar IS BEGIN


xor_loop: PROCESS (entra) IS
VARIABLE tempo: BIT;
BEGIN
tempo := 1'; -- se inicializa en 0 para paridad par
FOR i IN entra'RANGE LOOP tempo := tempo XOR entra(i);
END LOOP;
paridad <= tempo;
El bit de paridad hace que la cantidad total de 1s
END PROCESS xor_loop;
en el dato transmitido sea par o impar
END ARCHITECTURE usoloop;

95

G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

ig
ht
G.
Ja

Permiten reemplazar la enunciacin explcita de sentencias secuenciales, en


forma de un lazo de iteracin. La sentencia LOOP permite tres
construcciones distintas: LOOP, FOR LOOP, y WHILE LOOP, que varan en
relacin a las condiciones que determinan el final de la iteracin. En el primer
caso el lazo debe incluir al menos una sentencia WAIT.

02

Hot Lab Support Initiative

VHDL: Lenguaje de
descripcin de hardware

ARCHITECTURE ejemplo OF and_parametrizada IS


BEGIN
proceso: PROCESS (entradas)
VARIABLE tempo: BIT;
BEGIN
tempo:= 1;
FOR i IN entradasLENGTH-1 DOWNTO 0 LOOP
IF entradas(i) = 0 THEN tempo := 0; END
END LOOP;
salida <= tempo AFTER retardo;
END PROCESS proceso;
END;
96

entradas(n-1)
entradas(n-2)
entradas(n-3)
------------------------entradas(1)
entradas(0)

salida

IF;

G.Jaquenod 2002, All Rights Reserved.

Copyright Guillermo Jaquenod, 2002

16

VHDL: Lenguaje de
descripcin de hardware

Hot Lab Support Initiative


Ejemplo: suma(N)
con parametros y LOOP

Hot Lab Support Initiative

Para las estructuras LOOP existen dos sentencias capaces de alterar


la iteracin: NEXT y EXIT; estas sentencias se comportan como las
sentencias CONTINUE y BREAK del C, y slo son soportadas por
algunas de las herramientas de sntesis.

LIBRARY ieee; USE ieee.std_logic_1164.ALL;


ENTITY sumpara IS
GENERIC(num_bits : INTEGER:= 4); -- por defecto: 4 bits
PORT (a
: IN std_logic_vector (num_bits DOWNTO 1);
b
: IN std_logic_vector (num_bits DOWNTO 1);
cin : IN std_logic; cout : OUT std_logic;
sum : OUT std_logic_vector (num_bits DOWNTO 1));
END ENTITY sumpara;

Tanto para NEXT como para EXIT hay dos posibles modos, absoluto
y condicional:

Behavioral o
Structural?

G.Jaquenod 2002, All Rights Reserved.

97

20

NEXT y NEXT WHEN <condicin>


EXIT y EXIT WHEN <condicin>

Por ejemplo, para sumar los trminos positivos de un vector:


VARIABLE sum : INTEGER;

sum := 0;
sumapos: FOR i IN dataRANGE LOOP
NEXT sumapos WHEN data(i) <= 0;
sum := sum + data (i);
END LOOP sumapos;

qu
en
od

ARCHITECTURE ripple OF sumpara IS


BEGIN
PROCESS (a, b, cin)
VARIABLE vsum : std_logic_vector (num_bits DOWNTO 1);
VARIABLE carry : std_logic;
BEGIN
carry := cin;
FOR i IN 1 TO num_bits LOOP
vsum(i) := a(i) XOR b(i) XOR carry;
carry := (a(i) AND b(i)) OR (carry AND (a(i) OR b(i)));
END LOOP;
sum <= vsum; cout <= carry;
END PROCESS;
END ARCHITECTURE ripple;

98

Hot Lab Support Initiative

Controles de LOOP:
NEXT y EXIT

02

Hot Lab Support Initiative

XII Asamblea General del ISTEC, UTP, Panam, Noviembre de 2002

G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

Asignaciones incompletas:
inferencia de memoria

En algunos HDLs (P.Ej: AHDL) si a una seal no se le asigna un


valor, sta toma por default un valor esttico (GND o VCC).

ig
ht
G.
Ja

Bases de VHDL

Inferencia de
elementos de memoria
(voluntaria e involuntaria)
G.Jaquenod 2002, All Rights Reserved.

99

Inferencia de latches
dentro/fuera de procesos

Co
py
r

Hot Lab Support Initiative

100

ENTITY latchconcu IS PORT(a,b:IN BIT; c:OUT BIT);


END ENTITY latchconcu;
b

Como alternativa, el uso de clusulas de tipo OTHERS permite


garantizar que todos los casos restantes queden cubiertos
G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

Inferencia de latches en IFs


anidados

ARCHITECTURE behavior OF if_wrng IS


BEGIN
PROCESS (sel)
BEGIN
IF sel(3) = '1' THEN
IF sel(2) = '1' THEN
IF sel(1) = '1' THEN
IF sel(0) = '1' THEN y <= '1'; END IF;
END IF;
END IF;
ELSE y <= '0';
END IF;
END PROCESS;
END ARCHITECTURE behavior;

ENTITY mi_latch IS PORT (datos,enable:IN BIT; q:OUT BIT);


END ENTITY mi_latch;
El IF no tiene ELSE
ARCHITECTURE a OF mi_latch IS No est especificado qu hacer si enable = 0
por lo que el valor previo se conserva
BEGIN
--> se crea un latch
PROCESS (enable,data)
BEGIN
IF enable = '1' THEN q <= datos;
datos D Q q
END IF;
END PROCESS;
enable GATE
END ARCHITECTURE a;

G.Jaquenod 2002, All Rights Reserved.

Si se desea evitar este problema, en una asignacin condicional debe


especificarse el comportamiento para TODOS los casos, sin olvidar
que si bien una seal tipo BIT tiene dos valores posibles (0,1) una
del tipo STD_LOGIC tiene 9 valores posibles.

LIBRARY ieee; USE ieee.std_logic_1164.ALL;


ENTITY if_wrng is
port (sel : IN std_logic_vector (3 DOWNTO 0);
y
: OUT std_logic);
END ENTITY if_wrng;

GATE
ARCHITECTURE concu OF latchconcu IS
BEGIN
Qu pasa si a=0?
c <= b when a='1';
el valor previo se conserva --> se crea un latch
END ARCHITECTURE concu;

101

EN VHDL y VERILOG el criterio es distinto: si a una seal no se le


asigna un valor, se asume que se desea que sta mantenga el valor
previo, y por lo tanto se agregan los recursos necesarios para ello (es
decir, se infiere un elemento de memoria).

102

G.Jaquenod 2002, All Rights Reserved.

Slo este IF tiene ELSE


Si sel(3)=1 los demas IF
no dicen qu hacer
cuando sel(2) o sel(1) o
sel(0) vale 0--> se crea
un latch

sel(0)
sel(1)

1
sel(2)

gate
clrn

sel(3)

Fuente: ALTERA

Copyright Guillermo Jaquenod, 2002

17

VHDL: Lenguaje de
descripcin de hardware

Hot Lab Support Initiative

XII Asamblea General del ISTEC, UTP, Panam, Noviembre de 2002

Flipflops: formas de
definir el reloj

Flipflop D sensible al flanco+


Hot Lab Support Initiative

La creacin de flipflops requiere definir procesos sensibles a flancos, y puede


adoptar distintas formas, algunas de ellas ms generales, y otras no soportadas
para su sntesis por las herramientas EDA (Electronic Design Automation)
PROCESS (reloj) BEGIN
IF reloj=1
Slo
Slosisino
nose
senecesita
necesita
THEN q <= d;
RESET/SET
RESET/SETasincrnicos
asincrnicos
Acepta
END IF;
Aceptaflancos
flancosde
deX
XooZ
Zaa1
1
Tambin
Tambinsirve
sirvepara
paraseales
sealesBIT
BIT
END PROCESS;

PROCESS (reloj) BEGIN


IF rising_edge (reloj)
THEN q <= d;
END IF;
END PROCESS;

PROCESS BEGIN
WAIT UNTIL rising_edge (reloj);
q <= d;
END PROCESS;

PROCESS (reloj) BEGIN


IF relojEVENT AND reloj=1
AND relojLAST_VALUE=0
THEN q <= d;
Descarta
Descartaflancos
flancosque
queno
nosean
seande
de0
0aa
END IF;
1,
1,no
noes
esusada
usadapara
parasntesis
sntesis
END PROCESS;

Equivalente
Equivalenteaalalade
deabajo,
abajo,
pero
peroredundante
redundante

PROCESS BEGIN
WAIT UNTIL reloj=1;
q <= d;
Slo
Slosisino
nose
senecesita
necesitaRESET/SET
RESET/SET
END PROCESS;
asincrnicos
asincrnicos
Acepta
Aceptaflancos
flancosde
deX
XooZ
Zaa1
1
Tambin
Tambinsirve
sirvepara
paraseales
sealesBIT
BIT

ANALIZAR
ANALIZARCMO
CMOFUNCIONA
FUNCIONACADA
CADAMTODO!
MTODO!
103

G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

Fuente: SJOHOLM

Flipflop Toggle sensible al


flanco +

ENTITY ff_T IS PORT


(T,clk: IN STD_LOGIC; q: OUT STD_LOGIC);
END ff_T ;

Porqu debo definir


q_interno?
Cmo podra evitarlo?

105

G.Jaquenod 2002, All Rights Reserved.

107

106

Inferencia de registros:
cuntos flipflops?

PRN

4 inp.
LUT

ENA
CLRN

Cascade Out
Fuente: ALTERA
MAX+plus II HELP

ARCHITECTURE a OF ff_cl_ena IS
SIGNAL q_aux: STD_LOGIC;
BEGIN
lista de sensibilidad
PROCESS (clk, clrn)
BEGIN
IF clrn = '0' THEN q_aux <= '0';
ELSIF rising_edge (clk) THEN
IF ena = '1' THEN q_aux <= d;
ELSE q_aux <= q;
END IF;
END IF;
END PROCESS;
q <= q_aux;
END ARCHITECTURE a;
G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

ARCHITECTURE reg1 OF reg1 IS


SIGNAL a, b : BIT;
BEGIN
PROCESS (clk)
BEGIN
IF rising_edge(clk) THEN
a <= d;
b <= a;
q <= b;
END IF;
END PROCESS;
END ARCHITECTURE reg1;

G.Jaquenod 2002, All Rights Reserved.

ena
clk
clrn

Inferencia de registros:
cuntos flipflops?

ARCHITECTURE reg1 OF reg1 IS


SIGNAL a, b : BIT;
BEGIN
PROCESS (clk)
BEGIN
IF rising_edge(clk) THEN
a <= d;
b <= a;
q <= b;
END IF;
END PROCESS;
END ARCHITECTURE reg1;
108

Fuente: ALTERA

ENTITY reg1 IS
PORT (d,clk: in BIT;
q
: out BIT);
END ENTITY reg1;

Fuente: ALTERA

Cascade In

Flipflop con SET/RESET


asncrono y ENABLE

ENTITY reg1 IS
PORT (d,clk: in BIT;
q
: out BIT);
END ENTITY reg1;

G.Jaquenod 2002, All Rights Reserved.

LIBRARY ieee; USE ieee.std_logic_1164.ALL;


ENTITY ff_cl_ena IS
PORT (
porqu
d, clk,clrn,ena : IN STD_LOGIC;
q: BUFFER STD_LOGIC);
BUFFER?
END ENTITY ff_cl_ena;

Fuente: CHANG

G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

Co
py
r

Hot Lab Support Initiative

104

ig
ht
G.
Ja

ARCHITECTURE maxpld OF ff_T IS


SIGNAL q_interno : std_logic;
BEGIN
T T
PROCESS
BEGIN
clk
WAIT UNTIL clk = 1;
CASE T is
WHEN 1=> q_interno <= NOT (q_interno);
WHEN OTHERS => NULL;
END CASE;
END PROCESS;
q <= q_interno;
END maxpld;

clk

qu
en
od

Muy
Muyusada
usada
Necesita
NecesitaIEEE_1164
IEEE_1164
yyseales
sealesSTD_LOGIC
STD_LOGIC

ARCHITECTURE maxpld OF reginf IS


BEGIN
PROCESS
BEGIN
WAIT UNTIL clk = '1';
Carry In
q <= d;
Data1
END PROCESS;
Data2
END maxpld;
Data3
Data4

20

PROCESS (reloj) BEGIN


IF relojEVENT AND reloj=1
THEN q <= d;
Muy
Muyusada
usada
END IF;
Acepta
Aceptaflancos
flancosde
deX
XooZ
Zaa1
1
Tambin
END PROCESS;
Tambinsirve
sirvepara
paraseales
sealesBIT
BIT

Cules son los beneficios


de usar flipflops en vez de
latches, al usar FLEX10K?

ENTITY reginf IS PORT (


d, clk: IN STD_LOGIC;
q: OUT STD_LOGIC);
END reginf;

02

Hot Lab Support Initiative

D
D
QQ

clk

a
a, b y q se
actualizan al
mismo tiempo,
en el flanco de
subida de clk

D
D
QQ

clk

D
D
QQ

b
q

clk

clk

Fuente: ALTERA

Copyright Guillermo Jaquenod, 2002

18

VHDL: Lenguaje de
descripcin de hardware

Hot Lab Support Initiative

Hot Lab Support Initiative

ENTITY reg1 IS
PORT (d,clk:IN BIT;
q:OUT BIT);
END ENTITY reg1;

ENTITY reg1 IS
PORT (d,clk:IN BIT;
q:OUT BIT);
END ENTITY reg1;

ARCHITECTURE reg1 OF reg1 IS


BEGIN
PROCESS (clk)
VARIABLE a, b : BIT;
BEGIN
IF rising_edge(clk) THEN
a := d;
b := a;
q <= b;
END IF;
END PROCESS;
END ARCHITECTURE reg1;

ARCHITECTURE reg1 OF reg1 IS


BEGIN
PROCESS (clk)
VARIABLE a, b : BIT;
BEGIN
IF rising_edge(clk) THEN
a := d;
b := a;
q <= b;
END IF;
END PROCESS;
END ARCHITECTURE reg1;

Inferencia de registros:
cuntos flipflops?

ig
ht
G.
Ja
Fuente: ALTERA

Co
py
r

a q
b

clk

d se copia en a, y a en b, en forma
secuencial, y slo b es copiado en
q recin al fin del PROCESS

G.Jaquenod 2002, All Rights Reserved.

Fuente: ALTERA

Inferencia de registros:
cuntos flipflops?

ARCHITECTURE reg1 OF reg1 IS


SIGNAL a,b:BIT;
BEGIN
PROCESS (clk)
BEGIN
IF rising_edge(clk) THEN
a <= d;
b <= a;
END IF;
END PROCESS;
q <= b;
END ARCHITECTURE reg1;

Fuente: ALTERA
MAX+plus II HELP

114

b q

D
D
QQ

clk

clk

La copia de d en a y de a
en b se hace recin al final
del proceso.
En cambio la copia de b en
q es concurrente.

G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

Fuente: ALTERA

Ejemplos: contador con


SLOAD

ARCHITECTURE a OF counter IS BEGIN


PROCESS (clk)
VARIABLE cnt : INTEGER RANGE 0 TO 255;
BEGIN
IF (clk = '1') THEN
IF ld = '0' THEN cnt := d;
ELSE cnt := cnt + 1;
END IF;
END IF;
q <=
cnt;
END PROCESS;
END a;

D
D
QQ

clk

ENTITY counter IS PORT (


d : IN INTEGER RANGE 0 TO 255; clk, ld : IN
q : OUT INTEGER RANGE 0 TO 255);
END counter;

Porqu defino el
rango de cnt, en
vez de slo poner
INTEGER?

ARCHITECTURE a OF counter IS BEGIN


PROCESS (clk)
VARIABLE cnt : INTEGER RANGE 0 TO 255;
BEGIN
IF (clk = '1') THEN
IF enable = '1' THEN cnt := cnt + 1; END IF;
END IF;
enable
q <= cnt;
clk
END PROCESS;
END a;

G.Jaquenod 2002, All Rights Reserved.

112

Ejemplos: contador con


ENABLE

ENTITY counter IS PORT (


clk, enable : IN STD_LOGIC;
q : OUT INTEGER RANGE 0 TO 255);
END counter;

D Q
clk

ENTITY reg1 IS
PORT (d,clk:IN BIT;
q:OUT BIT);
END ENTITY reg1;

ARCHITECTURE reg1 OF reg1 IS


SIGNAL a,b:BIT;
BEGIN
PROCESS (clk)
BEGIN
IF rising_edge(clk) THEN
a <= d;
b <= a;
END IF;
END PROCESS;
q <= b;
END ARCHITECTURE reg1;

113

110

Hot Lab Support Initiative

ENTITY reg1 IS
PORT (d,clk:IN BIT;
q:OUT BIT);
END ENTITY reg1;

Hot Lab Support Initiative

20

Fuente: ALTERA

G.Jaquenod 2002, All Rights Reserved.

qu
en
od

G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

111

Inferencia de registros:
cuntos flipflops?

02

Inferencia de registros:
cuntos flipflops?

Hot Lab Support Initiative

109

XII Asamblea General del ISTEC, UTP, Panam, Noviembre de 2002

G.Jaquenod 2002, All Rights Reserved.

STD_LOGIC;

clk
ld
Fuente: ALTERA
MAX+plus II HELP

Copyright Guillermo Jaquenod, 2002

19

VHDL: Lenguaje de
descripcin de hardware

Hot Lab Support Initiative

XII Asamblea General del ISTEC, UTP, Panam, Noviembre de 2002

Ejemplos: contador UpDown

La idea de resource sharing


Hot Lab Support Initiative

Fuente: ALTERA
MAX+plus II HELP

G.Jaquenod 2002, All Rights Reserved.

Ejemplos: contadores
con cualquier mdulo

Hot Lab Support Initiative

ENTITY contador IS GENERIC (modulo : INTEGER := 200);


PORT (reloj: IN STD_LOGIC; sal: OUT INTEGER RANGE 0 TO modulo);
END contador ;

Usando sentido

PROCESS (clk)
VARIABLE cnt : INTEGER RANGE 0 TO 255;
BEGIN
IF (clk='1') THEN
IF (up_dn='1') THEN cnt := cnt+1;
ELSE cnt := cnt-1;
END IF;
END IF;
q <= cnt;
END PROCESS;

up_dn

clk

20

ARCHITECTURE a OF counter IS BEGIN


up_dn
PROCESS (clk)
q
VARIABLE cnt : INTEGER RANGE 0 TO 255;
clk
VARIABLE sentido : INTEGER;
BEGIN
IF (up_dn='1') THEN sentido:= 1; ELSE sentido:= -1; END IF;
IF (clk='1') THEN cnt:=cnt + sentido; END IF;
q <= cnt;
END PROCESS;
END a;

115

PROCESS (clk)
VARIABLE cnt : INTEGER RANGE 0 TO 255;
VARIABLE sentido : INTEGER;
BEGIN
IF (up_dn='1') THEN sentido:= 1;
ELSE sentido:= -1;
END IF;
IF (clk='1') THEN cnt:=cnt + sentido;
END IF;
q <= cnt;
END PROCESS;

Para qu se
define
sentido?

Sin usar sentido

-1

+1

up_dn

+
+

clk

qu
en
od

ENTITY counter IS PORT (


clk, up_dn:IN STD_LOGIC;
q:OUT INTEGER RANGE 0 TO 255);
END counter;

02

Hot Lab Support Initiative

G.Jaquenod 2002, All Rights Reserved.

116

Hot Lab Support Initiative

Asignaciones concurrentes
mltiples

Dada una seal, en VHDL se crea un driver que excita esa seal en diferentes
ocasiones:
al ejecutar una sentencia de asignacin, dentro o fuera de un proceso, o en un procedure
al instanciar un componente

117

ig
ht
G.
Ja

ARCHITECTURE a OF contador IS BEGIN


PROCESS (reloj)
VARIABLE cuenta : INTEGER RANGE 0 TO modulo -1;
BEGIN
IF reloj=1 THEN
IF cnt = modulo - 1
THEN cuenta := 0;
ELSE cuenta := cuenta + 1;
END IF;
END IF;
sal <= cuenta;
END PROCESS;
END a;
G.Jaquenod 2002, All Rights Reserved.

Fuente: ALTERA

118

Donde cada driver est asociado a una lista con el valor corriente y los valores
futuros a asignar a esa seal (cola de transacciones)
Por ejemplo, si se ejecutan los siguiente procesos:
PROCESS (s1) BEGIN
a <= s1;
END PROCESS;
PROCESS (s2) BEGIN
a <= s2;
END PROCESS;

Co
py
r

Para definir la funcin de resolucin a emplear en una dada seal de un tipo no resuelto, se
intercala el nombre de esta funcin antes de especificar el tipo:

G.Jaquenod 2002, All Rights Reserved.

SIGNAL resuelta: funcion_de_resolucin

tipo_no_resuelto;

SUBTYPE tipo_resuelto IS funcion_de_resolucin

Hot Lab Support Initiative

ENTITY NORES IS
PORT (A,ENA1,B,ENA2: IN STD_ULOGIC;
SALIDA: OUT STD_ULOGIC);
END;
ARCHITECTURE X OF NORES IS BEGIN
SALIDA <= A WHEN ENA1=1 ELSE Z;
SALIDA <= B WHEN ENA2=1 ELSE Z;
END X;

De igual modo puede definirse un subtipo resuelto del tipo no resuelto:


tipo_no_resuelto;

ENA1

Por ejemplo, la funcin siguiente resuelve conflictos de seales open-drain:

TYPE opndrn IS (0,H);


TYPE opndrn_array IS ARRAY (integer RANGE<>) OF opndrn;
SIGNAL s1: resolve_opndrn opndrn;

ENA2

119

G.Jaquenod 2002, All Rights Reserved.

SALIDA

L! !
MA

FUNCTION resolve_opndrn (bocas: IN opndrn_array) RETURN opndrn IS


VARIABLE resultado : opndrn := H;
BEGIN
FOR indice IN bocasRANGE LOOP
IF bocas(indice) = 0 THEN resultado := 0; END IF;
END LOOP;
RETURN resultado;
END FUNCTION resolve_opndrn;

s2

Esto crea un conflicto(colisin) donde 2 drivers excitan la misma seal, que debe
ser resuelto mediante una funcin de resolucin, que toma a s1,s2 como vector
de entrada y decide el valor de a.

Las funciones de resolucin

Hot Lab Support Initiative

s1

Funciones de resolucin
en STD_LOGIC_1164
ENTITY SIRES IS
PORT (A,ENA1,B,ENA2: IN STD_LOGIC;
SALIDA: OUT STD_LOGIC);
END;
ARCHITECTURE X OF SIRES IS BEGIN
SALIDA <= A WHEN ENA1=1 ELSE Z;
SALIDA <= B WHEN ENA2=1 ELSE Z;
END X;

ENA1
A

SALIDA

!
ok!

ENA2
B

STD_LOGIC_1164 define dos nuevos tipos/subtipos:

STD_ULOGIC con 9 posibles valores lgicos: U, X, 0,1, Z,W, L,H y -, donde


las asignaciones concurrentes mltiples no estn resueltas.

Y su subtipo STD_LOGIC, donde las asignaciones concurrentes mltiples estn


resueltas.

Si ms de un driver va a manejar una seal, sta deba ser de tipo STD_LOGIC.


120

G.Jaquenod 2002, All Rights Reserved.

Fuente: BAKER

Copyright Guillermo Jaquenod, 2002

20

VHDL: Lenguaje de
descripcin de hardware

Hot Lab Support Initiative

XII Asamblea General del ISTEC, UTP, Panam, Noviembre de 2002

Resolucin entre seales


std_ulogic

Seales versus Variables


Hot Lab Support Initiative

sentencia

destino <= fuente;

utilidad

Representa una
interconexin del circuito

123

VARIABLES ( := )
destino := fuente;

122

Cobertura local (slo


dentro de un proceso)

Actualizada al final (en un


WAIT) de cada proceso

Actualizada
inmediatamente

G.Jaquenod 2002, All Rights Reserved.

Fuente: ALTERA

124

Otras estructuras y sentencias:


Arrays
Generate
Assert y Report
NULL

G.Jaquenod 2002, All Rights Reserved.

Los arreglos (arrays)

Co
py
r

Los arrays son objetos compuestos consistentes en mltiples (un


rango) de elementos del mismo tipo

Un campo de un array (un slice) es


referenciado indicando un rango:

TYPE semaforo IS (verde,rojo,ama,amaroj,nada);


TYPE alertas IS ARRAY (semaforo RANGE rojo TO nada) OF BIT;

a (4 DOWNTO 0) <= word (7 DOWNTO 3)


Array
Arrayde
de55bits
bits

tanto en sentido creciente o decreciente

TYPE semaf IS ARRAY (semaforo) OF BIT;

Al definir un tipo array su rango puede dejarse abierto


(unconstrained) para ser definido recin al crear un objeto de ese tipo
TYPE word_3 IS ARRAY (INTEGER RANGE <>) OF BIT;

G.Jaquenod 2002, All Rights Reserved.

Los arrays: referencias a


elementos y slices

word(3) <= 1;

La cantidad de elementos de un array puede explicitarse en


referencia a un dado tipo, y a un rango de ese tipo
Array
Arrayde
de44bits
bits

Si el array tiene tantos elementos como el tipo usado para


dimensionarlo no es necesario el rango

Hot Lab Support Initiative

Un elemento del array es referenciado


mediante un ndice (que puede ser de un tipo
discreto tal como INTEGER o enumerado)

TYPE word_1 IS ARRAY (0 TO 31) OF BIT;


TYPE word_2 IS ARRAY (31 DOWNTO 0) OF BIT;

125

salida

G.Jaquenod 2002, All Rights Reserved.

Bases de VHDL

Representa una memoria


local usada para la
compilacin

Cobertura local y global


(puede intercomunicar
procesos)

Hot Lab Support Initiative

datos

02

20

clk
oe
ARCHITECTURE bts OF mi74374 IS
SIGNAL a:std_logic_vector (7 DOWNTO 0); --FlipFlop internos
BEGIN
registros: PROCESS (clk)
BEGIN
Forma
Formarpida
rpidade
de
asignar
IF clk=1' THEN a <= datos; end if;
asignarelelmismo
mismovalor
valor
aatodo
END PROCESS registros;
todoelelvector
vector
tri: PROCESS (oe,a)
BEGIN
IF oe = 1' THEN salida <= (others => 'Z');
ELSE
salida <= a;
END IF;
END PROCESS tri;
END ARCHITECTURE bts;

ig
ht
G.
Ja

BEHAVIOR

ENTITY mi74374 IS
PORT (salida:INOUT std_logic_vector (7 DOWNTO 0);
oe,clk:IN std_logic;
datos:IN std_logic_vector (7 DOWNTO 0));
END ENTITY mi74374;

Hot Lab Support Initiative

SEALES ( <= )

SCOPE

Hot Lab Support Initiative

LIBRARY ieee; USE ieee.std_logic_1164.ALL;

qu
en
od

Hot Lab Support Initiative

TYPE stdlogic_table IS ARRAY(std_ulogic,std_ulogic) OF std_ulogic;


CONSTANT resolution_table : stdlogic_table := (
---------------------------------------------------------Ejemplo:
-| U
X
0
1
Z
W
L
H
|
Z y 1
( 'U', 'U', 'U', 'U', 'U', 'U', 'U', 'U', 'U' ), -- U |
dan 1
( 'U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' ), -- X |
( 'U', 'X', '0', 'X', '0', '0', '0', '0', 'X' ), -- 0 |
( 'U', 'X', 'X', '1', '1', '1', '1', '1', 'X' ), -- 1 |
( 'U', 'X', '0', '1', 'Z', 'W', 'L', 'H', 'X' ), -- Z |
( 'U', 'X', '0', '1', 'W', 'W', 'W', 'W', 'X' ), -- W |
( 'U', 'X', '0', '1', 'L', 'W', 'L', 'W', 'X' ), -- L |
( 'U', 'X', '0', '1', 'H', 'W', 'W', 'H', 'X' ), -- H |
( 'U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' ) -- - |
);
FUNCTION resolved ( s : std_ulogic_vector ) RETURN std_ulogic IS
VARIABLE result : std_ulogic := 'Z';
BEGIN
IF
(s'LENGTH = 1) THEN
RETURN s(s'LOW);
A travs de una tabla se
ELSE FOR i IN s'RANGE LOOP
calcula la funcin resolved
result := resolution_table(result, s(i));
que decide el valor final
END LOOP;
std_logic es definido como
END IF;
resolved std_ulogic
RETURN result;
END resolved;
Fuente: maxplus2\vhdl93\ieee
G.Jaquenod 2002, All Rights Reserved.
std1164b.vhd y std1164.vhd
121

Buses TriState: modelo


de un 74374

En
Eneste
estecaso,
caso,al
al
declarar
declararuna
unavariable
variable
de
detipo
tipoword_3
word_3debe
debe
declararse
declararsesu
surango
rango

a (4 DOWNTO 0) <= word (1 TO 5)

126

G.Jaquenod 2002, All Rights Reserved.

Copyright Guillermo Jaquenod, 2002

21

VHDL: Lenguaje de
descripcin de hardware

Hot Lab Support Initiative

XII Asamblea General del ISTEC, UTP, Panam, Noviembre de 2002

Asignaciones a arreglos
Hot Lab Support Initiative

Hot Lab Support Initiative

Si se est trabajando con vectores de muchos bits, o de largo parametrizable, puede


asignarse un mismo valor a todos los elementos de un vector usando (others => <valor>)
a <= (OTHERS => 1);

vector_a <= 10011;

De igual modo, luego de haber definido el valor de ciertos elementos de un vector, puede
usarse others para completar los restantes:

Y al aplicarles operadores lgicos se logran operaciones bit a bit:


BITWISE
BITWISEAND
AND

b <= O765;
d <= 381;

-- Octal
-- Decimal

En VHDL87, si se desea usar strings de bit para inicializar objetos que no son
BIT_VECTOR (ej: STD_LOGIC) deben invocarse funciones de conversin:
a <= to_stdlogicvector (XF3);

Cuidado! Una cosa es B011 (bit_string) y otra 011 (string de std_logic)

Un array puede ser multidimensional, tal como:

44Columnas
Columnas

TYPE word_2d IS ARRAY (0 TO 3, 2 DOWNTO 0) OF INTEGER;


33Filas
Filas

Hot Lab Support Initiative

ig
ht
G.
Ja

En un array 2D los datos son almacenados fila por fila. Como en C, el


primer ndice es el que cambia ms lento.
La inicializacin de un array se hace como un vector unidimensional
de objetos (un aggregate), donde estos son a su vez vectores
(tambin aggregates) de menor dimensionalidad.

CONSTANT dat2d:word_2d := ((7,4,5),(1,2,3),(2,2,2),(8,8,9));

130

Concatenado de arrays y
subarrays

Co
py
r

Hot Lab Support Initiative

Para sumar dos vectores de 8 bits y no perder el Carry de salida:

La
Lasuma
suma

ENTITY sumador IS PORT (cin : IN STD_LOGIC;


requiere
requiere99
bits!
a,b : IN STD_LOGIC_VECTOR (7 DOWNTO 0);
bits!
sumout: OUT STD_LOGIC_VECTOR (7 DOWNTO 0);
cout: OUT STD_LOGIC);
END ENTITY sumador;
Como
Comoaaes
esde
de88
ARCHITECTURE uso_concat OF sumador IS
bits,
bits,con
con
('0'&a)
('0'&a)lo
lo
SIGNAL sumtmp : STD_LOGIC_VECTOR (8 DOWNTO 0);
fuerzo
a
9
bits
fuerzo a 9 bits
BEGIN
sumtmp <= ('0'&a)+ b + cin;
AAsuma
sumout <= sumtmp (7 DOWNTO 0);
sumase
segenera
generacon
consolo
solo88
de
delos
los99bits
bitsde
desumtmp,
sumtmp,yy
cout <= sumtmp(8);
cout
con
un
bit
aislado
cout
con
un
bit
aislado
END ARCHITECTURE uso_concat;

G.Jaquenod 2002, All Rights Reserved.

Fuente: BAKER

dos vectores BIT_VECTOR


dos vectores STD_LOGIC_VECTOR
un vector BIT_VECTOR y un objeto tipo BIT
un vector STD_LOGIC_VECTOR y un objeto tipo STD_LOGIC
dos objetos tipo BIT
dos objetos tipo STD_LOGIC

G.Jaquenod 2002, All Rights Reserved.

Ejemplo con un poco de todo


Hot Lab Support Initiative
LIBRARY ieee; USE ieee.std_logic_1164.ALL;
Parmetros!
Parmetros!
USE ieee.std_logic_unsigned.ALL;
ENTITY sum_acum IS GENERIC(ancho: INTEGER := 8);
PORT (reloj,nreset,cin : IN STD_LOGIC;
a: IN STD_LOGIC_VECTOR (ancho-1 DOWNTO 0);
sumout: OUT STD_LOGIC_VECTOR (ancho-1 DOWNTO 0);
cout: OUT STD_LOGIC);
END ENTITY sum_acum;
ARCHITECTURE concat OF sum_acum IS
Others!
SIGNAL sumtmp : STD_LOGIC_VECTOR (ancho DOWNTO 0);
Others!
BEGIN PROCESS (reloj,nreset) BEGIN
IF nreset='0' THEN sumtmp <= (others => '0');
Concatenado
Concatenado
ELSIF rising_edge (reloj) THEN
sumtmp <= cin + sumtmp(ancho-1 DOWNTO 0) + ('0'&a);
END IF;
Overload
Overloadde
de(+)
(+)
END PROCESS;

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.ALL;

131

Dos arrays, o un array y un elemento aislado del mismo tipo que los elementos
del array pueden ser concatenados usando el operador & (en cuyo caso el
objeto al que se asigna el resultado debe tener el largo correcto!).
Es posible agregar un carcter a un objeto tipo STRING o unir dos STRINGs
De igual modo, es posible concatenar:

Existen limitaciones al concatenado de dos objetos tipo STD_LOGIC/BIT, por


cuanto el rango (creciente o decreciente) del vector formado es ambiguo. Por
ejemplo, dados tres objetos a,b,c de tipo STD_LOGIC:
s <= '1' WHEN a&b&c = "110" ELSE '0';
El programa Synplify da Error: Expression has ambiguous type

TYPE STRING IS ARRAY (POSITIVE RANGE <>) OF CHARACTER;


G.Jaquenod 2002, All Rights Reserved.

Concatenado de arreglos
El operador &

El tipo STRING es un array de caracteres predefinido como:

129

AGGREGATE
AGGREGATE

G.Jaquenod 2002, All Rights Reserved.

128

Arreglos multidimensionales
El tipo STRING

);

TYPE nibble IS ARRAY (0 TO 3) OF BIT;


.....
El
Elvalor
valorde
detodo
todoel
elarray
arraybbes
es
VARIABLE a,b : nibble;
copiado
copiadoen
entodo
todoel
elarray
arrayaa
....
a := b;

incluir
incluirstd_logic_unsigned
std_logic_unsigned
yystd_logic_1164)
std_logic_1164)

G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

a <= (1 => b(3), 6 => d(5), OTHERS => f(0)

Asi como a elementos de un array pueden serle asignados elementos de otro array, los
valores de todo un array pueden ser asignados a otro array de igual dimensin en una
nica asignacin:

qu
en
od

a <= B11010; -- Binario


c <= X1F2D; -- Hexadecimal

a <= (1 =>1, 3 => 1, OTHERS => 0);

Donde estas asignaciones no necesariamente deben ser constantes:

20

a <= 0110; b <= 1101; c <= a AND b;

En VHDL93 existen strings de bit predefinidos que pueden ser usados para
asignar valores a objetos tipo bit_vector:

127

02

Las asignaciones a un vector unidimensional (vector_a:std_logic_vector) pueden


realizarse a travs de la indicacin de todo sus elementos como un string:

Asignaciones a arreglos:
uso de aggregates

sumout <= sumtmp (ancho-1 DOWNTO 0);


cout <= sumtmp(ancho);
Elemento
Elementode
deun
unarray
array
END ARCHITECTURE concat;
132

SubArray
SubArray

G.Jaquenod 2002, All Rights Reserved.

Copyright Guillermo Jaquenod, 2002

22

VHDL: Lenguaje de
descripcin de hardware

Hot Lab Support Initiative

XII Asamblea General del ISTEC, UTP, Panam, Noviembre de 2002

Ports tipo array, de rango


indefinido

Hot Lab Support Initiative

Hot Lab Support Initiative

TYPE direcciones IS INTEGER RANGE 0 TO 63;


TYPE octeto IS INTEGER RANGE 255 DOWNTO 0;
TYPE ramblock IS ARRAY (direcciones) OF octeto;

De igual modo se pueden definir entidades con ports de rango indefinido, cuyo
rango se define al instanciarlas como componentes de una jerarquia superior

G.Jaquenod 2002, All Rights Reserved.

Las instrucciones de SHIFT

SRL
Shifts lgicos
ROL

xRIGHT

20

Una sentencia GENERATE provee un mecanismo para la elaboracin


condicional o iterativa de una porcin de una descripcin. Puede ser
usada de dos modos distintos:
Iterativa

FALSE
0

SLA

SRA

Shifts aritmticos
ROR

Rotaciones

135

G.Jaquenod 2002, All Rights Reserved.

136

Ejemplo de GENERATE:
sumador

Co
py
r

Hot Lab Support Initiative

ENTITY sumgen IS PORT(


a,b: IN BIT_VECTOR(4 downto 1);
cout: OUT BIT; sum: OUT BIT_VECTOR(4 downto 1));
END sumgen;
ARCHITECTURE usogenerate OF sumgen IS
SIGNAL c: BIT_VECTOR (5 downto 1);
BEGIN
c(1) <= 0;
adders: FOR i IN 1 to 4 GENERATE
sum(i) <= a(i) XOR b(i) XOR c(i);
c(i+1) <= (a(i) AND b(i))
OR (a(i) AND c(i))
OR (b(i) AND c(i));
END GENERATE;
cout <= c(5);
END usogenerate;

137

Fuente: ASHENDEN

La sentencia GENERATE

ig
ht
G.
Ja

FALSE
0

G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

VHDL93 define 6 operandos de shift, llamados SLL, SRL, SLA, SRA, ROL, ROR, donde
el operando izquierdo debe ser un array de BIT o BOOLEAN, y el derecho un INTEGER
que indica la cantidad de desplazamientos a realizar. Notese que los desplazamientos se
refieren a izquierda o derecha y no al valor del ndce de rango, por lo que no importa si el
elemento a desplazar es de rango (xx TO yy) o (xx DOWNTO yy)

SLL

cs
oe
wr

64 x 8
ARCHITECTURE ejemplo OF miram IS BEGIN
8
8
memoria: PROCESS IS
VARIABLE esta_ram : ramblock;
Inicializacion
Inicializacion
BEGIN
FOR i IN direcciones LOOP esta_ram(i) := 0; END LOOP;
LOOP
WAIT ON cs,oe,wr,dir,d_ent;
IF (cs AND wr)='1' THEN esta_ram(dir) := d_ent; END IF;
IF (cs AND oe)='1' THEN d_sal <= esta_ram(dir);
Loop
Loopeterno
eterno
ELSE d_sal <= 0; END IF;
END LOOP;
END PROCESS memoria;
Si d_sal fuera STD_LOGIC_VECTOR ac
asignara (OTHERS => Z)
END ARCHITECTURE ejemplo ;

134

Hot Lab Support Initiative

xLEFT

ENTITY miram IS PORT (cs,oe,wr: IN BIT; dir: IN direcciones;


d_ent: IN octeto; d_sal: OUT octeto);
END ENTITY miram;
6
RAM

qu
en
od

133

En
Enalgn
algnpackage
package
defino
definolos
lostipos
tiposyyen
en
base
baseaaellos
ellosel
elarray
array

02

En STANDARD.VHD el tipo BIT_VECTOR est definido como type


BIT_VECTOR is array (NATURAL range <>) of BIT;, sin rango definido.

ENTITY or_gate IS PORT (


Slo
Slose
sedice
diceque
queentra
entraes
es
BIT_VECTOR,
entra: IN BIT_VECTOR;
BIT_VECTOR,sin
sinindicar
indicarsu
surango!
rango!
sale: OUT BIT);
END ENTITY or_gate;
ARCHITECTURE usoloop OF or_gate IS BEGIN
or_loop: PROCESS (entra) IS
Al
Alusar
usarRANGE
RANGEes
esinnecesario
innecesario
VARIABLE tempo: BIT;
conocer
conocerel
eltamao
tamaode
deentra
entra
BEGIN
tempo := 0;
FOR i IN entraRANGE LOOP tempo := tempo OR entra(i);
END LOOP;
sale <= tempo;
END PROCESS or_loop;
END ARCHITECTURE usoloop;

Uso de Arrays:
modelo de una RAM 64x8

G.Jaquenod 2002, All Rights Reserved.

Fuente: DUECK

138

label: FOR <ndice> IN <rango> GENERATE


[declaraciones...; BEGIN]
sentencia; ..; sentencia;
END GENERATE;

Condicional
label: IF <expresin booleana> GENERATE
[declaraciones...; BEGIN]
sentencia; ..; sentencia;
END GENERATE;

Atencin:
Atencin:IF
IF
GENERATE
GENERATEno
notiene
tiene
ELSE
ELSEGENERATE
GENERATE
como
comoel
elAHDL!
AHDL!

G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

Diferencias entre
FOR..GENERATE y LOOP

LOOP es una sentencia secuencial, vlida slo dentro de


procesos. A los fines de sntesis, LOOP slo sirve para
describir algortmicamente una secuencia de
operaciones, que luego son minimizadas por el
compilador al ser trasladadas a hardware. Al slo poder
ser usada dentro de un proceso, no es posible instanciar
componentes usando una sentencia LOOP

FOR..GENERATE es un modo eficiente de especificar


mltiples sentencias concurrentes, en nmero
parametrizable, incluyendo sentencias de instanciacin
de componentes, con sus correspondientes PORT MAP y
GENERIC MAP.

G.Jaquenod 2002, All Rights Reserved.

Copyright Guillermo Jaquenod, 2002

23

VHDL: Lenguaje de
descripcin de hardware

Hot Lab Support Initiative

XII Asamblea General del ISTEC, UTP, Panam, Noviembre de 2002


Ejemplo: test de salidas
usando ASSERT

ASSERT y REPORT
Hot Lab Support Initiative

Hot Lab Support Initiative

Las sentencias ASSERT/REPORT son de utilidad para el


chequeo de errores y el debug. Su sintaxis es:

02

chk_tsu:PROCESS (reloj) BEGIN


IF relojEVENT AND reloj=1 THEN

ac se activa chk_thold

ASSERT (datoSTABLE(t_setup))

[ASSERT <condicin booleana>] REPORT <mensaje>


SEVERITY <nivel de gravedad>;

REPORT violacion de tiempo de setup

dato

SEVERITY ERROR;
END IF;

Donde los posibles niveles de gravedad son definidos por


enumeracin en el package STANDARD, de la forma:

reloj

relojd

chk_thold:PROCESS (relojd) BEGIN

139

G.Jaquenod 2002, All Rights Reserved.

La sentencia NULL

Es como la sentencia
vaca (;) del C

141

SEVERITY ERROR;

ARCHITECTURE
ARCHITECTURE nullex
nullex OF
OF uso_NULL
uso_NULL IS
IS
BEGIN
BEGIN
ejemplo:
ejemplo: PROCESS
PROCESS (a)
(a) BEGIN
BEGIN
s1
s1 <=
<= 0;
0;
s2
s2 <=
<= 0;
0;
s3
s3 <=
<= 0;
0;
Qu circuito se
CASE
CASE (a)
(a) IS
IS
generar ac?
Se inferir un
WHEN
B00
WHEN B00 =>
=>
LATCH?
s1
s1 <=
<= 1;
1;
WHEN
WHEN B01
B01 =>
=>
s2
s2 <=
<= 1;
1;
s3
s3 <=
<= 1;
1;
WHEN
WHEN OTHERS
OTHERS =>
=> NULL;
NULL;
END
CASE;
END CASE;
END
END PROCESS
PROCESS ejemplo;
ejemplo;
END
END ARCHITECTURE
ARCHITECTURE nullex;
nullex;

142

Co
py
r

Subprogramas
funciones y procedimientos

G.Jaquenod 2002, All Rights Reserved.

G.Jaquenod 2002, All Rights Reserved.

Subprogramas: las funciones


Hot Lab Support Initiative

FUNCTION <nombre de funcin> (<parmetros de entrada>)


RETURN <tipo de datos> IS

Un PROCEDURE puede llamar a otro PROCEDURE o a una FUNCTION. Una


FUNCTION slo puede llamar otra FUNCTION.

143

Subprogramas: Funciones y procedimientos


Overload de Operadores

Su formato es:

PROCEDIMIENTOS: usados para descomponer grandes bloques de


comportamiento, y su ejecucion puede extenderse en el tiempo incluyendo sentencias
tipo WAIT

{declaraciones locales: tipos,constantes,variables,..}


BEGIN
{functionalidad}

PARAMETERS
RETURN VALUE

Otras estructuras y sentencias:

todas los objetos locales son voltiles, por lo que el resultado de la evaluacin debe
devolverse al programa que la invoca mediante una o ms RETURN.

FUNCIONES: usadas para el computo de un unico valor, deben ser resueltas en el


mismo ciclo de simulacion en que son llamadas; por ello no aceptan sentencias WAIT

ARCHITECTURE
begin
...
end

Bases de VHDL

los parmetros de llamada (o invocacion) pueden ser tanto de tipo variable como
signal, y son siempre modo IN (no es posible a una funcion modificar un parmetro)

VHDL ofrece dos tipos de subprogramas:

PARAMETERS

G.Jaquenod 2002, All Rights Reserved.

Usadas para tareas tales como conversin de tipo o resolucin de


conflictos (P.Ej: doble asignacin a una misma seal)

Son declarados en la seccin ARCHITECTURE de una entidad (previo


al BEGIN), o en un PACKAGE (prototipo) y PACKAGE BODY(cuerpo).

PARAMETERS

ac se activa chk_thold

END IF;
END PROCESS chk_thold;

Los subprogramas permiten implementar algoritmos reutilizables.

PROCEDURE

violacion
de thold

Hot Lab Support Initiative

G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

REPORT violacion de tiempo de hold

ig
ht
G.
Ja

Por ejemplo, para indicar


que una de las
aternativas de un CASE
no debe hacerse nada.

ASSERT (datoSTABLE(t_hold))

140

Hot Lab Support Initiative

En VHDL existe la
sentencia NULL para
indicar que no se hace
nada, y sirve para
realizar una
especificacin ms
completa.

IF relojdEVENT AND relojd=1 THEN

qu
en
od

En tareas de sntesis, ASSERT puede emplearse para chequear que un


determinado objeto tenga un valor adecuado (junto a RANGE..).
En una simulacin, ASSERT puede ser usada para definir TestPoints
que ante una dada condicin generen un mensaje (SEVERITY NOTE) o
aborten la simulacin (SEVERITY ERROR)
REPORT es equivalente a ASSERT FALSE ...

thold

violacion
de tsetup

relojd <= relojDELAYED(t_hold);

TYPE SEVERITY_LEVEL IS (NOTE,WARNING,ERROR FAILURE);

tsetup

20

END PROCESS chk_tsu;

RETURN <variable o sentencia>

FUNCTION

Fuente: ALTERA

END FUNCTION <nombre de funcin>;

144

G.Jaquenod 2002, All Rights Reserved.

Copyright Guillermo Jaquenod, 2002

24

Hot Lab Support Initiative

VHDL: Lenguaje de
descripcin de hardware
XII Asamblea General del ISTEC, UTP, Panam, Noviembre de 2002
Funcin para comparar
strings con dont care

Subprogramas: las funciones


Hot Lab Support Initiative

Hot Lab Support Initiative

Una funcion se dice pura (pure) si al ser llamada con identicos parametros
devuelve igual valor de retorno; sino (P.Ej: NOW) se dice impure.

02

Para comparar dos operandos tipos std_logic_vector, cuyos elementos puedan


ser - (dont care), puedo definir una funcin string_match (a,b):

Ejemplo de funcin pura (una posible version de rising_edge () para


objetos tipo BIT)

LIBRARY ieee; USE ieee.std_logic_1164.all;

package mypack is
FUNCTION string_match (a,b: IN std_logic_vector) RETURN BOOLEAN;
end package mypack;

PURE FUNCTION flancopos (SIGNAL reloj:BIT) RETURN BOOLEAN IS


BEGIN

20

RETURN (reloj = 1 AND relojEVENT);

package body mypack is


FUNCTION string_match (a,b: IN std_logic_vector)RETURN BOOLEAN IS
BEGIN
FOR i IN a'RANGE LOOP
IF (a(i) = -' OR b(i)=-') THEN NEXT;
ELSIF (a(i) /= b(i))
THEN RETURN FALSE;
END IF;
END LOOP;
Ejercicio: agregar test de longitud y
RETURN TRUE;
de sentido de crecimiento del rango
END FUNCTION string_match;
(DOWNTO o TO)
end package body mypack;

END FUNCTION flancopos;

Ejemplo de funcin impura (algo as como stack_allocate () )


IMPURE FUNCTION memuso (pidmem:POSITIVE) RETURN POSITIVE IS
BEGIN -- suponiendo que memo_top es una variable global
compartida (SHARED variable)
END FUNCTION memuso;
145

G.Jaquenod 2002, All Rights Reserved.

146

Subprogramas: los
procedimientos

Hot Lab Support Initiative

Los procedimientos (PROCEDURE) pueden ser usados para descomponer grandes


bloques de comportamiento secuencial
Su ejecucin puede afectar uno o ms objetos dado que sus parmetros pueden ser
tanto de modo IN, INOUT como OUT.
Pueden terminar en su END o con un RETURN

[POSTPONED] PROCEDURE <nombre>(<parametros>) IS


BEGIN
{ funcionalidad }
END PROCEDURE <nombre>;

Si los parmetros son VARIABLE los PROCEDURE slo pueden ser llamados desde
dentro de procesos; si son SIGNAL pueden ser llamados concurrentemente
147

G.Jaquenod 2002, All Rights Reserved.

148

Subprogramas
funciones y procedimientos

Co
py
r

Hot Lab Support Initiative

G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

ig
ht
G.
Ja

Su ejecucion puede extenderse en el tiempo al usar sentencias tipo WAIT, y en este


caso las variables locales conservan su valor durante el tiempo que un
PROCEDURE est en espera
Su sintaxis es

qu
en
od

memo_top := memo_top + pidmem; RETURN memo_top;

Subprogramas: un flipflop como


procedimiento

ARCHITECTURE usoproc OF ejemplo IS


PROCEDURE flipflop (SIGNAL dato,reloj :IN STD_LOGIC;
SIGNAL salida : OUT STD_LOGIC) IS
BEGIN
LOOP
WAIT UNTIL reloj = 1;
Descripcin
Descripcindel
del
salida <= dato;
PROCEDURE
PROCEDUREdentro
dentro
END LOOP;
de
deuna
unaarquitectura
arquitectura
END PROCEDURE flipflop;
BEGIN
Llamadas
Llamadasconcurrentes
concurrentesalal
flipflop (D1,R1,S1);
PROCEDURE
PROCEDUREcon
conPORT
PORTMAP
MAP
flipflop (D2,R2,S2);
P1: PROCESS BEGIN
Llamadas
Llamadassecuenciales
secuenciales
flipflop (D1,R1,S1);
alalPROCEDURE
PROCEDURE con
con
PORT
END PROCESS P1;
PORTMAP
MAP
(dentro
de
(dentro deun
unproceso)
proceso)
...
END ARCHITECTURE usoproc;

G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

Definicin de Subprogramas
en un package

PACKAGE std_logic_1164 IS
...
FUNCTION rising_edge (SIGNAL s:std_ulogic) RETURN BOOLEAN;
FUNCTION falling_edge (SIGNAL s:std_ulogic) RETURN BOOLEAN;
...
END std_logic_1164;

Todas las funciones y procedimientos pueden ser escritos sin especificar el


rango de los parmetros, lo que aumenta su versatilidad
Los subprogramas pueden ser definidos luego de ARCHITECTURE (de
alcance local) o en un PACKAGE (para tener alcance global); en este caso, la
declaracin se describe en la parte declarativa del PACKAGE y la
funcionalidad en el PACKAGE BODY.

PACKAGE BODY std_logic_1164 IS


...
FUNCTION rising_edge (SIGNAL s:std_ulogic) RETURN BOOLEAN IS
BEGIN
RETURN (s'EVENT AND (To_X01(s) = '1') AND
(To_X01(s'LAST_VALUE) = '0'));
END;

Un PROCEDURE puede ser visto en modo similar a una MACRO en muchas


aplicaciones de software. Si no se explicita que sus parmetros son de tipo
SIGNAL, se asume que son VARIABLE.
Dentro de los subprogramas el cdigo VHDL es secuencial (as como lo es en
un PROCESO), por lo no es posible usar dentro de ellos estructuras como
PROCESS, WHEN..ELSE, WITH..SELECT.

Prototipos
Prototipos

Cuerpo
Cuerpo

FUNCTION falling_edge (SIGNAL s:std_ulogic) RETURN BOOLEAN IS


BEGIN
RETURN (s'EVENT AND (To_X01(s) = '0') AND
(To_X01(s'LAST_VALUE) = '1'));
END;
...
END std_logic_1164;

En el caso de las FUNCTIONS, su carcter instantneo no permite el uso de


objetos locales tipo SIGNAL o sentencias WAIT

Fuente: MAXPLUS2\VHDL93\IEEE\STD1164.VHD y STD1164B.VHD


149

G.Jaquenod 2002, All Rights Reserved.

150

G.Jaquenod 2002, All Rights Reserved.

Copyright Guillermo Jaquenod, 2002

25

VHDL: Lenguaje de
descripcin de hardware

Hot Lab Support Initiative

Hot Lab Support Initiative

XII Asamblea General del ISTEC, UTP, Panam, Noviembre de 2002

Subprogramas
parmetros de rango abierto

Overload de Operadores
Hot Lab Support Initiative

Cmo se hace si se desea usar los operadores aritmticos y


booleanos con otros tipos de datos?

(3
(3
(6
(6

DOWNTO
DOWNTO
DOWNTO
DOWNTO

0);
0);
0);
0));

Operator Overloading - redefinicin de funciones Aritmticas y


Booleanas sobre nuevos tipos de objetos.

Descripcin
Descripcinde
delala
FUNCTION
FUNCTION dentro
dentrode
de
una
unaarquitectura
arquitectura

Un operador es reemplazado (overloaded) definiendo una funcin


cuyo smbolo es igual que el del operador a reemplazar.
En la definicin, y dado que el operador a reemplazar y la nueva
funcin tienen idntico nombre, el nombre de la funcin se
encierra entre comillas dobles para diferenciarlo.
Esta definicin se hace usualmente en un package, para que su
alcance sea global

20

ENTITY usoprocs IS PORT (


a1,a2: IN std_logic_vector
amax: OUT std_logic_vector
b1,b2: IN std_logic_vector
bmax: OUT std_logic_vector
END ENTITY usoprocs;

02

LIBRARY ieee; USE ieee.std_logic_1164.ALL;

ARCHITECTURE rangoabierto OF usoprocs IS


FUNCTION max (SIGNAL op1,op2: IN std_logic_vector)
RETURN std_logic_vector IS BEGIN
IF (op1 > op2) THEN RETURN op1; ELSE RETURN op2; END IF;
END max;

151

Cada
Cadallamada
llamadaaamax
maxdevuelve
devuelve
un
unlargo
largodistinto:
distinto:amax
amaxtiene
tiene
largo
largo44yybmax
bmaxlargo
largo77

G.Jaquenod 2002, All Rights Reserved.

152

Uso de Overload de Operadores


Hot Lab Support Initiative

G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.ALL;

Se incluye el
package donde
se describen los
nuevos
operadores

ig
ht
G.
Ja

ENTITY overload IS
PORT ( a
: IN STD_LOGIC_VECTOR (3 DOWNTO 0);
b
: IN STD_LOGIC_VECTOR (3 DOWNTO 0);
sum : OUT STD_LOGIC_VECTOR (3 DOWNTO 0));
END ENTITY overload;
ARCHITECTURE ejemplo OF overload IS
BEGIN
sumador: PROCESS (a, b)
BEGIN
sum <= a + b;
END PROCESS sumador;
END ARCHITECTURE ejemplo;

153

qu
en
od

BEGIN
amax <= max (a1,a2);
bmax <= max (b1,b2);
END ARCHITECTURE rangoabierto;

Se usa el operador sobre los


nuevos tipos

G.Jaquenod 2002, All Rights Reserved.

154

Bases de VHDL

Tipos y Packages aritmticos


Uso eficiente
de operadores aritmticos
G.Jaquenod 2002, All Rights Reserved.

Operaciones y tipos aritmticos

Co
py
r

Hot Lab Support Initiative

Para Operaciones y tipos aritmticos, Altera recomienda el uso de los


siguientes tipos:

Definicin de los nuevos tipos UNSIGNED y SIGNED como array (NATURAL range <>)
of STD_LOGIC
Funciones de Conversin CONV_INTEGER, CONV_UNSIGNED, CONV_SIGNED y
CONV_STD_LOGIC_VECTOR (4 funciones en cada caso) para operandos INTEGER,
STD_ULOGIC, UNSIGNED y SIGNED, con retorno INTEGER, UNSIGNED, SIGNED y
STD_LOGIC_VECTOR respectivamente
Funciones ZERO_EXTEND y SIGN_EXTEND para operandos STD_LOGIC_VECTOR,
con retorno STD_LOGIC_VECTOR
Funciones de Overload:

STD_LOGIC y STD_LOGIC_VECTOR, tal como han sido definidos en el


package estndar IEEE.STD_LOGIC_1164).
BIT y BIT_VECTOR, tal como han sido definidos en la STD library, en el
package STANDARD.
No se recomienda el uso mezclado de tipos en un mismo diseo, porque eso
fuerza al agregado de funciones de conversin, que complican el cdigo y la
comprensin.
De todos modos, para la realizacion de operaciones aritmticas, en la IEEE
library del MAX+plus II se encuentra una copia de los packages:
STD_LOGIC_ARITH.
STD_LOGIC_UNSIGNED.
STD_LOGIC_SIGNED.
Estos packages fueron desarrollados por Synopsis, y en 1995 el IEEE los
integr (con modificaciones) en NUMERIC_STD.

155

G.Jaquenod 2002, All Rights Reserved.

Fuente: ALTERA

Qu incluye std_logic_arith?
Hot Lab Support Initiative

de + y - (24 en cada caso) para operandos UNSIGNED, SIGNED, INTEGER, STD_ULOGIC y


retorno UNSIGNED, SIGNED, y STD_LOGIC_VECTOR
de + unario (4 funciones) para operandos UNSIGNED y SIGNED, con retorno UNSIGNED,
SIGNED, y STD_LOGIC_VECTOR
de - unario y de ABS (2 funciones en cada caso) para operandos SIGNED, con retorno SIGNED, y
STD_LOGIC_VECTOR
de *, <, >, <=, >=, =, y /= (8 funciones en cada caso), para operandos UNSIGNED y SIGNED, con
retorno UNSIGNED, SIGNED, y STD_LOGIC_VECTOR
de SHL y de SHR (2 funciones en cada caso) para operandos UNSIGNED y SIGNED, con retorno
de identico tipo

revisar
revisarc:\MAXPLUS2\VHDL93\IEEE\arith.vhd
c:\MAXPLUS2\VHDL93\IEEE\arith.vhdyyarithb.vhd
arithb.vhd!!!!

156

G.Jaquenod 2002, All Rights Reserved.

Fuente: ALTERA

Copyright Guillermo Jaquenod, 2002

26

VHDL: Lenguaje de
descripcin de hardware

Hot Lab Support Initiative

Qu incluyen std_logic_signed y
std_logic_unsigned?

Tipos SIGNED y UNSIGNED


Hot Lab Support Initiative

Los tipos SIGNED y UNSIGNED estn definidos dentro de la IEEE library,


en el package STD_LOGIC_ARITH como array (NATURAL range <>) of
STD_LOGIC

02

Usan los tipos y funciones definidos en std_logic_arith.all, y agregan nuevas


funciones de Overload para operaciones aritmticas sobre objetos de tipo
STD_LOGIC_VECTOR:
Funciones de Overload de + y de - (5 funciones en cada caso) para operandos
STD_LOGIC_VECTOR, STD_LOGIC, e INTEGER, con retorno
STD_LOGIC_VECTOR

Un tipo UNSIGNED representa un valor numrico que slo puede ser


positivo o cero. En el MAX+plus II se codifica con un nmero binario
puro.

Funciones de Overload de + y unario y de ABS (1 funciones en cada caso) para


operando STD_LOGIC_VECTOR, con retorno STD_LOGIC_VECTOR

Por ejemplo:

Funcion de Overload de * (1 funcion) para operandos STD_LOGIC_VECTOR, con


retorno STD_LOGIC_VECTOR

function CONV_INTEGER (STD_LOGIC_VECTOR) return INTEGER;

Por ejemplo:

G.Jaquenod 2002, All Rights Reserved.

Fuente: ALTERA

Conversin de tipos aritmticos


Hot Lab Support Initiative

158

Ejemplo de conversin aritmtica

Ejemplo: un sumador con entradas UNSIGNED y salida INTEGER


LIBRARY ieee; USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_arith.ALL;

ig
ht
G.
Ja

CONV_INTEGER: convierte un INTEGER, UNSIGNED, SIGNED, o STD_ULOGIC


en un INTEGER.
CONV_UNSIGNED: convierte un INTEGER, UNSIGNED, SIGNED, o STD_ULOGIC
en un UNSIGNED.
CONV_SIGNED: convierte un INTEGER, UNSIGNED, SIGNED, o STD_ULOGIC en
un SIGNED.
CONV_STD_LOGIC_VECTOR: convierte un INTEGER, UNSIGNED, SIGNED, o
STD_LOGIC en un STD_LOGIC_VECTOR.

Para CONV_STD_LOGIC_VECTOR, CONV_UNSIGNED, y CONV_SIGNED,


es necesario adems del dato a convertir el tamao del resultado. MAX+PLUS
II agrega ceros en UNSIGNEDs, y extiende el signo en SIGNEDs
G.Jaquenod 2002, All Rights Reserved.

Fuente: ALTERA

160

STD_LOGIC_ARITH, STD_SIGNED
y STD_UNSIGNED

Co
py
r

Hot Lab Support Initiative

ARCHITECTURE maxpld OF adder IS


BEGIN
result <= CONV_INTEGER (op1 + op2);
END maxpld;

G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

Agregado de bits en una


conversin

function "+ (L: UNSIGNED; R: SIGNED) return STD_LOGIC_VECTOR;


function "+ (L: SIGNED; R: UNSIGNED) return STD_LOGIC_VECTOR;

Y se suman dos operandos, uno SIGNED y otro UNSIGNED:


SIGNAL a,b : STD_LOGIC_VECTOR (4 DOWNTO 0);
caso1 <= CONV_UNSIGNED (a) + CONV_UNSIGNED (b);
caso2 <= CONV_SIGNED (a) + CONV_SIGNED (b);
caso3 <= CONV_UNSIGNED (a) + CONV_SIGNED (b);
caso4 <= CONV_SIGNED (a) + CONV_UNSIGNED (b);

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_arith.ALL;

largo=5
largo=5bits
bits

largo=6
largo=6bits
bits

Tanto caso1 como caso2 sern STD_LOGIC_VECTOR (4 DOWNTO 0),


pero caso3 y caso4 sern STD_LOGIC_VECTOR (5 DOWNTO 0), porque
para poder resolver estos casos (SIGNED mezclado con UNSIGNED) no hay
otra solucin que realizar la suma en modo SIGNED, y por ello extender
ambos operandos en 1 bit.

ARCHITECTURE mixta OF ejemplo IS


ss <= CONV_UNSIGNED(a) + CONV_UNSIGNED(b) ; -- sin signo
cs <= CONV_SIGNED(a) + CONV_SIGNED(b) ;
-- con signo
END ARCHITECTURE mixta;

G.Jaquenod 2002, All Rights Reserved.

ENTITY adder IS PORT (


op1,op2:IN unsigned(7 DOWNTO 0); result:OUT INTEGER);
END adder;

Es importante tener qu sucede cuando una operacin aritmtica devuelve


un objeto tipo STD_LOGIC_VECTOR.Por ejemplo si se consideran los
casos de overload de suma siguientes (tomados de std_logic_arith)

La IEEE library tiene dos packages adicionales para facilitar operaciones


aritmticas sobre objetos tipo STD_LOGIC_VECTOR: los packages
STD_LOGIC_UNSIGNED y STD_LOGIC_SIGNED.
Segn cul de estos packages haya sido includo los objetos sern
convertidos a valores sin o con signo
Si se requiere de ambos tipos de objetos deben usarse funciones
declaradas en el package STD_LOGIC_ARITH que realizan la conversin

161

G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

En el package STD_LOGIC_1164 se incluyen funciones para convertir valores


de los tipos BIT y BIT_VECTOR a STD_LOGIC y STD_LOGIC_VECTOR.
En el package STD_LOGIC_ARITH se agregan funciones para convertir
valores a los tipos SIGNED, UNSIGNED e INTEGER. De cada funcin hay
cuatro versiones, seleccionadas segn el tipo de sus operandos

159

SIGNED'("1010") representa -6

qu
en
od

157

UNSIGNED'(1010") representa +10

Un tipo SIGNED representa un valor numrico que puede ser positivo,


cero o negativo. En el MAX+PLUS II se codifica en complemento a dos,
donde el MSB est asociado al signo

Funciones de Overload de <, >, <=, >=, =, /=, (2 funciones en cada caso) para
operandos STD_LOGIC_VECTOR e INTEGER, con retorno BOOLEAN

revisar
revisarc:\MAXPLUS2\VHDL93\IEEE\signed.vhd
c:\MAXPLUS2\VHDL93\IEEE\signed.vhdyysignedb.vhd,
signedb.vhd,
as
ascomo
comounsigned.vhd
unsigned.vhdyyunsignb.vhd
unsignb.vhd!!!!

20

Hot Lab Support Initiative

XII Asamblea General del ISTEC, UTP, Panam, Noviembre de 2002

162

G.Jaquenod 2002, All Rights Reserved.

Fuente: SJOHOLM

Copyright Guillermo Jaquenod, 2002

27

VHDL: Lenguaje de
descripcin de hardware

Hot Lab Support Initiative

XII Asamblea General del ISTEC, UTP, Panam, Noviembre de 2002

Conversiones
STD <=> std_logic

Hot Lab Support Initiative

Hot Lab Support Initiative

Funciones de conversin definidas en "ieee.std_logic_1164")

Los operadores estn definidos slo para ciertos tipos de operandos


(por ejemplo, la suma est definida para tipos numricos)

02

Para pasar de BIT a STD_LOGIC


To_StdULogic (bit) RETURN std_ulogic

Si se desea ampliar el significado del operador para otros tipos se debe


definir una funcin + para esos tipos:

Para pasar de STD_LOGIC a BIT


To_bit (std_ulogic) RETURN bit;
Para pasar de BIT_VECTOR a STD_LOGIC_VECTOR
To_StdLogicVector (bit_vector) RETURN std_logic_vector
To_StdULogicVector (bit_vector) RETURN std_ulogic_vector

20

function "+ (L: std_logic_vector; R: std_logic_vector)


return std_logic_vector is
constant length: INTEGER := MAXIMUM (L'length, R'length);
variable result : INTEGER;
begin
result := CONV_INTEGER(L) + CONV_INTEGER(R);
return
CONV_STD_LOGIC_VECTOR (result,length);
end;

Para pasar entre STD_ULOGIC_VECTOR y STD_LOGIC_VECTOR


To_StdLogicVector(std_ulogic_vector) RETURN std_logic_vector
To_StdULogicVector (std_logic_vector) RETURN std_ulogic_vector
Desde bit, std_ulogic, o std_logic a X01: To_X01(v)
Desde bit, std_ulogic, o std_logic a X01Z: To_X01Z(v)
Desde bit, std_ulogic, o std_logic a UX01: To_UX01(v)
G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

164

Uso eficiente de operadores


aritmticos

Los operadores aritmticos de suma y resta (+) y (-) permiten un alto nivel de
abstraccin en funciones aritmticas, pues el diseador slo describe qu es
lo que desea (behavior) y el compilador resuelve cmo hacerlo (estructura)

b
COMPILADOR

sum

Hot Lab Support Initiative

165

Sin bien el nivel de abstraccin mayor libera al diseador de pensar en


detalles de arquitectura, ste no debe perder la idea que cada vez que pone
un operador + o - est instanciando un sumador en silicio, y que el grado de
optimizacin o minimizacin depende fuertemente del estilo en que se
describa el diseo.
Y no engaarse: para el mismo programa fuente en VHD, distintas
herramientas EDA ofrecen muy diferentes niveles de optimizacin
G.Jaquenod 2002, All Rights Reserved.

166

Uso eficiente de operadores


aritmticos

Co
py
r

Hot Lab Support Initiative

Uso eficiente de operadores


aritmticos

LIBRARY
LIBRARY ieee;
ieee;
USE
USE ieee.std_logic_1164.ALL;
ieee.std_logic_1164.ALL;
USE
USE ieee.std_logic_arith.ALL;
ieee.std_logic_arith.ALL;

ig
ht
G.
Ja

sum <= a + b;

Usa
Usaaasu
suvez
veztres
tresfunciones:
funciones:
CONV_INTEGER
CONV_INTEGER(std_logic_vector)
(std_logic_vector)RETURN
RETURN(integer)
(integer)para
parapasar
pasarde
de
STD_LOGIC_VECTOR
STD_LOGIC_VECTORaaUNSIGNED.
UNSIGNED.Definida
Definidaen
enSTD_LOGIC_ARITH
STD_LOGIC_ARITH
CONV_STD_LOGIC_VECTOR
CONV_STD_LOGIC_VECTOR(integer,integer)
(integer,integer)RETURN
RETURN(std_logic_vector)
(std_logic_vector)
para
paralalafuncion
funcionopuesta.
opuesta.Definida
Definidaen
enSTD_LOGIC_ARITH
STD_LOGIC_ARITH
MAXIMUM
MAXIMUM(integer,integer)
(integer,integer)RETURN
RETURN(integer).
(integer).Definida
Definidapor
poreleldiseador
diseador
G.Jaquenod 2002, All Rights Reserved.

qu
en
od

Para pasar de STD_LOGIC_VECTOR a BIT_VECTOR


To_bitvector(std_logic_vector) RETURN bit_vector
To_bitvector(std_ulogic_vector) RETURN bit_vector

163

Ejemplo de Overload
de un operador aritmtico

ENTITY
ENTITY add_ex1
add_ex1 IS
IS
PORT(a,b:IN
PORT(a,b:IN std_logic_vector(15
std_logic_vector(15 DOWNTO
DOWNTO 0);
0);
c,d:IN
c,d:IN std_logic_vector(15
std_logic_vector(15 DOWNTO
DOWNTO 0);
0);
input:IN
input:IN std_logic;
std_logic;
sum:OUT
std_logic_vector(15
DOWNTO
sum:OUT std_logic_vector(15 DOWNTO 0));
0));
END
END ENTITY
ENTITY add_ex1;
add_ex1;

ARCHITECTURE
ARCHITECTURE behavior
behavior OF
OF add_ex1
add_ex1 IS
IS
BEGIN
BEGIN
PROCESS(a,b,c,d,input)
PROCESS(a,b,c,d,input)
BEGIN
BEGIN
IF
IF input='0'
input='0' THEN
THEN sum
sum <=
<= aa ++ b;
b;
ELSE
sum
ELSE
sum <=
<= cc ++ d;
d;
END
IF;
END IF;
END
END PROCESS;
PROCESS;
END
END ARCHITECTURE
ARCHITECTURE behavior;
behavior;

a
b

c
d

MUX

sum

input

22 sumadores
sumadores
++
11 multiplexer:
multiplexer:
48
48LEs
LEs
22bloques
bloquesde
de16
16LEs
LEsc/u
c/u
usando
usandocadenas
cadenasde
deCarry
Carry

G.Jaquenod 2002, All Rights Reserved.

Fuente: ALTERA

Hot Lab Support Initiative

LIBRARY ieee; USE ieee.std_logic_1164.ALL;


USE ieee.std_logic_arith.ALL;

ENTITY add_ex1 IS
PORT(a,b,c,d:IN std_logic_vector(15 DOWNTO 0);
input:IN std_logic;
sum:OUT std_logic_vector(15 DOWNTO 0));
END ENTITY add_ex1;

ARCHITECTURE behavior OF add_ex1 IS


SIGNAL a_in1,a_in2: std_logic_vector(15 DOWNTO 0);
BEGIN PROCESS(a,b,c,d,input)
BEGIN
IF input = '0' THEN a_in1 <= a; a_in2 <= b;
ELSE
a_in1 <= c; a_in2 <= d;
END IF;
END PROCESS;
sum <= a_in1 + a_in2;
END ARCHITECTURE behavior;

167

G.Jaquenod 2002, All Rights Reserved.

a
c

b
d

sum

Bases de VHDL

input

Diseo de
mquinas de estado

11 sumador
sumador
++
22 multiplexer:
multiplexer:
tambin
tambin48
48LEs,
LEs,pero
pero
slo
slo11bloque
bloquede
de16
16LEs
LEs
usa
usacadenas
cadenasde
deCarry
Carry

Fuente: ALTERA

168

G.Jaquenod 2002, All Rights Reserved.

Copyright Guillermo Jaquenod, 2002

28

VHDL: Lenguaje de
descripcin de hardware

Hot Lab Support Initiative


Diseo de mquinas de
estado con VHDL

Hot Lab Support Initiative

Ejemplos: FSMs
Hot Lab Support Initiative

Las mquinas de estado finito (FSM) son herramientas FUNDAMENTALES


de cualquier diseo digital moderno.
Para su diseo conviene seguir ciertas reglas generales:
Definir los estados usando un nuevo tipo, creado por enumeracin:

ENTITY state_machine IS PORT(clk, input, reset: IN std_logic;


output: OUT std_logic);
END state_machine;

02

XII Asamblea General del ISTEC, UTP, Panam, Noviembre de 2002

ARCHITECTURE a OF state_machine IS
TYPE STATE_TYPE IS (s0,s1); SIGNAL state: STATE_TYPE;
BEGIN
PROCESS (clk,reset) BEGIN
IF reset = '1' THEN state <= s0;
s0/0
ELSIF (clk'EVENT AND clk = '1') THEN
CASE state IS
dont
WHEN s0=> state <= s1;
1
care
WHEN s1=> IF input='1' THEN state <= s0;
ELSE state <= s1; END IF;
END CASE;
s1/1
END IF;
END PROCESS;
output <= '1' WHEN state = s1 ELSE '0';
0
END a;

TYPE tipo_de_estado IS (idle, tap1, tap2, tap3, tap4 );

20

Definir dos objetos que almacenan los estado actual y futuro como
seales de ese tipo predefinido:
SIGNAL filter : tipo_de_estado;

Para definir el comportamiento de las salidas:


Usar asignaciones Conditional y/o Selected
O un segundo CASE (P.Ej: para mquinas de MOORE)
169

G.Jaquenod 2002, All Rights Reserved.

ENTITY semaforo IS PORT(clk,fotocelda:IN BIT; rojo,amarillo,verde:OUT BIT);


END ENTITY semaforo;
defino un nuevo tipo de variable,
por enumeracin!
ARCHITECTURE a OF semaforo IS

171

G.Jaquenod 2002, All Rights Reserved.

172

Definir el valor de los estados


con enum_encoding

ENTITY semaforo IS PORT(clk,fotocelda:IN BIT; rojo,amarillo,verde:OUT BIT);


END ENTITY semaforo;

G.Jaquenod 2002, All Rights Reserved.

Fuente: ALTERA

ARCHITECTURE state_machine OF rns IS


TYPE state_type IS (s0,s1,s2,s3,s4); SIGNAL current_state : state_type
BEGIN
PROCESS(clk)
MAX+plusII
VARIABLE next_state : state_type;
MAX+plusIIno
noreconoce
reconoceeste
este
BEGIN
estilo
estilode
dedescripcin
descripcincomo
comoel
el
IF clk'EVENT AND clk = '1' THEN
de
una
mquina
de
estados
de
una
mquina
de
estados
CASE current_state IS
WHEN s0 => next_state := s1;
WHEN s1 => next_state := s3; IF data='0' THEN next_state := s2; END IF;
WHEN s2 => next_state := s3; IF data='0' THEN next_state := s2; END IF;
WHEN s3 => next_state := s4;
IF data='0' AND sm_input = '0 THEN next_state := s0; END IF;
WHEN s4 => next_state := s2;
IF data='0' AND sm_input = '1 THEN next_state := s1;
ELSIF data='0' AND sm_input='0 THEN next_state := s3; END IF;
END CASE;
current_state <= next_state;
END IF;
-- otras sentencias para el calculo de las salidas registradas f(next_state)
END PROCESS;
-- otras sentencias para el calculo de las salidas combinatorias f(current_state)
END ARCHITECTURE state_machine;

G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

Fuente: ALTERA

Definir el valor de los estados


con enum_encoding

LIBRARY ieee; USE ieee.std_logic_1164.ALL;


ENTITY enumfsm IS PORT (ud,clk: IN STD_LOGIC; lsb, msb: OUT STD_LOGIC);
END enumfsm;

ARCHITECTURE a OF semaforo IS
TYPE modo_semaforo IS (stop, prepare, pase, alerta, nocturno);
ATTRIBUTE ENUM_ENCODING : STRING;
SIGNAL estado : modo_semaforo;
ATTRIBUTE ENUM_ENCODING OF modo_semaforo:TYPE IS 100 110 001 010 000";
BEGIN
PROCESS (clk) BEGIN
ATENCIN:
ATENCIN:
IF clk'EVENT AND clk = '1' THEN
ENUM_ENCODING
ENUM_ENCODING
CASE estado IS WHEN stop
=> estado <= prepare;
es
esun
unatributo
atributoslo
slo
WHEN prepare => estado <= pase;
interpretado
WHEN pase
=> estado <= alerta;
interpretadopor
porelel
WHEN alerta
=>
MAX+plus
IIIIVHDL!!
MAX+plus
VHDL!!
IF fotocelda ='1' THEN estado<=stop;
Cada
Cadaherramienta
herramienta
ELSE estado<=nocturno;
EDA
END IF;
EDAsuele
sueledefinir
definir
WHEN nocturno => estado <= alerta;
atributos
atributospropios
propios
END CASE;
para
controlar
elel
para
controlar
END IF;
proceso
procesode
desntesis!!
sntesis!!
END PROCESS;
WITH estado SELECT (rojo,amarillo,verde) <=
('1','0','0') WHEN stop,('1','1','0') WHEN prepare,('0','0','1') WHEN pase,
('0','1','0') WHEN alerta,('0','0','0') WHEN nocturno;
END ARCHITECTURE a;

173

Otra forma usando una variable


registrada next_state

ENTITY rns IS PORT (clk,data,sm_input: IN std_logic; flag:OUT std_logic);


END ENTITY rns;

Co
py
r

Hot Lab Support Initiative

Hot Lab Support Initiative

ig
ht
G.
Ja

TYPE modo_semaforo IS (stop, prepare, pase, alerta, nocturno);


SIGNAL estado : modo_semaforo;
defino la tabla de
BEGIN
transicin de estados
PROCESS (clk) BEGIN
IF clk'EVENT AND clk = '1' THEN
CASE estado IS WHEN stop
=> estado <= prepare;
WHEN prepare => estado <= pase;
WHEN pase
=> estado <= alerta;
WHEN alerta =>
IF fotocelda ='1' THEN estado<=stop;
ELSE estado<=nocturno;
END IF;
WHEN nocturno => estado <= alerta;
END CASE;
END IF;
END PROCESS;
WITH estado SELECT (rojo,amarillo,verde) <=
('1','0','0') WHEN stop,('1','1','0') WHEN prepare,
('0','0','1') WHEN pase,('0','1','0') WHEN alerta,
('0','0','0') WHEN nocturno;
defino el comportamiento
END ARCHITECTURE a;
de las salidas

Fuente: ALTERA
MAX+plus II HELP

G.Jaquenod 2002, All Rights Reserved.

170

Diseo de FSMs con


VHDL usando seales

Hot Lab Support Initiative

qu
en
od

Crear la tabla de transicin de estados activada por el clock:


Usando un CASE activado por el estado actual, y dentro de l un IFTHEN que define el estado futuro en funcin de las entradas

ARCHITECTURE a OF enumfsm IS
TYPE count_state is (cero, uno, dos, tres); SIGNAL present, next: count_state;
ATTRIBUTE ENUM_ENCODING: STRING;
ATTRIBUTE ENUM_ENCODING OF count_state : TYPE IS "11 01 10 00";
BEGIN
Slo vale para MAX+plus II VHDL!!
PROCESS (present, ud) BEGIN
CASE present IS
WHEN cero => IF (ud='0') THEN next <= uno;
ELSE next <= tres;
WHEN uno => IF (ud='0') THEN next <= dos;
ELSE next <= cero;
WHEN dos=>
IF (ud='0') THEN next <= tres;
ELSE next <= uno;
WHEN tres => IF (ud='0') THEN next <= cero;
ELSE next <= dos;
END CASE;
END PROCESS;
PROCESS BEGIN WAIT UNTIL clk = '1'; present <=
END a;
174

G.Jaquenod 2002, All Rights Reserved.

lsb
lsb
lsb
lsb
lsb
lsb
lsb
lsb

<=
<=
<=
<=
<=
<=
<=
<=

'0';
'1';
'1';
'0';
'0';
'1';
'1';
'0';

msb
msb
msb
msb
msb
msb
msb
msb

<=
<=
<=
<=
<=
<=
<=
<=

'0';
'1';
'0';
'0';
'1';
'0';
'1';
'1';

END IF;
END IF;
END IF;
END IF;

next; END PROCESS;


Fuente: ALTERA
MAX+plus II HELP

Copyright Guillermo Jaquenod, 2002

29

VHDL: Lenguaje de
descripcin de hardware

Hot Lab Support Initiative

XII Asamblea General del ISTEC, UTP, Panam, Noviembre de 2002


Diseo Jerrquico FLAT

Hot Lab Support Initiative

Hot Lab Support Initiative

Nivel superior (Estructural)


......

G.Jaquenod 2002, All Rights Reserved.

176

Diseo Jerrquico TOP-DOWN


Hot Lab Support Initiative

Nivel TOP(Estructural)

Nivel 1

177

Nivel 2

Nivel 3

Nivel 3

Nivel 2

Nivel 3

G.Jaquenod 2002, All Rights Reserved.

Nivel 3

Nivel 3

Nivel 3

Nivel 3

Fuente: ALTERA

178

Las ventajas del


Diseo TOP-DOWN

Las Opciones de sntesis pueden ser aplicadas individualmente

Counters
Adders
State Machines

G.Jaquenod 2002, All Rights Reserved.

Fuente: ALTERA

Nivel 2

Nivel 3

Nivel 3

Nivel 3

Counter

State
Machine

Adder

LFSR

G.Jaquenod 2002, All Rights Reserved.

MS NIVELES DE JERARQUA => MS FLEXIBILIDAD


G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

La pregunta clsica sobre el


Diseo Jerrquico

En general, al usar FLEX10K una buena regla


de diseo es limitar la complejidad de cada

STYLE=NORMAL
STYLE=NORMAL

bloque a no ms de 80 a 130 macroceldas,


de modo de no perder la conexin entre la

STYLE=FAST
STYLE=FAST

STYLE=WYSIWYG
STYLE=WYSIWYG

Las posibilidades para optimizar el ruteado y performance de un


diseo son ms reducidas.
En general:

a) Depende del diseo


b) Depende del dispositivo a usar
c) Depende del uso del dispositivo
d) Tantos como sean necesarios

Nivel 2

Nivel 3

Por ejemplo, si un mdulo usa varios SUMADORES y uno de ellos


requiere el uso de cadenas de Carry, todos los dems tambin
estarn forzados a usarlas.
La aislacin de un sumador para su sintona individual no es posible

Pregunta: Cuntos niveles de jerarqua convienen en un diseo?

GLOBAL_STYLE=NORMAL
GLOBAL_STYLE=NORMAL
ASSIGN
ASSIGN TIMING
TIMING REQ
REQ
FMAX=35MHz
FMAX=35MHz

Nivel 1

179

......

Las desventajas de una jerarqua FLAT versus una TOP-DOWN


pueden resumirse en las siguientes:
Las asignaciones (Logic Synthesis Options) son ms complejas
de realizar, porque slo pueden ser hechas a nivel de componente
TOP.

Nivel 2

.
.
.
.

Co
py
r

Hot Lab Support Initiative

Counters
Adders
State Machines

Desventajas del Diseo FLAT

ig
ht
G.
Ja

Nivel 1

Nivel 3

Counters
Adders
State Machines

Componente n
(Behavioral)

Hot Lab Support Initiative

Una jerarqua tipo rbol (diseo Top Down) es una mejor solucin

Nivel 2

Componente 2
(Behavioral)

qu
en
od

Herramientas para
el diseo jerrquico

Componente 1
(Behavioral)

20

Bases de VHDL

175

02

Una arquitectura de jerarqua plana (flat)

descripcin de VHDL y el hardware


sintetizado, y poder optimizar el diseo final

STYLE=FAST
STYLE=FAST
ASSIGN
ASSIGN CLIQUE
CLIQUE
Fuente: ALTERA

180

G.Jaquenod 2002, All Rights Reserved.

Fuente: ALTERA

Copyright Guillermo Jaquenod, 2002

30

VHDL: Lenguaje de
descripcin de hardware

Hot Lab Support Initiative

Hot Lab Support Initiative

XII Asamblea General del ISTEC, UTP, Panam, Noviembre de 2002

Diseo jerrquico: formas de uso


de archivos de diseo mltiples

Beneficios del Diseo Jerrquico


Hot Lab Support Initiative

Para poder hacer diseos jerrquicos, en VHDL se requiere la


declaracin y la instanciacin de Componentes

02

Si se trabaja en equipo, cada diseador puede crear funciones


separadas (componentes) en archivos separadas, y realizar su
depuracin en forma individual

top.vhd
entity-architecture top
component mid_a
component mid_b

bottom_a.vhd
entity-architecture bottom_a

181

20

Esto implica: modularidad, encapsulamiento, portabilidad, y


reusabilidad

mid_b.vhd
entity-architecture mid_b
component bottom_a
component bottom_b

bottom_b.vhd
entity-architecture bottom_b

G.Jaquenod 2002, All Rights Reserved.

Fuente: ALTERA

Diseo Jerrquico: ejemplos de IP


Hot Lab Support Initiative

Ademas, esta segmentacin del diseo hace ms fcil probar


soluciones alternativas para la optimizacin de bloques crticos por
el uso de recursos o por su performance de velocidad
Y posibilita el acceso a todo un mundo de diseos prevalidados, o
IP (Intellectual Property)

qu
en
od

mid_a.vhd
entity-architecture mid_a
component bottom_a

Estos componentes pueden ser compartidos con los otros


diseadores y a la vez quedan disponibles para ser usados en
diseos futuros

182

Diseo Jerrquico: ejemplos de IP

Hot Lab Support Initiative

ALTERA MEGACOREs:

Signal Processing & Telecom: cascadable adaptive FIR, Filter Library (FIR & IIR), Rank

PCI: 32bit 66MHz Master/Target, 64bit 66MHz Master/Target, 32bit 66MHz


Target only, 64bit 66MHz Target only

Order Filter, Laplacian Edge detector, Complex Multiplier/Mixer, FFT/IFFT, Discrete


Cosine Transform, Image Processing Library, Floating Point Operator Library,
Convolutional (encoder, interleaver), Reed Solomon (encoder, variable (N,K) encoder,
decoder), Viterbi (Dual Constraint Length Decoder), DVB FEC Codec, LFSRs, Digital IF

ig
ht
G.
Ja

Signal Processing: FIR e IIR Compiler, Color Space Convertor, CRC


Checker, Symbol Interleaver/Deinterleaver, NCO Compiler, Constellation
Mapper/Demapper, Reed Solomon Encoder y Decoder, Turbo Encoder y
Decoder, Parallel y Serial VITERBI Decoder, FFT/IFFT.

HammerCores: Data Encryption, Reed Solomon Decoder, Adaptive


Equalizer, Hadamard Transform Processor, Rijndael encryption/Decryption,
Secure Hash Algorithm, Message Digest Algorithm

183

receiver, Multi-Standard ADPCM, Early/Late Gate Symbol Synchronizer, QPSK Equalizer,


Digital Modulator, NCO, Binary Pattern Correlator

Communications: HDLC Controller (byte & bit oriented), Data encoder/decoder, Packet
over SONET (POS) Controller, SONET Interface, ATM Receive Processor, Generador de
tonos (DTMF, call progress, etc.), UTOPIA Level_2, 10/100 Ethernet MAC, Cell
Delineation (ATM sobre SONET o SDH)

Telecom: SONET Framers, ATM Cell Processor, PPP Packet Processor,


T3 Framer y Mapper, E3 Mapper, POSPHY Level 2 y 3 (PHY y LINK side),
UTOPIA level 2 y 3, 8b10b Encoder/Decoder

PCI: 32bit/33MHz, 32bit/66MHz, 64bit 66MHz Master, Target, ambos, Bridge, Arbiter

Procesadores: 8259, 8237, 8251, 8255, 6402, 16450, 6850

Otros: CAN, IEEE1394, IEEE1284, I2C, DAI (Digital Audio Interface), USB

G.Jaquenod 2002, All Rights Reserved.

Fuente: ALTERA

184

Diseo jerrquico en VHDL:


declaracin de Componentes

Co
py
r

Hot Lab Support Initiative

COMPONENT <nombre del componente> [IS]


[GENERIC (lista genrica);]
[PORT (descripcin de las puertas);]
END COMPONENT [<nombre del componente> ];

G.Jaquenod 2002, All Rights Reserved.

Microprocesadores: 49410, 8051, RAW8051, 8052, 2901, 2910, 6502, Z80, 6402, 6850,
8237,8251,8254, 8255, 8259, 16450, 165550, 6850,29116, SDRAM, DMA, PowerPC

G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

Fuente: ALTERA

Diseo jerrquico: declaracin de


componentes en un package

library IEEE; use IEEE.std_logic_1164.all;


package LPM_COMPONENTS is
component LPM_COUNTER
generic (LPM_WIDTH : positive; LPM_MODULUS: string := UNUSED;
LPM_AVALUE : string := UNUSED; LPM_SVALUE : string := UNUSED;
LPM_DIRECTION : string := UNUSED; LPM_TYPE: string := "LPM_COUNTER";
LPM_PVALUE : string := UNUSED; LPM_HINT : string := UNUSED);
port (DATA: in std_logic_vector(LPM_WIDTH-1 downto 0):= (OTHERS => '0');
CLOCK : in std_logic ; CLK_EN : in std_logic := '1'; CNT_EN : in std_logic := '1';
UPDOWN : in std_logic := '1';
SLOAD : in std_logic := '0'; SSET : in std_logic := '0'; SCLR : in std_logic := '0';
ALOAD : in std_logic := '0'; ASET : in std_logic := '0'; ACLR : in std_logic := '0';
EQ : out std_logic_vector(15 downto 0);
Q : out std_logic_vector(LPM_WIDTH-1 downto 0));
end component;
component LPM_ABS ....; component LPM_CONSTANT...
end package ;

Para describir la estructura de un sistema es necesario saber qu


componentes (como llama VHDL) lo forman, y sus interconexiones.
Un componente debe declararse dentro o fuera de una arquitectura, y
slo despus puede hacerse referencia a l
La declaracin dentro de una arquitectura permite referirse a l
slo dentro de la arquitectura
La declaracin fuera de una arquitectura (en un package) permite su
invocacin en todas las arquitecturas que usen ese package
La sintaxis de declaracin de un componente es:

185

G.Jaquenod 2002, All Rights Reserved.

186

G.Jaquenod 2002, All Rights Reserved.

Fuente: ALTERA

Copyright Guillermo Jaquenod, 2002

31

VHDL: Lenguaje de
descripcin de hardware

Hot Lab Support Initiative

Diseo jerrquico en VHDL:


Instanciacin de Componentes

As como en una aquitectura pueden declararse variables simples (SIGNAL,


BIT,...) tambin pueden declararse instancias de otras entidades

En estas declaraciones se da un nombre local a esa instancia, as como la


forma de asociacin entre las puertas de la entidad a la que se referencia,
con los objetos de la arquitectura en definicin (llamada PORT MAP) y se
asignan valores a los genericos (GENERIC MAP)

La referencia a la entidad instanciada puede ser hecha a traves de su


nombre como componente, la dupla nombre de entidad+nombre de
arquitectura, o su nombre de configuracin.

G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

componente
componenteen
enlalaarquitectura
arquitectura

ARCHITECTURE a OF practica IS
SIGNAL conta: STD_LOGIC_VECTOR (0 TO prescaler_size-1);

invocacin
invocacin
BEGIN
prescaler : LPM_COUNTER -- instanciacin del componente
GENERIC MAP (LPM_WIDTH => prescaler_size)
PORT MAP (clock => clk, q => conta);

BEGIN
u1 : tollv

Nombre
Nombre de
de
la
la Instancia
Instancia

Ejemplos:
un Full-Adder estilo RTL

Hot Lab Support Initiative

ENTITY full_add IS PORT(


a,b,c_in : IN BIT;
cout,sum : OUT BIT);
END full_add;

c_in

a
b

sum

ARCHITECTURE ecuaciones OF full_add IS


cout
BEGIN
sum
<= a XOR b XOR c_in;
cout <= (a AND b) OR (a AND c_in) OR (b AND c_in);
END ecuaciones;

PORT MAP ( tclk, tcross, tnickel, tdime,


tquarter, tgreen, tred,
tsout, tstate);
Invocacin
Invocacin del
del
Componente
Componente

Nombre
Nombre del
del Componente
Componente

G.Jaquenod 2002, All Rights Reserved.

Fuente: ALTERA

ENTITY add4gen IS PORT(


c0: IN BIT; a,b: IN BIT_VECTOR (4 DOWNTO 1);
c4: OUT BIT; sum: OUT BIT_VECTOR(4 DOWNTO 1));
END add4gen;

Como no est hecho


publico mediante un
PACKAGE, full_add
debe ser descrito en la
arquitectura, antes del
BEGIN

Fuente: DUECK

Hot Lab Support Initiative

Componentes con salidas


sin conectar

Al usar un componente pre-existente puede no interesar el uso de ciertas


salidas.

Si el PORT MAP se realiza mediante asociacin nominativa existen dos


alternativas:
No mencionar el port no usado

ARCHITECTURE adder OF add4gen IS


COMPONENT full_add PORT(a,b,c_in: IN BIT; c_out,sum :OUT BIT);
END COMPONENT;
SIGNAL c : BIT_VECTOR (4 DOWNTO 0);
Se instancia y se
BEGIN
conecta al componente
c(0) <= c0;
como cualquier otro
adders: FOR i IN 1 to 4 GENERATE
adder: full_add PORT MAP (a(i),b(i),c(i-1),c(i),sum(i));
END GENERATE;
c4 <= c(4);
END adder;
G.Jaquenod 2002, All Rights Reserved.

G.Jaquenod 2002, All Rights Reserved.

190

4bit adder instanciando


componentes

Co
py
r

Hot Lab Support Initiative

191

G.Jaquenod 2002, All Rights Reserved.

ig
ht
G.
Ja

Declaracin
Declaracin del
del
ARCHITECTURE tolleab_arch OF tolleab IS
Componente
Componente
COMPONENT tollv
PORT( clk : IN STD_LOGIC;
cross,nickel,dime, quarter:IN STD_LOGIC;
green,red:OUT STD_LOGIC;
sout:OUT STATE_TYPE;
Asociacin
Asociacin
state_in:IN STATE_TYPE);
Posicional
Posicional
END COMPONENT;

189

declaracin
declaracinusando
usando

188

Invocacin de Componentes:
mapeo por asociacin posicional

USE lpm.lpm_components.ALL;

un
unPackage
Package
ENTITY practica IS
GENERIC (prescaler_size: INTEGER := 23;...)
PORT ( clk: IN STD_LOGIC;.);
no
END ENTITY practica;
noes
esnecesario
necesariodeclarar
declararalal

La sintaxis, en el primer caso, es:


<nombre de la instancia> : <nombre del componente>
GENERIC MAP(<generic del componente> => <valor>,...)
PORT MAP(<port del componente> => <seal a la que se conecta>,
...,<port del componente> => <seal a la que se conecta>);

187

LIBRARY lpm;

qu
en
od

Hot Lab Support Initiative

-- declaraciones de componentes mediante el uso de un package

02

Diseo jerrquico: ejemplo de


Invocacin de Componentes

20

Hot Lab Support Initiative

XII Asamblea General del ISTEC, UTP, Panam, Noviembre de 2002

Asociar ese port a la palabra reservada OPEN


PORT MAP(...,<port del componente> => OPEN,...);

Si el PORT MAP se realiza mediante asociacin posicional la nica


alternativa es colocar OPEN en el lugar respectivo de la lista de puertas:
PORT MAP(a,b,c,..,OPEN,...);

192

G.Jaquenod 2002, All Rights Reserved.

Copyright Guillermo Jaquenod, 2002

32

VHDL: Lenguaje de
descripcin de hardware

Hot Lab Support Initiative

Hot Lab Support Initiative

XII Asamblea General del ISTEC, UTP, Panam, Noviembre de 2002

Componentes con entradas


sin conectar

Hot Lab Support Initiative

02

Al usar un componente pre-existente puede no interesar el uso de ciertas


entradas (por ejemplo, al usar un sumador puede que no se desee utilizar el
carry de entrada a la primer etapa). Para ello las alternativas son:
Si al disear ese componente esa entrada tena un valor de default, y si el PORT
MAP se realiza mediante asociacin nominativa existen dos alternativas:
directamente no mencionar el port no usado, o asociarlo a la palabra reservada
OPEN. SI la asociacin es posicional ser necesario usar OPEN.

VHDL FOR SYNTHESIS

20

PORT MAP(...,<port del componente> => OPEN,...);


Si en el diseo del componente esa entrada no tena valor de default, la nica
solucin es asignarle un valor esttico (0 o 1) en el PORT MAP al instanciar el
componente, ya sea en modo nominativo o posicional:

Reglas generales de diseo para


optimizar la performance

En VHDL87 no es posible asignar directamente 0 o 1, y debe crearse una seal


local a la que se asigna 0 o 1, y usar esta seal en el PORT MAP

193

G.Jaquenod 2002, All Rights Reserved.

194

Tcnicas de diseo eficaz


usando HDLs

Hot Lab Support Initiative

qu
en
od

PORT MAP(a,b,c,..,0,...);
PORT MAP(...,<port del componente> =>0,...);

Hot Lab Support Initiative

Realizar un anlisis profundo de los objetivos, qu se desea hacer


y cmo cada arquitectura se acomoda a ciertas soluciones
Que un diseo haya sido escrito en un HDL no quiere decir que est bien hecho, ni
que sea eficiente, ni de costo ptimo

Disear pensando en el posterior proceso de sntesis!

Tcnicas de diseo eficaz


usando HDLs

Particionar el diseo, manteniendo una estructura jerrquica


con bloques de dimensin acotada
Un diseo dividido en bloques reducidos facilita la escritura y
modificacin de cada bloque, el uso de mdulos de IP y el reuso de
diseos propios

ig
ht
G.
Ja

Una especificacin puede ser toda behavioral, pero en un diseo a ser sintetizado
hay que pensar en qu resultar en el silicio

Pensar el diseo de modo de aprovechar al mximo los lmites de fan-in, los modos
de operacin y las prestaciones especiales de la familia a usar!

Pensar sincrnico!

G.Jaquenod 2002, All Rights Reserved.

Las modernas arquitecturas de lgica programable son register-intensive, por lo


cual el uso intenso de flipflops no agrega hardware, sino slo usa recursos que de
todos modos estn disponibles.

Un diseo sincrnico es ms controlable y no depende de efectos analgicos como


tiempos de propagacin.

Permite el trabajo en equipo, disminuyendo el Time-To-Market


Permite probar alternativas de arquitectura sin tener que realizar
enormes modificaciones del cdigo

Cuidado con
el OverConstraint!

Facilita el proceso de simulacin y la deteccin temprana de errores


de diseo; la complejidad aumenta exponencialmente al aumentar el
tamao de un bloque circuital

!!

Permite optimizar separadamente bloques de rea crtica, as como


bloques de velocidad crtica, asignando constraints distintos en base
a la funcionalidad requerida para cada bloque.

Evitar los gated-clocks, tratando de usar pocos relojes globales (idealmente slo uno)
y aprovechar el ENABLE de los flipflops
195

G.Jaquenod 2002, All Rights Reserved.

Tcnicas de diseo eficaz


usando HDLs

Co
py
r

Hot Lab Support Initiative

196

Definir las estructuras y reservar recursos pensando en


los posibles cambios posteriores, en la simplicidad de la
simulacin y en el proceso de TEST fsico en produccin!
Una parte importantsima del proceso de diseo se ocupa en la
validacin del mismo a travs de la simulacin
El uso de bloques jerarquicos permite verificar separadamente los
subdiseos
La existencia de simulacin funcional y temporal permite separar la
validacin de la lgica (comportamiento behavioral) de los
fenmenos que dependen de los procesos de propagacin dentro
del componente

Un diseo recin
termina cuando el
equipo de serie
est funcionando
OK en lo del
usuario final!!

No antes!!!

!!

Tcnicas de diseo eficaz


usando HDLs

Tratar de unificar el diseo y no mezclar BITs con STD_LOGIC. En general


conviene el uso de package std_logic_1164 y el package numrico
numeric_std (IEEE 1076.3).

!!

Agregar la clusula de RANGE a las variables INTEGER, para minimizar el


uso de recursos
En el caso de lgica combinatoria, ser cuidadoso para evitar la inferencia de
elementos de memoria:
si a las seales se les asigna valores mediante asignaciones
condicionales, todas las seales deben tener un valor asignado en cada
rama de esa asignacin condicional

En produccin debe ser posible detectar la correcta operacin del


sistema antes de salir a la venta

si la operacin combinatoria es descripta dentro de un proceso, todas las


seales de entrada deben estar presentes en la lista de sensibilidad

En reworking debe ser posible detectar las causas de las fallas


G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

Especificar completamente los mdulos a sintetizar antes de inicar el


proceso de sntesis, evitando estados desconocidos u operaciones
presumidas.

Aunque el diseo funcione en simulacin, su prototipo luego debe


funcionar en el hardware real, donde debe poder ser testeado

197

G.Jaquenod 2002, All Rights Reserved.

198

G.Jaquenod 2002, All Rights Reserved.

Copyright Guillermo Jaquenod, 2002

33

VHDL: Lenguaje de
descripcin de hardware

Hot Lab Support Initiative

XII Asamblea General del ISTEC, UTP, Panam, Noviembre de 2002

Tcnicas de diseo eficaz


usando HDLs

Hot Lab Support Initiative

Tcnicas de diseo eficaz


usando HDLs

Hot Lab Support Initiative

Para el caso de CASE:

Evaluar cuantos flipflops se han especificado como seales a las que se asigna
valores en procesos sensibles a una seal de reloj
Ver en los archivos de reporte cuntos flipflops ha colocado el compilador
Analizar de dnde surgen esos nuevos registros

!!

Asignacin de estilos y valores a FSMs

no olvidar el uso de OTHERS

En vez de definir estados por enumeracin a los que el compilador asigne un valor
cualquiera, analizar si los mismos registros que sirven como memoria de estado no
pueden a su vez ser la salida sincrnica de la FSM. Eso produce circuitos ms
simples, ms rpidos, y con menos glitches.

Para el caso de FOR:


asignar valores de default a todos los objetos inmediatamente antes de
comenzar un FOR.

20

si se usan valores de default, conviene hacerlo inmediatamente antes de


comenzar un CASE, evitando la inferencia de elementos de memoria.

02

Evaluar post-sntesis las posibles inferencias indeseadas de memoria

usar CASE en vez de IF..THEN..ELSIF siempre que sea posible, evita la


generacin de codificadores de prioridad

tratar de realizar asignaciones a variables en lugar de a seales


LOGICA
DE NUEVO
ESTADO

LOGICA
DE NUEVO
ESTADO

DECOD

qu
en
od

Tratar de usar procesos con las seales de control en la lista de sensibilidad


ms sentencias tipo IF para la especificacin de flipflops, en lugar de hacerlo
mediante sentencias WAIT UNTIL.

MOORE de salida decodificada

199

G.Jaquenod 2002, All Rights Reserved.

200

Tcnicas de diseo eficaz


usando HDLs

Hot Lab Support Initiative

fronteras del proceso de optimizacin

Lgica
combinatoria

Lgica
combinatoria

D Q
Ck
CL

D Q
Ck
CL

En un proceso de sntesis que respete la estructura jerrquica, la


optimizacin del diseo se detiene en dos fronteras: las puertas de
los bloques jerrquicos y los registros.
Por eso conviene ubicar los registros en las fronteras de los bloques
jerrquicos (a la entrada o a la salida)

En un proceso de sntesis FLAT la optimizacin slo se detiene en


los registros.
201

G.Jaquenod 2002, All Rights Reserved.

202

Tcnicas de diseo eficaz


usando HDLs

Co
py
r

Hot Lab Support Initiative

FF1

Lgica
combinatoria

FF2

Lgica
combinatoria

D Q
Ck
CL

T0

FF3
Lgica
combinatoria

D Q
Ck
CL

T1~2xT0

FFx

D Q
Ck
CL

Lgica
combinatoria

T1~T0

T2~T0

Balancear la complejidad combinatoria entre registros


Cmo? Analizando la lista de worst paths!!

D Q
Ck
CL

Lgica
combinatoria

T0

Lgica
combinatoria

D Q
Ck
CL

T1~T0/2

Lgica
combinatoria

Lgica
combinatoria

D Q
Ck
CL

T2~T0/2

T3~T0

Y cuando las fronteras de los bloques jerrquicos dividan lgica combinatoria


repartir los retardos imponiendo constraints de Output Required Time (T1) y
de Input Arrival Time (T2).
G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

Tcnicas de diseo eficaz:


reducir el fanout y duplicar lgica

FLEX10K, ACEX1K, APEX, etc.., hace que el uso


de etapas de buffereado pueda disminuir los
retardos totales
Duplicar lgica: Con idntico criterio, a veces puede

ser til duplicar ciertos bloques para simplificar el


Lgica
combinatoria

D Q
Ck
CL

cantidad de elementos logicos en las familias

Pin

True Path

D Q
Ck
CL

importantes retardos. La disponibilidad de gran

FFy

ruteado de diseos complejos. Cada particin

D Q
Ck
CL

puede ser ms simple, porque si bien repite la

False Path

203

Lgica
combinatoria

seales a travs de una nica salida puede agregar

T2~T0

Para sincerar las evaluacin de Clock Performance debe notificarse este hecho al
compilador usando constraints de MultiCycle path

Lo mismo en relacin a los


False Path que suelen
aparecer cuando se usan
puertas bidireccionales:

D Q
Ck
CL

Reducir fanout: El manejo de gran cantidad de

D Q
Ck
CL

Si se usan flipflops con Enable y se sabe que (por ejemplo) FF1 y FF2 slo se habiltan en
los ciclos pares de la seal de reloj, el tiempo T1 puede ser el doble de lento que T0 o T2

True Path

Lgica
combinatoria

D Q
Ck
CL

T0

ig
ht
G.
Ja

D Q
Ck
CL

Tcnicas de diseo eficaz


usando HDLs

Hot Lab Support Initiative

Lgica
combinatoria

Lgica
combinatoria

MOORE de salida registrada

G.Jaquenod 2002, All Rights Reserved.

G.Jaquenod 2002, All Rights Reserved.

204

A
B

generacin de seales comunes, slo sintetiza las

F1

seales dedicadas requeridas por esa particin.

F2

G.Jaquenod 2002, All Rights Reserved.

Copyright Guillermo Jaquenod, 2002

34

VHDL: Lenguaje de
descripcin de hardware

Hot Lab Support Initiative

Hot Lab Support Initiative

XII Asamblea General del ISTEC, UTP, Panam, Noviembre de 2002

Tcnicas de diseo eficaz usando


HDLs: pipelining

Hot Lab Support Initiative

FLEX10K, ACEX1K, APEX, etc.., cuenta

delay

inevitablemente con un flipflop, lo que hace

02

Cada elemento lgico en las familias

T1

natural el empleo de pipelines en un diseo

Bases de VHDL

(ciertos eventos deben preverse en avance)

delay

delay

20

Si bien el diseo es un poco ms complejo


las mejoras de velocidad obtenibles pueden
Ta << T1

ser IMPORTANTSIMAS

Tb << T1

Modelado del tiempo en VHDL

ser considerado SI O SI en cualquier diseo


donde haya un objetivo de velocidad y el
dispositivo lgico ms lento (y econmico)
disponible no sea capaz de resolverlo
205

Recuerde: un buen diseo de


ingeniera no slo debe cumplir
las especificaciones tcnicas
sino tambin ser lo ms
econmico posible!!!

G.Jaquenod 2002, All Rights Reserved.

qu
en
od

Es por eso que el uso de pipelining DEBE

206

VHDL: el mundo real


Hot Lab Support Initiative

(concurrentes) a la mxima velocidad posible, y los procesos o bloques donde


se resuelven sentencias secuenciales, todos los eventos que se inter-

Las sentencias de asignacin a seales son de la forma

[TRANSPORT] <expresin> [AFTER <expresin temporal>];

ig
ht
G.
Ja

(seales que cambian de estado) y con la variable TIEMPO

Un evento fsico: importante en la seccin de hardware y en el monitor de

Un evento temporal: fundamental para crear los estmulos, as como para


modelizar los retardos propios del hardware

Adems del subconjunto de estructuras sintetizables, VHDL ofrece sentencias


que pueden ser usadas para las tareas de especificacin, modelado, y
simulacin. Este tipo de sentencias incluye el modelado del tiempo, y otras
funciones tiles para el ingreso de vectores de test y salida de resultados
G.Jaquenod 2002, All Rights Reserved.

208

Uso de after para asignaciones


demoradas

Co
py
r

Hot Lab Support Initiative

209

G.Jaquenod 2002, All Rights Reserved.

La posibilidad de asignar varios valores futuros a seales en


distintos momentos del tiempo futuro obliga a ciertos metodos de
resolucin

25

Fuente: SJOHOLM

Resolucin de asignaciones
demoradas

Retardo de Transporte: este enmascaramiento no existe,


siendo el caso de una lnea de retardo

C<= 1, 0 after 5 ns ,1 after 10 ns, 0 after 25 ns;

20

Hot Lab Support Initiative

Retardo Inercial (Default): donde un pulso de duracin menor


al retardo es enmascarado (caso tpico de una compuerta)

Es posible realizar asignaciones mltiples demoradas a la misma seal, para


definir ciertas formas especficas:

15

G.Jaquenod 2002, All Rights Reserved.

La asignacin de retardos a seales puede hacerse tanto dentro


como fuera de Procesos, habiendo dos tipos de retardos:

Cada vez que cambia reloj, en la cola de eventos se prepara un nuevo cambio
al valor negado para 50ns despues; y como esta asignacion es realizada solo
cuando hay eventos en reloj, recien a los 50ns del reloj de simulacion sera
reevaluada, cambiando y preparando un nuevo evento para 50 ns, .

10

[AFTER] :define el tiempo de propagacin de una seal.


[TRANSPORT] : indica que la seal es propagada con idntica forma, luego de un
retardo definido por AFTER. De no ponerse TRANSPORT se asume el modo
INERTIAL donde un pulso de retardo menor al tiempo de propagacin es ignorado.
[REJECT] : define el pulso minimo a propagar y slo puede ser usado para refinar
el modelo de una seal INERTIAL. Si un pulso de menor duracin al dado por
REJECT atraviesa un objeto, es filtrado y no aparece en la salida.

Para modelar el comportamiento de un dispositivo (behavioral


modelling) se hace necesario poder modelar estos retardos

reloj <= NOT reloj after 50 ns;

Estas asignaciones se efectivizan al final de cada ciclo de simulacin, cuando


TODAS las asignaciones han sido resueltas, y estos valores futuros pueden ser
condicionados mediante ciertos campos que no son sintetizables, pero que
sirven para la simulacin y especificacin:

Todo dispositivo real presenta retardos de propagacin, que


dependen intimamente de la arquitectura del dispositivo

Dado que las asignaciones solo se resuelven al producirse eventos sobre la


expresion concurrente correspondiente, un reloj de 10 MHz (T =100ns) y de
relacion de trabajo al 50% puede ser declarado mediante:

Recin
Recinen
enVHDL93!
VHDL93!

[label:] <nombre de seal> <= [REJECT <expresin temporal>]

relacionan con el mundo real deben sincronizarse con EVENTOS FSICOS

207

El tiempo en la asignacin
simple a seales

Hot Lab Support Initiative

Adems de las aplicaciones que operan procesando sentencias simultneas

salidas

G.Jaquenod 2002, All Rights Reserved.

210

G.Jaquenod 2002, All Rights Reserved.

Copyright Guillermo Jaquenod, 2002

35

VHDL: Lenguaje de
descripcin de hardware

Hot Lab Support Initiative


Resolucin de asignaciones
demoradas

process begin
s <= transport 1 after 20ns;
s <= transport 0 after 10ns;
wait;
end process;

El modelo transport
propaga la expresin a la
seal, sin modificaciones
El modelo inertial filtra
cambios de duracin inferior
a un mnimo

10ns
0

20ns
1

tiempo
valor

20ns
1

10ns
0

C<= 0,
1 AFTER 10 ns,
0 AFTER 12 ns,
1 AFTER 20 ns,
0 AFTER 25 ns,
1 AFTER 40 ns,
0 AFTER 57;
A1 <= INERTIAL C
AFTER 10 ns;

tiempo
valor

process begin
s <= 1 after 20ns;
s <= 0 after 10ns;
wait;
end process;

20ns
1

A2 <= TRANSPORT C
AFTER 10 ns;

10ns
0

A3 <= REJECT 4 ns
INERTIAL C
AFTER 10 ns;

G.Jaquenod 2002, All Rights Reserved.

212

Hot Lab Support Initiative

Ai

02

process begin
s <= 0 after 10ns;
s <= 1 after 20ns;
wait;
end process;

tiempo
valor

Hot Lab Support Initiative

20

process begin
s <= transport 0 after 10ns;
s <= transport 1 after 20ns;
wait;
end process;

Ejemplos de INERTIAL y
TRANSPORT

10

20

qu
en
od

Hot Lab Support Initiative

Los nuevos valores para las


seales se planean cuando se
analizan la sentencias pero se
realizan en un tiempo posterior,
ya sea al fin del actual o de un
futuro ciclo de simulacin. VHDL
permite elegir dos modelos de
retardo llamados inercial (por
defecto) y transporte

211

XII Asamblea General del ISTEC, UTP, Panam, Noviembre de 2002

30

40

G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

50

60

70

Fuente: SJOHOLM

Ejemplos: voto por mayoria con


3 votantes

LIBRARY ieee; USE ieee.std_logic_1164.ALL;

ig
ht
G.
Ja

Bases de VHDL
Ejemplos combinatorios

213

G.Jaquenod 2002, All Rights Reserved.

Ejemplos: voto por mayoria


parametrizado

Co
py
r

Hot Lab Support Initiative

214

LIBRARY ieee; USE ieee.std_logic_1164.ALL;


ENTITY mayoria_var IS GENERIC (num_vot : INTEGER := 10);
PORT(votantes: IN STD_LOGIC_VECTOR (num_vot-1 DOWNTO 0);
y : OUT STD_LOGIC);
END ENTITY mayoria_var ;
ARCHITECTURE looping OF mayoria_var IS
BEGIN
PROCESS (votantes) IS
VARIABLE conta : INTEGER;
BEGIN
SI
conta := 0;
FOR i IN votantes'RANGE LOOP
IF (votantes(i) = '1') THEN conta := conta+1; END IF;
END LOOP;
IF (conta > num_vot / 2) THEN y <= '1'; ELSE y <= '0'; END IF;
END PROCESS;
END ARCHITECTURE looping;

215

ENTITY mayoria IS PORT(


vot_a,vot_b,vot_c : IN STD_LOGIC;
y : OUT STD_LOGIC);
END ENTITY mayoria ;
ARCHITECTURE rtl
BEGIN
y <= (vot_a AND
OR (vot_b AND
OR (vot_a AND
END ARCHITECTURE

SI

NO

OF mayoria IS
vot_b)
vot_c)
vot_c);
rtl ;

G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

Fuente: DUECK

Ejemplos: Trascodificador
Binario a GRAY

Dados cdigos de N bits, una secuencia con codificacin binaria es aquella


donde cdigos sucesivos corresponden a valores numricos sucesivos (000,
001, 010, 011, 100, 101, 110, 111, 000,...). En este caso, al pasar de un
cdigo a otro puede cambiar ms de un bit (por ejemplo, al pasar desde 011
a 100, o desde 111 a 000 cambian todos).
En una secuencia con codificacin GRAY estos 2N cdigos estn ordenados
de otro modo, de modo que al pasar de un cdigo la siguiente slo cambie
un bit (000, 001, 011, 010, 110, 111, 101, 100, 000,...).

NO

G.Jaquenod 2002, All Rights Reserved.

Para convertir una secuencia binaria a GRAY los pasos son:


el bit MSB coincide en GRAY y binario
cada bit restante GRAY se obtiene como el XOR del bit de igual peso y el
inmediato superior del cdigo binario

Los cdigos GRAY son muy usados cuando en base a un cdigo desea
hacerse una decodificacin ausente de glitches.
216

G.Jaquenod 2002, All Rights Reserved.

Copyright Guillermo Jaquenod, 2002

36

VHDL: Lenguaje de
descripcin de hardware

Hot Lab Support Initiative

XII Asamblea General del ISTEC, UTP, Panam, Noviembre de 2002


Ejemplos: comparador
de 4 bits tipo 7485

Trascodificador Binario a GRAY


Hot Lab Support Initiative

Hot Lab Support Initiative

0000=0

0000=0

0001=1

0001=1

0010=2

0011=3

0011=3

0010=2

0100=4

0110=6

0101=5

0111=7

0100=4

1000=8

1100=C

1001=9

1101=D

1010=A

1111=F

1011=B

1110=E

1100=C

1010=A

1101=D

1011=B

1110=E

1001=9

1111=F

1000=8

Ejemplo: comparador de
magnitud de N bits

ig
ht
G.
Ja

A la vez, al ser desplazados los datos en un


sentido existen varias alternativas respecto a qu
bits ingresar por el otro extremo (cero, extensin
de signo o rotacin)
A diferencia de un shift-register, donde los
desplazamientos son de a un bit por ciclo de
clock, en este caso la operacin es combinatoria,
siendo usual que el ancho de los datos de entrada
(N) sea potencia de dos

220

Co
py
r

Barrel Shifter solo hacia


el LSB (a derecha)

bit_vector (15 DOWNTO 0);


bit_vector (3 DOWNTO 0);
bit_vector (15 DOWNTO 0));
;

sel(2)

cantidad de
desplazamientos

G.Jaquenod 2002, All Rights Reserved.

Barrel Rotator hacia la derecha


Hot Lab Support Initiative
ENTITY brder IS PORT (din:IN bit_vector (15 DOWNTO 0);
sel: IN bit_vector (3 DOWNTO 0); dout: OUT bit_vector (15 DOWNTO 0));
END ENTITY brder ;

En vez de 16 Mux
hago los shifts por
etapas: 1, 2 4 y 8
shifts!

ARCHITECTURE a OF bsder IS
SIGNAL shf1,shf2,shf4: bit_vector (15 DOWNTO 0);
BEGIN
shf1 <= din WHEN sel(0)='0'
ELSE '0' & din (15 DOWNTO 1);
shf2 <= shf1 WHEN sel(1)='0'
sel(0) sel(1)
ELSE B"00" & shf1 (15 DOWNTO 2);
shf4 <= shf2 WHEN sel(2)='0'
ELSE B"0000" & shf2 (15 DOWNTO 4);
dout <= shf4 WHEN sel(3)='0'
ELSE B"00000000" & shf4 (15 DOWNTO 8);
END ARCHITECTURE a;

221

En base a una palabra de control, un dato de


entrada de N bits es desplazado una cierta
cantidad de bits (hasta N-1), donde el
desplazamiento puede ser unsigned (siempre en
un sentido) o signed (en ambos sentidos)

dato de salida

G.Jaquenod 2002, All Rights Reserved.

ENTITY bsder IS
PORT (din: IN
sel: IN
dout: OUT
END ENTITY bsder

Barrel Shifter

El barrel shifter es un circuito muy usado en


operaciones numricas.

ARCHITECTURE a OF magnitud IS BEGIN


> = <
PROCESS (a,b,amaybi,aigualbi,amenbi)
VARIABLE salis: STD_LOGIC_VECTOR(2 downto 0);
VARIABLE dibit: STD_LOGIC_VECTOR(1 downto 0);
BEGIN
salis := amaybi & aigualbi & amenbi;
FOR i IN a'RANGE LOOP
Tiene sentido tener
dibit := a(i) & b(i);
CASE dibit IS
estas 3 entradas?
WHEN "10" => salis := "100"; EXIT;
WHEN "01" => salis := "001"; EXIT;
WHEN OTHERS => NEXT;
END CASE;
De todos modos, ac tambin podra ser NULL
END LOOP;
amaybo <= salis(2); aigualbo <= salis(1); amenbo <= salis(0);
END PROCESS;
END a;

Hot Lab Support Initiative

Hot Lab Support Initiative

> = <

7485

G.Jaquenod 2002, All Rights Reserved.

218

LIBRARY ieee; USE ieee.std_logic_1164.ALL;


ENTITY magnitud IS GENERIC (N: INTEGER := 4);
PORT (a,b:IN std_logic_vector (N-1 DOWNTO 0);
amaybi,aigualbi,amenbi:IN STD_LOGIC;
amaybo,aigualbo,amenbo:OUT STD_LOGIC);
END magnitud;

219

20

GRAY

0101=5

0111=7

G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

ARCHITECTURE a OF mi7485 IS
BEGIN PROCESS (a,b,amaybi,aigualbi,amenbi)
> = <
VARIABLE compare : STD_LOGIC_VECTOR(2 downto 0);
BEGIN
compare := 000;
IF a=b THEN
IF aigualbi=1 THEN compare(1):= 1; END IF;
> = <
IF amaybi=1
THEN compare(2):= 1; END IF;
IF amenbi=1
THEN compare(0):= 1; END IF;
END IF;
IF a<b THEN compare(0):= 1; END IF;
IF a>b THEN compare(2):= 1; END IF;
END IF;
amaybo <= compare(2); aigualbo <= compare(1); amenbo <= compare(0);
END PROCESS;
END a;

dato de entrada

217

BINARIO

0110=6

ARCHITECTURE a OF bin2gray IS
BEGIN
gray (ancho) <= bin (ancho);
gray (ancho-1 DOWNTO 1) <=
bin(ancho-1 DOWNTO 1)
XOR bin(ancho DOWNTO 2);
END a;

LIBRARY ieee; USE ieee.std_logic_1164.ALL;


ENTITY mi7485 IS PORT(
a,b:IN INTEGER RANGE 0 TO 15; amaybi,aigualbi,amenbi:IN STD_LOGIC;
amaybo,aigualbo,amenbo:OUT STD_LOGIC);
END mi7485 ;

02

GRAY

qu
en
od

ENTITY bin2gray IS
GENERIC (ancho : INTEGER := 8);
PORT(
bin : IN BIT_VECTOR (ancho DOWNTO 1);
gray : OUT BIT_VECTOR (ancho DOWNTO 1));
END ENTITY bin2gray;

Binario

ARCHITECTURE a OF brder IS
SIGNAL shf1,shf2,shf4: bit_vector
BEGIN
shf1 <= din WHEN sel(0)='0 ELSE
shf2 <= shf1 WHEN sel(1)='0 ELSE
shf4 <= shf2 WHEN sel(2)='0 ELSE
dout <= shf4 WHEN sel(3)='0 ELSE
END ARCHITECTURE a;

(15 DOWNTO 0);


din(0)
shf1(1
shf2(3
shf4(7

& din (15


DOWNTO 0)
DOWNTO 0)
DOWNTO 0)

DOWNTO 1);
& shf1(15 DOWNTO 2);
& shf2(15 DOWNTO 4);
& shf4(15 DOWNTO 8);

sel(3)

G.Jaquenod 2002, All Rights Reserved.

222

G.Jaquenod 2002, All Rights Reserved.

Copyright Guillermo Jaquenod, 2002

37

Hot Lab Support Initiative

VHDL: Lenguaje de
descripcin de hardware
XII Asamblea General del ISTEC, UTP, Panam, Noviembre de 2002

Operacin de un
Barrel Shifter Signed

Hot Lab Support Initiative

Hot Lab Support Initiative

Los 6 operandos de shift definidos en VHDL93 no son reconocidos por el


MAX+plus II, aunque puede definirse una funcin que realice esa tarea

G.Jaquenod 2002, All Rights Reserved.

20

Uso de recursos de mi_SLL

Cuntos recursos requiere la implementacin de una operacin de shift una


cantidad CONSTANTE de veces?

226

Recreando instrucciones de
SHIFT: SRL

Co
py
r

Hot Lab Support Initiative

Fuente: ALTERA
MAX+plus II HELP

G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

ig
ht
G.
Ja

FUNCTION mi_SLL (dato: IN std_logic_vector; cuenta: IN INTEGER)


RETURN std_logic_vector IS
SLL con shift negativo
VARIABLE tempo: std_logic_vector (dato'RANGE);
llama a SRL
VARIABLE izq,der: INTEGER;
BEGIN
Cuantos LEs
tempo := dato; izq := dato'LEFT; der := dato'RIGHT;
necesitar si
IF cuenta = 0
THEN RETURN tempo;
cuenta es
ELSIF cuenta < 0
THEN RETURN mi_SRL (dato,-cuenta);
constante?
ELSIF dato'LENGTH = 1 THEN RETURN B"0";
ELSIF izq > der THEN -- rango de dato es xx DOWNTO yy, con xx > yy
FOR i IN 1 TO cuenta LOOP
tempo (izq DOWNTO der+1):= tempo (izq-1 DOWNTO der); tempo(der):= '0';
END LOOP;
ELSE
-- rango de dato es xx TO yy, con xx < yy
FOR i IN 1 TO cuenta LOOP
tempo (izq TO der-1) := tempo (izq+1 TO der); tempo (der) := '0';
END LOOP;
END IF;
SLL
RETURN tempo;
Podra haber usado
END FUNCTION mi_SLL;
0
ASCENDING?
225

EPF10K10LC84-3

ARCHITECTURE a OF bsderlpm IS BEGIN


mishift: lpm_clshift
GENERIC MAP (LPM_WIDTH => 16,LPM_WIDTHDIST => 3,
LPM_SHIFTTYPE => "ARITHMETIC")
PORT MAP (data=>din, distance=>sel(2 DOWNTO 0),
direction=>sel(3), result=>dout );
END ARCHITECTURE a;

224

Recreando instrucciones de
SHIFT: SLL

Hot Lab Support Initiative

ENTITY bsderlpm IS PORT (din: IN std_logic_vector (15 DOWNTO 0);


sel:IN std_logic_vector(3 DOWNTO 0);
dout:OUT std_logic_vector(15 DOWNTO 0));
89 LEs y 26.4ns de
retardo usando una
END ENTITY bsderlpm ;

qu
en
od

G.Jaquenod 2002, All Rights Reserved.

LIBRARY ieee; USE ieee.std_logic_1164.ALL;


LIBRARY lpm; USE lpm.lpm_components.ALL;

02

ENTITY bsder IS PORT (din: IN bit_vector (15 DOWNTO 0);


sel:IN bit_vector(3 DOWNTO 0); dout:OUT bit_vector(15 DOWNTO 0));
END ENTITY bsder ;
62 LEs y 23.2ns de
ARCHITECTURE a OF bsder IS
retardo usando una
SIGNAL shf1,shf2,shf8: bit_vector (23 DOWNTO 0);
EPF10K10LC84-3
BEGIN
shf8 <= X"00" & din WHEN sel(3)='0' ELSE din & X"00";
shf1 <= shf8 WHEN sel(0)='0' ELSE '0' & shf8(23 DOWNTO 1);
shf2 <= shf1 WHEN sel(1)='0' ELSE B"00" & shf1(23 DOWNTO 2);
dout <= shf2(15 DOWNTO 0) WHEN sel(2)='0' ELSE shf2(19 DOWNTO 4);
END ARCHITECTURE a;

223

Barrel Shifter usando


LPM_CLSHIFT

FUNCTION mi_SLL (dato: IN std_logic_vector; cuenta: IN INTEGER)


RETURN std_logic_vector IS
Cuantos
VARIABLELEs
tempo: std_logic_vector (dato'RANGE);
SLL
Son slo cables
necesitar?
VARIABLE
izq,der: INTEGER;
que se cruzan!
BEGIN
0
tempo := dato; izq := dato'LEFT; der := dato'RIGHT;
IF cuenta = 0
THEN RETURN tempo;
ELSIF cuenta < 0
THEN RETURN mi_SRL (dato,-cuenta);
ELSIF dato'LENGTH = 1 THEN RETURN B"0";
ELSIF izq > der THEN -- rango de dato es xx DOWNTO yy, con xx > yy
FOR i IN 1 TO cuenta LOOP
tempo (izq DOWNTO der+1):= tempo (izq-1 DOWNTO der); tempo(der):= '0';
END LOOP;
ELSE
-- rango de dato es xx TO yy, con xx < yy
0
FOR i IN 1 TO cuenta LOOP
tempo (izq TO der-1) := tempo (izq+1 TO der); tempo (der) := '0';
END LOOP;
END IF;
RETURN tempo;
END FUNCTION mi_SLL;

NINGUNA!

G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

Los 6 operandos de shift definidos en VHDL93 no son reconocidos por el


MAX+plus II, aunque puede definirse una funcin que realice esa tarea
FUNCTION mi_SRL (dato: IN std_logic_vector; cuenta: IN INTEGER)
RETURN std_logic_vector IS
VARIABLE tempo: std_logic_vector (dato'RANGE);
SRL con shift negativo
VARIABLE izq,der: INTEGER;
llama a SLL
BEGIN
tempo := dato; izq := dato'LEFT; der := dato'RIGHT;
IF cuenta = 0
THEN RETURN tempo;
ELSIF cuenta < 0
THEN RETURN mi_SLL (dato,-cuenta);
ELSIF dato'LENGTH = 1 THEN RETURN B"0";
ELSIF izq > der THEN -- rango de dato es xx DOWNTO yy, con xx > yy
FOR i IN 1 TO cuenta LOOP
tempo (izq-1 DOWNTO der):= tempo (izq DOWNTO der+1); tempo(der):= '0';
END LOOP;
ELSE
-- rango de dato es xx TO yy, con xx < yy
FOR i IN 1 TO cuenta LOOP
tempo (izq+1 TO der) := tempo (izq TO der-1); tempo (der) := '0';
END LOOP;
END IF;
SRL
RETURN tempo;
END FUNCTION mi_SRL;
0

227

G.Jaquenod 2002, All Rights Reserved.

Bases de VHDL
Uso de elementos de memoria

228

G.Jaquenod 2002, All Rights Reserved.

Copyright Guillermo Jaquenod, 2002

38

VHDL: Lenguaje de
descripcin de hardware

Hot Lab Support Initiative

XII Asamblea General del ISTEC, UTP, Panam, Noviembre de 2002

Hot Lab Support Initiative

Intentar optimizar el diseo

A
B

ENTITY shaftlpm IS PORT (


a,b,z:IN std_logic;
pos:OUT std_logic_vector(8 DOWNTO 0));
END shaftlpm;

Giro Horario

230

A0
B0

Giro Horario
A0

B1

Si bien un contador GRAY de N bits puede hacerse usando un contador binario y un


trascodificador, con esa solucin se pierden todas las ventajas de ausencias de glitches
y se usan 2N macroceldas.

Una alternativa que aumenta la


resolucin y permite un diseo
sincronico con un reloj interno es
observar que:

en sentido horario la secuencia AB


es 00/10/11/01/00..
en sentido antihorario la secuencia
AB es 00/01/11/10/00...

232

Contador Cdigo GRAY


genrico

Co
py
r

Hot Lab Support Initiative

ENTITY graycont IS GENERIC (NBITS : INTEGER := 4);

Un algoritmo ms eficiente una slo N+1 macroceldas, que en base al bit actual Gi, al
previo Gi-1 y a una funcin Di-1 que viene desde la etapa previa calcula el siguiente Gi y
la funcin Di
Excepto la primer etapa (generacin de D-1) y la ltima etapa, las dems etapas tienen
una arquitectura como sigue
Ei
Evaluar los posibles usos de los modos de operacion

ARCHITECTURE a OF graycont IS

SIGNAL d: BIT_VECTOR (NBITS-1 downto 0); SIGNAL qt: BIT_VECTOR (NBITS downto 0);

BEGIN

sync: PROCESS (reloj,clr_n)


BEGIN

Ci

T Q Gi
clk

Di

En base a este mdulo un contador GRAY de N bits se configura


1

TQ
clk

TQ
clk

TQ
clk

D0

D1

D2

Q0
Q1
G.Jaquenod 2002, All Rights Reserved.

TQ
clk

TQ
clk

DN-1
Q2

QN-1

QN

Contadores Cdigo GRAY


Hot Lab Support Initiative

Resultados
de la
simulacin
funcional
usando
MAX+plus II

PORT (reloj,clr_n: IN BIT; q: OUT BIT_VECTOR (NBITS downto 1));

END ENTITY graycont;

IF clr_n='0' THEN qt <=

G.Jaquenod 2002, All Rights Reserved.

Contadores Cdigo GRAY

Giro Antihorario

G.Jaquenod 2002, All Rights Reserved.

Giro Antihorario

El uso de LPMs
simplifica el diseo y
casi siempre da
resultados de sntesis
mucho ms eficientes
En este caso el uso
de recursos baja de
26 LEs a slo 16 LEs!

Hot Lab Support Initiative

ig
ht
G.
Ja

ENTITY shaft1 IS PORT (a,b,z,reloj:IN BIT;


pos:OUT INTEGER RANGE 0 TO 1439);
END shaft1;
ARCHITECTURE a OF shaft1 IS BEGIN
PROCESS (reloj)
VARIABLE cont :INTEGER RANGE -1 TO 1440;
VARIABLE sent:INTEGER;
VARIABLE stat: BIT_VECTOR (1 DOWNTO 0):= B"00";
VARIABLE pack: BIT_VECTOR (3 DOWNTO 0);
BEGIN
pack := stat & a & b;
IF reloj='1' THEN
CASE pack IS
WHEN B"0010"|B"1011"|B"1101"|B"0100"=> sent:= 1;
WHEN B"0111"|B"1110"|B"1000"|B"0001"=> sent:=-1;
WHEN OTHERS=> sent := 0;
END CASE;
cont := cont+sent;
stat:= a & b;
IF (z='1') OR cont=1440 THEN cont:=0; END IF;
IF cont=-1 THEN cont:=1439; END IF;
END IF;
pos <= cont;
END PROCESS;
END a;

231

ARCHITECTURE a OF shaftlpm IS
BEGIN
shaftcnt: lpm_counter GENERIC MAP (
LPM_WIDTH => 9, LPM_MODULUS =>360)
PORT MAP (clock => a, updown =>b,
sclr => z, q => pos);
END a;

Giro Antihorario

Shaft Encoder: aumento 4x de la


resolucin (de 360 a 1440!!)

20

G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

Giro Horario

Es un dispositivo muy usado en aplicaciones industriales para el sensado de ngulos, y


genera tres seales:
dos seales A y B desfasadas entre s 1/4 de perodo, a razn de 360 pulsos por vuelta
una seal Z, de duracin menor a 1/360, a razn de una por vuelta.
La interfase ms simple usa A como reloj y B como control para definir si un contador de
angulo debe ser incrementado o decrementado
229

A
B

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
LIBRARY lpm;
USE lpm.lpm_components.ALL;

qu
en
od

Hot Lab Support Initiative

ENTITY shaft0 IS PORT (a,b,z:IN BIT;


pos:OUT INTEGER RANGE 0 TO 359);
END shaft0;
ARCHITECTURE a OF shaft0 IS BEGIN
PROCESS (a)
VARIABLE cont :INTEGER RANGE -1 TO 360;
VARIABLE sent:INTEGER;
BEGIN
IF a='1' THEN
IF b=0' THEN sent:= 1; ELSE sent:=-1; END IF;
cont := cont+sent;
IF (z='1') OR cont=360 THEN cont:=0; END IF;
IF cont=-1 THEN cont:=359; END IF;
END IF;
pos <= cont;
END PROCESS;
END a;

Interfase a Shaft Encoder


usando LPMs

02

Interfase a Shaft Encoder


Incremental

Ciclo

Cdigo GRAY

Dummy qt0

Ciclo

Cdigo GRAY

Dummy qt0

0000=0

1100=C

0001=1

1101=D

0011=3

1111=F

0010=2

1110=E

0110=6

1010=A

0111=7

1011=B

0101=5

1001=9

0100=4

1000=8

(others =>'0');

ELSIF reloj'EVENT AND reloj='1' THEN


qt(0) <= NOT(qt(0));

FOR i IN 1 TO NBITS-1 LOOP qt(i) <= qt(i) XOR (qt(i-1) AND d(i-1)); END LOOP;
qt(NBITS) <= qt(NBITS) XOR ( (qt(NBITS-1) OR qt(NBITS)) AND d(NBITS-1));

END IF;

END PROCESS sync;


d(0) <= '1';

dloop: FOR i IN 1 TO NBITS-1 GENERATE d(i) <= NOT(qt(i-1)) AND d(i-1);


END GENERATE;

q <= qt (NBITS downto 1);

END ARCHITECTURE a;

233

G.Jaquenod 2002, All Rights Reserved.

234

G.Jaquenod 2002, All Rights Reserved.

Copyright Guillermo Jaquenod, 2002

39

VHDL: Lenguaje de
descripcin de hardware

Hot Lab Support Initiative

XII Asamblea General del ISTEC, UTP, Panam, Noviembre de 2002

Hot Lab Support Initiative

235

CL

Q
CL

CL

Q
CL

ARCHITECTURE a OF johnson IS
BEGIN
sync: PROCESS (reloj,init)
BEGIN
IF init=1' THEN q <=(others =>'0');
ELSIF reloj'EVENT AND reloj='1' THEN
q(n DOWNTO 2) <= q (n-1 DOWNTO 1);
q(1) <= NOT (q(n));
END IF;
END PROCESS sync;
END ARCHITECTURE a;

G.Jaquenod 2002, All Rights Reserved.

PORT (n_init,reloj : IN BIT; taps : OUT BIT_VECTOR (LFSRTAPS DOWNTO 1));


END ENTITY lfsrn;
ARCHITECTURE a OF lfsrn IS
CONSTANT tablaxor : tabla := (X"0006",X"000C",X"0014",X"0030",X"0060",X"00B8",X"0110",
X"0240",X"0500",X"0829",X"100D",X"2015",X"6000",X"D008");
BEGIN

xorout : BIT;

FOR i IN 2 TO LFSRTAPS LOOP fftaps(i) <= fftaps (i-1); END LOOP;


fftaps (1) <= xorout;
END IF;
END PROCESS p0;
p1: PROCESS (fftaps)

VARIABLE temp : BIT; VARIABLE mask : BIT_VECTOR (16 DOWNTO 1);


BEGIN

temp := '0'; mask := tablaxor (LFSRTAPS);

FOR i IN 1 TO LFSRTAPS LOOP if (mask (i)='1') THEN temp := temp XOR fftaps(i); END IF; END LOOP;
xorout <= NOT (temp);
END PROCESS p1;
taps <= fftaps;
END ARCHITECTURE a;

237

G.Jaquenod 2002, All Rights Reserved.

238

x1

x2

x3 x4

Co
py
r

Adems del CRC-16 existen otras versiones de CRC muy usadas:


CRC-12: 1 + X +

X2

X3

X11

CRC-32: 1 + X + X2 + X4 + X5 + X7 + X8 + X10 + X11 + X12 + X16 + X22 + X23 + X26 + X32

din

xpass

dout

rdy
CRC_OK

Un generador/testeador de CRC-16 para transmisin y recepcion de mensajes


de N bits podra tener una arquitectura como la que se indica en el grfico

239

x7 x8 x9 x10 x11 x12 x13 x14 x15

G.Jaquenod 2002, All Rights Reserved.

240

x16

din
dout

El CRC emplea LFSRs, pero agregando como variable adicional un canal de


datos que ingresan en forma serial. De este modo, el proceso de generacin
de CRC es como sigue:
El registro se inicializa con todos sus bits en un valor predefinido (usualmente 1..1)
Se ingresan los datos en forma serial
Al finalizar este ingreso, el cdigo resultante en el registro es el CRC

De igual modo, el proceso de verificacinde CRC es el siguiente


El registro se inicializa con todos sus bits en el mismo valor predefinido (1..1)
Se ingresan los datos en forma serial, y luego de ellos el CRC
Al finalizar este ingreso, el cdigo resultante (el resto) debe ser todos ceros
G.Jaquenod 2002, All Rights Reserved.

Fuente: 74F401 en
www.fairchildsemi.com

Generador/testeador de CRC-16
Hot Lab Support Initiative

ARCHITECTURE a OF crcshft IS
CONSTANT mask: std_logic_vector (15 DOWNTO 0):= X"8005";
SIGNAL feedback: std_logic;
SIGNAL shf,inp : std_logic_vector (15 DOWNTO 0);
BEGIN
feedback <= (din XOR shf(15)) AND xpass;
inp (0) <= feedback;
l0: FOR i IN 1 TO 15 GENERATE
inp(i) <= (feedback AND mask(i)) XOR shf(i-1);
END GENERATE l0;
PROCESS (reloj) BEGIN
IF reloj = '1' THEN
IF init='1' THEN shf <= (others =>'1'); ELSE shf <= inp;
END IF;
END IF;
END PROCESS;
zero <= '1' WHEN shf = X"0000" ELSE '0';
dout <= shf(15) WHEN xpass='0' ELSE din;
END a;

donde CRC-12 es usada con datos de 6 bits, CRC-16 y CRC-CCITT para


caracteres de 8 bits, y CRC-32 en canales de comunicacin sincrnicos (por
ejemplo la norma IEEE-802 especifica el uso de CRC-32).

Control, contador de rango N+16) y detector de cero

x6

ENTITY crcshft IS PORT (dout,zero: OUT std_logic;


din,init,xpass,reloj: IN std_logic);
END crcshft;

CRC-CCITT: 1 + X5 + X12 + X16

Tx/Rx

x5

LIBRARY ieee; USE ieee.std_logic_1164.ALL;

X12

reloj
init

Al
Alser
serfuncin
funcinde
de22oo44
realimentaciones,
realimentaciones,bastan
bastanNNelementos
elementos
lgicos
para
un
LFSR
lgicos para un LFSRde
deNNbits
bits

reloj
init

Generador/testeador de CRC

Hot Lab Support Initiative

DQ

Generador/testeador de CRC

IF n_init = '0' THEN fftaps <= (others=>'0');


ELSIF reloj'EVENT AND reloj = '1' THEN

DQ

Hot Lab Support Initiative

ig
ht
G.
Ja

fftaps : BIT_VECTOR (LFSRTAPS DOWNTO 1); SIGNAL

DQ

G.Jaquenod 2002, All Rights Reserved.

x0

SUBTYPE mascara IS BIT_VECTOR (16 DOWNTO 1); TYPE tabla IS ARRAY (3 TO 16) OF mascara;

p0: PROCESS (reloj,n_init) BEGIN

Pero los recursos de cableado que usa


son mucho menores, por lo que es ms
veloz y ms fcil de rutear

DQ

CRC-16: 1+X2+X15+X16

ENTITY lfsrn IS GENERIC (LFSRTAPS : INTEGER RANGE 3 TO 16 :=3); -- cantidad de etapas, entre 3 y 16

SIGNAL

Si las realimentaciones son bien elegidas,


la secuencia generada se repite luego de
2N-1 ciclos de reloj, lo que aproxima su
eficiencia de uso de flipflops al de un
contador binario puro (2N estados)

236

LFSR genrico, de 3 a 16
etapas

Hot Lab Support Initiative

Se basa en un shift register de N etapas,


donde el valor que se ingresa a la primer
etapa se calcula como el XNOR de 2 o 4
etapas intermedias (siempre est la salida
de la ltima etapa).

ENTITY johnson IS GENERIC (n:INTEGER:= 8);


PORT (reloj,init: IN BIT;
q: BUFFER BIT_VECTOR (n DOWNTO 1));
END ENTITY johnson;

Realimentacion desde
2 etapas

LUT

LUT

CL

LUT

20

Estos beneficios ya no son tales


al usar lgica programable,
donde tienen igual performance
que un contador LFSR

qu
en
od

En diseos de microelectrnica
de RF suelen ser usados como
prescalers en las primeras
etapas, dada su alta simplicidad
circuital y la rpida velocidad de
operacin

Un Linear Feedback Shift Register


(LFSR) es un caso de mquina sincrnica
de enorme simplicidad circuital

LUT

Hot Lab Support Initiative

Los contadores Johnson son


ineficientes en el uso de
registros, por cuanto la cantidad
de estados distintos es slo el
doble de los registros usados

Contador Linear Feedback Shift


Register

02

Contadores Johnson

Uso 22 LEs:
16 para shift
1 para MUX dout
4 para zero

El LE adicional genera una


funcion interna necesaria
porque la entrada a cada
LE es funcion de 5
variables: init, din, shf(15),
xpass y shf(i-1)

G.Jaquenod 2002, All Rights Reserved.

Copyright Guillermo Jaquenod, 2002

40

VHDL: Lenguaje de
descripcin de hardware

Hot Lab Support Initiative

XII Asamblea General del ISTEC, UTP, Panam, Noviembre de 2002

Generador/testeador de CRC-16

Cmputo paralelo de CRC-16


Hot Lab Support Initiative

Porqu usa 3
LIBRARY ieee; USE ieee.std_logic_1164.ALL;
Uso
Uso38
38LEs:
LEs:
LEs para ena?
LIBRARY ieee; USE ieee.std_logic_unsigned.ALL;
22
crcshift
22para
paracrcshift
LIBRARY lpm; USE lpm.lpm_components.ALL;
99para
el
contador
para el contador
ENTITY crc16 IS PORT (
33para
ena
paraena
init,reloj,txrx,din: IN std_logic;
33para
xpass
paraxpass
dout,nrdy,crc_ok: OUT std_logic);
END crc16;
ARCHITECTURE a OF crc16 IS
CONSTANT NMSG : INTEGER :=30; -- largo del mensaje
COMPONENT crcshift PORT (dout,zero: OUT std_logic;
din,init,xpass,reloj: IN std_logic); END COMPONENT;
SIGNAL xpass,ena,cntval: std_logic; SIGNAL conta: std_logic_vector (8 DOWNTO 0);
SIGNAL crcx: std_logic_vector (15 DOWNTO 0);
BEGIN
shift: crcshift PORT MAP
(dout=>dout,zero=>crc_ok,din=>din,init=>init,xpass=>xpass,reloj=>reloj);
shaftcnt: lpm_counter GENERIC MAP (LPM_WIDTH => 9)
PORT MAP (clock => reloj, sclr =>init, cnt_en => ena,q => conta);
cntval <= '1' WHEN (conta < NMSG) ELSE '0'; xpass <= '1' WHEN txrx='0' ELSE cntval;
ena
<= '1' WHEN (conta < NMSG+15) ELSE '0';
nrdy
<= ena;
END a;

X8
X7

X7
X6

X6
X5

T=8

243

R15

X87
X65
X43
X21

X76
X54
X32
X1

R14

X87

R13

X76

R12

X65

R11

X5
X4

R10

X4
X3

R9

X3
X2

R8

Q16
X2
X1

R7

Q15
X1

R11

X54

R10

R6

Q14

R5

Q13

R4

Q12

R3

Q11

R2

R1

Q10

Q9
X8
X7
X6
X5
X4
X3
X2
X1

X43

R9

R8

R7

R6

R5

R4

R3

R2

R1

X32

Q16
X21

Q15
X1

Q14

Q13

Q12

Q11

Q10

Q9
Xf

G.Jaquenod 2002, All Rights Reserved.

R11

R10

R9

R8

R7

R6

R5

R4

R3

R2

R1

Q12

Q11

Q10

Q9

Q8

Q7

Q6

Q5

Q4

Q3

Q2

Q1

T=1

Q1
D1

Q16

Q15
Q1
D1

Q14

Q13

Q12

Q11

Q10

Q9

Q8

Q7

Q6

Q5

Q4

Q3

Q2
Q1
D1

Q1
Di

Q16
Q2
Q1
D1
D2

Q15
Q1
Di

Q14

Q13

Q12

Q11

Q10

Q9

Q8

Q7

Q6

Q5

Q4

Q3
Q2
Q1
D1
D2

Q2
Q1
D1
D2

T8

Perez, A. 1983. "Byte-wise CRC


Calculations." IEEE Micro. June. 40-50

R16

R15

R14

R13

R12

R11

R10

R9

R8

R7

R6

R5

R4

R3

R2

R1

X87,X65
X43,X21

X76,X54
X32,X1

X87

X76

X65

X54

X43

X32

Q16
X21

Q15
X1

Q14

Q13

Q12

Q11

Q10

Q9
Xf

D[8..1]

244

Slo necesito los 16 registros de


CRC ms otros 9 operando en
modo combinatorio para calcular
un nuevo byte de CRC en un nico
ciclo de reloj (modo NORMAL)
El peor caso para la velocidad es el
clculo de R1, que requiere
atravesar dos LE combinatorios
Conviene poner X87, X65, X43, X21,
Xf y R1 en un clique
Usando register packing los
recursos usados son menores (Xf
es generado por R16, X1 por R7,..),
puede bajar a 17 LEs, y ser tan
eficiente como la solucin serie

Co
py
r
G.Jaquenod 2002, All Rights Reserved.

X76
X54
X32
X1
X87
X65
X43
X21
Xf

R16
R15
R14
R13
R12
R11
R10
R9
R8
R7
R6
R5
R4
R3
R2
R1

Q[16..1]

G.Jaquenod 2002, All Rights Reserved.

Shift & Store (tipo CMOS 4094)


Hot Lab Support Initiative
LIBRARY ieee; USE ieee.std_logic_1164.ALL;

LIBRARY ieee; USE ieee.std_logic_1164.ALL;


ENTITY crc16byte IS PORT (q : BUFFER std_logic_vector (16 downto 1);
d : IN std_logic_vector (8 downto 1); ninit,reloj : IN std_logic);
END ENTITY crc16byte;
ARCHITECTURE a OF crc16byte IS
SIGNAL X: std_logic_vector(8 downto 1); SIGNAL inp: std_logic_vector(16 downto 1);
BEGIN
x(1) <= q(1) xor d(1);
xg: for i in 2 to 8 generate x(i) <= d(i) xor q(i) xor d(i-1) xor q(i-1); end generate;
inp(16) <= x(8) xor x(6) xor x(4) xor x(2);
inp(15) <= x(7) xor x(5) xor x(3) xor x(1);
inp (14) <= x(8); inp (13) <= x(7); inp (12) <= x(6);
inp (11) <= x(5); inp (10) <= x(4); inp (9) <= x(3);
inp (8) <= q(16) xor x(2); inp (7) <= q(15) xor x(1); inp (6) <= q(14);
inp (5) <= q(13); inp (4) <= q(12); inp (3) <= q(11); inp (2) <= q(10);
inp(1) <= x(8) xor x(6) xor x(4) xor x(2) xor q(9);
PROCESS (ninit,reloj) IS BEGIN
IF (ninit = '0') THEN q <= (OTHERS => '1');
ELSIF reloj'EVENT AND reloj = '1' THEN
q <= inp;
END IF;
END PROCESS;
END ARCHITECTURE a;

245

Perez, A. 1983. "Byte-wise CRC


Calculations." IEEE Micro. June. 40-50

En base a las expresiones resultantes puede evaluarse la red de conexiones:

Cmputo paralelo de CRC-16

Hot Lab Support Initiative

20

R12

Q13

Cmputo paralelo de CRC-16

Viendo que un elemento lgico tiene 4 entradas, y que cada Xi requiere dos
variables, pueden definirse trminos Xij = ( Xi xor Xj ), solucionables con un
nico LE, y llamando Xf = ( X87 xor X65 xor X43 xor X21 ), queda:
R16

R13

Q14

ENTITY shift_store IS GENERIC (largo: INTEGER := 8);


PORT (reloj,din,store:IN STD_LOGIC;
dout:OUT STD_LOGIC; data: OUT STD_LOGIC_VECTOR (largo-1 DOWNTO 0));
END shift_store;

din
ARCHITECTURE a OF shift_store IS
SIGNAL regshf : STD_LOGIC_VECTOR (largo-1 DOWNTO 0);
store
BEGIN
PROCESS (reloj) BEGIN
reloj
IF reloj=1 THEN
regshf (largo-1 DOWNTO 1)<=regshf (largo-2 DOWNTO 0);
regshf (0)<=din;
END IF;
END PROCESS;
PROCESS (store) BEGIN
IF store=1 THEN data <= regshf; END IF;
END PROCESS;
dout
dout <= regshf (largo-1);
END a;

246

data

X7
X6
X5
X4
X3
X2
X1

R14

Q15

Hot Lab Support Initiative

ig
ht
G.
Ja

T=8

X8
X7
X6
X5
X4
X3
X2
X1

R12

R15

Q16

G.Jaquenod 2002, All Rights Reserved.

242

Siguiendo el anlisis hasta T=8, y llamando Xi a Di XOR Qi, se puede llegar a:


R13

R16
T=0

T=2

Cmputo paralelo de CRC-16

R14

dout

Dados los 16 registros R[16..1] usados en un CRC-16 y su valor inicial


Q16..Q1, y conocidos 8 datos sucesivos de entrada Di (D1..D8), puede
evaluarse qu sucede luego de 8 ciclos de reloj

Hot Lab Support Initiative

R15

Q1

di

G.Jaquenod 2002, All Rights Reserved.

R16

Q14 Q13 Q12 Q11 Q10 Q9 Q8 Q7 Q6 Q5 Q4 Q3 Q2

reloj
init

qu
en
od

241

Q16 Q15

02

Hot Lab Support Initiative

G.Jaquenod 2002, All Rights Reserved.

Copyright Guillermo Jaquenod, 2002

41

VHDL: Lenguaje de
descripcin de hardware

Hot Lab Support Initiative

XII Asamblea General del ISTEC, UTP, Panam, Noviembre de 2002

Recuperador de reloj
behavioral
e2

e3

e7

e6
e<=
e<=
e<=
e<=
e<=
e<=
e<=

X"04";
X"08";
X"10";
X"20";
X"40";
X"80";
X"01";

END
END
END
END
END
END
END

ARCHITECTURE a OF recupclka IS
SIGNAL rxdly,edge : bit;
SIGNAL e: bit_vector (8 DOWNTO 1);
BEGIN
PROCESS (rxck_8x,nreset) IS
BEGIN
IF nreset='0' THEN e <= X"00";
ELSIF rxck_8x'EVENT and rxck_8x='1' THEN
rxdly <= rxd; -- rxd demorado un ciclo
edge <= rxdly XOR rxd; -- detector de transicion
e(1) <= NOT((e(8) AND NOT(edge)) OR (e(7) AND edge));
e(2) <= NOT(e(1)) OR ((e(8) OR e(2)) AND edge);
e(3) <= (e(2) AND NOT(edge)) OR (e(3) AND edge);
e(4) <= (e(3) AND NOT(edge)) OR (e(4) AND edge);
e(5) <= (e(4) AND NOT(edge));
e(6) <= (e(5) AND NOT(edge));
e(7) <= (e(6) AND NOT(edge)) OR (e(5) AND edge);
e(8) <= (e(7) AND NOT(edge)) OR (e(6) AND edge);
END IF;
END PROCESS;
rxck <= e(4);
END ARCHITECTURE a;

e4

IF;
IF;
IF;
IF;
IF;
IF;
IF;

e5
el flanco se
engancha ac

Estediseo,
diseo,compilado
compilado
Este
conMAX+Plus
MAX+PlusII,
II,
con
requiere32
32LEs
LEs
requiere

G.Jaquenod 2002, All Rights Reserved.

247

Hot Lab Support Initiative

248

Ejemplos: multiplicador iterativo


por shift/suma

LIBRARY
LIBRARY ieee;
ieee; USE
USE ieee.std_logic_1164.ALL;
ieee.std_logic_1164.ALL;
LIBRARY
LIBRARY ieee;
ieee; USE
USE ieee.std_logic_unsigned.ALL;
ieee.std_logic_unsigned.ALL;

MULTIPLICANDO

MULTIPLICADOR

ARCHITECTURE
ARCHITECTURE aa OF
OF cysel64
cysel64 IS
IS
SIGNAL
SIGNAL slo,shi0,shi1:
slo,shi0,shi1:
std_logic_vector(33
std_logic_vector(33 DOWNTO
DOWNTO 1);
1);
BEGIN
BEGIN
slo
<=
'0'&
a(32
DOWNTO
1)
slo <= '0'& a(32 DOWNTO 1)
++ b(32
b(32 DOWNTO
DOWNTO 1)
1) ++ cin;
cin;
shi0
<=
'0'&
a(64
DOWNTO
33)
shi0 <= '0'& a(64 DOWNTO 33)
++ b(64
b(64 DOWNTO
DOWNTO 33);
33);
shi1
shi1 <=
<= '0'&
'0'& a(64
a(64 DOWNTO
DOWNTO 33)
33)
++ b(64
DOWNTO
33)
+
b(64 DOWNTO 33) + '1';
'1';

ACUMULADOR

Hacerlo
genrico!

Ejemplos: Sumador serial


Carry Save Adder

ENTITY
ENTITY seradd
seradd IS
IS PORT
PORT ((
a,b,reloj,init:IN
a,b,reloj,init:IN BIT;
BIT; s:OUT
s:OUT BIT);
BIT);
END
END seradd
seradd ;;

ARCHITECTURE
ARCHITECTURE aa OF
OF seradd
seradd IS
IS
SIGNAL
SIGNAL c:
c: BIT;
BIT;
BEGIN
BEGIN
PROCESS
PROCESS (reloj,init)
(reloj,init) BEGIN
BEGIN
IF
IF (init=1)
(init=1) THEN
THEN s<=0;
s<=0; c<=0;
c<=0;
ELSIF
ELSIF relojEVENT
relojEVENT AND
AND reloj=1
reloj=1 THEN
THEN
ss <=
<= aa XOR
XOR bb XOR
XOR c;
c;
cc <=
<= (a
(a AND
AND b)
b) OR
OR (a
(a AND
AND c)
c) OR
OR (b
(b AND
AND c);
c);
END
END IF;
IF;
END
END PROCESS;
PROCESS;
END
END a;
a;

a
b

A
B
C

D Q
Ck
CL

S
c0

reloj

En el caso de dos operandos a y b que ingresen simultneamente, empezando por el


LSB hasta el MSB, es posible usar un circuito simple, que slo requiere 2 LEs, y cuya
latencia es de slo 1 ciclo de reloj.

En este circuito un LE calcula la suma de los datos de entrada ms el acarreo generado


en la etapa previa (salida s), y el otro LE calcula el acarreo generado en esa etapa y lo
almacena (Carry Save) para su posterior uso al calcular el bit siguiente.

G.Jaquenod 2002, All Rights Reserved.

e4

Fuente: R.Andraka.

e5

Pensando en la sntesis
obtengo los siguientes
beneficios:
Bajo de 32 LEs a slo 10 LEs
Anda mucho ms rpido
Evito metaestabilidades
Fuerzo el uso de ONE-HOT!!

252

AH

BH

N/2 Adder

AH

N/2 Adder

Ci

Co

BH

Co

AL

0
Ci

BL

N/2 Adder

Co
0

SH

SL

La idea de Carry-select es simple:


Usa 3 sumadores (slo, shi0, y shi1) de N/2 bits:
uno para la mitad inferior de los sumandos
dos para la parte superior, donde en uno de
stos se supone que el carry de entrada ser
0 (shi0) y en el otro que ser 1(shi1).
En funcin de la salida de carry de slo se opta
entre los posibles resultados shi0 y shi1
Consume el doble de recursos (132 vs 66 LEs),
pero tambin casi duplica la velocidad

G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

Ejemplos:
Sumador/restador Serial

ARCHITECTURE
ARCHITECTURE aa OF
OF seraddsub
seraddsub IS
IS
SIGNAL
SIGNAL c:
c: BIT;
BIT; --- carry/borrow
carry/borrow
BEGIN
BEGIN
PROCESS
PROCESS (reloj,init)
(reloj,init) BEGIN
BEGIN
IF
IF (init=1)
(init=1) THEN
THEN s<=0;
s<=0; c<=0;
c<=0;
ELSIF
ELSIF relojEVENT
relojEVENT AND
AND reloj=1
reloj=1 THEN
THEN
ss <=
<= aa XOR
XOR bb XOR
XOR c;
c;
IF
IF sr=1
sr=1
THEN
-sr=1
indica
suma
THEN -- sr=1 indica suma
cc <=
<= (m
(m AND
AND s)
s)
OR
OR (m
(m AND
AND c)
c)
OR
OR (s
(s AND
AND c);
c);
ELSE
ELSE --- sr=0
sr=0 indica
indica resta
resta
cc <=
<= (NOT(m)
(NOT(m) AND
AND s)
s)
OR
(NOT(m)
OR (NOT(m) AND
AND c)
c)
OR
OR (s
(s AND
AND c);
c);
END
END IF;
IF;
END
END IF;
IF;
END
END PROCESS;
PROCESS;
END
END a;
a;

CSA

e6

ENTITY
ENTITY seraddsub
seraddsub IS
IS PORT
PORT ((
m,s,sr,reloj,init:IN
m,s,sr,reloj,init:IN BIT;
BIT; s:OUT
s:OUT BIT);
BIT);
END
END seraddsub;
seraddsub;

D Q
Ck
CL

init

e3

e7

Cout

s(32
s(32 DOWNTO
DOWNTO 1)
1) <=
<= slo(32
slo(32 DOWNTO
DOWNTO 1);
1);
s(64
s(64 DOWNTO
DOWNTO 33)
33) <=
<=
shi0
shi0 (32
(32 DOWNTO
DOWNTO 1)
1) WHEN
WHEN slo(33)='0'
slo(33)='0'
ELSE
shi1
(32
DOWNTO
1);
ELSE shi1 (32 DOWNTO 1);
cout
<=
shi0
(33)
WHEN
slo(33)='0'
cout <= shi0 (33) WHEN slo(33)='0'
ELSE
ELSE shi1
shi1 (33);
(33);
END
END a;
a;

250

Co
py
r

Hot Lab Support Initiative

e2

Ejemplos:
sumador Carry-select

LIBRARY
LIBRARY ieee;USE
ieee;USE ieee.std_logic_1164.ALL;
ieee.std_logic_1164.ALL;
LIBRARY
LIBRARY ieee;USE
ieee;USE ieee.std_logic_unsigned.ALL;
ieee.std_logic_unsigned.ALL;
ENTITY
ENTITY cysel64
cysel64 IS
IS
PORT
(a,b:IN
PORT (a,b:IN std_logic_vector(64
std_logic_vector(64 DOWNTO
DOWNTO 1);
1);
s:
OUT
std_logic_vector(64
s: OUT std_logic_vector(64 DOWNTO
DOWNTO 1);
1);
cin:IN
std_logic;
cin:IN std_logic; cout:OUT
cout:OUT std_logic);
std_logic);
END
cysel64;
END cysel64;

ig
ht
G.
Ja
CONTROL

G.Jaquenod 2002, All Rights Reserved.

249

251

SUMADOR

e8

G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

ENTITY
ENTITY iteramult
iteramult IS
IS PORT
PORT ((
mr,mo:IN
mr,mo:IN std_logic_vector
std_logic_vector (8
(8 DOWNTO
DOWNTO 1);
1);
init,reloj:
init,reloj: IN
IN std_logic;
std_logic; rdy:OUT
rdy:OUT std_logic;
std_logic;
res:
res: BUFFER
BUFFER std_logic_vector
std_logic_vector (16
(16 DOWNTO
DOWNTO 1));
1));
END
END ENTITY
ENTITY iteramult
iteramult ;;
ARCHITECTURE
ARCHITECTURE aa OF
OF iteramult
iteramult IS
IS
BEGIN
BEGIN
PROCESS
PROCESS (reloj)
(reloj) IS
IS
VARIABLE
VARIABLE cnt
cnt :: INTEGER
INTEGER RANGE
RANGE 00 TO
TO 8;
8;
VARIABLE
VARIABLE moshf:std_logic_vector(16
moshf:std_logic_vector(16 DOWNTO
DOWNTO 1);
1);
VARIABLE
VARIABLE mrshf:std_logic_vector(8
mrshf:std_logic_vector(8 DOWNTO
DOWNTO 1);
1);
BEGIN
BEGIN
IF
IF reloj='1'
reloj='1' THEN
THEN
IF
IF init
init == '1'
'1' THEN
THEN moshf:=
moshf:= X"00"
X"00" && mo;
mo; cnt:=0;
cnt:=0;
mrshf
mrshf :=
:= mr;
mr; res
res <=
<= X"0000";rdy
X"0000";rdy <=
<= '0';
'0';
ELSIF
ELSIF cnt
cnt << 88 THEN
THEN
IF
IF mrshf(1)
mrshf(1) == '1'
'1' THEN
THEN res
res <=
<= moshf+res;
moshf+res; END
END IF;
IF;
moshf
moshf :=
:= moshf
moshf (15
(15 DOWNTO
DOWNTO 1)
1) && '0';
'0';
mrshf
mrshf :=
:= '0'
'0' && mrshf(8
mrshf(8 DOWNTO
DOWNTO 2);
2);
if
if cnt/=7
cnt/=7 THEN
THEN rdy<='0';
rdy<='0'; ELSE
ELSE rdy<='1';
rdy<='1'; END
END IF;
IF;
cnt
cnt :=
:= cnt+1;
cnt+1;
END
END IF;
IF;
END
END IF;
IF;
END
END PROCESS;
PROCESS;
END
END ARCHITECTURE
ARCHITECTURE a;
a;

e1

02

e8

ENTITY recupclka IS PORT (rxd,rxck_8x,nreset: IN bit; rxck: OUT bit);


END ENTITY recupclka;

20

ARCHITECTURE a OF recupclk IS
SIGNAL rxdly,edge : bit;
SIGNAL e: bit_vector (8 DOWNTO 1);
BEGIN
edge <= rxdly XOR rxd; -- detector de transicion
PROCESS (rxck_8x) IS
BEGIN
IF rxck_8x='1' THEN
rxdly <= rxd; -- rxd demorado un ciclo
CASE e IS
WHEN X"02" => IF edge='1' THEN e <= X"02"; ELSE
WHEN X"04" => IF edge='1' THEN e <= X"04"; ELSE
WHEN X"08" => IF edge='1' THEN e <= X"08"; ELSE
WHEN X"10" => IF edge='1' THEN e <= X"40"; ELSE
WHEN X"20" => IF edge='1' THEN e <= X"80"; ELSE
WHEN X"40" => IF edge='1' THEN e <= X"01"; ELSE
WHEN X"80" => IF edge='1' THEN e <= X"02"; ELSE
WHEN OTHERS => e <= X"02";
END CASE;
END IF;
END PROCESS;
rxck <= e(5);
END ARCHITECTURE a;

Hot Lab Support Initiative

e1

qu
en
od

Hot Lab Support Initiative

ENTITY recupclk IS PORT (rxd,rxck_8x: IN bit; rxck: OUT bit);


END ENTITY recupclk;

Recuperador de reloj
pensando en la sntesis

G.Jaquenod 2002, All Rights Reserved.

m
s
s/r

reloj
init

A
B
x
Ci

D Q
Ck
CL

cO
D Q
Ck
CL

Dado que cada LE tiene una tabla


LUT de 4 entradas, ampliar el
sumador serial a
sumador/restador serial se hace
sin consumir ms recursos, pues
tambin slo requiere 2 LEs, y su
latencia es de 1 ciclo de reloj.
Fuente: R.Andraka.

Copyright Guillermo Jaquenod, 2002

42

VHDL: Lenguaje de
descripcin de hardware

Hot Lab Support Initiative

XII Asamblea General del ISTEC, UTP, Panam, Noviembre de 2002

Ejemplos:
Complementador serial

Hot Lab Support Initiative


mr(N-1)

reloj
init

D Q
Ck
CL

s
D
Q
DFF

D Q
Ck
CL

A partir de all los bits restantes se invierten


G.Jaquenod 2002, All Rights Reserved.

Fuente: R.Andraka.

Ejemplos: Multiplicador
serial sin signo

ENTITY
ENTITY umulser
umulser IS
IS GENERIC
GENERIC (N:INTEGER:=
(N:INTEGER:= 16);
16);
PORT
PORT (rel,init,m0:IN
(rel,init,m0:IN BIT;
BIT; mr:IN
mr:IN BIT_VECTOR(N
BIT_VECTOR(N DOWNTO
DOWNTO 1);
1);
res:OUT
res:OUT BIT);
BIT);
END
END umulser;
umulser;

254

G.Jaquenod 2002, All Rights Reserved.

gnt0

gnt3

gnt1

gnt2

reloj

req0
req1
req2
req3

cycle
start

257

gnt0
gnt1
gnt2
gnt3

mr(N-1)

256

Un rbitro sincrnico
Round Robin

a
b

res

CSA

Fuente: R.Andraka.

Ejemplos: Multiplicador
serial con signo

mr(N-2)

D
Q
Ca2

a
b

m(1)

m(0)

CSA

a
b

s
CSA

a
b

res

CSA

rel
init

El multiplicador serial con signo es casi idntico al sin signo, slo que en
la primer etapa, en vez de un simple flipflop D, debe colocarse un
circuito de complemento a 2

G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

Fuente: R.Andraka.

rbitro Round Robin:


tabla de decisin

LIBRARY
LIBRARY ieee;
ieee; USE
USE ieee.std_logic_1164.ALL;
ieee.std_logic_1164.ALL;

Un
Unarbitro
arbitroROUND
ROUNDROBIN
ROBINimplementa
implementaun
uncircuito
circuito
de
deprioridad
prioridadvariable,
variable,donde
dondeen
enfuncin
funcindel
delestado
estado
actual
(gnt0..3)
y
las
entradas
req0..3
se
define
actual (gnt0..3) y las entradas req0..3 se definela
la
prioridad
prioridadde
deatencin
atencinaaesas
esasentradas.
entradas.
por
porejemplo,
ejemplo,sisignt0
gnt0est
estactiva,
activa,req1
req1tendr
tendrla
la
mxima
mximaprioridad,
prioridad,seguido
seguidopor
porreq2
req2 yyslo
slo
despus
despuspor
porreq3;
req3;al
alactivarse
activarsegnt1,
gnt1,la
laprioridad
prioridad
ser
serahora
ahorade
dereq2
req2seguida
seguidapor
porreq3
req3 yyluego
luegopor
por
req0.
req0.
de
deeste
estemodo
modose
setrata
tratade
deasegurar
aseguraruna
unaasignacin
asignacin
de
deprioridades
prioridadesequitativa.
equitativa.
Como
Comoseales
sealesauxiliares:
auxiliares:
start
startavisa
avisacuando
cuandoel
elcontrol
controldel
delsistema
sistemase
se
asigna
a
un
nuevo
asigna a un nuevomaster
master
cycle
cycleindica
indicaal
alrbitro
rbitroque
queel
eltiempo
tiempodisponible
disponible
para
parael
elmaster
masteractual
actualse
seagot,
agot,por
porlo
loque
quesisi
hay
hayalgun
algunotro
otroen
enespera
esperale
leser
serasignado
asignadoel
el
control
control

G.Jaquenod 2002, All Rights Reserved.

CSA

mo

Co
py
r

Hot Lab Support Initiative

a
b

G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

BEGIN
BEGIN
genprod:
genprod: FOR
FOR ii IN
IN NN DOWNTO
DOWNTO 11
GENERATE
GENERATE prod(i)
prod(i) <=
<= mr(i)
mr(i) AND
AND m0;
m0;
END
END GENERATE;
GENERATE;
gencsa:
gencsa: FOR
FOR ii IN
IN N-1
N-1 DOWNTO
DOWNTO 11
GENERATE
GENERATE chaincsa:
chaincsa: seradd
seradd PORT
PORT MAP(a=>prod(i),b=>chain(i+1),reloj=>rel,
MAP(a=>prod(i),b=>chain(i+1),reloj=>rel,
init=>init,
init=>init, s=>chain(i));
s=>chain(i));
END
END GENERATE;
GENERATE;
PROCESS
PROCESS (rel,init)
(rel,init) BEGIN
BEGIN
IF
IF (init=1)
(init=1) THEN
THEN chain(N)<=0;
chain(N)<=0;
ELSIF
ELSIF relEVENT
relEVENT AND
AND rel=1
rel=1 THEN
THEN chain(N)
chain(N) <=
<= prod(N);
prod(N);
END
END IF;
IF;
END
END PROCESS;
PROCESS;
res
res <=
<= chain(1);
chain(1);
END
END a;
a;
255

mr(0)

El multiplicador serial es til cuando, para realizar una multiplicacin, el multiplicador


mr es conocido en forma paralela, en tanto el multiplicando mo ingresa en forma serial
El producto de cada bit de mr por mo es realizado usando N funciones AND.
El resultado de cada producto parcial es sumado, mediante una cadena de
sumadores seriales, al resultado acumulado hasta ese entonces y desplazado a la
derecha. La primer etapa no recibe acarreo de anteriores, por lo que basta un FFD.
La salida del sumador serial menos significativo (res) corresponde al producto.
Es necesario generar 2xN-1 ciclos de reloj, durante los N primeros ingresar el
multiplicando mo (LSB primero) y durante los restantes ingresar 0, para vaciar las
etapas carry save

ig
ht
G.
Ja

ARCHITECTURE
ARCHITECTURE aa OF
OF umulser
umulser IS
IS
COMPONENT
COMPONENT seradd
seradd PORT
PORT (a,b,reloj,init:IN
(a,b,reloj,init:IN BIT;
BIT; s:OUT
s:OUT BIT);
BIT); END
END COMPONENT;
COMPONENT;
SIGNAL
SIGNAL prod,chain:
prod,chain: BIT_VECTOR
BIT_VECTOR (N
(N DOWNTO
DOWNTO 1);
1);

s
CSA

qu
en
od

Desde el LSB hacia adelante, hasta encontrar el primer 1 (inclusive), la entrada es


copiada en forma textual en la salida

a
b

rel
init

El complementador serial implementa el algoritmo tradicional para calcular el


complementar a dos de un nmero:

Hot Lab Support Initiative

mr(1)

20

ARCHITECTURE
ARCHITECTURE aa OF
OF com2dos
com2dos IS
IS
SIGNAL
SIGNAL flg:
flg: BIT;
BIT;
BEGIN
BEGIN
PROCESS
(reloj,init)
BEGIN
PROCESS (reloj,init) BEGIN
IF
IF (init=1)
(init=1) THEN
THEN
s<=0;
s<=0; flg
flg <=0;
<=0;
ELSIF
ELSIF relojEVENT
relojEVENT AND
AND reloj=1
reloj=1 THEN
THEN
ss <=
<= aa XOR
XOR flg;
flg;
flg
<=
a
OR
flg;
flg <= a OR flg;
END
IF;
END IF;
END
END PROCESS;
PROCESS;
END
END a;
a;

253

mr(N-2)

mo

02

Hot Lab Support Initiative


ENTITY
ENTITY com2dos
com2dos IS
IS PORT
PORT ((
a,reloj,init:IN
a,reloj,init:IN BIT;
BIT; s:OUT
s:OUT BIT);
BIT);
END
END com2dos;
com2dos;

Ejemplos: Multiplicador
serial sin signo

ENTITY
ENTITY rrobtab
rrobtab IS
IS PORT
PORT ((
req:
req: IN
IN std_logic_vector
std_logic_vector (3
(3 DOWNTO
DOWNTO 0);
0);
actual
actual :: IN
IN std_logic_vector
std_logic_vector (3
(3 DOWNTO
DOWNTO 0);
0);
nuevo:OUT
nuevo:OUT std_logic_vector
std_logic_vector (3
(3 DOWNTO
DOWNTO 0));
0));
END
END rrobtab;
rrobtab;

req0
req1
req2
req3

actual
nuevo

Este diseo
ARCHITECTURE
ARCHITECTURE aa OF
OF rrobtab
rrobtab IS
IS
no funciona.
SIGNAL
SIGNAL concat:
concat: std_logic_vector
std_logic_vector (7
(7 DOWNTO
DOWNTO 0);
0);
Porqu?
BEGIN
BEGIN
concat
concat <=
<= actual&req;
actual&req;
WITH
WITH concat
concat SELECT
SELECT
nuevo
nuevo <=
<= "0001"
"0001" WHEN
WHEN "0001000X"|"001000X1"|"01000XX1"|"1000XXX1",
"0001000X"|"001000X1"|"01000XX1"|"1000XXX1",
"0010"
"0010" WHEN
WHEN "0001XX1X"|"001000X0"|"01000X10"|"1000XX10",
"0001XX1X"|"001000X0"|"01000X10"|"1000XX10",
"0100"
WHEN
"0100" WHEN "0001X10X"|"0010X1XX"|"01000X00"|"1000X100",
"0001X10X"|"0010X1XX"|"01000X00"|"1000X100",
"1000"
"1000" WHEN
WHEN "0001100X"|"001010XX"|"01001XXX"|"1000X000",
"0001100X"|"001010XX"|"01001XXX"|"1000X000",
"XXXX"
"XXXX" WHEN
WHEN OTHERS;
OTHERS;
END
END a;
a;

258

G.Jaquenod 2002, All Rights Reserved.

Copyright Guillermo Jaquenod, 2002

43

VHDL: Lenguaje de
descripcin de hardware

Hot Lab Support Initiative

XII Asamblea General del ISTEC, UTP, Panam, Noviembre de 2002

rbitro Round Robin:


tabla de decisin

Hot Lab Support Initiative

LIBRARY
LIBRARY ieee;
ieee; USE
USE ieee.std_logic_1164.ALL;
ieee.std_logic_1164.ALL;

actual
nuevo

ARCHITECTURE
ARCHITECTURE aa OF
OF rrobtab
rrobtab IS
IS
BEGIN
BEGIN
PROCESS
PROCESS (actual,req)
(actual,req) IS
IS
variable
vnuevo:
std_logic_vector
variable vnuevo: std_logic_vector (3
(3 DOWNTO
DOWNTO 0);
0);
BEGIN
BEGIN
CASE
CASE actual
actual IS
IS
WHEN
WHEN X"0"
X"0" =>
=> vnuevo
vnuevo :=
:= X"1";
X"1";
WHEN
WHEN X"1"
X"1" =>
=> IF
IF req(1)='1'
req(1)='1' THEN
THEN vnuevo
vnuevo :=
:= X2";
X2"; ELSIF
ELSIF req(2)='1'
req(2)='1' THEN
THEN vnuevo
vnuevo :=
:= X4";
X4";
ELSIF
ELSIF req(3)='1'
req(3)='1' THEN
THEN vnuevo
vnuevo :=
:= X8";
X8"; ELSE
ELSE vnuevo
vnuevo :=
:= actual;
actual; END
END IF;
IF;
WHEN
WHEN X2"
X2" =>
=> IF
IF req(2)='1'
req(2)='1' THEN
THEN vnuevo
vnuevo :=
:= X"4";
X"4"; ELSIF
ELSIF req(3)='1'
req(3)='1' THEN
THEN vnuevo
vnuevo :=
:= X"8";
X"8";
ELSIF
ELSIF req(0)='1'
req(0)='1' THEN
THEN vnuevo
vnuevo :=
:= X"1";
X"1"; ELSE
ELSE vnuevo
vnuevo :=
:= actual;
actual; END
END IF;
IF;
WHEN
WHEN X4"
X4" =>
=> IF
IF req(3)='1'
req(3)='1' THEN
THEN vnuevo
vnuevo :=
:= X8";
X8"; ELSIF
ELSIF req(0)='1'
req(0)='1' THEN
THEN vnuevo
vnuevo :=
:= X"1";
X"1";
ELSIF
req(1)='1'
THEN
vnuevo
:=
X2";
ELSE
vnuevo
:=
actual;
END
IF;
ELSIF req(1)='1' THEN vnuevo := X2"; ELSE vnuevo := actual; END IF;
WHEN
WHEN X8"
X8" =>
=> IF
IF req(0)='1'
req(0)='1' THEN
THEN vnuevo
vnuevo :=
:= X"1";
X"1"; ELSIF
ELSIF req(1)='1'
req(1)='1' THEN
THEN vnuevo
vnuevo :=
:= X2";
X2";
ELSIF
ELSIF req(2)='1'
req(2)='1' THEN
THEN vnuevo
vnuevo :=
:= X4";
X4"; ELSE
ELSE vnuevo
vnuevo :=
:= actual;
actual; END
END IF;
IF;
WHEN
WHEN OTHERS
OTHERS =>
=> vnuevo
vnuevo :=
:= actual;
actual;
END
END CASE;
CASE;
nuevo
nuevo <=
<= vnuevo;
vnuevo;
END
END PROCESS;
PROCESS;
END
END a;
a;

259

G.Jaquenod 2002, All Rights Reserved.

02

req0
req1
req2
req3

ENTITY
ENTITY rndrob
rndrob IS
IS PORT
PORT (reloj,ini
(reloj,ini :: IN
IN std_logic;
std_logic; req:
req: IN
IN std_logic_vector
std_logic_vector (3
(3 DOWNTO
DOWNTO 0);
0);
grant:OUT
grant:OUT std_logic_vector
std_logic_vector (3
(3 DOWNTO
DOWNTO 0));
0));
END
END rndrob;
rndrob;
ARCHITECTURE
a
OF
rndrob
IS
ARCHITECTURE a OF rndrob IS
COMPONENT
COMPONENT rrobtab
rrobtab PORT
PORT (req:
(req: IN
IN std_logic_vector(3
std_logic_vector(3 DOWNTO
DOWNTO 0);
0);
actual:
actual: IN
IN std_logic_vector(3
std_logic_vector(3 DOWNTO
DOWNTO 0);
0); nuevo:OUT
nuevo:OUT std_logic_vector
std_logic_vector (3
(3 DOWNTO
DOWNTO 0));
0));
END
END COMPONENT;
COMPONENT;
SIGNAL
act,nov:std_logic_vector(3
DOWNTO
0);
SIGNAL
tstop,rini,tout,lib:
SIGNAL act,nov:std_logic_vector(3 DOWNTO 0); SIGNAL tstop,rini,tout,lib: std_logic;
std_logic;
BEGIN
BEGIN
decis:
decis: rrobtab
rrobtab PORT
PORT MAP
MAP (req
(req =>
=> req,actual=>act,nuevo=>nov);
req,actual=>act,nuevo=>nov);
tstop
tstop <=
<= NOT(tout);
NOT(tout);
timer:
timer: lpm_counter
lpm_counter GENERIC
GENERIC MAP
MAP (LPM_WIDTH
(LPM_WIDTH =>
=> 3)
3)
PORT
PORT MAP
MAP (clock=>reloj,cnt_en
(clock=>reloj,cnt_en =>
=> tstop,
tstop, aclr=>rini,cout=>tout);
aclr=>rini,cout=>tout);
lib
lib <=
<= (not(req(0))
(not(req(0)) AND
AND act(0)
act(0) AND
AND not(nov(0)))
not(nov(0))) OR
OR (not(req(1))
(not(req(1)) AND
AND act(1)
act(1) AND
AND not(nov(1)))
not(nov(1)))
OR
OR (not(req(2))
(not(req(2)) AND
AND act(2)
act(2) AND
AND not(nov(2)))
not(nov(2))) OR
OR (not(req(3))
(not(req(3)) AND
AND act(3)
act(3) AND
AND not(nov(3)));
not(nov(3)));
grant
grant <=
<= act
act WHEN
WHEN (tout='0')
(tout='0') OR
OR (nov=act)
(nov=act) ELSE
ELSE "0000";
"0000";
PROCESS
(reloj)
BEGIN
PROCESS (reloj) BEGIN
IF
IF reloj='1'
reloj='1' THEN
THEN
IF
IF ini='1'
ini='1' THEN
THEN act
act <=
<= X"1";
X"1"; rini
rini <=
<= '1';
'1'; ELSIF
ELSIF lib='1'
lib='1' THEN
THEN act
act <=
<= nov;
nov; rini
rini <=
<= '1';
'1';
ELSE
ELSE rini
rini <=
<= '0';
'0'; END
END IF;
IF;
END
IF;
END IF;
END
END PROCESS;
PROCESS;
END
END a;
a;

20

ENTITY
ENTITY rrobtab
rrobtab IS
IS PORT
PORT (req:
(req: IN
IN std_logic_vector
std_logic_vector (3
(3 DOWNTO
DOWNTO 0);
0);
actual
actual :: IN
IN std_logic_vector
std_logic_vector (3
(3 DOWNTO
DOWNTO 0);
0);
nuevo:OUT
nuevo:OUT std_logic_vector
std_logic_vector (3
(3 DOWNTO
DOWNTO 0));
0));
END
END rrobtab
rrobtab ;;

LIBRARY
LIBRARY ieee;
ieee; USE
USE ieee.std_logic_1164.ALL;
ieee.std_logic_1164.ALL; LIBRARY
LIBRARY lpm;
lpm; USE
USE lpm.lpm_components.ALL;
lpm.lpm_components.ALL;

qu
en
od

Hot Lab Support Initiative

rbitro Round Robin:


tope de jerarqua

G.Jaquenod 2002, All Rights Reserved.

260

Manejo de archivos en VHDL

Hot Lab Support Initiative

Hot Lab Support Initiative

leer constantes almacenadas en un archivo separado es el mtodo ms


conveniente para generar estmulos (vectores de test) complejos
estos vectores pueden haber sido generados automticamente, haber sido parte de la
especificacin a cumplir en el proceso de aceptacin de un producto, o estar definidos
mediante algn estndar

a su vez, almacenar las salidas del diseo bajo test en un archivo permite su
uso posterior para comparar respuestas de arquitecturas alternativas

ig
ht
G.
Ja

Bases de VHDL

Para el manejo de archivos, VHDL cuenta con el package TEXTIO (no


sintetizable), para operar sobre objetos de clase FILE.
Al crearse un objeto FILE se define el modo de acceso (IN o OUT) y el nombre
del archivo, y esta accin tiene como resultado implcito el OPEN del archivo.

Manejo de archivos en VHDL

Los cinco subprogramas a utilizar son:


WRITE(), WRITELINE(), READ(), READLINE(), ENDFILE()

y operan con objetos de los tipos definidos en STANDARD/STD:

261

G.Jaquenod 2002, All Rights Reserved.

262

BIT,BIT_VECTOR,BOOLEAN,CHARACTER,INTEGER,REAL,STRING,TIME;
G.Jaquenod 2002, All Rights Reserved.

Tipos definidos en TEXTIO

Co
py
r

Hot Lab Support Initiative

TEXTIO define 4 nuevos tipos a usar:

Subprogramas definidos en
TEXTIO

FILE input: TEXT OPEN read_mode IS "std_input";


FILE output: TEXT OPEN write_mode IS "std_output";

type LINE is access STRING;

una LINE es un puntero a un objeto de tipo STRING

hay dos objetos clase FILE predefinidos (INPUT y OUTPUT) asociados a


"STD_INPUT y "STD_OUTPUT";

type TEXT is file of STRING;

FUNCTION endline ( l : IN LINE ) RETURN BOOLEAN ;


FUNCTION endfile ( f : IN TEXT ) RETURN BOOLEAN ;

un TEXT es un archivo formado por una sucesin de strings ASCII

PROCEDURE writeline (file F: TEXT; l: INOUT LINE);


PROCEDURE write (l: INOUT LINE; value: IN <tipo>;
justified: IN SIDE:=RIGHT; field:IN WIDTH:=0);

type SIDE is (RIGHT, LEFT);

PROCEDURE readline (FILE f: TEXT; l: INOUT LINE);


PROCEDURE read (l: INOUT LINE; value: OUT <tipo>
[;good: OUT BOOLEAN]);

por enumeracin, define la forma de justificar los datos de salida en los


campos de salida, y es usada en el procedure WRITE ()

mtodos para leer y escribir, as como para detectar el final de un archivo.


Notar que WRITE escribe en un objeto LINE, y es slo WRITELINE quien
escribe en el FILE

subtype WIDTH is NATURAL;

ancho de los campos de datos de salida, usado en el procedure WRITE ()

263

Hot Lab Support Initiative

G.Jaquenod 2002, All Rights Reserved.

264

G.Jaquenod 2002, All Rights Reserved.

Copyright Guillermo Jaquenod, 2002

44

VHDL: Lenguaje de
descripcin de hardware

Hot Lab Support Initiative

XII Asamblea General del ISTEC, UTP, Panam, Noviembre de 2002

Ejemplo de escritura

Ejemplo de escritura

Hot Lab Support Initiative

Hot Lab Support Initiative


LIBRARY ieee; USE ieee.std_logic.ALL; USE std.textio.ALL;
..
escribo: PROCESS IS
FUNCTION std_to_char (sl : std_logic) RETURN character IS BEGIN
CASE sl IS
WHEN U=> RETURN U; WHEN X=> RETURN X; WHEN 0=> RETURN 0;
WHEN 1=> RETURN 1; WHEN Z=> RETURN Z; WHEN W=> RETURN W;
WHEN L=> RETURN L; WHEN H=> RETURN H; WHEN OTHERS=> RETURN -;
END CASE;
END FUNCTION;
FILE wrfile: TEXT IS OUT salida.vct; ahora_i: INTEGER; puntero: LINE;
BEGIN
WAIT UNTIL reloj = 1;
ahora_i = now/1us; WRITE (puntero,ahora_i,FIELD=> 5);
WRITE (puntero, ); WRITE (puntero, ); WRITE (puntero,std_to_char(A));
WRITE (puntero, ); WRITE (puntero, ); WRITE (puntero,std_to_char(B));
WRITELINE (wrfile,puntero);
END PROCESS escribo;
...

5 caracteres para el valor del reloj de simulacin, en microsegundos, justificado a derecha


dos espacios de separacin
reloj
un carcter que indique el valor de A
dos espacios de separacin
A
Proceso
y un carcter que indique el valor de B
B

ahora

...tt..A..B

20

02

Se cuenta con tres seales std_logic llamadas A, B y reloj, y se desea, cada vez que haya
un flanco positivo de reloj, escribir en un archivo llamado salida.vct una lnea que
describe el momento del evento, A y B con el siguiente formato:

escribo

Los elementos en juego sern:

Un objeto de nombre wrfile, de clase FILE y tipo TEXT, definido como:

Un integer llamado ahora_i, que representa el tiempo actual en microsegundos

wrfile

265

Una variable de nombre puntero, de tipo LINE, donde preparar los datos a escribir

Una funcin que permita convertir los nueve posibles valores de una variable STD_LOGIC a los
nueve caracteres que los representan

G.Jaquenod 2002, All Rights Reserved.

qu
en
od

FILE wrfile: TEXT IS OUT salida.vct;

266

G.Jaquenod 2002, All Rights Reserved.

Iteracin del proceso de diseo

Hot Lab Support Initiative

Hot Lab Support Initiative

Existen dos acciones


claramente distintas:

ig
ht
G.
Ja

Bases de VHDL

El control del proceso de


sntesis es realizado casi
exclusivamente dentro del
proceso de sntesis, con poca
interaccin con el proceso de
PLACE&ROUTE

Verificacin funcional
de modelos VHDL

267

G.Jaquenod 2002, All Rights Reserved.

268

La edicin y modificacin del


cdigo fuente, incluyendo el
test de distintas arquitecturas

Ingreso del diseo


Constraints

Sntesis
OK?

Co
py
r

Para el proceso de diseo y debug de Hardware, el VHDL es usado


de distintas maneras:

Si

Velocidad?

269

Place&Route

No
Anlisis temporal

La edicin y modificacin de
constraints, que puede ser
realizada tanto dentro del
cdigo VHDL (en algunos
casos) como mediante
asignaciones externas

rea?

No

Si

OK?
Si

No
No

Velocidad?
Si
rea?

SINTESIS

No

Si

PLACE & ROUTE


G.Jaquenod 2002, All Rights Reserved.

Qu es el test bench?
Hot Lab Support Initiative

TEST BENCH

Para la generacin de estmulos se disea un bloque de tipo


behavior, donde es el diseador quien define, mediante retardos,
la temporizacin y secuenciacin de los estmulos.

lmf

acf

Si

El test bench en VHDL

Hot Lab Support Initiative

edif
No

Generador de
estmulos

Otros mdulos ya
operativos

Mdulo del diseo


de nivel tope o DUT
(Design Under Test)

Monitor de
salidas

De igual modo, el monitor de salidas tambin es definido en tipo


behavior, y opera en base a tiempos definidos por el diseador
ms eventos que provienen de la unidad bajo test (UUT)

Se llama as cuando al mdulo de mayor nivel del diseo (DUT) se agrega:

Para el sistema bajo test, el diseo suele llegar al nivel


estructural, y los tiempos de retardo provienen del resultado de la
compilacin del diseo (o de los asociados a los modelos de
bloques funcionales pre-existentes auxiliares)

Se crea un mdulo de an mayor nivel, sin puertas de entrada o salida,


llamado test bench, de uso fundamental en la simulacin

G.Jaquenod 2002, All Rights Reserved.

un generador de estmulos, conectado a las entradas del DUT


un monitor de salidas, conectado a las salidas del DUT
otros posibles modulos predisenados

Nota: A veces tambin se insertan dentro del DUT funciones no sintetizables


de verificacin, en lo que se llama embedded test.
270

G.Jaquenod 2002, All Rights Reserved.

Copyright Guillermo Jaquenod, 2002

45

VHDL: Lenguaje de
descripcin de hardware

Hot Lab Support Initiative

Cmo se usa un HDL en el


test bench?
El testbench no tiene
entradas ni salidas!

I.

Test bench applies stimulus to target code and outputs are


manually reviewed

II.

Test bench applies stimulus to target code and verifies


outputs functionally

III.

Test bench applies stimulus to target code and verifies


outputs with timing

Otros mdulos ya
operativos

TEST BENCH

Mdulo del diseo


de nivel tope
(DUT)

Generador de
estmulos

Monitor de
salidas

02

HDL behavioral, con el


modelo de comportamiento
temporal del dispositivo real

Las 3 clases de Testbenches


Hot Lab Support Initiative

Requires static timing analysis

20

Hot Lab Support Initiative

XII Asamblea General del ISTEC, UTP, Panam, Noviembre de 2002

Does not require full static timing analysis

Code and test bench data more complex

HDL no sintetizable, con manejo de archivos, allocacin


dinmica de memoria, entrada salida por consola, y referencias
temporales
271

G.Jaquenod 2002, All Rights Reserved.

qu
en
od

HDL sintetizable, con el diseo a testear, a


veces con funciones de embedded test

272

Clase I
Hot Lab Support Initiative

ig
ht
G.
Ja

Original designer who fully understands code can


more easily understand waveforms and timing

Different engineer may miss errors or take much


longer to understand target code to verify manually

Best used for simpler target code & code not intended
for re-use

G.Jaquenod 2002, All Rights Reserved.

Fuente: ALTERA

274

Writing expected results vectors requires deep


understanding of target code and can typically help
make code better by forcing engineer to do more work
up front
Fallback is that errors in the expected results vectors
can be hard to catch
Benefit is that you can set it and forget it (besides
static timing analysis / timing simulation)

G.Jaquenod 2002, All Rights Reserved.

Co
py
r

Fuente: ALTERA

Hot Lab Support Initiative

Create test harness code to instantiate the target


code and create stimulus signals

Much harder to write and debug initially


Writing expected results vectors requires deep
understanding of both target code and timing
information setup and hold times for clock edges
checked
Can require substantial changes to both testbench
and vectors every time a design or process change
occurs
Most in-depth of test benches but can be overkill for
most situations

G.Jaquenod 2002, All Rights Reserved.

Fuente: ALTERA

General Testbench Methods

Class III

275

Clase II

Harder to write and debug initially

Requires manual verification (usually visual)

Hot Lab Support Initiative

Fuente: ALTERA

Hot Lab Support Initiative

Simplest to write (no verification code)

273

G.Jaquenod 2002, All Rights Reserved.

mycode_tb.vhd
clk_assignment
wavegen_process

mycode.vhd
clk
in1
in2
in3

out1
out2

reset_assignment

276

G.Jaquenod 2002, All Rights Reserved.

rst

Fuente: ALTERA

Copyright Guillermo Jaquenod, 2002

46

VHDL: Lenguaje de
descripcin de hardware

Hot Lab Support Initiative

XII Asamblea General del ISTEC, UTP, Panam, Noviembre de 2002

Self Verification Methods

Generacin de vectores de Test

Hot Lab Support Initiative

Hot Lab Support Initiative

mediante un algoritmo:

mycode_tb.vhd

wavegen_process

mediante una secuencia de asignaciones simples

mycode.vhd
clk
in1
in2
in3

mediante procesos explcitos que produzcan la repeticin de seales, y la


consiguiente (generacin de seales peridicas

compare_process

mediante patrones complejos generados algortmicamente

20

clk_assignment

out1

leyendo tablas de constantes almacenadas en forma de tablas (arrays)


equivalente a una secuencia de asignaciones simples, es una forma ms compacta
de generacin de vectores pues las tareas de asignacin y los valores a asignar
estn en estructuras separadas (un procedimiento y un array, respectivamente)

out2
reset_assignment

02

La generacin de estmulos (vectores de test) puede ser hecha de tres


grandes maneras:

Add a process or at least the functions to an existing process so that


the outputs can be monitored

clk

leyendo constantes almacenadas en un archivo separado

277

G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

Fuente: ALTERA

Clase I: Asignaciones simples


y WAIT FOR

ENTITY testbench IS END ENTITY testbench;

279

278

G.Jaquenod 2002, All Rights Reserved.

Fuente: ASHENDEN

G.Jaquenod 2002, All Rights Reserved.

Asignaciones simples y
WAIT FOR (simulacin)

Hot Lab Support Initiative

ig
ht
G.
Ja

El testbench no tiene entradas ni salidas!


ARCHITECTURE testr2 OF testbench IS
Instanciacin del componente a testear
SIGNAL d0,d1,enable,reloj,q0,q1 : BIT;
COMPONENT registro2 is port (
d0,d1,enable,reloj : IN BIT; q0,q1: OUT BIT);
END COMPONENT;
BEGIN
device_under_test: registro2
PORT MAP (d0,d1,enable,reloj,q0,q1);
ciclo_de_test: PROCESS IS BEGIN
d0<='1'; d1<='0'; enable<='0'; reloj<='0'; WAIT FOR 5 ns;
Tsetup
enable <= '1'; WAIT FOR 20 ns;
reloj <= '1'; WAIT FOR 15 ns;
Thold
d0<='0'; d1<='1'; enable<='0'; WAIT FOR 30 ns;
reloj <= '0'; WAIT FOR 15 ns; reloj <= '1'; WAIT FOR 15 ns;
enable <='1'; WAIT FOR 30 ns;
reloj <= '0'; WAIT FOR 15 ns; reloj <= '1'; WAIT FOR 15 ns;
END PROCESS ciclo_de_test;
END ARCHITECTURE testr2;

qu
en
od

es el mtodo ms conveniente para vectores complejos, que a su vez pueden


tambin ser generados automticamente, o definidos mediante un estndar en el
caso de que el test forme parte del proceso de aceptacin de un producto.

280

reloj <= '1'; WAIT FOR 15 ns;


enable <= '1'; WAIT FOR 20 ns;
d0<='1'; d1<='0'; enable<='0'; reloj<='0'; WAIT FOR 5 ns;

G.Jaquenod 2002, All Rights Reserved.

Vectores repetitivos y simtricos

Co
py
r

Hot Lab Support Initiative

ENTITY relojes IS PORT (clk1, clk2, clk3 :OUT BIT);


END ENTITY relojes;
ARCHITECTURE algo OF relojes IS
CONSTANT valf1 : INTEGER := 500; -- frecuencia en MHz
CONSTANT periodf2 : TIME := 15ns; -- periodo en nanosegundos
CONSTANT valf3 : INTEGER := 50; -- frecuencia en MHz
SIGNAL intclk1,intclk2,intclk3 : BIT;
BEGIN
intclk1 <= NOT intclk1 AFTER (500/valf1)*1ns;
intclk2 <= NOT intclk2 AFTER (periodf2/2);
intclk3 <= NOT intclk3 AFTER (500/valf3)*1ns;
clk1 <= intclk1;
clk2 <= intclk2;
El esquema general es:
clk3 <= intclk3;
reloj <= NOT reloj AFTER semiperiodo;
END ARCHITECTURE algo;
y genera una seal peridica simtrica

G.Jaquenod 2002, All Rights Reserved.

Vectores repetitivos y
simtricos (simulacin)

ENTITY testbench IS END;


ARCHITECTURE xx OF testbench IS
COMPONENT relojes IS PORT (clk1, clk2, clk3 :OUT BIT);
END COMPONENT;
SIGNAL clk1, clk2, clk3 : BIT;
BEGIN
DUT: relojes PORT MAP (clk1, clk2, clk3);
END;

Generacin de relojes simtricos con una secuencia de asignaciones simples

281

Hot Lab Support Initiative

Fuente de grficos: VERIBEST


99.0 VHDL Simulator

282

G.Jaquenod 2002, All Rights Reserved.

Fuente de grficos: VERIBEST


99.0 VHDL Simulator

Copyright Guillermo Jaquenod, 2002

47

Hot Lab Support Initiative

VHDL: Lenguaje de
descripcin de hardware
XII Asamblea General del ISTEC, UTP, Panam, Noviembre de 2002

Vectores repetitivos y
asimtricos

Hot Lab Support Initiative

Hot Lab Support Initiative

ENTITY testbench IS END;


ARCHITECTURE xx OF testbench IS
COMPONENT reloj_asimetrico IS PORT (reloj1,reloj2:OUT BIT);
END COMPONENT;
SIGNAL reloj1,reloj2:BIT;
BEGIN
PROCESS BEGIN
dut:reloj_asimetrico PORT MAP (reloj1,reloj2); PROCESS BEGIN
reloj1
reloj1 <=
<= '1','0'
'1','0' AFTER
AFTER ton;
ton;
END;
WAIT FOR (ton+toff);

02

Generacin de relojes asimtricos con procesos explcitos y asignaciones


simples. Dos modos de generar la misma seal:
ENTITY reloj_asimetrico IS PORT (reloj1,reloj2:OUT BIT);
END ENTITY reloj_asimetrico;
ARCHITECTURE usoproc OF reloj_asimetrico IS
CONSTANT ton:TIME := 15ns; CONSTANT toff:TIME := 19ns;
BEGIN
asym1: PROCESS BEGIN
reloj1 <= '1','0' AFTER ton;
WAIT FOR (ton+toff);
END PROCESS asym1;
asym2: PROCESS BEGIN
reloj2 <= '1'; WAIT FOR (ton);
reloj2 <= '0'; WAIT FOR (toff);
Ambas soluciones son
equivalentes
END PROCESS asym2;

283

G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

Vectores complejos usando


algoritmos

Es posible generar patrones de test ms complejos que una seal de reloj (por
ejemplo, secuencias GRAY) a travs del uso de algoritmos:
LIBRARY ieee;
USE ieee.std_logic_1164.ALL; USE ieee.numeric_std.ALL;

20

asym2:
asym2: PROCESS
PROCESS BEGIN
BEGIN
reloj2
reloj2 <=
<= '1';
'1'; WAIT
WAIT FOR
FOR (ton);
(ton);
reloj2
reloj2 <=
<= '0';
'0'; WAIT
WAIT FOR
FOR (toff);
(toff);
END
PROCESS
asym2;
END PROCESS asym2;

284

G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

Fuente de grficos: VERIBEST


99.0 VHDL Simulator

Vectores complejos usando


algoritmos (simulacin)

LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE ieee.numeric_std.ALL;


ENTITY testbench IS END;

ig
ht
G.
Ja

ENTITY graygen IS PORT (gray : OUT unsigned (8 DOWNTO 1));


END ENTITY graygen;
Ac no importa hacer un
contador binario y luego
ARCHITECTURE a OF graygen IS
decodificarlo porque
CONSTANT periodo:TIME := 35ns;
sto solo es usado para
BEGIN
TEST y no para sntesis.
gg: PROCESS IS

WAIT FOR (ton+toff);


END
END PROCESS
PROCESS asym1;
asym1;

qu
en
od

END ARCHITECTURE usoproc;

Vectores repetitivos y
asimtricos (simulacin)

ARCHITECTURE xx OF testbench IS
COMPONENT graygen IS PORT (gray : OUT unsigned (8 DOWNTO 1));
END COMPONENT;
SIGNAL gray : unsigned (8 DOWNTO 1);
BEGIN
dut: graygen PORT MAP (gray);
END;

VARIABLE bin: unsigned(8 DOWNTO 1) := X"00";


BEGIN
WAIT FOR periodo;
bin := bin + 1; -- contador binario
gray (8) <= bin (8); -- conversin de binario a GRAY
gray (7 DOWNTO 1) <= bin(7 DOWNTO 1) XOR bin(8 DOWNTO 2);
END PROCESS gg;
END a;

285

G.Jaquenod 2002, All Rights Reserved.

Vectores complejos usando


algoritmos

Co
py
r

Hot Lab Support Initiative

286

Es posible generar patrones de test ms complejos que una seal de reloj (por
ejemplo, secuencias pseudo-random) a travs del uso de algoritmos similares a
los usados para el diseo de LFSRs:

G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

Fuente de grficos: VERIBEST


99.0 VHDL Simulator

Vectores complejos usando


algoritmos (simulacin)

ENTITY testbench IS END;


ARCHITECTURE xx OF testbench IS
COMPONENT psrnd IS PORT (taps : OUT BIT_VECTOR (7 DOWNTO 0)); END COMPONENT;
SIGNAL random : BIT_VECTOR (7 DOWNTO 0);
BEGIN
dut: psrnd PORT MAP (random);
END;

ENTITY psrnd IS PORT (taps : OUT BIT_VECTOR (7 DOWNTO 0)); END psrnd;
ARCHITECTURE a OF psrnd IS

CONSTANT msk: BIT_VECTOR (7 DOWNTO 0):= X"B8"; CONSTANT periodo:TIME := 35ns;


BEGIN

p0: PROCESS IS
VARIABLE

fftaps: BIT_VECTOR (7 DOWNTO 0):= X"00"; VARIABLE tmp : BIT;

BEGIN

WAIT FOR periodo;


tmp := '0';

FOR i IN 0 TO 7 LOOP IF (msk(i)='1') THEN tmp:= tmp XOR fftaps(i); END IF;
END LOOP;

FOR i IN 7 DOWNTO 1 LOOP fftaps(i) := fftaps (i-1); END LOOP;


fftaps (0) := NOT (tmp);
taps <= fftaps;

END PROCESS p0;

END a;

287

G.Jaquenod 2002, All Rights Reserved.

288

G.Jaquenod 2002, All Rights Reserved.

Fuente de grficos: VERIBEST


99.0 VHDL Simulator

Copyright Guillermo Jaquenod, 2002

48

VHDL: Lenguaje de
descripcin de hardware

Hot Lab Support Initiative

XII Asamblea General del ISTEC, UTP, Panam, Noviembre de 2002

Generacin de vectores
mediante arrays

Hot Lab Support Initiative

Hot Lab Support Initiative

el uso de vectores de test almacenados en forma de arrays permite


separar los procesos de asignacin de los valores a asignar

02

LIBRARY
LIBRARY ieee;USE
ieee;USE ieee.std_logic_1164.ALL;
ieee.std_logic_1164.ALL; USE
USE ieee.numeric_std.ALL;
ieee.numeric_std.ALL;
ENTITY
ENTITY testbench
testbench IS
IS END;
END;
ARCHITECTURE
ARCHITECTURE xx
xx OF
OF testbench
testbench IS
IS
COMPONENT
COMPONENT usoarray
usoarray IS
IS PORT
PORT (tabular_bus:
(tabular_bus: OUT
OUT UNSIGNED
UNSIGNED (7
(7 DOWNTO
DOWNTO 0));
0));
END
END COMPONENT;
COMPONENT;
SIGNAL
SIGNAL out_tab:
out_tab: UNSIGNED
UNSIGNED (7
(7 DOWNTO
DOWNTO 0);
0);
BEGIN
BEGIN
dut:
dut: usoarray
usoarray PORT
PORT MAP
MAP (out_tab);
(out_tab);
END;
END;

LIBRARY ieee;USE ieee.std_logic_1164.ALL;


USE ieee.numeric_std.ALL;

G.Jaquenod 2002, All Rights Reserved.

Hot Lab Support Initiative

Se simula el bus de un microprocesador, compuesto por datos, direcciones, nWR,


nRD, y duracin de esas muestras, y que con WRITE y WRITELINE se generaron
lneas de forma bit_vector(7 DOWNTO 0); bit_vector(15 DOWNTO 0); bit, bit, time,
la generacin de estmulos basados en ese archivo podra ser de la forma:

ARCHITECTURE xx OF testfile IS
BEGIN
leo_file: PROCESS
VARIABLE dly:time; VARIABLE punte:line; FILE vecfile:TEXT IS IN vect.vec;
BEGIN
WHILE NOT (endfile(vecfile)) LOOP
READLINE (vecfile,punte);
READ(punte,dbus); READ(punte,abus); READ(punte,nWR);READ(punte,nRD);
READ(punte,dly);
WAIT FOR dly;
END LOOP;
END PROCESS leo_file;
END;
291

G.Jaquenod 2002, All Rights Reserved.

Mdulo del diseo

Generador de
Monitor de
ARCHITECTURE completa OF and2 IS
de nivel tope
estmulos
salidas
(DUT)
SIGNAL valor : std_ulogic;
BEGIN
Dos procesos:
compuerta: PROCESS (a,b) IS BEGIN
Tiempos de
uno para modelar el behavior
propagacion
valor <= a AND b;
otro para modelar los retardos
distintos!
END PROCESS compuerta;
retardos: PROCESS (valor) IS BEGIN
IF valor=1 THEN
y <= REJECT tr1 INERTIAL 1 AFTER tp1;
ELSIF valor=0 THEN y <= REJECT tr0 INERTIAL 0 AFTER tp0;
ELSE
y <= REJECT trx INERTIAL X AFTER tpx;
END IF;
Cuando a o b son X o Z
END PROCESS retardos;
END ARCHITECTURE completa ;
Uso REJECT --> VHDL93

G.Jaquenod 2002, All Rights Reserved.

Fuente: ASHENDEN

5....

Fuente de grficos: VERIBEST


99.0 VHDL Simulator

Otros mdulos ya
operativos

Generador de
estmulos

chk_thold:PROCESS (relojd) BEGIN


IF relojdEVENT AND relojd=1 THEN
ASSERT (datoSTABLE(t_hold))
REPORT violacion de tiempo de hold
SEVERITY ERROR;
END IF;
END PROCESS chk_thold;

Mdulo del diseo


de nivel tope
(DUT)

Monitor de
salidas

ac se activa chk_thold

datos

relojd <= relojDELAYED(t_hold);

reloj

tsetup

thold

violacion
de tsetup
relojd
violacion
de thold
ac se activa chk_thold

G.Jaquenod 2002, All Rights Reserved.

Ejemplo: modelo de una


AND2 con todo

LIBRARY ieee; USE ieee.std_logic_1164.ALL;


Tipos fsicos, definidos en
ENTITY and2 IS
STANDARD
GENERIC ( tr1:TIME := 400 ps; tp1:TIME := 1.5 ns;
tr0:TIME := 350 ps; tp0:TIME := 1.3 ns;
trx:TIME := 300 ps; tpx:TIME := 600 ps);
PORT (a,b:IN std_ulogic; y: OUT std_ulogic);
Otros mdulos ya
operativos
END ENTITY and2;

293

chk_tsu:PROCESS (reloj) BEGIN


IF relojEVENT AND reloj=1 THEN
ASSERT (datoSTABLE(t_setup))
REPORT violacion de tiempo de setup
SEVERITY ERROR;
END IF;
END PROCESS chk_tsu;

292

Co
py
r

Hot Lab Support Initiative

Ejemplo: test de salidas


usando ASSERT

Hot Lab Support Initiative

ig
ht
G.
Ja

LIBRARY standard; USE std.textio.ALL;


ENTITY testfile IS PORT (nWR : OUT BIT; nRD: OUT BIT;
dbus: OUT BIT_VECTOR (7 DOWNTO 0); abus: OUT BIT_VECTOR (15 DOWNTO 0)); END;

G.Jaquenod 2002, All Rights Reserved.

290

Leyendo estmulos desde un


archivo

qu
en
od

289

20

ENTITY usoarray IS PORT (bus: OUT UNSIGNED (7 DOWNTO 0));


END ENTITY usoarray ;
valores
valoresaaasignar
asignar
ARCHITECTURE a OF usoarray IS
TYPE tabla IS ARRAY (0 TO 7) OF INTEGER;
CONSTANT stimu_table : tabla := (4,27,254,14,82,00,255,128);
CONSTANT periodo:TIME := 35ns;
BEGIN
p0: PROCESS IS BEGIN
FOR i IN 0 TO 7 LOOP
bus <= to_unsigned (stimu_table(i),8);
proceso
procesocclico
cclico
WAIT FOR periodo;
de
deasignacin
asignacin
END LOOP;
END PROCESS p0;
END ARCHITECTURE a;

Vectores complejos usando


arrays (simulacin)

Bibliografa: libros sobre VHDL


Hot Lab Support Initiative

ALTERA Corp. MAX+PLUS II VHDL, Version 7.1. December 1996.

P.Ashenden. The Designers Guide to VHDL. Morgan Kaufmann Publishers Inc., 2nd Edition. ISBN: 1-55860-674-2

P.Ashenden. The Students Guide to VHDL. Morgan Kaufmann Publishers Inc, 1998, ISBN 1-55860-520-7

L.Baker. VHDL Programming With Advanced Topics. John Wiley and Sons, Inc. 1993, ISBN 0-471-57464-3

J.Bhasker. A VHDL Primer, Revised Edition. Prentice Hall 1995. ISBN 0-13-181447-

J.Bhasker. A Guide to VHDL Syntax. Prentice Hall 1995, ISBN: 0-13-324351-6.

K.C.Chang. Digital Systems Design With VHDL and Synthesis. An inteegrated Approach. IEEE Computer Society
1999. ISBN 0-7695-0023-4

R. Dueck. Digital Design with CPLD. Applications and VHDL. DELMAR, Thomson Learning. ISBN 0-7668-1160-3

S.S.Leung & M.AA.Shanblatt. ASIC System Design with VHDL: A Paradigm. 2nd.Edition, Kluwer Academic
Publishers, 1989, ISBN:0-7923-9032-6

294

F.Pardo & J.Boluda. VHDL Lenguaje para sntesis y modelado de circuitos. AlfaOmega 2000. ISBN 970-15-0443-7.

L.H.Pollard. The Design Book. Prentice Hall 1990. ISBN 0-13-200304-X.

S.Sjoholm & L.Lindh. VHDL for Designers. Prentice Hall 1997. ISBN 0-13-473414-9.

M.J.S.Smith. Application Specific Integrated Circuits. Addison Wesley 1997. ISBN 0-201-50022-1

L.Ters et al. VHDL Lenguaje Estndar de Diseo Electrnico. McGraw Hill 1998, ISBN 84-481-1196-6

G.Jaquenod 2002, All Rights Reserved.

Copyright Guillermo Jaquenod, 2002

49

Hot Lab Support Initiative

VHDL: Lenguaje de
descripcin de hardware
XII Asamblea General del ISTEC, UTP, Panam, Noviembre de 2002

Bibliografa: manuales
y notas de aplicacin

Hot Lab Support Initiative

Cypress Semiconductor. Applications Handbook. April 1994.

02

QuickLogic Corp. 1996/97 Quick Logic Data Book.


Actel Corp. FPGA Data Book and Design Guide. 1995
R.Andraka. A survey of CORDIC algorithms for FPGA based computers. ACM 0-89791-978-5/98/01

G.Jaquenod 2002, All Rights Reserved.

Co
py
r

ig
ht
G.
Ja

295

qu
en
od

20

A.Perez. "Byte-wise CRC Calculations." IEEE Micro. June. 40-50, 1983.

Copyright Guillermo Jaquenod, 2002

50

Potrebbero piacerti anche