You are on page 1of 88

VHDL: Lenguaje de descripcin de hardware

HDLs discretos vs. continuos

VHDL

IMPORTANTE!

Very High Speed Integrated Circuits


Hardware Description Language

Existen lenguajes de descripcin de hardware


pensados para el diseo de sistemas continuos
(analgicos), y otros concebidos para trabajar con
sistemas discretos (usualmente binarios)

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

Este curso trata sobre lenguajes de descripcin


de hardware de sistemas discretos

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.
Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Qu es un HDL?

Caractersticas de un HDL

Un lenguaje HDL para descripcin de hardware (HDL: Hardware

Description Language) es una herramienta formal para describir

(CONCURRENCIA)

el comportamiento y la estructura de sistemas (usualmente

electrnicos pero a veces tambin de otros tipos) usando un

Permite describir mdulos con acciones que sern evaluadas en


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

esquema textual

Describe actividades que ocurren en forma simultnea

como una accin concurrente ms

Usando HDL el diseador puede describir la operacin del

sistema con diferentes niveles de abstraccin (o estilos):

Posibilita la construccin de una estructura jerrquica, donde es


posible combinar descripciones estructurales y de flujo de datos

describiendo QU es lo que el sistema debe hacer

con descripciones de comportamiento (BEHAVIOR)

(comportamiento)

describiendo CMO hacerlo (algortmico)

Permite modelizar el concepto de tiempo, fundamental para la


descripcin de sistemas electrnicos

detallando CON QU hacerlo (flujo de datos y estructural)


Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Qu HDLs existen?

Que ventajas da el uso de HDLs?

Como herramienta de especificacin

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


(FlipFlops, compuertas bsicas, ecuaciones lgicas)

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).

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

es posible su uso para la de especificacin general de un


sistema, tanto a nivel de hardware como de software
permite describir el hardware, tanto a nivel de sistemas y
subsistemas, como de componentes

PALASM, CUPL, ABEL

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

AHDL (ALTERA Hardware Description Language)

VHDL, VERILOG HDL

Facilidad para la generacin de vectores de test complejos


Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

VHDL: Lenguaje de descripcin de hardware


HDLs estndar de alto nivel: VHDL
Estandarizado por el IEEE (IEEE standard 1076-1987), fu creado
por iniciativa del Departamento de Defensa de USA desde los inicios
de la dcada del 80, como medio de documentacin de sus
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)

HDLs estndar de alto nivel: VERILOG HDL


Desarrollado en 1983/84 por Gateway Design Automation, fu luego
perfeccionado por Cadence Design Systems
Estandarizado por el IEEE (IEEE standard #1364-1995)

Es usual que la herramientas de sntesis que soportan VERILOG


toleren slo un subconjunto del lenguaje completo
Estas limitaciones pueden deberse a imposibilidades fsicas (P.Ej: en un
diseo basado en PLD es imposible fijar externamente el retardo que
aadir una compuerta, porque eso est predefinido por el tipo de chip)
O a limitaciones del propio compilador

abstraccin a veces oscurece la relacin final entre la especificacin

Es un lenguaje de sintaxis ms simple que VHDL, pero tambin


menos potente, y en ciertos aspectos incluso ms limitado que AHDL
(por ejemplo, ausencia de construcciones FOR..GENERATE)

de un diseo y los recursos que terminan siendo empleados

Tiene ciertas similitudes formales con el lenguaje C

Especialmente til en diseos MUY complejos, aunque su elevada

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Dnde es posible usar HDL?

Flujo de diseo con VHDL

ESPECIFICACIN DEL SISTEMA


Fase del desarrollo

Resultado

Documentacin

Anlisis

Especificacin

Descripcin de qu
debe hacerse

Diseo

Cdigo VHDL

Mapeo a una dada


tecnologa

Netlists

Simulacin

Validacin
simulada

Detalle del
funcionamiento

PARTICIN HARDWARE/SOFTWARE

Test-Bench y vectores

Prototipo

ESPECIFICACIN

Prototipado

Elaboracin de cmo
llegar a los resultados

SINTESIS!!

ESPECIFICACIN
DE HARDWARE

ESPECIFICACIN
DE SOFTWARE

ASIC
FPGA
PLD

SINTESIS!!

Partes
Estndar

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


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

PLAQUETAS
Y
SISTEMAS

SOFTWARE
DISEO

El diseador de hardware debe estar plenamente conciente de esas diferencias


Guillermo Jaquenod, 2001

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

Guillermo Jaquenod, 2001

Modelado por comportamiento (behavior)


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

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

input1, .., inputn

la arquitectura del sistema, pero no de la tecnologa


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

output1, .., outputn


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

y registros, incorporando posibles esquemas de conexin

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Fuente: ALTERA

VHDL: Lenguaje de descripcin de hardware


Modelado estructural

Estructura jerrquica

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
input1

Componente de mayor nivel

diseo de jerarqua tope


subdiseo tope

output1

subdiseo 2

subdiseo 1

subdiseo 4

Componente1
de menor nivel
Componente1
de menor nivel

Fuente: ALTERA

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Instancias y Jerarquas
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 inclusin de un mdulo dentro de otro de


mayor nivel se llama crear una INSTANCIA
de ese mdulo

.....

.....

.....

.....
outputn

inputn

subdiseo 3

Esta facilidad permite generar estructuras


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

Diseo jerrquico
modulo A

instancia del
mdulo B

full_adder
half
adder
half
adder

instancia del
mdulo C

otra instancia
del mdulo B

OR

mdulo full_adder
...
instancia de half_adder
...
instancia de half_adder
....
mdulo half_adder
.....

El diseo jerrquico permite


descomponer un sistema complejo en subsistemas, y asignar
el diseo de cada subsistema a una persona diferente

mdulo B
mdulo C

Guillermo Jaquenod, 2001

generar sudiseos reutilizables


posibilidad de usar diseos realizados por terceros (IP:
Intellectual Property)
Guillermo Jaquenod, 2001

Encapsulamiento de mdulos

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

Bases de VHDL

PUERTAS

Generalidades
Identificadores
Tipos y objetos
Atributos
Operadores

Este tipo de operacin permite el


encapsulamiento del diseo

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

COMPORTAMIENTO
INTERNO

Guillermo Jaquenod, 2001

VHDL: Lenguaje de descripcin de hardware


Generalidades sobre VHDL
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

Elementos de lxico: identificadores


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:
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
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

Guillermo Jaquenod, 2001

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

29 0 -5 999

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

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

myemail@net

2k_efecto

VHDL1993

cod1997_

schematics!

X__FPGAs

digital_design

FLEX_10k

Adems existen los identificadores extendidos, que son una secuencia


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

2#1011# 4#13#e2 16#B#

Elementos de lxico: caracteres


Los caracteres son literales que se escriben en VHDL encerrndolos
entre comillas simples. Corresponden a los caracteres ASCII
imprimibles:
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,

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#0.1#

8#0.4#

12#0.6#

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


987_899

hello_world

Guillermo Jaquenod, 2001

Elementos de lxico: nmeros

3.1415927

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

3.141_592_7

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

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Elementos de lxico: strings


Un string es un objeto compuesto por un conjunto de caracteres:
type STRING is array (POSITIVE range <>) of CHARACTER;
Un string constante se indica con caracteres encerrados entre comillas dobles:
Un string puede estar compuesto por ningn carcter (string nulo )
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 &.
SI es necesario incluir una comilla doble en un string, eso se hacer
colocando DOS comillas dobles juntas

Elementos de lxico: bit_strings


En muchas ocasiones los nmeros son representados internamente en forma
binaria, como cadenas de bits que valen 0 o 1.
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.
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
Es posible incluir undescores en el string para facilitar su lectura

VHDL Altera Max+Plus II

Doble Comilla

Si el string no entra en una sola lnea,


& se lo arma concatenando dos strings en lineas sucesivas

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

B0110_1101

O537 XF5AA

Guillermo Jaquenod, 2001

VHDL: Lenguaje de descripcin de hardware


Preguntas

Preguntas

Cules de los siguientes identificadores son vlidos y


cules no? Porqu?

Cules es el equivalente decimal de los siguientes


literales?

mi-nombre
mi nombre
mi_nombre
mi__nombre
_mi_nombre_
#mi_nombre#

8#21#
2#10.01#
2#1#E3
16#F0_0F#
8#31#

Cual es la diferencia entre 8#1234# y O1234?


Convertir a bit-string binarios

Escriba los siguientes literales decimales en formato


hexadecimal

O176
X5F
X0002

1024
1
256.0
0.5
33

Cul es la diferencia entre Q y Q?


Cul es la diferencia entre B1001 y 1001?
Fuente: ASHENDEN

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Tipos, y Subtipos en VHDL


En VHDL se requiere necesariamente especificar el tipo (type) de cada
objeto, existiendo cuatro clases de tipos:
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.
compuestos:

Tipos, y Subtipos en VHDL


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);

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

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

archivos: para manejo de I/O en archivos


Dado un type, es posible declarar un nuevo tipo (como rango restringido
del primero), llamado subtype

Guillermo Jaquenod, 2001

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!!!!

Guillermo Jaquenod, 2001

Tipos definidos por enumeracin


Su sintaxis es
TYPE nombre IS (elemento[,elemento]);

donde los elementos usados para definir los posibles valores del tipo pueden
ser identificadores o caracteres.
A su vez, dado un tipo enumerado pueden definirse subtipos de l como un
rango limitado de las opciones enumeradas
TYPE dia_semana IS (lu,ma,mie,jue,vie,sa,do);
SUBTYPE no_laboral IS dia_semana RANGE sa TO do;

Un objeto de tipo enumerado se incializa por defecto al valor del primer


elemento de la lista. Si se revisa el package STANDARD.VHD de la Library
STD se observan ciertas definiciones por enumeracin:
type BOOLEAN is (FALSE, TRUE);
type BIT is ('0', '1');
type CHARACTER IS (NUL,SOH,..,'?');

Tipos INTEGER y REAL


Son tipos numricos predefinidos, ejemplos de los cuales taambin
pueden verse en el Package STANDARD
TYPE integer IS RANGE -2147483648 TO 2147483647;
TYPE real IS RANGE -1.7e38 to 1.7e38;

Para declarar un subtipo entero o real especificando su rango


puede emplearse tanto TO como DOWNTO, del siguiente modo:
SUBTYPE tres_coma_tres IS RANGE 0.0 TO 999.999;
SUBTYPE despegue IS RANGE 10 DOWNTO 0;

Donde el subtipo corresponde a los tipos integer o real segn sea la


forma de especificar su rango. Alternativamente, esta decisin
puede hacerse explcita poniendo el tipo base antes de RANGE.
SUBTYPE natural IS integer RANGE 0 TO integer'HIGH;

type SEVERITY_LEVEL is (NOTE, WARNING, ERROR, FAILURE);


as se define el tipo NATURAL en STANDARD.VHD
Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

VHDL: Lenguaje de descripcin de hardware


Tipos fsicos

Tipos compuestos: los ARRAYs

Permiten representar objetos que usan unidades de medida, tales


como distancia, tiempo, temperatura, velocidad, peso, voltaje,
corriente, capacidad, resistencia e inductancia, etc..). Adems de un
literal numrico, llevan asociada una unidad de medida, que identifica
la variable fsica que se quiere cuantificar.
Para un mismo tipo fisico es posible definir varias unidades de medida
y la relacin entre ellas. Por ejemplo, en STANDARD.VHD se define
el tipo time y el subtipo delay_length, como:
type TIME is range -9223372036854775808 to 9223372036854775807
units fs;
-- unidad base: femtosegundo
ps = 1000 fs; ns = 1000 ns; -- pico y nanosegundos
us = 1000 ns; ms = 1000 us; -- micro y milisegundos
sec = 1000 ms; min = 60 sec; -- segundos y minutos
hr = 60 min; -- horas
end units;
subtype DELAY_LENGTH is TIME range 0 fs to TIME'HIGH;
Guillermo Jaquenod, 2001

UN ARRAY es un conjunto de objetos de igual tipo, con sintaxis:


TYPE nombre IS ARRAY (rango) OF tipo_de_objetos;

donde el rango puede definirse de modo explcito (usando TO o DOWNTO),


por mencin a algn tipo de rango definido, o quedar abierta (unconstrained).
TYPE word_1 IS ARRAY (0 TO 31) OF BIT;
TYPE word_2 IS ARRAY (31 DOWNTO 0) OF BIT;
Array
Array
de 5
de 5
bits
bits

Array de 4 bits
Array de 4 bits

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


TYPE alertas IS ARRAY (semaforo RANGE rojo TO nada) OF BIT;
TYPE one_hot IS ARRAY (semaforo) OF BIT;
TYPE string IS ARRAY (positive RANGE <>) OF character;
Unconstrained
Unconstrained

Un array puede tener varias dimensiones, y por ejemplo una memoria RAM de
64 palabras de 7 bits puede definirse como:
TYPE mem64x8 IS ARRAY (

0 TO 7 , 0 TO 63
Filas
Filas

) OF BIT;

Columnas
Columnas

Guillermo Jaquenod, 2001

Tipos compuestos: RECORD

Preguntas

Un RECORD es un conjunto de objetos que pueden ser de distinto


tipo, con sintaxis:

Ir al subdirectorio \MAXPLUS2\VHDL93\STD y editar el


package STANDARD.VHD

TYPE nombre IS RECORD


identificador{,..}: tipo;
{...}
END RECORD [nombre];

Cmo estn definidos los tipos BOOLEAN, BIT y


CHARACTER?
Qu diferencia hay entre NATURAL y POSITIVE?
Es posible asignar el valor de un objeto POSITIVE a un objeto
NATURAL?

Cada uno de los objetos (o campos) de un RECORD deben tener una


indicacin de tipo. Por ejemplo:

Es posible asignar el valor de un objeto tipo BIT a un objeto


tipo CHARACTER?

TYPE fecha IS RECORD


dia: integer RANGE 1 TO 31;
mes: integer RANGE 1 TO 12;
ao: integer RANGE 1900 TO 2100;
END RECORD fecha;

Declarar una constante de nombre tercio y valor 1/3.


Declarar una variable entera representable con 8 bits
Definir un tipo distancia con unidades desde micrmetros
hasta kilmetros (um,mm,cm,dm,m,dem,hm,km)

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Declaracin de objetos en VHDL

Preguntas y ejercicios
Definir un tipo escalar entero llamado dia_mes que
comprenda los nmeros 1 a 31
Definir un tipo escalar por enumeracion llamado mes, con
los nombres de los 12 meses del ao
Definir un tipo compuesto RECORD capaz de almacenar
fechas
Definir un tipo compuesto RECORD capaz de almacenar
fechas y strings de caracteres
Definir un tipo compuesto tipo ARRAY capaz de ser usado
para definir hasta 10 fechas+nombres
Definir un tipo compuesto RECORD de nombre
complejo compuesto por un elemento real y otro
imaginario (ambos de punto flotante)
Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Fuente: ASHENDEN

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>];
Por ejemplo: CONSTANT largocte : INTEGER := 16;

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;

Guillermo Jaquenod, 2001

VHDL: Lenguaje de descripcin de hardware


Declaracin de objetos en VHDL
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

Declaracin de objetos en VHDL

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

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


de apertura

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


datos desde/hacia un objeto clase file

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


FILE file_name: file_type_name [[OPEN mode] IS <string>];
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 !!!.
Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Declaracin de atributos
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
TYPE coord IS RECORD X,Y:INTEGER; END RECORD;

-- declaro ubicacion como un atributo de tipo coordenada.


ATTRIBUTE ubicacion: coord;

-- asigno el atributo a mi_variable y le doy valor


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

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

Guillermo Jaquenod, 2001

Ciertos atributos predefinidos de VHDL estn pensados para seales.


Por ejemplo, dada una seal S:
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
Recordarlos!
Son MUY
usados!

Guillermo Jaquenod, 2001

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


seal muestra definida por:
muestra : IN STD_LOGIC_VECTOR(7 DOWNTO 0)
Los atributos definidos para rangos de vectores son
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

Recordarlos!
Son MUY
usados!

Guillermo Jaquenod, 2001

Atributos predefinidos en VHDL

Guillermo Jaquenod, 2001

Atributos predefinidos en VHDL

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);
SUBTYPE oscuro IS colores RANGE azul TO negro;

se tiene:
coloresSUCC (amarillo) devuelve azul
coloresPRED (amarillo) devuelve rojo
coloresPOS (amarillo) devuelve 2
Slo para tipos fsicos y discretos
Slo para tipos fsicos y discretos
coloresVAL (4) devuelve verde
coloresLOW devuelve rojo
coloresHIGH devuelve rosa
coloresLENGTH devuelve 7
oscuroLEFT vale azul
oscuroRANGE vale azul TO negro
BASE slo se usa junto con otro atributo!
BASE slo se usa junto con otro atributo!
oscuroBASELEFT vale rojo
oscuroBASERANGE vale rojo TO rosa
Guillermo Jaquenod, 2001

VHDL: Lenguaje de descripcin de hardware


Ejemplos de atributos de tipos escalares

Dado los tipos siguientes

Dado el tipo siguiente:

type index_range is range 21 downto 11;


type loglev is (unknown,low,undriven,high);

TYPE resistencia IS RANGE 0 TO 1E9


UNITS ohm; kohm = 1000ohm; Mohm = 1000kohm;
END UNITS resistencia;

Los siguientes atributos asumiran los siguientes valores:

Los siguientes atributos asumiran los siguientes valores:

index_rangeLEFT = 21;
index_rangeLOW = 11;
index_rangeASCENDING = FALSE;
index_rangeVALUE (20) = 20;

resistenciaLEFT = 0 ohm;
resistenciaRIGHT = 1E9 ohm;
resistenciaLOW = 0 ohm;
resistenciaHIGH = 1E9 ohm;
resistenciaASCENDING = TRUE;
resistenciaIMAGE (2 kohm) = 2000 ohm;
resistenciaVALUE (5 Mohm) = 5_000_000 ohm;

loglevLEFT = unknown;
loglevLOW = unknown;
loglevASCENDING = TRUE;
loglevVALUE (low) = low;
loglevVAL(1) = low;

Fuente: ASHENDEN

Guillermo Jaquenod, 2001

Al querer realizar operaciones aritmticas con tipos no numricos puede ser


necesario definir una funcin de overload o directamente hacer uso de atributos.
Por ejemplo, dados los tipos longitud y superficie
TYPE longitud IS NATURAL
UNITS mm; END UNITS longitud;
TYPE superficie IS NATURAL
UNITS mmcuad; END UNITS superficie;

Fuente: ASHENDEN

Guillermo Jaquenod, 2001

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:

S1 := L1 * L2;

Y debe hacerse usando los atributos VAL y POS, como


A := superficieVAL(longitudPOS(L1)*longitudPOS(L2));

Fuente: ASHENDEN

Guillermo Jaquenod, 2001

Se asocia el atributo al objeto


ATTRIBUTE <identificador> OF <objeto:tipo> IS <expresin>;
Por ejemplo, para un objeto CONTROL de tipo alguntipo pueden definirse:

VARIABLE L1,L2: longitud; VARIABLE S1:superficie;

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:

VHDL ofrece un conjunto de operadores predefinidos slo para los tipos


primitivos de VHDL(definidos en el package Standard):
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
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 -.

Preguntas
Dados los siguientes tipos definir cules son los valores de
los atributos LEFT, RIGHT, LOW, HIGH, RANGE,
LENGTH y ASCENDING de cada uno de ellos
type muestra IS bit_vector (15 DOWNTO 0)
type numeros IS
(0,1,2,3,4,5,6,7,8,9);

Para A y B de tipo bit_vector de 5 bits de largo, y C y D de


tipo TIME, definir cuales de las siguientes expresiones son
vlidas, y de serlo el tipo del resultado
A
A
A
A
B
C
C

de multiplicacin y divisin: *, /, MOD, REM. * y / estn predefinidos para los tipos


numricos (enteros y punto flotante), en tanto 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

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

Guillermo Jaquenod, 2001

VHDL: Operadores

Guillermo Jaquenod, 2001

loglevRIGHT = high;
loglevHIGH = high;
loglevIMAGE (undriven) = undriven;
loglevIMAGE (undriven) = 2;
loglevSUCC (unknown) = low;

ATTRIBUTE <identificador> : <tipo del identificador>;


para tipos basados en INTEGERs
para tipos basados en INTEGERs
o sus subtipos el atributo POS
o sus subtipos el atributo POS
coincide con el valor numrico
coincide con el valor numrico

Y las variables

Guillermo Jaquenod, 2001

index_rangeRIGHT = 11;
index_rangeHIGH = 21;
index_rangeIMAGE (14) = 14;

Atributos definidos por el usuario

Ejemplo de uso de atributos

No es vlido hacer:

Ejemplos de atributos de tipos escalares

== XF3;
SRL 3;
XOR B;
+ B;
/= B10010
* D
/ D

Guillermo Jaquenod, 2001

VHDL: Lenguaje de descripcin de hardware


Preguntas

Preguntas

Dado el type numeros IS (0,1,2,3,4,5,6,7,8,9);


Cunto
Cunto
Cunto
Cunto
Cunto
Cunto
Cunto

vale
vale
vale
vale
vale
vale
vale

Dado el type

numerosSUCC (3)?
numerosRIGHTOF(3)?
numerosLOW?
numerosHIGH?
numerosPOS(3)?
numerosVAL(2)?
numerosASCENDING?

matrix IS ARRAY(0 TO 15,12 DOWNTO 0,2 TO 31) OF character;

Decir cul es el valor de las siguientes expresiones:


matrixLEFT
matrixLEFT(1)
matrixLEFT(2)
matrixRIGHT(3)
matrixLOW
matrixLOW(2)
matrixHIGH(3)
matrixRANGE
matrixRANGE(2)
matrixASCENDING(3)
matrixREVERSE_RANGE(2)
matrixLENGTH(3)

Dado el type numdwn IS (9,8,7,6,5,4,3,2,1,0);


Cunto
Cunto
Cunto
Cunto
Cunto
Cunto
Cunto

vale
vale
vale
vale
vale
vale
vale

numdwnSUCC (3)?
numdwnLOW?
numdwnHIGH?
numdwnPOS(3)?
numdwnVAL(2)?
numdwnASCENDING?
numdwnSUCC (numdwnHIGH)?

Guillermo Jaquenod, 2001

Fuente: Ters

Guillermo Jaquenod, 2001

Estructuras de VHDL
Un diseo en VHDL emplea cuatro grandes bloques constructivos:
Entity

Bases de VHDL

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


Architecture

Construcciones bsicas:
Entidad
Arquitectura
Package
Configuracin

Para definir una posible funcionalidad de un modelo


Package
Coleccin de informacin que puede ser referenciada en modelos de
VHDL, consiste en dos partes: Package Declaration y Package Body.
Configuration
Usado para asociar Architectures con Entities, no disponible en varios
paquetes de sntesis (P.Ej: Max+Plus II)

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Un ejemplo en VHDL

Estructuras de VHDL: organizacin


La estructura de mayor nivel en VHDL
se llama design file.
Un design file se compone de una
o ms design units, y cada una se
compone a su vez de varios campos:
una posible referencia al uso de otras
libraries y packages
Un campo primario, asociado a la
declaracin de una entidad (entity),
y/o de un package
Un campo secundario, con la descripcin
de una entre varias posibles
arquitecturas (ARCHITECTURE..OF..
IS..) de la entidad o del package.

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

DESIGN FILE

a
b

LIBRARY..USE...
LIBRARY..USE...
ENTITY..IS
...
END...;
ARCHITECTURE..OF..IS..
...
BEGIN
...
design unit
END..;
END..;
END..;
END..;

design unit

c
d

ejemplo_1

design unit
design unit

AND

Se define separadamente el
comportamiento desde el
punto de vista externo
(ENTITY) a la realizacin
interna (ARCHITECTURE)
Es posible definir distintas
arquitecturas de un mismo
bloque funcional

-- descripcion del nombre y


-- las puertas
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;

Guillermo Jaquenod, 2001

VHDL: Lenguaje de descripcin de hardware


Entidades en VHDL: datos genricos

Entidades en VHDL
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 variable entre entidades
valores genricos, capaces de transportar parametros o informacin
esttica (constante) entre entidades

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

Agregado
Agregado
en VHDL93
en VHDL93

La sintaxis es: ENTITY <identificador> IS

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>;

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

Por ejemplo: ENTITY half_add IS


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

Guillermo Jaquenod, 2001

identificador
identificador

modo
modo

tipo
tipo

Guillermo Jaquenod, 2001

Entidades en VHDL: las puertas

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


una listal formal de seales

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.

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

Guillermo Jaquenod, 2001

La dupla VHDL Entidad + Arquitectura

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

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

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

La arquitectura de una entidad VHDL

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
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> ;

Agregado
Agregado
en VHDL93
en VHDL93

Guillermo Jaquenod, 2001

Estructura bsica de modelado en VHDL


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

Estas tres secciones son


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

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;
Guillermo Jaquenod, 2001

Fuente: ALTERA

10

VHDL: Lenguaje de descripcin de hardware


Estructuras de VHDL:
libraries y packages

Los Packages en VHDL

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.

Una library unit es un conjunto de bloques elementales de


diseo (entidades, arquitecturas y configuraciones: design units)

El uso de un package se indica con la secuencia:

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> ;

LIBRARY <nombre de la library>; USE <nombre del


package.funciones o procedimientos usados de ese package>;

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

La library STD y el package STANDARD

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

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

Esta library y package, y los


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

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..
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
Guillermo Jaquenod, 2001

Tipos
Tipos

Escalares
Escalares

De acceso
De acceso

Discretos
Discretos

Boolean
Boolean
FALSE, TRUE
FALSE, TRUE

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;

Guillermo Jaquenod, 2001

Tipos definidos en el package STANDARD

Natural
Natural
Positive
Positive

Agregados
Agregados
en VHDL-93
en VHDL-93

PACKAGE BODY <package_name> IS


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

Packages del VHDL

Enteros
Enteros

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

Fsicos
Fsicos

Enumerados
Enumerados

Carcter
Carcter

Bit
Bit

0,1
0,1

Archivos
Archivos

Punto
Punto
flotante
flotante

Compuestos
Compuestos

Records
Records

Arrays
Arrays

Reales
Reales

Strings
Strings

Bit-Vector
Bit-Vector

Severity Level
Severity Level

NOTE, WARNING, ERROR, FAILURE


NOTE, WARNING, ERROR, FAILURE

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


revisar STANDARD.VHD en C:\maxplus2\vhdl93\std
Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Ejemplo de un Package cualquiera


LIBRARY ieee; USE ieee.std_logic_1164.all;

Tiempo
Tiempo

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

Fuente: ALTERA MAX+plus II

Fuente: ASHENDEN

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;
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 ;
Guillermo Jaquenod, 2001

Declaracin
Declaracin
del Package
del Package

Cuerpo del
Cuerpo del
Package
Package

Fuente: ALTERA

11

VHDL: Lenguaje de descripcin de hardware


Las Libraries en VHDL

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:

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


uno o ms packages.

La Library IEEE

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

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

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
buscar en C:\MAXPLUS2\VHDL93\IEEE\
Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Interpretacin de X y de Z

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

En VHDL la interpretacin de los valores X (desconocido) y - (sin


importancia) es distinta al caso habitual en diseo lgico o en AHDL,
donde la X se usa para indicar al proggrama de sntesis que un valor
puede ser asignado tanto a 0 como a 1 a los fines de optimizacin.
Por ejemplo, dado un valor s=01100110, de ejecutarse la
sentencia
CUIDADO!
IF s=0110--10 THEN q <= 1; ELSE q <=0;

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

no se dar el primer caso, y esta sentencia equivaldr a

Eso es as porque se estn comparando dos strings de caracteres, y


desde ese punto de vista el 1 y el - son caracteres distintos

q <=0; -- 01100110 distinto a 0110--10 !

library IEEE; use IEEE.std_logic_1164.all;


El string STD_LOGIC_VECTOR no lleva la letra B al inicio!
El string STD_LOGIC_VECTOR no lleva la letra B al inicio!
Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Estructuras de VHDL: la Configuracin

La configuracin es una estructura usada para indicar ciertas


asociaciones:
Asociar una Entidad con una dada Arquitectura
Asociar un Componente a una dupla Entidad-Arquitectura
Es mayormente usada en instancias de simulacin, porque habilita
una forma eficiente de chequear alternativas.
En instancias de Sntesis tiene soporte limitado o nulo

CONFIGURATION <identifier> OF <entity_name> IS


FOR <architecture_name> END FOR;
END CONFIGURATION;

Estructuras de VHDL: configuracion


CONFIGURATION E1A3 OF E1 IS FOR Arq3
END FOR;
END CONFIGURATION;

Entidad E1
Entidad E2

Arq1

Arq2

Arq3
Arq1

Al asociar una Entidad con una Arquitectura se


definen dos tipos de vinculos:

Guillermo Jaquenod, 2001

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

Guillermo Jaquenod, 2001

Arq2

Arq1

Arq2

Arq3

Guillermo Jaquenod, 2001

12

VHDL: Lenguaje de descripcin de hardware


Tipos de descripciones en VHDL

Concurrencia y Secuencialidad
Seales y Variables
Sentencias de asignacin

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

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

STD_LOGIC_VECTOR (7 downto 0);

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;

process

process

signals

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

Guillermo Jaquenod, 2001

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

signals

Concurrentes y
secuenciales

Concurrentes

Qu son las seales (Signals) en VHDL

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


acciones concurrentes y otras exclusivas para procesos secuenciales

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

Guillermo Jaquenod, 2001

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.

Bases de VHDL

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.

Bloque signals Bloque


Funcional
Funcional

Para asignar un valor similar a todos los elementos del array:


temp <= (others => 1);

signals

Para asignar valores en forma mixta:


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

Debe notarse que la referencia a un elemento aislado emplea comillas


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

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Asignaciones concurrentes

Las seales, como elementos de interconexin

VHDL ofrece tres posibles tipos de asignaciones concurrentes:


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

qa <= r or t;
qb <= (qa and not(g xor h));

r
OR

qa

Asignaciones simples (<=)


AND

qb

XOR

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


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

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


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

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

END ARCHITECTURE logic;


asignacin simple de seales!
Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Fuente: ALTERA

Guillermo Jaquenod, 2001

13

VHDL: Lenguaje de descripcin de hardware


Asignaciones simples a seales

Ejemplos: decodificador 2 a 4 estilo RTL

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

LIBRARY ieee; USE ieee.std_logic_1164.ALL;

qa <= r or t ;
qb <= (qa and not(g xor h));
r
OR

ENTITY decod2a4 IS PORT(


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

qa

procesos
implcitos

t
AND

qb

XOR

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.
Fuente: ALTERA

Guillermo Jaquenod, 2001

Asignaciones condicionales concurrentes a


seales: WHEN..ELSE

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;

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

proceso implcito

b
selb

sela

Guillermo Jaquenod, 2001

Porqu?

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

dos funciones combinatorias de 3 entradas


solo requiere dos macroceldas

Guillermo Jaquenod, 2001

Asignaciones condicionales concurrentes:


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;

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Fuente del grfico: SYNPLIFY HDL Analyst

Fuente: DUECK

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

0
1

y3

-- codificador de prioridad

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


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

y2

Asignaciones condicionales concurrentes:


WHEN..ELSE

Permite asignar a una dada seal resultados variables en funcin de


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

y1

sel1

Guillermo Jaquenod, 2001

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


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

y0
sel0

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

Ejemplos: codificador de prioridad 7:3


ENTITY prioricoder8 IS PORT(
d : IN BIT_VECTOR(7 downto 1);
q : OUT INTEGER RANGE 0 to 7);
END prioricoder8 ;
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 ;

q(2)
q(1)
q(0)

Guillermo Jaquenod, 2001

14

VHDL: Lenguaje de descripcin de hardware


Asignaciones condicionales concurrentes a
seales: 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
[label:] WITH <expresin> SELECT
<seal> <= <expresin> WHEN <constante>,
...,
<expresin> WHEN <constante>,
<expresin> WHEN OTHERS;

WITH sel SELECT


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

a
b
c
d
sel

00
01
10
?

Asignaciones condicionales concurrentes a


seales: WITH..SELECT
--- 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;

LIBRARY ieee; USE ieee.std_logic_1164.ALL;

Ejemplos: decodificador BCD a 7 segmentos


ENTITY bcd7seg IS PORT (
codbcd : BIT_VECTOR (3 DOWNTO 0); a,b,c,d,e,f,g : OUT BIT);
END ENTITY bcd7seg;

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)

codbcd

y(1)

ARCHITECTURE usowith_segment OF bcd7seg IS


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

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;
Guillermo Jaquenod, 2001

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

a
b
c
d
e
f
g

Quines
son los
OTHERS?

seg(3);

Guillermo Jaquenod, 2001

Asignaciones usando SELECT:


el uso de WHEN OTHERS

Ejemplos: multiplexor 8 a 1 usando WITH

Guillermo Jaquenod, 2001

1,
3,
5,
7,
9,

Guillermo Jaquenod, 2001

Ejemplos: decodificador 2 a 4 usando WITH

Guillermo Jaquenod, 2001

WHEN
WHEN
WHEN
WHEN
WHEN

Los BIT_VECTOR llevan la letra B al inicio!


Los BIT_VECTOR llevan la letra B al inicio!

WHEN OTHERS considera los 78 casos restantes. Porqu 78?

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

d(0)
d(1)
d(2)
d(3)
d(4)
d(5)
d(6)
d(7)

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
y

sel(2)
sel(1)
sel(0)

ARCHITECTURE usowhen OF mux_8a1 IS BEGIN


MUX8: WITH sel SELECT
y <= d(0) WHEN B"000",
d(1) WHEN B"001",
Porqu ac no
d(2) WHEN B"010",
uso WHEN
OTHERS?
d(3) WHEN B"011",
d(4) WHEN B"100",
d(5) WHEN B"101",
d(6) WHEN B"110",
d(7) WHEN B"111";
END usowhen ;

0));

ARCHITECTURE usoselect OF bcd7seg IS


BEGIN
WITH codbcd SELECT
sevsegs <= B"1111110" WHEN 0,B"0110000"
B"1101101" WHEN 2,B"1111001"
B"0110011" WHEN 4,B"1011011"
B"1011111" WHEN 6,B"1110000"
B"1111111" WHEN 8,B"1111011"
B0000000 WHEN OTHERS;
END ARCHITECTURE usoselect;

Guillermo Jaquenod, 2001

ENTITY mux_8a1 IS PORT(


sel : IN BIT_VECTOR(2 downto 0);
d : IN BIT_VECTOR(7 downto 0);
y : OUT BIT);
END mux_8a1;

cada salida es funcin


combinatoria de 4 entradas
requiere siete macroceldas,
una por cada salida

ENTITY mux2a1_sig IS
PORT ( a,b,sel:IN STD_LOGIC;
z : OUT STD_LOGIC;
END ENTITY mux2a1;
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;

sel es de tipo STD_LOGIC !!

WHEN OTHERS considera


los 7 casos restantes

Guillermo Jaquenod, 2001

15

VHDL: Lenguaje de descripcin de hardware


Mezclas de (a DOWNTO b) con (c TO d)

El uso de vector de rango descendiente (a DOWNTO b) con otros de


rango ascendiente (c TO d) se puede prestar a multiples confusiones:
ENTITY tst_rangos IS PORT (
enttest: IN BIT_VECTOR (0 TO 2);
sale_DOWN: OUT BIT_VECTOR (2 DOWNTO 0);
sale_UP: OUT BIT_VECTOR (0 TO 2);
tsteq: OUT BIT);
END ENTITY tst_rangos ;
ARCHITECTURE tst OF tst_rangos IS
SIGNAL wires: BIT_VECTOR (2 downto 0);
BEGIN
wires <= B"110";
sale_DOWN <= wires;
sale_UP <= wires;
tsteq <='1' WHEN enttest=wires ELSE '0';
END ARCHITECTURE tst;

1. Cunto vale wires (2) y


cunto wires (0)?
2. Cunto vale sale_DOWN(2)
y cunto sale_DOWN (0)?
3. Cunto vale sale_UP(2) y
cunto sale_UP(0)?
4. Qu valor deben tener
enttest(2), enttest(1) y
enttest(0) para que tsteq
valga 1?

Mezclas de (a DOWNTO b) con (c TO d)


ENTITY tst_rangos IS PORT (
enttest: IN BIT_VECTOR (0 TO 2);
sale_DOWN: OUT BIT_VECTOR (2 DOWNTO 0);
sale_UP: OUT BIT_VECTOR (0 TO 2);
tsteq: OUT BIT);
END ENTITY tst_rangos ;
ARCHITECTURE tst OF tst_rangos IS
SIGNAL wires: BIT_VECTOR (2 downto 0);
BEGIN
wires <= B"110";
sale_DOWN <= wires;
sale_UP <= wires;
tsteq <='1' WHEN enttest=wires
ELSE '0';
END ARCHITECTURE tst;

Guillermo Jaquenod, 2001

Cunto valen wires (2),wires (1) y wires (0)? Valen 1, 1 y 0


Cunto valen sale_DOWN(2), sale_DOWN(1) y sale_DOWN (0)? Valen 1, 1 y 0
Cunto valen sale_UP(2), sale_UP(1) y sale_UP(0)? Valen 0, 1 y 1
Qu valor deben tener enttest(2), enttest(1) y enttest(0) para que tsteq valga 1?
Deben valer 0, 1 y 1

Guillermo Jaquenod, 2001

Mezclas de (a DOWNTO b) con (c TO d)


LEFT
B110

RIGHT
1

Bases de VHDL

enttest: BIT_VECTOR (0 TO 2)

bit(0)

bit(1)

bit(2)

sale_DOWN: BIT_VECTOR (2 DOWNTO 0)

bit(2)

bit(1)

bit(0)

sale_UP: BIT_VECTOR (0 TO 2)

bit(0)

bit(1)

bit(2)

wires: BIT_VECTOR (2 downto 0)

bit(2)

bit(1)

bit(0)

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

Las distintas formas de indicar el rango de un vector slo sirven para


definir cul valor de indice es usado para referenciar el elemento de la
izquierda y cual para el de la derecha
Al realizar asignaciones mezcladas lo que se respeta es quin est a la
izquierda y quien a la derecha.
Al definir un bit_string o un string constante se asume que el primer
elemento est a la izquierda y el ltimo a la derecha
Guillermo Jaquenod, 2001

Otras acciones concurrentes: los PROCESOS

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
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

Guillermo Jaquenod, 2001

Sentencias concurrentes: PROCESOS


Los modos posibles (excluyentes entre si) son:
la lista de sensibilidad: es un conjunto de variables adjunto a la
palabra PROCESS, cuyo cambio (ya sea de valor numrico o lgico)
activa la ejecucin del proceso por un barrido
una sentencia WAIT (aceptada con restricciones por las
herramientas de sntesis)
lista de
lista de
sensibilidad
sensibilidad

La sintaxis de un proceso es:

Un proceso conforma un loop infinito, que comienza luego de


PROCESS..BEGIN, llega hasta END PROCESS y vuelve al inicio

[label:] PROCESS

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.

BEGIN

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

[(nombre de seal/es)]

[IS]

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


<sentencias secuenciales>;...;<>;
END PROCESS [label];
El label es opcional!
Guillermo Jaquenod, 2001

16

VHDL: Lenguaje de descripcin de hardware


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
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
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 implcito: PROCESS (qa,g,h) IS BEGIN

Sentencias de control de procesos,


asociadas a eventos: WAIT
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:
[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
[label:] WAIT FOR <expresin temporal>; la resolucin se detiene por un
dado tiempo. ATENCION: WAIT FOR no es sintetizable!

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


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

qb<=(qa and not(g xor h)); END PROCESS;


Guillermo Jaquenod, 2001

Un WAIT UNTIL al comienzo de un proceso es el


nico tipo de WAIT soportado por MAX+plus II VHDL
Guillermo Jaquenod, 2001

Sentencias asociadas a eventos:


ejemplos del uso de WAIT
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.
Por su lado, la sentencia
IF luz=(rojo OR ama) WAIT UNTIL luz=verde; END IF;
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.
No sintetizable!!!
No 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

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

X
a b

PROCESS (X) BEGIN


X1 <= not (X);
END PROCESS;

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

No sintetizable!!!
No sintetizable!!!
Guillermo Jaquenod, 2001

Diseo de un Flipflop usando WAIT

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY wdff IS PORT (
d,reloj : IN std_logic;
q : OUT std_logic );
END ENTITY wdff;
ARCHITECTURE usowait OF wdff IS
BEGIN
PROCESS
BEGIN
WAIT UNTIL reloj='1';
q <= d;
END PROCESS;
END ARCHITECTURE usowait;

10 20 30 40

Guillermo Jaquenod, 2001

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
...no hay lista de sensibilidad!

X1

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

50 60 70
Fuente: SJOHOLM

Variables locales y globales


Al definir las variables se indic que slo pueden ser declaradas en
un proceso, una funcin o un procedimiento, antes del BEGIN, y que
slo pueden almacenar valores temporarios dentro de esa
estructura. Es decir no pueden ser usadas para sacar informacin
fuera de la estructura secuencial donde son declaradas.
VHDL93 agrega las variables globales, que pueden ser usadas para
compartir informacin entre distintos procesos secuenciales (pero no
ser usadas fuera de ellos en sentencias concurrentes, o como parte
de la lista de sensibilidad de un proceso o en un WAIT)!
Las variables globales suelen no ser soportadas por las herramientas
de sntesis, y la sintaxis de su uso es:

WAIT UNTIL espera a que la


condicin pase de falsa a
verdadera => flanco positivo!

SHARED VARIABLE <nombre> : <tipo>;


No es soportado por MAX+plus II VHDL
No es soportado por MAX+plus II VHDL

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

17

VHDL: Lenguaje de descripcin de hardware


Asignaciones a variables en un proceso
Las sentencias de asignacin a variables son de la forma

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


Estas asignaciones son SIEMPRE secuenciales, y la actualizacin de
la variable con el valor de la expresin es realizada inmediatamente
Ejemplo:

si se intercambia el orden el resultado final es distinto


...SON SECUENCIALES!

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;

Guillermo Jaquenod, 2001

Asignaciones a seales en un proceso


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.
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;

Guillermo Jaquenod, 2001

Asignaciones mltiples a seales

Asignaciones condicionales en procesos: IF

Dentro de un proceso secuencial, las sentencias de asignacin a seales


se efectivizan recien al final de cada ciclo de simulacin; es como si estas
sentencias quedaran pendientes y luego se ejecutaran en un tiempo cero,
todas a la vez, cuando un proceso se detiene.
Si a una misma seal se le asignan dos valores distintos dentro de una serie
de sentencias secuenciales, slo es vlida la ltima asignacin; esta
caracterstica es til para definir asignaciones por default

Opera como una nica sentencia que habilita el procesamiento


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

PROCESS
SIGNAL s1, s2,
BEGIN
s1 <= s3;
s1 <= s2;
WAIT FOR 1 ns;
s2 <= s3;
s2 <= s1;
WAIT FOR 1 ns;
END PROCESS;

s3;

-- se superpone la asignacion previa a s1


-- al llegar a wait se le asigna a s1 el valor de s2

--

CUIDADO! No confundirse: Si a una misma seal se le


CUIDADO! No confundirse: Si a una misma seal se le
asignan dos valores dentro de dos procesos secuenciales
asignan dos valores dentro de dos procesos secuenciales
diferentes, ser necesaria alguna funcion de resolucin!
diferentes, ser necesaria alguna funcion de resolucin!

Guillermo Jaquenod, 2001

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

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;

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


circuitos con codificacin de prioridad cuando es sintetizada en hardware
Guillermo Jaquenod, 2001

IF - THEN: Ejemplo

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;

Proceso implcito

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)

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Fuente del grfico: SYNPLIFY HDL Analyst

Uso de IF en PROCESOS combinatorios


-- 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;
ARCHITECTURE usowhen 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 usowhen;

Guillermo Jaquenod, 2001

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

Fuente del grfico: SYNPLIFY HDL Analyst

18

VHDL: Lenguaje de descripcin de hardware


Uso de IF en PROCESOS combinatorios
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;
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;

triout

Uso eficiente de IF - THEN

PROCESS(current_state,x,y,z)
BEGIN
IF current_state = (s1 | s3 | s4)
THEN output1 <= x;
ELSE output1 <= 0;
END IF;
IF current_state = (s0 | s2 | s5)
THEN output2 <= y;
ELSE output2 <= 0;
END IF;
IF current_state = (s6 | s7 | s8)
THEN output3 <= z;
ELSE output3 <= 0;
END IF;
output3 = z and
END PROCESS;

Guillermo Jaquenod, 2001

PROCESS(current_state,x,y,z)
Tmese el ejemplo
BEGIN
siguiente, donde se sabe
output1 <= 0;
que las salidas output(i)
output2 <= 0;
son mutuamente
output3 <= 0;
excluyentes
IF current_state = (s1 | s3 | s4)
Para calcular output3 se
THEN output1 <= x;
chequea que s6..s8 sean
ELSIF current_state = (s0 | s2 | s5)
verdaderas pero tambin
THEN output2 <= y;
que s1..s5 sean falsas
ELSIF current_state = (s6 | s7 | s8)
THEN output3 <= z;
ELSIF causa el uso de lgica innecesaria!
END IF;
...
END PROCESS;

output3= z and ((s6 or s7 or s8)


and (not(s0) and not(s1) and not(s2)
and not(s3) and not(s4) and not(s5)))
Fuente: ALTERA

Guillermo Jaquenod, 2001

Uso eficiente de IF - THEN

Fuente: ALTERA

Guillermo Jaquenod, 2001

Uso eficiente de IF - THEN mediante defaults

Cmo corregir el
ejemplo previo?
Usando para cada
salida sentencias
IF..THEN separadas ,
para evitar la sntesis de
codificadores de
prioridad
sto reduce la logica, el
cableado, y aumenta la
performance

(s6 or s7 or s8)

Fuente: ALTERA

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.
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.
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
[label:] CASE <expresin> IS
WHEN <constante> => <sentencia>;...;<sentencia>;
...
WHEN <constante> => <sentencia>;...;<sentencia>;
WHEN OTHERS <sentencia>;...;<sentencia>;
END CASE;

ASIGNACIONES
MULTIPLES: Si a una
misma seal se le asignan
dos valores dentro de un
mismo bloque secuencial
en un proceso, vale la
ltima asignacin!
No hay colisin y no es
necesaria ninguna
resolucin
Y el cdigo puede
ser ms simple

PROCESS(current_state,x,y,z)
BEGIN
output1 <= 0;
output2 <= 0;
output3 <= 0;
IF current_state = (s1 | s3 | s4)
THEN output1 <= x;
END IF;
IF current_state = (s0 | s2 | s5)
THEN output2 <= y;
END IF;
IF current_state = (s6 | s7 | s8)
THEN output3 <= z;
END IF;
END PROCESS;

CUIDADO! No olvidar: Si a una misma seal se le


CUIDADO! No olvidar: Si a una misma seal se le
asignan dos valores dentro de dos procesos secuenciales
asignan dos valores dentro de dos procesos secuenciales
diferentes, ser necesaria alguna funcion de resolucin!
diferentes, ser necesaria alguna funcion de resolucin!
Fuente: ALTERA

Guillermo Jaquenod, 2001

Asignaciones condicionales en procesos:


CASE
Ejemplo: un multiplexor 4:1
PROCESS(sel, a, b,
BEGIN
CASE sel IS
=> q
WHEN 00
=> q
WHEN 01
=> q
WHEN 10
WHEN OTHERS => q
END CASE;
END PROCESS;

c, d)

Guillermo Jaquenod, 2001

01

10
11

sel
2

<=
<=
<=
<=

a;
b;
c;
d;

a
b
sel0
sel1

c
d

Guillermo Jaquenod, 2001

00

b
c
d

requiere slo 2
macroceldas
operando en
Cascade Chain

Guillermo Jaquenod, 2001

19

VHDL: Lenguaje de descripcin de hardware

Dentro de cada WHEN


de un CASE es posible
incluir varios casos

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

Para ello se usa el


carcter | que
considera el OR de
esos 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 + OR
Rango + OR
END CASE;
END PROCESS micase;
END ARCHITECTURE rangovar;
Distintas formas de incluir
Distintas formas de incluir
mltiples casos en una
mltiples casos en una
sola lnea
sola lnea
Guillermo Jaquenod, 2001

Ejemplos: multiplexor 4 a 1 usando CASE


ENTITY mux4case IS PORT(
d0,d1,d2,d3: IN BIT; s: IN BIT_VECTOR (1 downto 0); y: OUT BIT);
END mux4case;
d(0)
d(1)
ARCHITECTURE mux4to1 OF mux4case IS BEGIN
y
d(2)
PROCESS(s) BEGIN
d(3)
CASE s IS
WHEN B"00" => y <= d0;
WHEN B"01" => y <= d1;
Porqu ac uso
WHEN B"10" => y <= d2;
WHEN OTHERS?
WHEN B"11" => y <= d3;
WHEN OTHERS => y <= '0';
END CASE;
END PROCESS;
END mux4to1;
s(1)
s(0)

Asignaciones condicionales en procesos:


CASE usando rangos u OR

Guillermo Jaquenod, 2001

Ejemplos: demux 3:8 negado tipo 74138


ENTITY dmux8 IS PORT(
s: IN INTEGER Range 0 to 7; d: IN BIT; y: OUT BIT_VECTOR(0 to 7));
END dmux8;
ARCHITECTURE a OF dmux8 IS
SIGNAL sal : BIT_VECTOR(0 to 7);
BEGIN
PROCESS (d,s) BEGIN
IF (d = '1') THEN output <= "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;

s2
s1
s0

y7
y6
y5
y4
y3
y2
y1
y0

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

Comparacin entre CASE y WITH..SELECT


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)
Proceso Implcito

Quines
son los
OTHERS?

a
b
c
d
sel

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

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


la posibilidad de inferir registros (IF incompletos)
generar circuitos de complejidad innecesaria (prioridades indeseadas)

El uso de sentencias CASE es ms conveniente:

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.

No induce prioridades

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

El uso de hardware es ms evidente y predecible


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

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


LOOP
<sentencia>;...;<sentencia>;
END LOOP label;

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

[label:] WHILE <expresin booleana>


LOOP
<sentencia>;...;<sentencia>;
END LOOP label;

Recomendacin: donde pueda reemplace IF por CASE

Guillermo Jaquenod, 2001

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;

Iteraciones en procesos usando LOOP, FOR


LOOP y WHILE LOOP

IF-ELSE versus CASE

Guillermo Jaquenod, 2001

Proceso Explcito

WITH sel SELECT


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

Fuente: ALTERA

Guillermo Jaquenod, 2001

20

VHDL: Lenguaje de descripcin de hardware


Ejemplo: iteraciones usando LOOP

Generador de paridad: LOOP de rango abierto

-- 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

ENTITY generador_paridad_impar IS PORT (


entra: IN BIT_VECTOR; -- vector de rango abierto
paridad: OUT BIT);
Slo se dice que entra es
Slo se dice que entra es
BIT_VECTOR, sin indicar su rango!
END ENTITY generador_paridad_impar; BIT_VECTOR, sin indicar su rango!
ARCHITECTURE usoloop OF generador_paridad_impar IS BEGIN
xor_loop: PROCESS (entra) IS
VARIABLE tempo: BIT;
BEGIN
tempo := '0'; -- se inicializa en 1 para paridad par
FOR i IN entra'RANGE LOOP tempo := tempo XOR entra(i);
END LOOP;
paridad <= tempo;
END PROCESS xor_loop;
END ARCHITECTURE usoloop;

Structural?
Fuente: ALTERA

Guillermo Jaquenod, 2001

Ejemplo: AND(N) con parametros y LOOP

Guillermo Jaquenod, 2001

Ejemplo: suma(N) con parametros y LOOP


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;

ENTITY and_parametrizada IS
GENERIC (retardo: TIME := 10 ns;
fanin: POSITIVE := 4);
PORT (entradas : IN BIT_VECTOR (fanin-1 DOWNTO 0);
salida: OUT BIT);
entradas(n-1)
END ENTITY and_parametrizada;
entradas(n-2)
entradas(n-3)
------------ARCHITECTURE ejemplo OF and_parametrizada IS
------------BEGIN
entradas(1)
proceso: PROCESS (entradas)
entradas(0)
VARIABLE tempo: BIT := 1;
BEGIN
FOR i IN entradasLENGTH-1 DOWNTO 0 LOOP
IF entradas(i) = 0 THEN tempo := 0; END IF;
END LOOP;
salida <= tempo AFTER retardo;
END PROCESS proceso;
END;

salida

Guillermo Jaquenod, 2001

Controles de LOOP: NEXT y EXIT


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 las herramientas de sntesis.
Tanto para NEXT como para EXIT hay dos posibles modos, absoluto
y condicional:
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;
Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Behavioral o

ARCHITECTURE ripple OF sumpara IS


Structural?
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;
Guillermo Jaquenod, 2001

Alcance de la variable de iteracin en un FOR


En una sentencia
FOR <variable local> IN <> LOOP ... END LOOP;

Slo el valor de la <variable de iteracion> puede ser usado en las


asignaciones, siendo invlido cualquier intento de cambiar este valor
ex1: FOR i IN 1 TO 10 LOOP
...
i := 4;
END LOOP ex1;

Adems, dentro del LOOP esta variable local deshabilita cualquier otra
posible variable de igual nombre
k := 7; m := 4;
ex2: FOR k IN 1 TO 15 LOOP
m := k;
END LOOP ex2;
-- ac k sigue valiendo 7 y m vale 15

Guillermo Jaquenod, 2001

21

VHDL: Lenguaje de descripcin de hardware


Asignaciones combinatorias incompletas:
inferencia de elementos 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).

Bases de VHDL

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).

Inferencia de
elementos de memoria
(voluntaria e involuntaria)

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.
CUIDADO! No ver a X como un joker que reemplaza a 0 o 1!
Como alternativa, el uso de clusulas de tipo OTHERS permite
garantizar que todos los casos restantes queden cubiertos

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Inferencia de latches dentro/fuera de procesos


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

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;

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;
Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

ENTITY latchinf IS PORT (enable, data: IN STD_LOGIC;


q : OUT STD_LOGIC);
END latchinf;

i0

i1

Cul es el riesgo de
usar LATCHES al
usar FLEX10K?

ARCHITECTURE maxpld OF latchinf IS BEGIN


latch: PROCESS (enable, data)
BEGIN
IF (enable = '1') THEN q <= data; END IF;
END PROCESS latch;
END maxpld;

data

enable

Cascade In

Carry In
Data1
Data2
Data3
Data4

PRN

4 inp.
LUT

ENA
CLRN

Cascade Out
Fuente: ALTERA MAX+plus II HELP

Guillermo Jaquenod, 2001

Variables en procesos Combinatorios

Uso de seales y de variables


LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY cmb_var IS
PORT(i0, i1, a : IN BIT;
q : OUT BIT);
END ENTITY cmb_var;
ARCHITECTURE logic OF cmb_var IS
SIGNAL val : INTEGER RANGE 0 TO 1;
BEGIN
PROCESS(i0, i1, a)
BEGIN
IF (a = '0') THEN val <= val;
ELSE val <= val + 1;
END IF;
CASE val IS
WHEN 0 => q <= i0;
WHEN 1 => q <= i1;
END CASE;
END PROCESS;
END ARCHITECTURE logic;

Ejemplos: latches

deseo este
circuito... pero
funciona
como se
desea????

Si val es una
seal...cuando se
actualiza?
R: al fin del proceso
Como logro que la
actualizacin sea
inmediata?
R: usando una
VARIABLE
Fuente: ALTERA

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY cmb_var IS
PORT(i0, i1, a : IN BIT;
q : OUT BIT);
END ENTITY cmb_var;
ARCHITECTURE logic OF cmb_var IS
BEGIN
PROCESS(i0, i1, a)
VARIABLE val : INTEGER RANGE 0 TO 1;
BEGIN
IF (a = '0') THEN val := val;
ELSE val := val + 1;
END IF;
CASE val IS
WHEN 0 => q <= i0;
WHEN 1 => q <= i1;
END CASE;
END PROCESS;
END ARCHITECTURE logic;

Guillermo Jaquenod, 2001

i0

i1

deseo este
circuito... pero
funciona
como se
desea????

ahora se ha logrado
que val se actualice
en el momento en
que es le asignado
un valor,
pero.....funciona???'
0'

Fuente: ALTERA

22

VHDL: Lenguaje de descripcin de hardware


Mal uso de variable: inferencia de latches

Evitar los latches mediante la asignacin


permanente de un valor a una variable

val
i0

i1

LIBRARY ieee; USE ieee.std_logic_1164.ALL;


ENTITY cmb_vari IS
PORT(i0, i1,a :IN BIT;q :OUT BIT);
END ENTITY cmb_vari;

0
a

la forma de uso de
val fuerza que se
cree un fedback
combinatorio!!!!

ARCHITECTURE logic OF cmb_vari IS


BEGIN
PROCESS(i0, i1, a, gnd)
VARIABLE val : INTEGER RANGE 0 TO 1;
BEGIN
val := '0';
IF (a = '0') THEN val := val;
ELSE val := val + 1;
END IF;
CASE val IS
WHEN 0 => q <= i0;
WHEN 1 => q <= i1;
END CASE;
END PROCESS;
END ARCHITECTURE logic;

ARCHITECTURE logic OF cmb_var IS


BEGIN
PROCESS(i0, i1, a)
VARIABLE val : INTEGER RANGE 0 TO 1;
BEGIN
IF (a = '0') THEN val := val;
ELSE val := val + 1;
END IF;
CASE val IS
WHEN 0 => q <= i0;
WHEN 1 => q <= i1;
END CASE;
END PROCESS;
END ARCHITECTURE logic;
Fuente: ALTERA

Guillermo Jaquenod, 2001

Flipflops: las formas de definir el reloj


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 relojEVENT AND reloj=1
THEN q <= d;
Muy usada
Muy usada
END IF;
Acepta flancos de X o Z aa1
Acepta flancos de X o Z 1
Tambin sirve para seales BIT
END PROCESS;
Tambin sirve para seales BIT

PROCESS (reloj) BEGIN


IF reloj=1
Slo si no se necesita
Slo si no se necesita
THEN q <= d;
RESET/SET asincrnicos
RESET/SET asincrnicos
Acepta flancos de X o Z aa1
END IF;
Acepta flancos de X o Z 1
Tambin sirve para seales BIT
Tambin sirve para seales 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;

Muy usada
Muy usada
Necesita IEEE_1164
Necesita IEEE_1164
yyseales STD_LOGIC
seales STD_LOGIC

PROCESS (reloj) BEGIN


IF relojEVENT AND reloj=1
AND relojLAST_VALUE=0
THEN q <= d;
Descarta flancos que no sean de 0 aa
Descarta flancos que no sean de 0
END IF;
1, no es usada para sntesis
1, no es usada para sntesis
END PROCESS;

Equivalente aala de abajo,


Equivalente la de abajo,
pero redundante
pero redundante

PROCESS BEGIN
WAIT UNTIL reloj=1;
q <= d;
Slo si no se necesita RESET/SET
Slo si no se necesita RESET/SET
END PROCESS;
asincrnicos
asincrnicos

Ejemplos: Flipflop Toggle sensible al flanco +

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

ahora funciona, pero


cmo se podra hacer ms
simple?
PROCESS(i0, i1, a, gnd)
BEGIN
CASE a IS
WHEN 0 => q <= i0;
WHEN 1 => q <= i1;
END CASE;
END PROCESS;

Fuente: ALTERA

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;
ARCHITECTURE maxpld OF reginf IS
BEGIN
PROCESS
BEGIN
WAIT UNTIL clk = '1';
q <= d;
Carry In
END PROCESS;
Data1
END maxpld;
Data2
Data3
Data4

clk

Cascade In
PRN

4 inp.
LUT

ENA
CLRN

Cascade Out
Fuente: SJOHOLM

Porqu debo definir


q_interno?
Cmo podra evitarlo?

Ejemplos: un Flipflop D sensible al flanco+

ANALIZAR CMO FUNCIONA CADA MTODO!


ANALIZAR CMO FUNCIONA CADA MTODO!

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;

i1

Guillermo Jaquenod, 2001

Acepta flancos de X o Z aa1


Acepta flancos de X o Z 1
Tambin sirve para seales BIT
Tambin sirve para seales BIT

Guillermo Jaquenod, 2001

ENTITY ff_T IS PORT


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

i0

Guillermo Jaquenod, 2001

Fuente: ALTERA MAX+plus II HELP

Ejemplos: Flipflop JK sensible al flanco +


ENTITY ff_JK IS PORT
(J,K,clk: IN STD_LOGIC; q: BUFFER STD_LOGIC);
END ff_JK ;
As evit tener que definir

ARCHITECTURE maxpld OF ff_JK IS


una seal interna
BEGIN
PROCESS
VARIABLE JK : std_logic_vector (1 DOWNTO 0);
BEGIN
Porqu debo
WAIT UNTIL clk = 1;
definir JK?
JK := J & K;
CASE JK is
WHEN 01=> q <= 0;
WHEN 10=> q <= '1;
WHEN 11=> q <= NOT q;
WHEN OTHERS => NULL;
END CASE;
END PROCESS;
END maxpld;

Fuente: CHANG

Guillermo Jaquenod, 2001

Fuente: CHANG

23

VHDL: Lenguaje de descripcin de hardware


Ejemplos: flipflop D sensible al flanco-

Flipflop con SET o RESET asncrono

Tiene algn beneficio o


perjuicio usar flipflops sensibles
al flanco - , al usar FLEX10K?

ENTITY reginf IS PORT (


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

d
ARCHITECTURE maxpld OF reginf IS
BEGIN
PROCESS
BEGIN
WAIT UNTIL clk = '0';
q <= d;
END PROCESS;
END maxpld;

LIBRARY ieee; USE ieee.std_logic_1164.ALL;


ENTITY reginf IS
PORT (d, clk, clr :IN STD_LOGIC; q :OUT STD_LOGIC);
END ENTITY reginf;

con lista de sensibilidad

ARCHITECTURE maxpld OF reginf IS


BEGIN
PROCESS (clk, clr)
BEGIN
IF clr='1'
THEN q <= '0';
ELSIF clk'EVENT AND clk='1' THEN q <= d;
END IF;
END PROCESS;
END ARCHITECTURE maxpld;

clk

q
clk
clr

Quin tiene
prioridad?
clk o clr?

Fuente: ALTERA MAX+plus II HELP

Guillermo Jaquenod, 2001

Flipflop con SET o RESET asncrono

Fuente: ALTERA

Guillermo Jaquenod, 2001

Flipflop con SET y RESET asncrono


ENTITY reginf IS PORT (
d, clk, clr, pre : IN STD_LOGIC;
q : OUT STD_LOGIC);
END reginf;

LIBRARY ieee; USE ieee.std_logic_1164.ALL;


ENTITY reginf IS
PORT (d, clk, clr :IN STD_LOGIC; q :OUT STD_LOGIC);
END ENTITY reginf;

pre
d

clk

ARCHITECTURE maxpld OF reginf IS


sin lista de sensibilidad!
BEGIN
PROCESS
BEGIN
WAIT UNTIL (rising_edge(clk) OR clr='1');
d
q
IF clr='1'
clk
THEN q <= '0';
clr
ELSE q <= d;
END IF;
END PROCESS;
END ARCHITECTURE maxpld; FUNCTION rising_edge (SIGNAL s:std_ulogic)

q
cl

ARCHITECTURE maxpld OF reginf IS


clr
BEGIN
PROCESS (clk, clr, pre)
BEGIN
IF clr = '1'
THEN q <= '0';
ELSIF pre = '1'
THEN q <= '1';
ELSIF clk'EVENT AND clk = '1' THEN q <= d;
END IF;
END PROCESS;
END maxpld;

Cmo son las


prioridades de
clk, clr y pre?

RETURN BOOLEAN;
definida en IEEE.std_logic_1164 junto a falling_edge()!!
Fuente: ALTERA

Guillermo Jaquenod, 2001

Consideraciones al usar ASET, ACLR y ALOAD


Al usar ASET, ACLR y ALOAD no todas las combinaciones
son vlidas, y en ciertos casos el uso de ciertas opciones
limitan la disponibilidad de variables de entrada, y existen 6
posibles Clear&Preset Control Modes.
Slo ACLR es realizado mediante una de las lineas de
control de LAB junto al CHIP-WIDE reset.
Slo ASET puede realizarse por hardware pero tambin
por software (llamado NOT-Gate Push Back) donde
ASET es reemplazado con ACLR y se trabaja con la seal
negada, sin afectar timing o uso de recursos.
Si se usan ASET y ACLR, se consumen las dos lneas de
control disponibles en el LAB!
Los otros 3 modos (Asynchronous load with clear,
Asynchronous load w/preset, y Asynchronous load without
clear or preset) requieren adems el uso de una de las
entradas de datos al LE (DATA 3) como dato de carga
asincrnica, disminuyendo la capacidad combinatoria.
Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Chip
wide
RESET

PRN
D Q

ENTITY ffwena IS PORT(enable,d,clk:IN BIT; q:OUT BIT);


END ffwena ;

CLRN

ARCHITECTURE good OF ffwena IS BEGIN


PROCESS(clk) BEGIN
IF (enable = '0' ) then null;
ELSIF (clk = '1') then q <= d;
END IF;
END PROCESS;
END good;

LABCTL1
(asyn load)

DATA3
(data)
LABCTL2 (clear)
Chip wide RESET

Diseo de un flipflop c/ENABLE


en MAX+plus II VHDL
El diseo de un simple flifpflop con ENABLE puede aprovechar (o no) la existencia de
este tipo de recursos en los FLEX10K, segn el estilo que se use para su definicin

LABCTL1

LABCTL2

Fuente: ALTERA MAX+plus II HELP

Guillermo Jaquenod, 2001

PRN
D Q
CLRN

ARCHITECTURE not_so_good OF ffwena IS BEGIN


PROCESS(clk) BEGIN
IF (clk = '1') THEN
IF (enable = '1' ) THEN q <= d; END IF;
END IF;
END PROCESS;
END not_so_good;

Guillermo Jaquenod, 2001

d
enable
clk

PRN
D Q
ENA
CLRN

d
enable

PRN
D Q
CLRN

clk

Esto sucede con MAX+plus II VHDL pero NO


necesariamente con otras herramienta EDA

Fuente: ALTERA

24

VHDL: Lenguaje de descripcin de hardware


Inferencia de latches en IFs anidados
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;
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;

Flipflop con SET/RESET asncrono y ENABLE

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

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;
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;

sel(0)
sel(1)

d
1

gate

sel(2)

clrn
sel(3)

Fuente: ALTERA

Guillermo Jaquenod, 2001

Errores de inferencia de flipflops


LIBRARY ieee; USE ieee.std_logic_1164.ALL;
i0
ENTITY reg_var IS
i1
PORT(i0,i1,a:IN BIT;
clr,clk:IN STD_LOGIC;
a
q:OUT BIT);
END ENTITY reg_var;
ARCHITECTURE logic OF reg_var IS
BEGIN
deseo sto
PROCESS(clr, clk)
obtengo sto!!
VARIABLE val : INTEGER RANGE 0 TO 1;
BEGIN
IF clr = '1' THEN q <= '0';
ELSIF rising_edge(clk) THEN
i0
IF (a = '0') THEN val := val;
i1
ELSE val := val + 1;
val
END IF;
CASE val IS
WHEN 0 => q <= i0;
WHEN 1 => q <= i1;
0
END CASE;
1
END IF;
a
END PROCESS;
END ARCHITECTURE logic;

ENA
CLRN

clr

ENA
CLRN

clr

ENA
CLRN

clk

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Inferencia de registros: cuntos flipflops?


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

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

clk

D
D QQ

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;

clk

clk

Fuente: ALTERA

Fuente: ALTERA

Guillermo Jaquenod, 2001

D
D QQ

D
D QQ

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;

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;

clk

Fuente: ALTERA

clrn

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

q
Q

Inferencia de registros: cuntos flipflops?


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

clk

Inferencia de registros: cuntos flipflops?


D

Guillermo Jaquenod, 2001

ena

Fuente: ALTERA

Guillermo Jaquenod, 2001

clk

Guillermo Jaquenod, 2001

Fuente: ALTERA

25

VHDL: Lenguaje de descripcin de hardware


Inferencia de registros: cuntos flipflops?
ENTITY reg1 IS
PORT (d,clk:IN BIT;
q:OUT BIT);
END ENTITY reg1;

D Q

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

Fuente: ALTERA

Inferencia de registros: cuntos flipflops?


d

D
D QQ

LIBRARY ieee; USE ieee.std_logic_1164.ALL;


LIBRARY ieee; USE ieee.std_logic_unsigned.ALL;
ENTITY regx IS
PORT (reloj:IN STD_LOGIC; s:OUT STD_LOGIC);
END ENTITY regx;

b q

ARCHITECTURE regx OF regx IS BEGIN


PROCESS (reloj)
VARIABLE c: STD_LOGIC_VECTOR (1 DOWNTO 0);
BEGIN
IF reloj'EVENT and reloj='1' THEN
c:= c + 1;
IF c = "11" THEN s <= '1';
ELSE s <= '0';
END IF;
END IF;
END PROCESS;
END ARCHITECTURE regx;

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.
Fuente: ALTERA

Inferencia de registros: cuntos flipflops?


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

D Q

ENTITY regx IS
(reloj:IN STD_LOGIC; s:OUT STD_LOGIC);
END ENTITY regx;

Guillermo Jaquenod, 2001

c(0)

clk

D Q

Guillermo Jaquenod, 2001

Inferencia de registros: cuntos flipflops?

clk

D
D QQ

c(1)

clk

D Q

reloj

Fuente: ALTERA

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

ARCHITECTURE regx OF regx IS BEGIN


PROCESS (reloj)
VARIABLE c: STD_LOGIC_VECTOR (1 DOWNTO 0);
BEGIN
IF reloj'EVENT and reloj='1' THEN
c:= c + 1;
IF c = "11" THEN s <= '1';
ELSE s <= '0';
END IF;
END IF;
END PROCESS;
END ARCHITECTURE regx;

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;

clk

Guillermo Jaquenod, 2001

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;

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

a q
b

clk

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;

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

Inferencia de registros: cuntos flipflops?

clk

Porqu, si la comparacin
es con 11, la compuerta
en rojo detecta 10?

Fuente: ALTERA

Fuente: ALTERA

Guillermo Jaquenod, 2001

Ejemplos: contador con ENABLE


ENTITY counter IS PORT (
clk, enable : IN STD_LOGIC;
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;

Guillermo Jaquenod, 2001

Fuente: ALTERA MAX+plus II HELP

26

VHDL: Lenguaje de descripcin de hardware


Ejemplos: contador con SLOAD
ENTITY counter IS PORT (
d : IN INTEGER RANGE 0 TO 255; clk, ld : IN
q : OUT INTEGER RANGE 0 TO 255);
END counter;

Ejemplos: contador con SCLR


ENTITY counter IS PORT (
clk, clear : IN STD_LOGIC;
q : OUT INTEGER RANGE 0 TO 255);
END counter;

STD_LOGIC;

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;

clk
ld

Fuente: ALTERA MAX+plus II HELP

Guillermo Jaquenod, 2001

Ejemplos: contador UpDown


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

Para qu se
define
sentido?

Fuente: ALTERA MAX+plus II HELP

Ejemplos: contador con UpDown y LOAD


ENTITY counter IS PORT (
d : IN INTEGER RANGE 0 TO 255;
clk,ld,up_dn: IN STD_LOGIC;
q : OUT INTEGER RANGE 0 TO 255);
END counter;

up_dn
ARCHITECTURE a OF counter IS BEGIN
clk
PROCESS (clk)
ld
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
IF ld='0' THEN cnt:= d; ELSE cnt:= cnt + sentido ; END IF;
END IF;
q <= cnt;
END PROCESS;
END a;
Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

clear
clk

Fuente: ALTERA MAX+plus II HELP

Guillermo Jaquenod, 2001

Sntesis alternativas del contador UpDown

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;

Guillermo Jaquenod, 2001

ARCHITECTURE a OF counter IS BEGIN


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

Fuente: ALTERA MAX+plus II HELP

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;
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;

Usando sentido
q

up_dn

1
clk

-1

Sin usar sentido

+1

+
+

up_dn

clk

Guillermo Jaquenod, 2001

Ejemplos: contador con SCLR y UpDown


ENTITY counter IS PORT (clk,clear,up_dn : IN
q : OUT INTEGER RANGE 0 TO 255);
END counter;

STD_LOGIC;

ARCHITECTURE a OF counter IS BEGIN


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
IF clear ='0' THEN cnt:= 0; ELSE cnt:= cnt + sentido ;
END IF;
END IF;
q <= cnt;
END PROCESS;
END a;

Guillermo Jaquenod, 2001

Fuente: ALTERA MAX+plus II HELP

27

VHDL: Lenguaje de descripcin de hardware


Ejemplos: contadores con cualquier mdulo
ENTITY contador IS GENERIC (modulo : INTEGER := 200);
PORT (reloj: IN STD_LOGIC; sal: OUT INTEGER RANGE 0 TO modulo);
END contador ;

Seales pblicas, locales y procesos


LIBRARY ieee;USE ieee.std_logic_1164.ALL;
ENTITY clk_per IS
PORT(a,b,sel,clr,clk: IN std_logic;
q : OUT std_logic);
END ENTITY clk_per;

Seales
locales
mux_out

a
ARCHITECTURE logic OF clk_per IS
SIGNAL mux_out : STD_LOGIC;
SIGNAL reg : STD_LOGIC;
BEGIN

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;

combinatorio: PROCESS(a, b, sel)


BEGIN
IF sel = '0' THEN mux_out <= a;
ELSE
mux_out <= b;
END IF;
END PROCESS combinatorio;
secuencial: PROCESS(clk, clr)
BEGIN
IF clr='0' THEN reg <='0'; q <='0';
ELSIF rising_edge(clk) THEN
reg <= mux_out; q <= reg;
END IF;
END PROCESS secuencial;
END ARCHITECTURE logic;

Guillermo Jaquenod, 2001

b
sel

reg

ENA
CLR
N

clr

clr

ENA
CLR
N

solo dos macroceldas


Fuente: ALTERA

Asignaciones concurrentes mltiples

VARIABLES ( := )

SEALES ( <= )

clk

clk

Guillermo Jaquenod, 2001

Seales versus Variables

q
D

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

sentencia
utilidad

SCOPE

BEHAVIOR

destino := fuente;

destino <= fuente;


Representa una
interconexin del circuito

Representa una memoria


local usada para la
compilacin

Cobertura local y global


(puede intercomunicar
procesos)

Actualizada
inmediatamente

PROCESS (s1) BEGIN


a <= s1;
END PROCESS;
PROCESS (s2) BEGIN
a <= s21;
END PROCESS;

Cobertura local (slo


dentro de un proceso)

Actualizada al final (en un


WAIT) de cada proceso

al instanciar un componente

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:

Fuente: ALTERA

Guillermo Jaquenod, 2001

Las funciones de resolucin


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:
SIGNAL resuelta: funcion_de_resolucin

tipo_no_resuelto;

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


SUBTYPE tipo_resuelto IS funcion_de_resolucin

Guillermo Jaquenod, 2001

Funciones de resolucin en STD_LOGIC_1164


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;

tipo_no_resuelto;
ENA1

Guillermo Jaquenod, 2001

SALIDA

TYPE opndrn IS (0,H);


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

Guillermo Jaquenod, 2001

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.

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

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;

s1

ENA2
B

L!!
MA

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.


Guillermo Jaquenod, 2001

Fuente: BAKER

28

VHDL: Lenguaje de descripcin de hardware


Resolucin entre seales std_ulogic
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);
ELSE FOR i IN s'RANGE LOOP
result := resolution_table(result, s(i));
END LOOP;
A travs de una tabla se calcula la funcin resolved
END IF;
que decide el valor final
RETURN result;
std_logic es definido como resolved std_ulogic
END resolved;
Fuente: maxplus2\vhdl93\ieee std1164b.vhd y std1164.vhd

Guillermo Jaquenod, 2001

Overload de Operadores

Cmo se hace si se desea usar los operadores aritmticos y


booleanos con otros tipos de datos?
Operator Overloading - redefinicin de funciones Aritmticas y
Booleanas sobre nuevos tipos de objetos.

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

Guillermo Jaquenod, 2001

Bases de VHDL
Otras estructuras y sentencias:
Overload de Operadores
Arrays
Subprogramas
Generate
Assert y Report
NULL
Buffers y buses TriState
Guillermo Jaquenod, 2001

Uso de Overload de Operadores

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;

Un elemento del array es referenciado


mediante un ndice (que puede ser de un tipo
discreto tal como INTEGER o enumerado)
word(3) <= 1;

Se usa el operador sobre los


nuevos tipos

Guillermo Jaquenod, 2001

Los arrays: referencias a elementos y slices

Se incluye el
package donde
se describen los
nuevos
operadores

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

Asignaciones a arreglos
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:
vector_a <= 10011;

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


BITWISE AND
BITWISE AND

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

Un campo de un array (un slice) es


referenciado indicando un rango:
a (4 DOWNTO 0) <= word (7 DOWNTO 3)

tanto en sentido creciente o decreciente

En VHDL93 existen strings de bit predefinidos que pueden ser usados para
asignar valores a objetos tipo bit_vector:
a <= B11010; -- Binario
c <= X1F2D; -- Hexadecimal

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 (4 DOWNTO 0) <= word (1 TO 5)


a <= to_stdlogicvector (XF3);

incluir std_logic_unsigned
incluir std_logic_unsigned
y std_logic_1164)
y std_logic_1164)

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


Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

29

VHDL: Lenguaje de descripcin de hardware


Asignaciones a arreglos: uso de aggregates
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>)

Arreglos multidimensionales. El tipo STRING

a <= (OTHERS => 1);

Un array puede ser multidimensional, tal como:

4 Columnas
4 Columnas

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

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

3 Filas
3 Filas

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

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.

Donde estas asignaciones no necesariamente deben ser constantes:


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

);

AGGREGATE
AGGREGATE

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:
TYPE nibble IS ARRAY (0 TO 3) OF BIT;
.....
El valor de todo el array b es
El valor de todo el array b es
VARIABLE a,b : nibble;
copiado en todo el array a
copiado en todo el array a
....
a := b;

Guillermo Jaquenod, 2001

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

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


Guillermo Jaquenod, 2001

Concatenado de arreglos (operador &)

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 ambiguious type
Guillermo Jaquenod, 2001

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
SIGNAL sumtmp : STD_LOGIC_VECTOR (ancho DOWNTO 0);
Others!
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 de (+)
Overload de (+)
END PROCESS;

Guillermo Jaquenod, 2001

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


LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.ALL;
ENTITY sumador IS PORT (cin : IN STD_LOGIC;
requiere 9
requiere 9
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 a es de 8
Como a es de 8
ARCHITECTURE uso_concat OF sumador IS
bits, con
bits, con
('0'&a) lo
SIGNAL sumtmp : STD_LOGIC_VECTOR (8 DOWNTO 0);
('0'&a) lo
fuerzo a 9 bits
fuerzo a 9 bits
BEGIN
sumtmp <= ('0'&a)+ b + cin;
A suma se genera con solo 8
sumout <= sumtmp (7 DOWNTO 0);
A suma se genera con solo 8
de los 9 bits de sumtmp, y
de los 9 bits de sumtmp, y
cout <= sumtmp(8);
cout con un bit aislado
cout con un bit aislado
END ARCHITECTURE uso_concat;

Guillermo Jaquenod, 2001

Ejemplo con arrays, subarrays, concatenado,


others, generics, overload de suma,..,etc.

Guillermo Jaquenod, 2001

Concatenado de arrays y subarrays

La suma
La suma

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

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


cout <= sumtmp(ancho);
Elemento de un array
Elemento de un array
END ARCHITECTURE concat;

El tipo STRING es un array de caracteres predefinido como:

SubArray
SubArray

Fuente: BAKER

Ports tipo array, de rango indefinido


En STANDARD.VHD el tipo BIT_VECTOR est definido como type
BIT_VECTOR is array (NATURAL range <>) of BIT;, sin rango definido.
De igual modo se pueden definir entidades con ports de rango indefinido, cuyo
rango se define al instanciarlas como componentes de una jerarquia superior
ENTITY or_gate IS PORT (
Slo se dice que entra es
Slo se dice que entra es
BIT_VECTOR, sin indicar su rango!
entra: IN BIT_VECTOR;
BIT_VECTOR, sin indicar su rango!
sale: OUT BIT);
END ENTITY or_gate;
ARCHITECTURE usoloop OF or_gate IS BEGIN
or_loop: PROCESS (entra) IS
Al usar RANGE es innecesario
Al usar RANGE es innecesario
VARIABLE tempo: BIT;
conocer el tamao de entra
conocer el tamao de 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;
Guillermo Jaquenod, 2001

30

VHDL: Lenguaje de descripcin de hardware


La sentencia GENERATE

Ejemplo de GENERATE: sumador

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
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: IF
Atencin: IF
GENERATE no tiene
GENERATE no tiene
ELSE GENERATE
ELSE GENERATE
como el AHDL!
como el AHDL!

Guillermo Jaquenod, 2001

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;

Fuente: DUECK

Guillermo Jaquenod, 2001

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

ASSERT y REPORT
Las sentencias ASSERT/REPORT son de utilidad para el
chequeo de errores y el debug. Su sintaxis es:
[ASSERT <condicin booleana>] REPORT <mensaje>
SEVERITY <nivel de gravedad>;

Donde los posibles niveles de gravedad son definidos por


enumeracin en el package STANDARD, de la forma:
TYPE SEVERITY_LEVEL IS (NOTE,WARNING,ERROR FAILURE);

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.

Guillermo Jaquenod, 2001

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 ...
Guillermo Jaquenod, 2001

Ejemplo: test de salidas usando ASSERT


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;
relojd <= relojDELAYED(t_hold);
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;

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

ac se activa chk_thold

datos

reloj

tsetup

thold

La sentencia NULL
En VHDL existe la
sentencia NULL para
indicar que no se hace
nada, y sirve para
realizar una
especificacin ms
completa.
Por ejemplo, para indicar
que una de las
aternativas de un CASE
no debe hacerse nada.

violacion
de tsetup
relojd
violacion
de thold

Es como la sentencia
vaca (;) del C
ac se activa chk_thold

ARCHITECTURE nullex OF uso_NULL IS


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

Guillermo Jaquenod, 2001

31

VHDL: Lenguaje de descripcin de hardware


Las instrucciones de SHIFT

Las instrucciones de SHIFT lgico

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)
xLEFT

SLL

xRIGHT

SLA

FALSE
0

SRL

FALSE
0

Shifts lgicos

Shifts aritmticos

ROL

el operando izquierdo es un array de


BIT o BOOLEAN cuyo valor ser
desplazado
el operando derecho es un INTEGER
que indica la cantidad de
desplazamientos a realizar. Si se indica
un valor negativo se asume un
desplazamiento en el sentido opuesto

SRA

SLL

VHDL93 define 2 operandos de shift


lgico llamados SLL y SRL, que usan
dos operandos:

FALSE
0
B10011010 SLL 3 = B11010000
B10011010 SLL 3 = B11010000
B00001000 SLL -1 = B00000100
B00001000 SLL -1 = B00000100

SRL
FALSE
0
B10011010 SRL 3 = B00010011
B10011010 SRL 3 = B00010011
B00001000 SRL -1 = B00010000
B00001000 SRL -1 = B00010000

En el SHIFT LOGICO se ingresa un


0 o un valor FALSE en el sitio que
queda vacante

ROR

SLL -3 es lo mismo
que SRL 3!!

Rotaciones
Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Las instrucciones de SHIFT aritmtico


VHDL93 define 2 operandos de shift
aritmtico llamados SLA y SRA, que
usan dos operandos:
el operando izquierdo es un array de
BIT o BOOLEAN cuyo valor ser
desplazado
el operando derecho es un INTEGER
que indica la cantidad de
desplazamientos a realizar. Si se indica
un valor negativo se asume un
desplazamiento en el sentido opuesto

Las instrucciones de rotacin


VHDL93 define 2 operandos de
rotacin llamados ROL y ROR, que
usan dos operandos:

SLA

B10011011 SLA 3 = B11011111


B10011011 SLA 3 = B11011111
B00001000 SLA -1 = B00000100
B00001000 SLA -1 = B00000100

el operando izquierdo es un array de


BIT o BOOLEAN cuyo valor ser
desplazado

SRA

B10011010 SRA 3 = B11110011


B10011010 SRA 3 = B11110011
B00001000 SRA -1 = B00010000
B00001000 SRA -1 = B00010000

En el SHIFT ARITMTICO se
conserva el valor del sitio que queda
vacante (LEFT en SRA y RIGHT en
SLA)

B10011010 ROL 3 = B11010100


B10011010 ROL 3 = B11010100
B00001001 ROL -1 = B10000100
B00001001 ROL -1 = B10000100

ROR

B10011010 ROR 3 = B01010011


B10011010 ROR 3 = B01010011
B10001000 ROR -1 = B00010001
B10001000 ROR -1 = B00010001

En las rotaciones el valor que sale


por un extremo es cargado en el sitio
que queda vacante

SLA -3 es lo mismo
que SRA 3!!

Guillermo Jaquenod, 2001

ROL -3 es lo mismo
que ROR 3!!

Guillermo Jaquenod, 2001

Buses TriState: modelo de un 74374

La forma de crear un buffer TRISTATE


es definir una seal tipo STD_LOGIC y
asignarle el valor Z.

ENTITY tri_state_buffs IS
PORT (a,oe : IN std_logic;
b1,b2: OUT std_logic);
END ENTITY tri_state_buffs;

En el MAX+plus II hay un modo


preferencial, definiendo primero los
casos en que vale Z

ARCHITECTURE x
OF tri_state_buffs IS
BEGIN
b1 <= 'Z' WHEN oe = '0
ELSE a ;
WHEN oe = '1
ELSE 'Z' ;

END ARCHITECTURE x;

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

b1
oe

a
oe

b2

Fuente: ALTERA

LIBRARY ieee; USE ieee.std_logic_1164.ALL;


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;

salida

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;

datos

Maneras de definir buffers TriState

b2 <= a

el operando derecho es un INTEGER


que indica la cantidad de rotaciones a
realizar. Si se indica un valor negativo
se asume un desplazamiento en el
sentido opuesto

ROL

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

Guillermo Jaquenod, 2001

32

VHDL: Lenguaje de descripcin de hardware


Subprogramas: funciones y procedimientos
Los subprogramas permiten implementar algoritmos reutilizables.
Son declarados en la seccin ARCHITECTURE de una entidad (previo
al BEGIN), o en un PACKAGE (prototipo) y PACKAGE BODY(cuerpo).
VHDL ofrece dos tipos de subprogramas:
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
PROCEDIMIENTOS: usados para descomponer grandes bloques de
comportamiento, y su ejecucion puede extenderse en el tiempo incluyendo sentencias
tipo WAIT

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


FUNCTION slo puede llamar otra FUNCTION.
PARAMETERS

PROCEDURE

PARAMETERS

ARCHITECTURE
begin
...
end

Subprogramas: las funciones


Usadas para tareas tales como conversin de tipo o resolucin de
conflictos (P.Ej: doble asignacin a una misma seal)
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)
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.

Su formato es:
FUNCTION <nombre de funcin> (<parmetros de entrada>)
RETURN <tipo de datos> IS
{declaraciones locales: tipos,constantes,variables,..}
BEGIN
{functionalidad}

PARAMETERS
RETURN VALUE

RETURN <variable o sentencia>


FUNCTION

Guillermo Jaquenod, 2001

Fuente: ALTERA

END FUNCTION <nombre de funcin>;

Guillermo Jaquenod, 2001

Subprogramas: las funciones

Funcin para comparar strings con dont care

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.

Para comparar dos operandos tipos std_logic_vector, cuyos elementos puedan


ser X (desconocido), puedo definir una funcin string_match (a,b):

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


objetos tipo BIT)
PURE FUNCTION flancopos (SIGNAL reloj:BIT) RETURN BOOLEAN IS
BEGIN
RETURN (reloj = 1 AND relojEVENT);
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)
memo_top := memo_top + pidmem; RETURN memo_top;

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;
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) = X' OR b(i)=X') 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 memuso;


Guillermo Jaquenod, 2001

Subprogramas: los procedimientos


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
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
[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
Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

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 del
Descripcin del
salida <= dato;
PROCEDURE dentro
PROCEDURE dentro
END LOOP;
de una arquitectura
de una arquitectura
END PROCEDURE flipflop;
BEGIN
Llamadas concurrentes al
Llamadas concurrentes al
flipflop (D1,R1,S1);
PROCEDURE con PORT MAP
PROCEDURE con PORT MAP
flipflop (D2,R2,S2);
P1: PROCESS BEGIN
Llamadas secuenciales
Llamadas secuenciales
flipflop (D1,R1,S1);
al PROCEDURE con
al PROCEDURE con
PORT MAP
END PROCESS P1;
PORT MAP
(dentro de un proceso)
(dentro de un proceso)
...
END ARCHITECTURE usoproc;

Guillermo Jaquenod, 2001

33

VHDL: Lenguaje de descripcin de hardware


Subprogramas: funciones y procedimientos
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.
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.
En el caso de las FUNCTIONS, su carcter instantneo no permite el uso de
objetos locales tipo SIGNAL o sentencias WAIT

Guillermo Jaquenod, 2001

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;

Prototipos
Prototipos

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;
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;

Guillermo Jaquenod, 2001

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

Subprogramas: parmetros de rango abierto


LIBRARY ieee; USE ieee.std_logic_1164.ALL;
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;

(3
(3
(6
(6

DOWNTO
DOWNTO
DOWNTO
DOWNTO

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

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;
BEGIN
amax <= max (a1,a2);
bmax <= max (b1,b2);
END ARCHITECTURE rangoabierto;

Bases de VHDL

Descripcin de la
Descripcin de la
FUNCTION dentro de
FUNCTION dentro de
una arquitectura
una arquitectura

Cada llamada a max devuelve


Cada llamada a max devuelve
un largo distinto: amax tiene
un largo distinto: amax tiene
largo 4 y bmax largo 7
largo 4 y bmax largo 7

Guillermo Jaquenod, 2001

Tipos y Packages aritmticos


Uso eficiente
de operadores aritmticos
Guillermo Jaquenod, 2001

Qu incluye logic_arith.vhd?

Operaciones y tipos aritmticos


Para Operaciones y tipos aritmticos, Altera recomienda el uso de los
siguientes tipos:
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.
Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Fuente: ALTERA

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:
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 c:\MAXPLUS2\VHDL93\IEEE\arith.vhd y arithb.vhd !!


revisar c:\MAXPLUS2\VHDL93\IEEE\arith.vhd y arithb.vhd !!
Guillermo Jaquenod, 2001

Fuente: ALTERA

34

VHDL: Lenguaje de descripcin de hardware


Qu incluyen std_logic_signed y .._unsigned?
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
Funciones de Overload de + y unario y de ABS (1 funciones en cada caso) para
operando STD_LOGIC_VECTOR, con retorno STD_LOGIC_VECTOR
Funcion de Overload de * (1 funcion) para operandos STD_LOGIC_VECTOR, con
retorno STD_LOGIC_VECTOR
Funciones de Overload de <, >, <=, >=, =, /=, (2 funciones en cada caso) para
operandos STD_LOGIC_VECTOR e INTEGER, con retorno BOOLEAN
function CONV_INTEGER (STD_LOGIC_VECTOR) return INTEGER;

Fuente: ALTERA

Conversin de tipos aritmticos

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
Fuente: ALTERA

_LOGIC_ARITH, _SIGNED y _UNSIGNED


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
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_arith.ALL;
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;

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

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.
Por ejemplo:

SIGNED'("0110") representa +6

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
SIGNED'("1010") representa -6

Guillermo Jaquenod, 2001

Ejemplo de conversin aritmtica

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

Guillermo Jaquenod, 2001

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

Por ejemplo:

revisar c:\MAXPLUS2\VHDL93\IEEE\signed.vhd y signedb.vhd,


revisar c:\MAXPLUS2\VHDL93\IEEE\signed.vhd y signedb.vhd,
as como unsigned.vhd y unsignb.vhd !!
as como unsigned.vhd y unsignb.vhd !!
Guillermo Jaquenod, 2001

Tipos SIGNED y UNSIGNED

Ejemplo: un sumador con entradas UNSIGNED y salida INTEGER


LIBRARY ieee; USE ieee.std_logic_1164.all;
USE ieee.std_logic_arith.all;
ENTITY adder IS PORT (
op1,op2:IN UNSIGNED(7 DOWNTO 0); result:OUT INTEGER);
END adder;
ARCHITECTURE maxpld OF adder IS
BEGIN
result <= CONV_INTEGER(op1 + op2);
END maxpld;

Guillermo Jaquenod, 2001

Agregado de bits en una conversin


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)
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);

largo=5 bits
largo=5 bits

largo=6 bits
largo=6 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.
Guillermo Jaquenod, 2001

Fuente: SJOHOLM

35

VHDL: Lenguaje de descripcin de hardware


Ejemplo de Overload de un operador
aritmtico

Uso eficiente de operadores aritmticos

Los operadores estn definidos slo para ciertos tipos de operandos


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

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


definir una funcin + para esos tipos:
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;

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
sum <= a + b;

COMPILADOR

sum

Usa aasu vez tres funciones:


Usa su vez tres funciones:
CONV_INTEGER (std_logic_vector) RETURN (integer) para pasar de
CONV_INTEGER (std_logic_vector) RETURN (integer) para pasar de
STD_LOGIC_VECTOR aaUNSIGNED. Definida en STD_LOGIC_ARITH
STD_LOGIC_VECTOR UNSIGNED. Definida en STD_LOGIC_ARITH
CONV_STD_LOGIC_VECTOR (integer,integer) RETURN (std_logic_vector)
CONV_STD_LOGIC_VECTOR (integer,integer) RETURN (std_logic_vector)
para la funcion opuesta. Definida en STD_LOGIC_ARITH
para la funcion opuesta. Definida en STD_LOGIC_ARITH
MAXIMUM (integer,integer) RETURN (integer). Definida por el diseador
MAXIMUM (integer,integer) RETURN (integer). Definida por el diseador

Guillermo Jaquenod, 2001

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

Guillermo Jaquenod, 2001

Uso eficiente de operadores aritmticos


LIBRARY ieee;
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_arith.all;
USE ieee.std_logic_arith.all;

a
c

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

b
d

Uso eficiente de operadores aritmticos


LIBRARY ieee; USE ieee.std_logic_1164.all;
USE ieee.std_logic_arith.all;

MUX

sum

48 LEs
48 LEs
2 bloques de 16 LEs c/u
2 bloques de 16 LEs c/u
usando cadenas de Carry
usando cadenas de Carry

Fuente: ALTERA

Guillermo Jaquenod, 2001

Uso aritmtico de las familias FLEX, ACEX y


APEX: los modos de operacin
NORMAL
4 inp.
LUT

3 inp.
LUT

Fuente: ALTERA

Cascade In

Carry In
Data1
Data2

ENA
CLRN

tambin 48 LEs, pero


tambin 48 LEs, pero
slo 1 bloque de 16 LEs
slo 1 bloque de 16 LEs
usa cadenas de Carry
usa cadenas de Carry

El modo de operacin NORMAL en


FLEX/ACEX/APEX

PRN
D

1 sumador
1 sumador
+
+
2 multiplexer:
2 multiplexer:

Guillermo Jaquenod, 2001

ARITMETICO
3 inp.
LUT

PRN

sum

input

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;

2 sumadores
2 sumadores
+
+
1 multiplexer:
1 multiplexer:

b
d

input

ARCHITECTURE behavior OF add_ex1 IS


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

a
c

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;

ENA
CLRN

Data3
Data4

4 inp.
LUT

PRN
D

ENA
CLRN

Cascade Out
3 inp.
LUT
3 inp.
LUT

PRN
D

ENA
CLRN

U/D
COUNTER

3 inp.
LUT
3 inp.
LUT

En este modo cada LE puede resolver funciones de Fan-In 4, registradas o no.

PRN
D

ENA
CLRN

COUNTER C/CLEAR

Los modos de operacin de los elementos lgicos, en las familias FLEX, ACEX
y APEX, redefinen las conexiones de los recursos internos de cada macrocelda,
de modo de hacer ms eficiente la realizacin de ciertas aplicaciones tpicas.

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Fuente: ALTERA

Al disponer una entrada alternativa a Data 3 desde la cadena de Carry (seal Carry_In)
sirve para terminar una suma cuando es necesario tener acceso a la seal Cout de la
etapa ms significativa para su uso por otros circuitos
Permite uso pleno de las cadenas de Cascada y de funciones adicionales como registerpacking.
El uso de register packing, o de flipflops con enable se hace a costa de perder fan-in (Data
4 o Data 1, respectivamente)
Si una funcin se requiere a la vez en forma combinatoria y registrada la celda se
aprovecha al mximo (recordar para el ejemplo de computo paralelo de CRC-16)
Guillermo Jaquenod, 2001

Fuente: ALTERA

36

VHDL: Lenguaje de descripcin de hardware


El modo de operacin ARITMTICO en
FLEX/ACEX/APEX
Carry In
Data1
Data2

AnBn

Cascade In
3 inp.
LUT

A1B1

El modo de operacin U/D Counter en


FLEX/ACEX/APEX

A0B0 Cin
Carry In
Enable

PRN
D

Din

ENA
CLRN

3 inp.
LUT

Carry Out

Cout

Cascade Out

Sn ........... S1

S0

U/D
Load

Cascade In
3 inp.
LUT

PRN
D

ENA
CLRN

3 inp.
LUT

Carry Out

Cascade
Out

IF rising_edge (clk) THEN


IF ena = '1' THEN
IF nld = '0
THEN count_signal <= data;
ELSIF ud='1
THEN count_signal<=count_signal+1;
ELSE count_signal<=count_signal-1;
END IF;
END IF;

Este modo slo se emplea si las cadenas de Carry estn habilitadas. En l cada LE puede
resolver dos funciones simultaneas de Fan-In 3, donde una de las entradas debe venir de
la cadena de Carry, y una de las funciones de salida debe salir hacia la cadena de Carry.

En este modo cada LE puede resolver una etapa de bit de un contador con controles de
LOAD sincrnico, ENABLE y Up/Down.

El resultado de la operacin (suma o resta) puede salir en forma combinatoria, o ser


registrado (ACUMULADOR)

Si las prioridades se respetan y el uso de Carry-Chains est habilitado, el MAX+plusII


emplea automticamente este modo de operacin

En un sumador de n bits con Carry de entrada y de salida se hace necesario un LE


adicional en modo aritmtico para ingresar el Carry_In a la cadena de carry y otro LE en
modo normal para sacar Carry_Out al resto del circuito

El uso de la cadena de Carry impone restricciones de fitting

La cadena de Carry impone restricciones de fitting

Fuente: ALTERA

Guillermo Jaquenod, 2001

El modo de operacin CLEARABLE


COUNTER en FLEX/ACEX/APEX
Carry In
Enable

3 inp.
LUT

PRN
D

Din
Clear
Load

ENA
CLRN

3 inp.
LUT

Carry Out

Cascade
Out

IF rising_edge (clk) THEN


IF ena = '1' THEN
IF clr = '0
THEN count_signal <= 0;
ELSIF load=0
THEN count_signal<=data;
ELSE count_signal<=count_signal+1;
END IF;
END IF;

En este modo cada LE puede resolver una etapa de bit de un contador con controles
de LOAD y CLEAR sincrnico, y ENABLE.
Si las prioridades se respetan y el uso de Carry-Chains est habilitado, el MAX+plusII
emplea automticamente este modo de operacin
El uso de la cadena de Carry impone restricciones de fitting
CLEAR siempre tiene prioridad sobre LOAD, en tanto que ENABLE puede tener la
mxima o la minima prioridad. Si la especificacin de VHDL no respeta esta prioridad
pueden llegar a ser necesarios dos LEs por etapa

Es importante notar que las prioridades entre ENABLE y LOAD pueden ser conmutadas
(analizar el circuito para ver cmo se hace), pero a su vez tienen prioridad sobre
Up/Down. Si la especificacin de VHDL no respeta esta prioridad pueden llegar a ser
necesarios dos LEs por etapa
Fuente: ALTERA

Guillermo Jaquenod, 2001

Uso ptimo de los modos COUNTER


--- contador con Clear, Load y Enable --parametrizado!
LIBRARY ieee; USE ieee.std_logic_1164.all;
ENTITY cont_cl_ld_ena IS
GENERIC (count_value : INTEGER := 511);
PORT ( data : IN
INTEGER RANGE 0 TO count_value;
clk, clrn, ena, nld : IN STD_LOGIC;
count_output : OUT
INTEGER RANGE 0 TO count_value );
END ENTITY cont_cl_ld_ena;

porqu? Qu
pasa si no pongo
RANGE? ..

ARCHITECTURE a OF cont_cl_ld_ena IS
SIGNAL
count_signal : INTEGER RANGE 0 TO count_value;
BEGIN
data[] count_out
PROCESS (clk, clrn)
BEGIN
nld
IF clrn = '0' THEN count_signal <= 0;
ena
clk
ELSIF rising_edge (clk) THEN
clrn
IF nld = '0' THEN count_signal <= data;
ELSIF ena = '1' THEN count_signal <= count_signal + 1;
END IF;
END IF;
requiere 10 macroceldas, 9 de ellas
END PROCESS;
count_output <= count_signal;
operando en modo counter por contar
END ARCHITECTURE a ;

hasta 511, ms una celda extra

Porqu ac uso rising_edge()?


Guillermo Jaquenod, 2001

Fuente: ALTERA

Uso ptimo de los modos COUNTER


LIBRARY ieee; USE ieee.std_logic_1164.all;
ENTITY cont_cl_ld_ena IS
GENERIC (count_value : INTEGER := 511);
PORT (data : IN
INTEGER RANGE 0 TO count_value;
clk, clrn, ena, nld : IN STD_LOGIC;
count_output:OUT INTEGER RANGE 0 TO count_value);
END ENTITY cont_cl_ld_ena;
ARCHITECTURE a OF cont_cl_ld_ena IS
data[] count_out
SIGNAL
count_signal:INTEGER RANGE 0 TO count_value;
BEGIN
nld
PROCESS (clk, clrn) BEGIN
ena
IF clrn = '0' THEN count_signal <= 0;
clk
ELSIF rising_edge (clk) THEN
clrn
IF ena = '1' THEN
IF nld = '0 THEN count_signal <= data;
ELSE count_signal <= count_signal + 1;
END IF;
END IF;
END IF;
ahora requiere slo 9
END PROCESS;
macroceldas operando en modo
count_output <= count_signal;
counter Porqu???
END ARCHITECTURE a ;
Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Uso ptimo de los modos COUNTER


PROCESS (clk, clrn) BEGIN
ac nld tiene prioridad sobre ena, lo que no
IF clrn = '0' THEN count_signal <= 0;
coincide con un LE en modo counter
ELSIF rising_edge (clk) THEN
IF nld = '0' THEN count_signal <= data;
ELSIF ena = '1' THEN count_signal <= count_signal + 1;
END IF;
END IF;
ENABLE
END PROCESS
3 inp.
DIN

LUT

PRN

ENA
CLRN
3 inp.
PROCESS (clk, clrn) BEGIN
UP/DOWN
LUT
IF clrn = '0' THEN count_signal <= 0;
LOAD
ELSIF rising_edge (clk) THEN
IF ena = '1' THEN
LE en modo counter
IF nld = '0 THEN count_signal <= data;
ELSE count_signal <= count_signal + 1;
END IF;
END IF;
ac se modela un circuito donde
END IF;
ena tiene prioridad sobre nld, que
END PROCESS;
coincide con el circuito interno de
count_output <= count_signal;

un LE en modo counter
Guillermo Jaquenod, 2001

37

VHDL: Lenguaje de descripcin de hardware


Ejemplos: contador con LOAD y ENABLE
ENTITY counter IS PORT (
d: IN INTEGER RANGE 0 TO 255; clk,ld,enable: IN
q: OUT INTEGER RANGE 0 TO 255);
END counter;

STD_LOGIC;

d
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;
ELSIF enable='1' THEN cnt:= cnt + 1;
END IF;
END IF;
Carry In
q<=
cnt;
Enable
END PROCESS;
END a;

Aprovecha
el modo
Counter?

ld

3 inp.
LUT

PRN
D

ENA
CLRN

3 inp.
LUT

Carry Out

up_dn
ARCHITECTURE a OF counter IS BEGIN
q
PROCESS (clk)
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
IF enable = '1' THEN cnt := cnt + sentido ; END IF;
END IF;
Carry In
q <= cnt;
Cascade In
Enable
3 inp.
END PROCESS;
LUT
END a;
Din

Cascade
Out

Fuente: ALTERA MAX+plus II HELP

Ejemplos: contador con SCLR y ENABLE


ENTITY counter IS PORT (
clk, clear, enable : IN STD_LOGIC;
qg : OUT INTEGER RANGE 0 TO 255);
END counter;

U/D
Load
Guillermo Jaquenod, 2001

enable
clear
clk

Carry Out

Cascade Out

Ejemplos: contador con SCLR y LOAD

Fuente: ALTERA MAX+plus II HELP

ARCHITECTURE a OF counter IS BEGIN


PROCESS (clk)
VARIABLE cnt : INTEGER RANGE 0 TO 255;
clear
BEGIN
clk
IF (clk = '1') THEN
ld
IF clear = '0' THEN cnt := 0;
ELSIF ld = '0' THEN cnt := d;
ELSE
cnt := cnt + 1;
END IF;
Aprovecha el
modo
END IF;
Counter?
q <= cnt;
END PROCESS;
END a;
Guillermo Jaquenod, 2001

Ejemplos: contador con SCLR, LOAD y ENA


ENTITY counter IS PORT (clk, clear, ena : IN
q : OUT INTEGER RANGE 0 TO 255);
END counter;

ARCHITECTURE a OF counter IS BEGIN


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
IF ld='0' THEN cnt:= d;
ELSIF ena='1' THEN cnt:= cnt + sentido;
END IF;
END IF;
Aprovecha el
q <= cnt;
modo
Counter?
END PROCESS;
END a;

ARCHITECTURE a OF counter IS BEGIN


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

Fuente: ALTERA MAX+plus II HELP

Fuente: ALTERA MAX+plus II HELP

ENTITY counter IS PORT (d : IN INTEGER RANGE 0 TO 255;


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

Guillermo Jaquenod, 2001

Fuente: ALTERA MAX+plus II HELP

Ejemplo: contador con UpDown, LOAD y ENA

Guillermo Jaquenod, 2001

PRN

ENA
CLRN

3 inp.
LUT

ENTITY counter IS PORT (


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

ARCHITECTURE a OF counter IS BEGIN


PROCESS (clk)
VARIABLE cnt : INTEGER RANGE 0 TO 255;
BEGIN
IF (clk = '1') THEN
IF clear = '0' THEN cnt := 0;
ELSIF enable = '1' THEN cnt := cnt + 1;
END IF;
END IF;
Aprovecha el
qg <= cnt;
modo
Counter?
END PROCESS;
END a;

Guillermo Jaquenod, 2001

Counter?

enable

Din

Guillermo Jaquenod, 2001

ENTITY counter IS PORT (clk,enable,up_dn: IN STD_LOGIC;


Aprovecha
q: OUT INTEGER RANGE 0 TO 255);
el modo
END counter;

enable
clk

Clear
Load

Ejemplos: contador con UpDown y ENABLE

Guillermo Jaquenod, 2001

STD_LOGIC;

Aprovecha
el modo
Counter?

Fuente: ALTERA MAX+plus II HELP

38

VHDL: Lenguaje de descripcin de hardware


Ejemplo: contador con SCLR, ENA y UpDown

Funciones de conversin definidas en "ieee.std_logic_1164")

ENTITY counter IS PORT (


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

Para pasar de BIT a STD_LOGIC


To_StdULogic (bit) RETURN std_ulogic
Para pasar de STD_LOGIC a BIT
To_bit (std_ulogic) RETURN bit;

ARCHITECTURE a OF counter IS BEGIN


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
IF clear = '0' THEN cnt := 0;
ELSIF enable = '1' THEN cnt := cnt + sentido;
END IF;
END IF;
Aprovecha
q <= cnt;
el modo
Counter?
END PROCESS;
END a;
Guillermo Jaquenod, 2001

Conversiones STD <=> std_logic

Fuente: ALTERA MAX+plus II HELP

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
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
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)
Guillermo Jaquenod, 2001

Extensin de cero (ieee.std_logic_arith EXT)

Extensin de signo (ieee.std_logic_arith SXT)

LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all;

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


ENTITY sign_ext IS GENERIC(WIDTH_IN: INTEGER := 4; SIZE_OUT: INTEGER := 8);
PORT(d_in: IN STD_LOGIC_VECTOR(WIDTH_IN-1 DOWNTO 0);
d_out: OUT STD_LOGIC_VECTOR(SIZE_OUT-1 DOWNTO 0) );
END sign_ext;

ENTITY zero_ext IS GENERIC(WIDTH_IN: INTEGER := 4; SIZE_OUT: INTEGER := 8);


PORT( d_in: IN STD_LOGIC_VECTOR(WIDTH_IN-1 DOWNTO 0);
d_out: OUT STD_LOGIC_VECTOR(SIZE_OUT-1 DOWNTO 0));
END zero_ext;
ARCHITECTURE behavior OF zero_ext IS BEGIN
PROCESS(d_in) BEGIN
FOR j IN width_in TO size_out-1 LOOP d_out(j) <= '0'; END LOOP;
d_out(WIDTH_IN-1 DOWNTO 0) <= d_in(WIDTH_IN-1 DOWNTO 0);
END PROCESS;
END behavior;

COMPONENT zero_ext GENERIC (WIDTH_IN: INTEGER; SIZE_OUT: INTEGER);


PORT (d_in: IN STD_LOGIC_VECTOR(WIDTH_IN-1 DOWNTO 0);
d_out: OUT STD_LOGIC_VECTOR(SIZE_OUT-1 DOWNTO 0));
END COMPONENT;
Guillermo Jaquenod, 2001

Fuente: ALTERA

ARCHITECTURE behavior OF sign_ext IS BEGIN


PROCESS(d_in) BEGIN
FOR j IN WIDTH_IN TO (SIZE_OUT-1) LOOP d_out(j) <= d_in(WIDTH_IN-1);
END LOOP;
d_out(WIDTH_IN-1 DOWNTO 0) <= d_in(WIDTH_IN-1 DOWNTO 0);
END PROCESS;
END behavior;
COMPONENT sign_ext GENERIC (WIDTH_IN: INTEGER; SIZE_OUT: INTEGER);
PORT (d_in: IN STD_LOGIC_VECTOR(WIDTH_IN-1 DOWNTO 0);
d_out: OUT STD_LOGIC_VECTOR(SIZE_OUT-1 DOWNTO 0) );
END COMPONENT;

Fuente: ALTERA

Guillermo Jaquenod, 2001

Usando ieee.numeric_std y ieee.numeric_bit


Frente al package logic_arith de Synopsis otros fabricantes definieron sus
propios packages aritmticos, y para unificar los mtodos de manejo aritmtico y
el overload de operadores, en 1995 el IEEE defini dos nuevos packages para
trabajar sobre tipos bit_vector y std_logic_vector.

Bases de VHDL

numeric_bit: Standard VHDL Synthesis Package (1076.3, NUMERIC_BIT)


numeric_std: Standard VHDL Synthesis Package (1076.3, NUMERIC_STD)

Estos packages engloban los operadores, tipos y funciones de conversin antes


definidos en std_logi_arith, std_logic_unsigned y std_logic_signed, y
agregan similares operadores al caso de los tipos bit_vector.
Tambien redefinen los subtipos unsigned y signed, as como las funciones de
conversin:

Diseo de
mquinas de estado

to_integer (unsigned or signed)


to_unsigned (integer,vector_size)
to_signed (integer,vector_size)

El compilador VHDL del MAX+plus II no incorpora este nuevo package


Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

39

VHDL: Lenguaje de descripcin de hardware


Diseo de mquinas de estado con VHDL

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:
TYPE tipo_de_estado IS (idle, tap1, tap2, tap3, tap4 );
Definir dos objetos que almacenan los estado actual y futuro como
seales de ese tipo predefinido:
SIGNAL filter : tipo_de_estado;
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
Para definir el comportamiento de las salidas:
Usar asignaciones Conditional y/o Selected
O un segundo CASE (P.Ej: para mquinas de MOORE)

Guillermo Jaquenod, 2001

Diseo de mquinas de estado con VHDL


usando seales
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
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
Guillermo Jaquenod, 2001

FSMs en VHDL/MAX+plus II: forzando el


valor de los estados con enum_encoding
ENTITY semaforo IS PORT(clk,fotocelda:IN BIT; rojo,amarillo,verde:OUT BIT);
END ENTITY semaforo;
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 un atributo slo
es un atributo slo
WHEN prepare => estado <= pase;
interpretado por el
WHEN pase
=> estado <= alerta;
interpretado por el
WHEN alerta
=>
MAX+plus II VHDL!!
MAX+plus II VHDL!!
IF fotocelda ='1' THEN estado<=stop;
Cada herramienta
Cada herramienta
ELSE estado<=nocturno;
EDA suele definir
END IF;
EDA suele definir
WHEN nocturno => estado <= alerta;
atributos propios
atributos propios
END CASE;
para controlar el
para controlar el
END IF;
proceso de sntesis!!
proceso de 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;
Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Ejemplos: FSMs
ENTITY state_machine IS PORT(clk, input, reset: IN STD_LOGIC;
output: OUT STD_LOGIC);
END state_machine;
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;

Guillermo Jaquenod, 2001

Fuente: ALTERA MAX+plus II HELP

Otra forma de definir FSMs, usando una


variable registrada next_state
ENTITY rns IS PORT (clk,data,sm_input: IN std_logic; flag:OUT std_logic);
END ENTITY rns;
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 no reconoce este
VARIABLE next_state : state_type;
MAX+plusII no reconoce este
BEGIN
estilo de descripcin como el
estilo de descripcin como 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;

Guillermo Jaquenod, 2001

Fuente: ALTERA

FSMs en VHDL/MAX+plus II: forzando 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 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; lsb <= '0'; msb <= '0';
ELSE next <= tres; lsb <= '1'; msb <= '1'; END IF;
WHEN uno => IF (ud='0') THEN next <= dos; lsb <= '1'; msb <= '0';
ELSE next <= cero; lsb <= '0'; msb <= '0'; END IF;
WHEN dos=>
IF (ud='0') THEN next <= tres; lsb <= '0'; msb <= '1';
ELSE next <= uno; lsb <= '1'; msb <= '0'; END IF;
WHEN tres => IF (ud='0') THEN next <= cero; lsb <= '1'; msb <= '1';
ELSE next <= dos; lsb <= '0'; msb <= '1'; END IF;
END CASE;
END PROCESS;
PROCESS BEGIN WAIT UNTIL clk = '1'; present <= next; END PROCESS;
END a;
Guillermo Jaquenod, 2001

Fuente: ALTERA MAX+plus II HELP

40

VHDL: Lenguaje de descripcin de hardware


Maquinas de estado:
One-HOT y Binarias

Mquinas de estado One-HOT y Binarias


Para la codificacin de una mquina de n estados se requieren al
menos CEIL(log2(n)) elementos de memoria.

el flanco se
engancha ac

Caso: recuperador de reloj:


Usando codificacion binaria se requieren

Si se emplean CEIL(log2(n)) elementos de memoria, se dice que su


codificacion es binaria. Si se emplean n elementos de memoria
(uno por estado), se dice que su codificacion es One-HOT.

4 macroceldas, tres de ellas para

Una solucin que emplee ms flipflops, sin embargo, puede ser ms


eficiente cuando se usan dispositivos FLEX10K. PORQU????

e1

macroceldas puede bajar a slo 3 si los

e8

calcular la salida rxck. Este uso de

En la codificacion One-HOT la lgica combinatoria que precede a cada


flipflop es slo funcin de los flipflops asociados a los estados anteriores

e3

e7

estaados se asignan manualmente


En codificacin One-Hot se requieren 9

En la codificacin binaria el nmero de flipflops es minimo, pero la lgica


combinatoria que excita cada flipflop es una funcion compleja de TODOS
los flipflops usados en la mquina, y por ello de gran fan-in y con muchos
trminos

e2

codificar el estado actual, y una ms para

e6

e4

elementos lgicos, 8 para codificar los 9

e5

estados y uno ms para la salida rxck


el estado e7 es funcin de tres variables:

rxd

e6, e5 y una entrada


pero e2 (ver lneas azules) es funcin de

rxd
edge
detect

rxck

recuperador
de reloj

cuatro variables: e8, e1, e2 y una entrada


8rxck

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Descripcin de maquinas de estado


One-HOT y Binarias en VHDL

Diseo de mquinas de estado con VHDL:


Maquinas tipo Mealy y tipo Moore

Cuando MAX+PLUS II detecta que un circuito representa una


mquina de estados, usa por default la codificacin binaria si la
familia elegida es MAX (7K o 9k) y la codificacion One-HOT cuando
se usa FLEX (6k, 8k y 10k).

Bloque
combinatorio

Cmputo
del
estado
siguiente

Cmputo
de las
salidas

Salidas

Entradas

MOORE
Las salidas son funcin combinatoria slo
del estado actual (pueden presentar
glitches debido al skew del registro de
estados o a caminos de propagacin)
Es facil de codificar en VHDL
Las ecuaciones de las salidas son de
menor fanin y ms fciles de rutear
Suelen requerir ms estados que una
mquina MEALY equivalente
Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Cmputo
del
estado
siguiente

memoria
reloj

MOORE
Guillermo Jaquenod, 2001

Evitando los glitches en las salidas de


maquinas tipo Moore

Registros
de estado

Entradas

Registros
de estado

Diseo de mquinas de estado con VHDL:


Maquinas tipo Mealy y tipo Moore

Cmputo
de las
salidas

E(k+1)=EF=f(ent{},EA)

SAL{} = g(E(k))

Entradas

Salidas

MEALY

Cmputo
del
estado
siguiente

Registros
de estado

Fuente: ALTERA

Guillermo Jaquenod, 2001

SAL{} = g(E(k),ent{})

E(k)=EA

En el caso del uso de One-Hot es usual que slo el flip-flop activo


est en 1, aunque no es necesario que as sea (incluso es
conveniente que el estado de RESET sea codificado mediante un
0).
Esta asignacion por default puede ser cambiada; para ello, en
MAX+PLUS II puede definirse un atributo llamado
enum_encoding al definir los estados, para asignar un dado valor
binario a cada uno de los posibles estados (este atributo slo es
interpretado por el MAX+plus II)

MEALY

ent{}

Cmputo
de las
salidas

Salidas

Las salidas son resultado


de una funcin
combinatoria, por lo que
pueden presentar glitches
Cmo hago para evitarlos?

Las salidas son funcin combinatoria


del estado y las entradas actuales
Es facil de codificar en VHDL
(usando un simple CASE)
Las salidas pueden presentar ms
glitches que en una mquina de
MOORE y sus ecuaciones son de
mayor fanin
Algo ms difciles de rutear
Guillermo Jaquenod, 2001

41

VHDL: Lenguaje de descripcin de hardware


Evitando los glitches en las salidas de
maquinas tipo Moore

Solucin 3: computa las


salidas futuras en base al
estado futuro. Sin latencia,
introduce ms retardos
combinatorios (menor Fmax)

Entradas

Cmputo
de las
salidas

Cmputo
del estado
siguiente

Registros
de salidas

Registros
de salidas

Cmputo
del estado
siguiente

Cmputo
de las
salidas

Salidas

Si en una entidad se describe una mquina de estados,


aquellos detalles pblicos de esa mquina pueden ser
publicados en forma de ports de un nuevo tipo, definido en
un package apropiado.

Salidas

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Linked State Machines y Petri Nets

En cualquier diseo de mediana complejidad es previsible


la necesidad de modelar mltiples mquinas de estado
que operan concurrentemente, y que interactan entre si.
Aunque M mquinas de estado con N estados cada una
pueden presentar NM posibles casos, en general una
mquina no necesita operar conociendo los detalles
internos completos de cada una de las otras mquinas,
posibilitando el modelado de LSMs (Linked State
Machines)
Desde el punto de vista de su interaccin, los estados
internos de una FSM pueden ser agrupados en clases de
equivalencia, simplificado el modelado.

Salidas

Registros
de salidas

Solucion 2: computa las salidas


futuras junto con el estado
futuro en funcin del estado
actual.Sin latencia, es la ms
rpida, y requiere ms lgica
combinatoria de gran fanin
Entradas

Cmputo
de las
salidas

Registros
de estado

Entradas

Registros
de estado

Cmputo
del estado
siguiente

Registros
de estado

Solucion 1: Registra las


salidas. Requiere mnimo
hardware pero agrega un ciclo
de demora (latencia)

Linked State Machines y Petri Nets

Linked State Machines y Petri Nets

Las Redes de Petri (Petri Nets o PN) son un formalismo apto para la
descripcin de Linked State Machines, pues permiten describir
procesos que interactan y se sincronizan, al modo data flow.

Son grafos dirigidos, en los que los vrtices son llamados lugares (y
estn asociados al estado de la red) y las aristas son llamadas
transiciones (y estn asociadas a los posible eventos en la red).

El disparo de esta transicin requiere que en todos los lugares de origen


haya al menos un token, y que la condicin se cumpla.
Guillermo Jaquenod, 2001

PROCESO 2

C4

L1

L8

C3
L3

C1
C2

*
L4

En una PN marcada existen uno o ms smbolos llamados tokens


(cuya cantidad puede ser variable) que se estacionan en lugares, y se
mueven de lugar a lugar siguiendo las transiciones que se disparan.
Una transicin suele tiene asociada una condicin de disparo, ciertas
flechas que vienen desde lugarse de origen y ciertas flechas que van hacia
lugares de destino

L5

PROCESO 1

C5
L6

*
C6

Tokens
Tokens
C7
Condiciones
Condiciones

L2

Transiciones
Transiciones
C8

L7

Lugares
Lugares

Sincronizacin: ZONA PUBLICA!!


Sincronizacin: ZONA PUBLICA!!

Ejemplo que muestra dos FSM sincronizadas entre s.


A los fines pblicos tiles para la sincronizacin, el PROCESO 2 puede
modelizarse como si tuviera slo dos estados (similar al PROCESO 1)
Se observan transiciones donde el nmero de tokens aumenta (C3), y otras
donde ese nmero disminuye (C8).
Fuente: BAKER

Guillermo Jaquenod, 2001

Diseo Jerrquico FLAT

Bases de VHDL
Herramientas para
el diseo jerrquico

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Una arquitectura de jerarqua plana (flat)


Nivel superior (Estructural)
......
Componente 1
(Behavioral)

Componente 2
(Behavioral)

Counters
Adders
State Machines

Counters
Adders
State Machines

Guillermo Jaquenod, 2001

Componente n
(Behavioral)
......

Counters
Adders
State Machines

Fuente: ALTERA

42

VHDL: Lenguaje de descripcin de hardware


Diseo Jerrquico TOP-DOWN

Desventajas del Diseo FLAT

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

Nivel 1

Nivel 1

Nivel 2

Nivel 3

Nivel 2

Nivel 3

Nivel 3

Nivel 2

Nivel 3

Nivel 3

Nivel 2

Nivel 3

Nivel 3

.
.
.
.

Guillermo Jaquenod, 2001

Nivel 3

Fuente: ALTERA

Las Opciones de sntesis pueden ser aplicadas individualmente

Las posibilidades para optimizar el ruteado y performance de un


diseo son ms reducidas.
En general:

Guillermo Jaquenod, 2001

Las ventajas del Diseo Jerrquico


Pregunta: Cuntos niveles de jerarqua convienen en un diseo?

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

Nivel 1

Nivel 2

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

MS NIVELES DE JERARQUA => MS FLEXIBILIDAD

Las ventajas del Diseo TOP-DOWN

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.

a) Depende del diseo


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

Nivel 2

En general, al usar FLEX10K una buena regla


Nivel 3

Nivel 3

Nivel 3

Nivel 3

Counter

State
Machine

Adder

LFSR

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

descripcin de VHDL y el hardware


STYLE=WYSIWYG
STYLE=WYSIWYG

sintetizado, y poder optimizar el diseo final

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

Guillermo Jaquenod, 2001

Diseo jerrquico: formas de uso de


archivos de diseo mltiples

Para poder hacer diseos jerrquicos, en VHDL se requiere la


declaracin y la instanciacin de Componentes
top.vhd
entity-architecture top
component mid_a
component mid_b

bottom_a.vhd
entity-architecture bottom_a

bottom_b.vhd
entity-architecture bottom_b

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Fuente: ALTERA

Beneficios del Diseo Jerrquico


Si se trabaja en equipo, cada diseador puede crear funciones
separadas (componentes) en archivos separadas, y realizar su
depuracin en forma individual
Estos componentes pueden ser compartidos con los otros
diseadores y a la vez quedan disponibles para ser usados en
diseos futuros

mid_b.vhd
entity-architecture mid_b
component bottom_a
component bottom_b

mid_a.vhd
entity-architecture mid_a
component bottom_a

Guillermo Jaquenod, 2001

Fuente: ALTERA

Esto implica: modularidad, encapsulamiento, portabilidad, y


reusabilidad
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)
Guillermo Jaquenod, 2001

43

VHDL: Lenguaje de descripcin de hardware


Diseo Jerrquico: ejemplos de IP
ALTERA MEGACOREs:
PCI: 32bit 66MHz Master/Target, 64bit 66MHz Master/Target, 32bit 66MHz
Target only, 64bit 66MHz Target only
Signal Processing: FIR e IIR Compiler, Color Sopace 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.

Diseo Jerrquico: ejemplos de IP


Signal Processing & Telecom: cascadable adaptive FIR, Filter Library (FIR & IIR), Rank
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
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

HammerCores: Data Encryption, Reed Solomon Decoder, Adaptive


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

over SONET (POS) Controller, SONET Interface, ATM Receive Processor, Generador de

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


Guillermo Jaquenod, 2001

Delineation (ATM sobre SONET o SDH)

Microprocesadores: 49410, 8051, RAW8051, 8052, 2901, 2910, 6502, Z80, 6402, 6850,
8237,8251,8254, 8255, 8259, 16450, 165550, 6850,29116, SDRAM, DMA, PowerPC
Otros: CAN, IEEE1394, IEEE1284, I2C, DAI (Digital Audio Interface), USB
Guillermo Jaquenod, 2001

Diseo jerrquico en VHDL:


declaracin de Componentes
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:
COMPONENT <nombre del componente> [IS]
[GENERIC (lista genrica);]
[PORT (descripcin de las puertas);]
END COMPONENT [<nombre del componente> ];
Guillermo Jaquenod, 2001

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.

tonos (DTMF, call progress, etc.), UTOPIA Level_2, 10/100 Ethernet MAC, Cell

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>);

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Diseo jerrquico en VHDL: 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 ;
Fuente: ALTERA

Guillermo Jaquenod, 2001

Diseo jerrquico en VHDL: ejemplo


de Invocacin de Componentes
-- declaraciones de componentes mediante el uso de un package
LIBRARY lpm;

USE lpm.lpm_components.ALL;
declaracin usando
declaracin usando

un Package
un Package
ENTITY practica IS
GENERIC (prescaler_size: INTEGER := 23;...)
PORT ( clk: IN STD_LOGIC;.);
no es necesario declarar al
END ENTITY practica;
no es necesario declarar al

componente en la arquitectura
componente en la 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);
Guillermo Jaquenod, 2001

44

VHDL: Lenguaje de descripcin de hardware


Invocacin de Componentes: mapeo de
la instancia por asociacin posicional

Componentes con salidas sin conectar

Declaracin del
Declaracin 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;
BEGIN
u1 : tollv PORT MAP ( tclk, tcross, tnickel, tdime,
tquarter, tgreen, tred,
tsout, tstate);
Invocacin del
Invocacin del
Componente
Nombre de
Componente
Nombre de

la Instancia
la Instancia

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
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,...);

Nombre del Componente


Nombre del Componente

Fuente: ALTERA

Guillermo Jaquenod, 2001

Componentes con entradas sin conectar


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.

Guillermo Jaquenod, 2001

Ejemplos: un Full-Adder estilo RTL

ENTITY full_add IS PORT(


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

cin

a
b

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:
PORT MAP(a,b,c,..,0,...);
PORT MAP(...,<port del componente> =>0,...);

sum

ARCHITECTURE ecuaciones OF full_add IS


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

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

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Ejemplo: 4bit adder instanciando componentes


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 descripto en
la arquitectura, antes
del BEGIN

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;
Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Fuente: DUECK

Ejemplos: sumador/restador
ENTITY subadd4 IS PORT(
sub: IN BIT; a,b: IN BIT_VECTOR(4 downto 1);
c4: OUT BIT; sum: OUT BIT_VECTOR(4 downto 1));
END subadd4;
ARCHITECTURE adder OF subadd4 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);
SIGNAL b_comp: BIT_VECTOR (4 downto 1);
uso que
BEGIN
A-B = A + /B + 1
c(0) <= sub;
adders: FOR i IN 1 to 4 GENERATE
b_comp(i) <= b(i) xor sub;
adder: full_add PORT MAP (a(i),b_comp(i),c(i-1),c(i),sum(i));
END GENERATE;
c4 <= c(4);
END adder;

Guillermo Jaquenod, 2001

Fuente: DUECK

45

VHDL: Lenguaje de descripcin de hardware

Muchas aplicaciones pueden ser definidas en forma recursiva, donde una


instancia de un objeto es definido en funcin de instancias ms simples del
mismo objeto, hasta llegar a un tope mnimo
Un ejemplo clsico es el cmputo del Factorial de un nmero, que puede ser
definido por una funcin:
FUNCTION factorial (N: IN integer) RETURN integer IS
VARIABLE temp : INTEGER := 1;
BEGIN
IF (N > 1) THEN temp := N * factorial (N-1);
RETURN temp;
END FUNCTION factorial;

As como sucede en la funcin, tambin un componente puede definirse en


forma recursiva a partir de s mismo, y lo mismo vale, por ejemplo, para definir
procedimientos recursivos en un PACKAGE
Para ello una entidad X debe declarar en su arquitectura al componente X, y
crear condicionalmente (usando IF..GENERATE) una instancia de X con algn
valor (usualmente un GENERIC) de menor valor.
Guillermo Jaquenod, 2001

Uso recursivo de componentes: ejemplo


Barrel Shifters, rboles de buffers, as como otros circuitos pueden ser
descriptos en forma recursiva
Por ejemplo, suponiendo que un buffer pudiera tener slo un fanout de 2 y que
se deseara un fanout de 2N=16, se hace necesario definir un rbol de N=4
niveles de buffers, como la figura
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY buf IS PORT (
a: IN std_logic; y: OUT std_logic);
END ENTITY buf;

1 etapa: FANOUT=2

sali(2N-1..0)

Declaracin recursiva de componentes

entra

ARCHITECTURE basic OF buf IS BEGIN


y <= a;
END ARCHITECTURE basic;
2 etapas: FANOUT=4
3 etapas: FANOUT=8
4 etapas: FANOUT=16
Guillermo Jaquenod, 2001

Uso recursivo de componentes: ejemplo


LIBRARY ieee;USE ieee.std_logic_1164.ALL;
ENTITY arbol IS GENERIC (N: natural);
PORT (entra: IN std_logic; sali: OUT std_logic_vector(0 to 2**N-1));
END ENTITY arbol;
ARCHITECTURE recursiva OF arbol IS
COMPONENT buf IS PORT (a:IN std_logic; y:OUT std_logic); END COMPONENT buf;
BEGIN
caso lmite
tope: IF N=0 GENERATE BEGIN sali(0) <= entra; END GENERATE;
division: IF N>0 GENERATE
recursin:
SIGNAL buf0, buf1:std_logic;
la arquitectura
BEGIN
de rbol usa
ibuf0: buf PORT MAP(a=>entra, y=> buf0);
instancias de
ibuf1: buf PORT MAP(a=>entra, y=> buf1);
rbol
rama_0: arbol GENERIC MAP (N => N-1)
PORT MAP (entra => buf0, sali => sali(0 TO 2**(N-1)-1));
rama_1: arbol GENERIC MAP (N => N-1)
PORT MAP (entra => buf1, sali => sali(2**(N-1) TO 2**N-1));
END GENERATE;
END ARCHITECTURE recursiva;
Gran parte de las herramientas de

Bases de VHDL
Uso de primitivas y LPMs de ALTERA

sntesis no soportan recursin!!


Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Libraries ofrecidas por ALTERA

MAX+plus II: primitivas y macrofunciones

ALTERA provee en el MAX+plus II dos grandes libraries con macrofunciones


y primitivas
LIBRARY ALTERA
Contiene dos packages:
maxplus2 : declaracin como Componentes de todas las primitivas y las
megafunciones de acceso libre propias de ALTERA
megacore : declaracin de Componentes de megafunciones de acceso
pago de ALTERA: los Megacores
LIBRARY LPM
Contiene el package lpm_components, con la declaracin de Componentes
de las LPMs resueltas por ALTERA

El hecho que estas libraries describan diseos optimizados por ALTERA para
sus distintos PLDs, permite optimizar la implementacin fsica dentro de la
PLD manteniendo la portabilidad del diseo

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Fuente: ALTERA

Para instanciar Primitivas o Macrofunciones (library ALTERA, package


MAXPLUS2), se puede instanciar un Componente, y conectar las puertas de
la funcin con las seales o puertas de la entidad bajo diseo.
Cuando se usan Macrofunciones TTL debe tenerse en cuenta que no es
vlido comenzar nombres de funciones con un nmero, y debe agregarse un
underscore (_), que es quitado por el MAX+PLUS II durante la compilacion.
LIBRARY altera; USE altera.maxplus2.ALL;
LIBRARY ieee; USE ieee.std_logic_1164.ALL;
ENTITY compinst IS PORT (
ent,reloj, nrst, nset: IN STD_LOGIC; sal: OUT STD_LOGIC;
a,b,c,g : IN STD_LOGIC;d:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
y, w: OUT STD_LOGIC);
Asociacin nominal
END compinst;
Asociacin nominal
ARCHITECTURE a OF compinst IS BEGIN
dff1 : DFF PORT MAP (d =>ent, q => sal, clk => reloj, clrn => nrst, prn => nset);
mux: a_74151b PORT MAP (c, b, a, d, g, y, w) ;
END a;
Asociacin posicional
Asociacin posicional
Guillermo Jaquenod, 2001

Fuente: ALTERA

46

VHDL: Lenguaje de descripcin de hardware


Ejemplos: uso de primitivas de MAX+plus II

Uso de LPMs en VHDL


of Parameterized Modules

Las LPMs describen bloques funcionales importantes, que son parametrizados


a travs del uso de sus PORTs y de valores asignados a sus GENERICs.
Su formato ha sido consensuado por mltiples fabricantes de dispositivos y de
software de diseo, asegurando un importante grado de portabilidad. Han sido
definidas como estndar por la Electronics Industry Association (EIA), ``Library
of Parametrized Modules'', EIA/IS-103, 1993

Su uso aumenta la productividad de diseo (menor TTM:time-to-market) y


provee consistentes resultados de sntesis

Cada fabricante resuelve internamente cada LPM de modo de sacar mximo


provecho de las habilidades de sus componentes
Las LPMs de Altera estn declaradas en la LIBRARY lpm; en el package
lpm_components.all. En VHDL su uso requiere la lnea:

Para usar las primitivas


Para usar las primitivas
la library+package a
la library+package a
usar son altera y
usar son altera y
maxplus2!
maxplus2!

ENTITY lch_prim IS PORT(


d_in, enable : IN STD_LOGIC; q_out : OUT STD_LOGIC);
END lch_prim;
ARCHITECTURE a OF lch_prim IS BEGIN
latch_primitive: latch
PORT MAP (d => d_in, ena => enable,
q => q_out);
END a;

LIBRARY lpm; USE lpm.lpm_components.all;


Fuente: ALTERA MAX+plus II HELP

Guillermo Jaquenod, 2001

LPM significa Library

LIBRARY ieee; USE ieee.std_logic_1164.ALL;


LIBRARY altera; USE altera.maxplus2.ALL;

Cuando se usa el MAX+plus II el uso de primitivas de ALTERA, definidas


en c:\maxplus2\vhdlXX\altera\maxplus2.vhd permite un control ms fino
sobre la arquitectura. Estas primitivas no son portables.

Ejemplo de uso de LPMs

Ejemplos de LPMs: LPM_MUX

LIBRARY ieee; USE ieee.std_logic_1164.ALL;


LIBRARY lpm; USE lpm.lpm_components.ALL;
ENTITY ltch4lpm IS PORT(
d_in : IN
STD_LOGIC_VECTOR(3 downto 0);
enable : IN
STD_LOGIC;
q_out : OUT STD_LOGIC_VECTOR(3 downto 0));
END ltch4lpm;

Fuente: ALTERA

Guillermo Jaquenod, 2001

Se indica el uso de la
Library LPM y del
package
LPM_COMPONENTS

Se instancia el
componente, dando

valor a sus parmetros


ARCHITECTURE a OF ltch4lpm IS BEGIN
latch4: lpm_latch GENERIC MAP (LPM_WIDTH => 4)
PORT MAP (data => d_in,gate => enable,
q => q_out);
Nombre de la LPM
Y se conectan sus puertas
END a;
a los ports o a las seales

COMPONENT lpm_mux
Para usar LPMs la
Para usar LPMs la
GENERIC (LPM_WIDTH: POSITIVE;
library+package a usar
library+package a usar
LPM_WIDTHS: POSITIVE; LPM_PIPELINE: INTEGER := 0;
son lpm y
son lpm y
LPM_SIZE: POSITIVE; LPM_TYPE: STRING := "LPM_MUX";
lpm_components!
lpm_components!
LPM_HINT: STRING := "UNUSED");
PORT (data: IN STD_LOGIC_2D(LPM_SIZE-1 DOWNTO 0,
LPM_WIDTH-1 DOWNTO 0);
aclr, clock: IN STD_LOGIC := '0';
clken: IN STD_LOGIC := '1';
sel: IN STD_LOGIC_VECTOR(LPM_WIDTHS-1 DOWNTO 0);
result: OUT STD_LOGIC_VECTOR(LPM_WIDTH-1 DOWNTO 0));
END COMPONENT;

LPM_MUX permite multiplexar buses (notar que data es


2D) ya sea en forma combinatoria (accin por Default) o
agregando registros de pipeline

clk
data[][]
aclr
clken

de la arquitectura

Fuente: ALTERA MAX+plus II HELP

Guillermo Jaquenod, 2001

Ejemplo de LPMs: instanciacin de lpm_mux


Declaracin del
Declaracin del
Componente
Componente

Guillermo Jaquenod, 2001

result[]
sel[]

Fuente: ALTERA MAX+plus II HELP

Ejemplos de LPMs: LPM_DECODE

Declaracin de LPM_MUX en lpm_components


Declaracin de LPM_MUX en lpm_components

COMPONENT lpm_mux
COMPONENT lpm_mux
GENERIC (LPM_WIDTH: POSITIVE;
GENERIC (LPM_WIDTH: POSITIVE;
LPM_WIDTHS: POSITIVE;
LPM_WIDTHS: POSITIVE;
LPM_PIPELINE: INTEGER:= 0;
LPM_PIPELINE: INTEGER:= 0;
LIBRARY ieee;
LPM_SIZE: POSITIVE;
LPM_SIZE: POSITIVE;
USE ieee.std_logic_1164.all;
LPM_HINT: STRING := UNUSED);
LPM_HINT: STRING := UNUSED);
USE ieee.std_logic_arith.all;
PORT (data: IN STD_LOGIC_2D(LPM_SIZE-1 DOWNTO 0,
PORT (data: IN STD_LOGIC_2D(LPM_SIZE-1 DOWNTO 0,
LPM_WIDTH-1 DOWNTO 0);
USE ieee.std_logic_signed.all;
LPM_WIDTH-1 DOWNTO 0);
aclr: IN STD_LOGIC := '0';
aclr: IN STD_LOGIC := '0';
clock: IN STD_LOGIC := '0';
clock: IN STD_LOGIC := '0';
LIBRARY lpm;
sel: IN STD_LOGIC_VECTOR(LPM_WIDTHS-1 DOWNTO 0);
sel: IN STD_LOGIC_VECTOR(LPM_WIDTHS-1 DOWNTO 0);
USE lpm.lpm_components.all;
result: OUT STD_LOGIC_VECTOR(LPM_WIDTH-1 DOWNTO 0));
result: OUT STD_LOGIC_VECTOR(LPM_WIDTH-1 DOWNTO 0));
END COMPONENT;
END COMPONENT;

ENTITY tst_mux IS
PORT (a:in std_logic_2d (3 downto 0, 15 downto 0);
sel:in std_logic_vector(1 downto 0);
Asignacin de valores
y:out std_logic_vector (15 downto 0));
Asignacin de valores
a los parmetros
END ENTITY tst_mux;
a los parmetros
Nombre de la LPM
Nombre de la LPM
ARCHITECTURE behavior OF tst_mux IS
BEGIN
u1: lpm_mux GENERIC MAP(lpm_width => 16, lpm_size => 4, lpm_widths => 2)
PORT MAP (data => a, sel => sel, result => y);
END ARCHITECTURE behavior;
Mapeo de las puertas
Mapeo de las puertas
Nombre de la Instancia
Nombre de la Instancia
Fuente: ALTERA
Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

COMPONENT lpm_decode

IrIr al HELP
al HELP
del
del
MAX+plus II!
MAX+plus II!

GENERIC (LPM_WIDTH: POSITIVE;


LPM_TYPE: STRING := "LPM_DECODE";
LPM_PIPELINE: INTEGER := 0;
LPM_DECODES: POSITIVE;
LPM_HINT: STRING := "UNUSED");
PORT (data: IN STD_LOGIC_VECTOR(LPM_WIDTH-1 DOWNTO 0);
aclr, clock: IN STD_LOGIC := '0';
clken, enable: IN STD_LOGIC := '1';
eq: OUT STD_LOGIC_VECTOR(LPM_DECODES-1 DOWNTO 0));
END COMPONENT;

LPM_DECODE permite decodificar nmeros de entrada a valores lgicos


individuales de salida ya sea en forma combinatoria (accin por Default) o
agregando registros de pipeline

Guillermo Jaquenod, 2001

data[]
aclr
enable
clk
clken

eq[]

Fuente: ALTERA MAX+plus II HELP

47

VHDL: Lenguaje de descripcin de hardware


Ejemplos de LPMs: LPM_ADD_SUB
COMPONENT lpm_add_sub
GENERIC (LPM_WIDTH: POSITIVE;
LPM_REPRESENTATION: STRING := "SIGNED";
LPM_DIRECTION: STRING := "UNUSED";
LPM_PIPELINE: INTEGER := 0;
LPM_TYPE: STRING := "LPM_ADD_SUB");
LPM_HINT: STRING := "UNUSED";
PORT (
dataa, datab: IN STD_LOGIC_VECTOR(LPM_WIDTH-1 DOWNTO 0);
aclr, clock, cin: IN STD_LOGIC := '0';
add_sub: IN STD_LOGIC := '1';
clken: IN STD_LOGIC := '1';
result: OUT STD_LOGIC_VECTOR(LPM_WIDTH-1 DOWNTO 0);
cout, overflow: OUT STD_LOGIC);
END COMPONENT;

Ir al HELP
Ir al HELP
del
del
MAX+plus
MAX+plus
II!
II!

LPM_ADD_SUB facilita el diseo de circuitos de suma y resta binaria que aprovechan las
caractersticas de arquitectura de los dispositivos de ALTERA, y puede operar en forma combinatoria
(accin por Default) o agregando registros de pipeline
Fuente: ALTERA MAX+plus II HELP

Guillermo Jaquenod, 2001

Ejemplos de LPMs: LPM_COUNTER


COMPONENT lpm_counter
GENERIC (
LPM_WIDTH: POSITIVE; LPM_MODULUS: NATURAL:='0';
LPM_DIRECTION: STRING:="UNUSED"; LPM_AVALUE: STRING:="UNUSED";
LPM_SVALUE: STRING:="UNUSED"; LPM_PVALUE: STRING:="UNUSED";
LPM_TYPE: STRING:="LPM_COUNTER"; LPM_HINT: STRING:="UNUSED");
PORT (
data:IN STD_LOGIC_VECTOR(LPM_WIDTH-1 DOWNTO 0):= (OTHERS => '0');
clock: IN STD_LOGIC; cin: IN STD_LOGIC := '0';
clk_en: IN STD_LOGIC := '1'; cnt_en: IN STD_LOGIC := '1';
IrIral HELP
updown: IN STD_LOGIC := '1'; sload: IN STD_LOGIC := '0';
al HELP
del
del
sset: IN STD_LOGIC := '0'; sclr: IN STD_LOGIC := '0';
MAX+plus II!
MAX+plus II!
aload: IN STD_LOGIC := '0'; aset: IN STD_LOGIC := '0';
aclr: IN STD_LOGIC := '0'; cout: OUT STD_LOGIC := '0';
q: OUT STD_LOGIC_VECTOR(LPM_WIDTH-1 DOWNTO 0));
END COMPONENT;
El uso de LPM_COUNTER es ideal cuando se desean sintetizar contadores de todo tipo,
porque aprovecha al mximo las caractersticas de arquitectura de los dispositivos de
ALTERA, obteniendo el menor uso de recursos y la mxima velocidad
Fuente: ALTERA MAX+plus II HELP

Guillermo Jaquenod, 2001

Ejemplosde LPM: LPM_CLSHIFT

data
distance

Ir al HELP
Ir al HELP
del
del
MAX+plus
MAX+plus
II!
II!

result
overflow
underflow

direction

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

COMPONENT lpm_compare
GENERIC (LPM_WIDTH: POSITIVE;
LPM_REPRESENTATION: STRING := "UNSIGNED";
LPM_PIPELINE: INTEGER := 0;
LPM_TYPE: STRING := "LPM_COMPARE";
LPM_HINT: STRING := "UNUSED");
PORT (
dataa, datab: IN STD_LOGIC_VECTOR(LPM_WIDTH-1 DOWNTO 0);
aclr, clock: IN STD_LOGIC := '0';
clken: IN STD_LOGIC := '1';
agb, ageb, aeb, aneb, alb, aleb: OUT STD_LOGIC);
END COMPONENT;
agb: a greater than b;
ageb: a greater or equal than b;
aeb: a equal b;
aneb: a not equal b;
alb: a less than b;
aleb: a less or equal than b;
Guillermo Jaquenod, 2001

Ir al HELP
Ir al HELP
del
del
MAX+plus
MAX+plus
II!
II!

LPM_COMPARE facilita el desarrollo de comparadores de


igualdad o magnitud entre datos de ancho configurable
optimizando el aprovechamiento de las arquitectura de los
dispositivos de ALTERA, y puede operar en forma combinatoria
(accin por Default) o agregando registros de pipeline
Fuente: ALTERA MAX+plus II HELP

Ejemplos de LPMs: LPM_MULT


COMPONENT lpm_mult
GENERIC (
Ir al HELP
Ir al HELP
LPM_WIDTHA: POSITIVE; LPM_WIDTHB: POSITIVE;
del
del
MAX+plus
LPM_WIDTHS: NATURAL := 0; LPM_WIDTHP: POSITIVE;
MAX+plus
II!
II!
LPM_REPRESENTATION: STRING := "UNSIGNED";
LPM_PIPELINE: INTEGER := 0;
LPM_TYPE: STRING := "LPM_MULT";
LPM_HINT: STRING := "UNUSED");
PORT (
dataa: IN STD_LOGIC_VECTOR(LPM_WIDTHA-1 DOWNTO 0);
datab: IN STD_LOGIC_VECTOR(LPM_WIDTHB-1 DOWNTO 0);
aclr, clock: IN STD_LOGIC:= '0'; clken: IN STD_LOGIC:= '1';
sum: IN STD_LOGIC_VECTOR(LPM_WIDTHS-1 DOWNTO 0):=(OTHERS=>'0');
result: OUT STD_LOGIC_VECTOR(LPM_WIDTHP-1 DOWNTO 0));
END COMPONENT;
Los multiplicadores paralelos poseen una estructura compleja, cuya estrategia de optimizacion depende
fuertemente de la arquitectura usada. El uso de LPM_MULT es recomendable porque aprovecha al
mximo las caractersticas de arquitectura de los dispositivos de ALTERA, obteniendo el menor uso de
recursos y la mxima velocidad
Guillermo Jaquenod, 2001

Fuente: ALTERA MAX+plus II HELP

Ejemplos de LPMs: LPM_SHIFTREG


Shift Register con I/O serie Y paralela

Logic Shifter / Barrel Shifter Combinatorio


COMPONENT lpm_clshift
GENERIC (LPM_WIDTH: POSITIVE;
LPM_WIDTHDIST: POSITIVE;
LPM_TYPE: STRING := "LPM_CLSHIFT";
LPM_SHIFTTYPE: STRING := "LOGICAL";
LPM_HINT: STRING := "UNUSED");
PORT (data: IN STD_LOGIC_VECTOR(LPM_WIDTH-1 DOWNTO 0);
distance: IN STD_LOGIC_VECTOR(LPM_WIDTHDIST-1 DOWNTO 0);
direction: IN STD_LOGIC := '0';
result: OUT STD_LOGIC_VECTOR(LPM_WIDTH-1 DOWNTO 0);
underflow, overflow: OUT STD_LOGIC);
END COMPONENT;

Ejemplos de LPMs: LPM_COMPARE

Fuente: ALTERA MAX+plus II HELP

Ir al HELP del
Ir al HELP del
COMPONENT lpm_shiftreg
MAX+plus II!
MAX+plus II!
GENERIC (LPM_WIDTH: POSITIVE;
LPM_AVALUE: STRING := "UNUSED";
LPM_PVALUE: STRING := "UNUSED";
LPM_SVALUE: STRING := "UNUSED");
LPM_DIRECTION: STRING:= "UNUSED";
LPM_TYPE: STRING:= "LPM_SHIFTREG";
LPM_HINT: STRING:= "UNUSED");
PORT (
data: IN STD_LOGIC_VECTOR(LPM_WIDTH-1 DOWNTO 0);
clock: IN STD_LOGIC; enable: IN STD_LOGIC := '1';
shiftin: IN STD_LOGIC := '1'; load: IN STD_LOGIC := '0';
sclr: IN STD_LOGIC := '0';
sset: IN STD_LOGIC := '0';
aclr: IN STD_LOGIC := '0';
aset: IN STD_LOGIC := '0';
q: OUT STD_LOGIC_VECTOR(LPM_WIDTH-1 DOWNTO 0);
shiftout: OUT STD_LOGIC);
END COMPONENT;
Guillermo Jaquenod, 2001

Fuente: ALTERA MAX+plus II HELP

48

VHDL: Lenguaje de descripcin de hardware


LPMs para usar los EAB con VHDL
Entradas y clock dedicados

1, 2, 4, 8

1, 2, 4 u 8
data in
EAB
Local
Interconnect

in clock

RAM / ROM

address
in clock

2048 bits
256 x 8
512 x 4
1,024 x 2
2,048 x 1

write
enable
D

in
clock

Write
Pulse
Circuit

La disponibilidad de bloques de memoria (EABs) en los FLEX10K,


ACEX1K y APEX hace conveniente contar con componentes predefinidos
de VHDL que faciliten la construccin de funciones basadas en memoria.
Altera no recomienda crear funciones propias para el manejo de memoria,
sino usar las LPMs provistas para la creacin de RAMs y ROMs.

data out

D
11 a 8

Qu es un
EAB?

LPMs para instanciacin de RAM y ROM

En las 10KE y en las


ACEX1K los EABs son
DualPort real y de 4096 bits!

out clock

Fuente: ALTERA

Guillermo Jaquenod, 2001

Ejemplos de LPMs y EABs: LPM_RAM_DQ

lpm_ram_dq: memoria sincrnica o asincrnica con entrada y salida separada


lpm_ram_io: memoria sincrnica o asincrnica con entrada y salida comn
lpm_rom: memoria ROM sincrnica o asincrnica
csdpram: memoria sincrnica o asincrnica de doble puerta en ciclos
alternados. Para el caso de FLEX10K, FLEX 10KA, y FLEX 10KB.
lpm_ram_dp: memoria sincrnica o asincrnica de doble puerta. Para el caso
de FLEX10KE, ACEX1K y APEX.
csfifo: memoria (FIFO) sincrnica o asincrnica en ciclos alternados. Para el
caso de FLEX10K, FLEX 10KA, y FLEX 10KB.
lpm_fifo: memoria (FIFO) sincrnica o asincrnica de doble puerta real
lpm_fifo_dc: memoria (FIFO) sincrnica o asincrnica de reloj dual.

Guillermo Jaquenod, 2001

Ejemplos de LPMs y EABs: LPM_FIFO

RAM de puerta simple con I/O separada


El uso de LPMs para instanciar
El uso de LPMs para instanciar
COMPONENT lpm_ram_dq
bloques de memoria es la mejor
bloques de memoria es la mejor
GENERIC (
forma de aprovechar los EABs
forma de aprovechar los EABs
LPM_WIDTH: POSITIVE;
insertos en las arquitecturas APEX,
insertos en las arquitecturas APEX,
LPM_TYPE: STRING := "LPM_RAM_DQ";
ACEX y FLEX10K.
ACEX y FLEX10K.
LPM_RAM_DQ es el modelo VHDL
LPM_WIDTHAD: POSITIVE;
LPM_RAM_DQ es el modelo VHDL
ms proximo a un EAB real
ms proximo a un EAB real
LPM_NUMWORDS: NATURAL : = 0;
LPM_FILE: STRING := "UNUSED";
LPM_INDATA: STRING := "REGISTERED";
LPM_ADDRESS_CONTROL: STRING := "REGISTERED";
LPM_OUTDATA: STRING:= "REGISTERED";
LPM_HINT: STRING:= "UNUSED");
PORT ( data: IN STD_LOGIC_VECTOR(LPM_WIDTH-1 DOWNTO 0);
address: IN STD_LOGIC_VECTOR(LPM_WIDTHAD-1 DOWNTO 0);
we: IN STD_LOGIC;
inclock: IN STD_LOGIC := '0';
outclock: IN STD_LOGIC := '0';
q: OUT STD_LOGIC_VECTOR(LPM_WIDTH-1 DOWNTO 0));
END COMPONENT;
Guillermo Jaquenod, 2001

Fuente: ALTERA MAX+plus II HELP

Instanciacin de RAM y ROM usando LPMs


Ejemplo de uso de LPMs: memoria de entrada y salida separadas de 256 bytes:
LIBRARY ieee; USE ieee.std_logic_1164.ALL;
LIBRARY lpm; USE lpm.lpm_components.ALL;

Package de LPMs
Package de LPMs

ENTITY ram256x8 IS PORT(


datos: IN STD_LOGIC_VECTOR (7 DOWNTO 0);
direcciones: IN STD_LOGIC_VECTOR (7 DOWNTO 0);
escribir,relojent,relojsal: IN STD_LOGIC;
salidas: OUT STD_LOGIC_VECTOR (7 DOWNTO 0));
END ram256x8;
ARCHITECTURE usoLPM OF ram256x8 IS BEGIN
inst_1: lpm_ram_dq
GENERIC MAP (lpm_widthad => 8,lpm_width => 8)
PORT MAP(data => datos,address => direcciones,we =>
inclock => relojent,outclock => relojsal,q
END usoLPM;
Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Instanciacin del
Instanciacin del
componente LPM
componente LPM
escribir,
=> salidas);

Fuente: ALTERA

COMPONENT LPM_FIFO
GENERIC (LPM_WIDTH: POSITIVE;
Un LPM_FIFO emplea un EAB ms
Un LPM_FIFO emplea un EAB ms
LPM_WIDTHU: POSITIVE : = 1;
otros recursos (contadores de
otros recursos (contadores de
lectura y escritura) cuya realizacin
LPM_TYPE: STRING := "LPM_FIFO";
lectura y escritura) cuya realizacin
queda oculta al diseador.
queda oculta al diseador.
LPM_NUMWORDS: POSITIVE;
LPM_SHOWAHEAD: STRING := "OFF"
LPM_HINT: STRING := "UNUSED");
PORT (data: IN STD_LOGIC_VECTOR(LPM_WIDTH-1 DOWNTO 0);
clock, rdreq, wrreq: IN STD_LOGIC;
aclr, sclr: IN STD_LOGIC := '0';
full, empty: OUT STD_LOGIC;
usedw: OUT STD_LOGIC_VECTOR(LPM_WIDTHU-1 DOWNTO 0)
q: OUT STD_LOGIC_VECTOR(LPM_WIDTH-1 DOWNTO 0));
END COMPONENT;

Guillermo Jaquenod, 2001

Fuente: ALTERA MAX+plus II HELP

MAX+plus II/VHDL: diseo de megafunciones


Para disear una megafuncin se usa el campo de GENERICs en la
descripcin de la entidad para listar todos los parmetros de la entidad, y
opcionalmente sus valores de default.
Para usar esa megafuncin se debe declarar el componente (ya sea en forma
explicita o mediante el uso de un PACKAGE) y luego crear una instancia de
esa entidad
La nica diferencia con una macrofuncin o primitiva es que al crear esa
instancia, adems del PORT MAP debe hacerse un GENERIC MAP, donde se
definen los valores especficos de los parmetros de ese componente para esa
instancia.
Si el componente haba sido diseado en VHDL, el GENERIC MAP coincide con la
descripcin de GENERICs del componente
Si el componente haba sido diseado en AHDL, el GENERIC MAP coincide con la
descripcin dada en la seccin WITH(..) del prototipo
Si el componente haba sido diseado en modo grfico (*.gdf), el GENERIC MAP se
basa en las primitivas PARAM definidas en ese grfico

Guillermo Jaquenod, 2001

49

VHDL: Lenguaje de descripcin de hardware


MAX+plus II/VHDL: diseo de megafunciones
Parmetro
ENTITY regvar IS
Parmetro
GENERIC(ANCHO : INTEGER);
PORT(d:IN STD_LOGIC_VECTOR(ANCHO- 1 DOWNTO 0); clk:IN STD_LOGIC;
q:OUT STD_LOGIC_VECTOR(ANCHO- 1 DOWNTO 0));
END regvar;

ANCHO=

regvar
D
D

d()

Q
Q

ARCHITECTURE a OF regvar IS BEGIN


PROCESS BEGIN
WAIT UNTIL clk = '1'; q <= d;
END PROCESS;
END a;

Libraries definidas por el usuario

q()

Ir al menu Options
Elegir User Libraries

clk

En el campo Directory
Name:, definir el
directorio donde buscar
los subdiseos de
menor jerarqua

ENTITY reg24 IS PORT(


d:IN STD_LOGIC_VECTOR(23 DOWNTO 0);clk:IN STD_LOGIC;
q:OUT STD_LOGIC_VECTOR(23 DOWNTO 0));
END reg24;

Declaracin del
Declaracin del

componente
ARCHITECTURE a OF reg24 IS
componente
COMPONENT regvar
GENERIC(ANCHO: INTEGER);
PORT(d:IN STD_LOGIC_VECTOR(ANCHO- 1 DOWNTO 0);clk:IN STD_LOGIC;
q:OUT STD_LOGIC_VECTOR(ANCHO- 1 DOWNTO 0));
END COMPONENT;
BEGIN
reg12a : regvar
PORT MAP (d =>
reg12b : regvar
PORT MAP (d =>
END a;

GENERIC MAP
d(11 DOWNTO
GENERIC MAP
d(23 DOWNTO

(ANCHO=> 12)
0), clk => clk, q => q(11 DOWNTO 0));
(ANCHO=> 12)
12), clk => clk,q => q(23 DOWNTO 12));

Dos instancias del


Dos instancias del
componente
componente
(cada una ocupa
(cada una ocupa
una regin de
una regin de
silicio), dando
silicio), dando
valor a los
valor a los
parmetros
parmetros

Guillermo Jaquenod, 2001

Fuente: ALTERA

Packages definidos por el usuario

Los packages tienen una extensin .VHD, al igual que cualquier


mdulo que defina entidades
Los packages definidos por el usuario deben ser compilados antes
de compilar diseos que usen componentes descriptos en esos
packages
Los packages definidos por el usuario pueden estar en el
subdirectorio de trabajo, en cuyo caso se referencian as:
LIBRARY WORK; --opcional
USE WORK.<nombre del package>.all;

En otro directorio, en una USER LIBRARY


LIBRARY <library del usuario>;
USE <library del usuario>.<nombre del package>.all;

Agregarlo (ADD y luego


OK)

Guillermo Jaquenod, 2001

Fuente: ALTERA

MAX+plus II: cmo definir un package


La creacin y uso de funciones propias es sumamente fcil en el
ambiente del MAX+plus II
Para definir una macro/megafuncin propia:
1. Cree la macrofuncin deseada
2. Cree un package que contenga una declaracin de
PACKAGE con una declaracin de ese componente
3. Compile ese package
Para usar una macro/megafuncin propia:
4. Declare la library y el package
5. Instancie los componentes en el bloque de arquitectura
Alternativamente, los pasos 2 y 3 pueden ser includos en el diseo
final (nivel TOP de la jerarqua)

O pegados dentro del propio archivo de diseo donde son usados

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

MAX+plus II: cmo definir un package

Packages definidos por el usuario

Ejemplo: creacin de la funcin:

Con la ventana del


compilador abierta
Ir al menu Interfaces
Elegir VHDL Netlist
Readers Settings
En Library Name:,
definir la library
En Directory Name:,
definir donde est
ubicado el package
Apretar ADD y OK
El Package debe ser
compilado antes de
poder ser usado

ENTITY reg12 IS PORT(d:IN STD_LOGIC_VECTOR(11 DOWNTO 0);


clk:IN STD_LOGIC; q:OUT STD_LOGIC_VECTOR(11 DOWNTO 0));
END reg12;
ARCHITECTURE a OF reg12 IS
BEGIN PROCESS BEGIN WAIT UNTIL clk = '1'; q <= d; END PROCESS;
END a;

Creacin del package:


PACKAGE reg24_package IS
COMPONENT reg12 PORT(
d: IN STD_LOGIC_VECTOR(11 DOWNTO 0); clk:IN STD_LOGIC;
q: OUT STD_LOGIC_VECTOR(11 DOWNTO 0));
END COMPONENT;
END reg24_package;
LIBRARY work; USE work.reg24_package.ALL;
ENTITY reg24 IS PORT(
d:IN STD_LOGIC_VECTOR(23 DOWNTO 0); clk: IN STD_LOGIC;
q: OUT STD_LOGIC_VECTOR(23 DOWNTO 0));
END reg24;
ARCHITECTURE a OF reg24 IS BEGIN
reg12a : reg12 PORT MAP(d=>d(11 DOWNTO 0),clk=>clk,q=>q(11 DOWNTO 0));
reg12b : reg12 PORT MAP(d=>d(23 DOWNTO 12),clk=>clk,q=>q(23 DOWNTO 12));
END a;

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Fuente: ALTERA

Fuente: ALTERA

Guillermo Jaquenod, 2001

Fuente: ALTERA

50

VHDL: Lenguaje de descripcin de hardware


Cmo mantener los nombres de nodos internos?

Bases de VHDL
Posibles escenarios de diseo para
Sntesis + Place&Route + Simulacin:
Escoger Show All Node Name Synonyms
Escoger Show All Node Name Synonyms
en la ventana de dilogo Enter Nodes from SNF
en la ventana de dilogo Enter Nodes from SNF
Escoger Preserve all Node Name Synonyms
Escoger Preserve all Node Name Synonyms
en el men Processing antes de compilar
en el men Processing antes de compilar
Fuente: ALTERA

Guillermo Jaquenod, 2001

Primer escenario: slo MAX+plus II

Slo MAX+plus II
EDA => MAX+plus II => EDA
MAX+plus II => EDA
Guillermo Jaquenod, 2001

Lmitaciones de diseo en VHDL/MAX+plus II


MAX+plus II VHDL slo soporta construcciones orientadas a la
sntesis, y ciertas construcciones son aceptadas slo parcialmente:

Editor de texto VHDL

MAX+plus II

Es posible declarar varias ENTITY en un unico archivo


El nombre del archivo debe coincidir con la entidad de jerarqua tope, que no
necesariamente debe ser la primera de las definidas en ese archivo

Compilador y Simulador

Las Libraries y Packages deben ser declaradas para cada entidad

Todo el proceso de diseo se realiza dentro del ambiente MAX+plus II


Slo es posible la simulacin usando formas de onda
Y no es posible simular el diseo ALTERA junto con el de otros dispositivos
Est atado a las limitaciones del compilador VHDL del MAX+plus II
Los archivos en juego en este tipo de escenario de diseo son de extensin
vhd (cdigo fuente en VHDL), acf (asignaciones), pof/sof (cdigo de
programacin), snf (netlist para simulacin), scf (estimulos para simulacin)

Es posible definir varias arquitecturas para una entidad, pero slo la ltima es usada
Slo pueden definirse GENERICS en una entidad si se define una entidad por archivo.
Los genricos slo son usados para transportar parmetros, y no es posible pasarse
informacin de parmetros entre entidades descriptas en el mismo archivo.
Constantes: slo pueden ser de tipo INTEGER, enumeradas, STD_LOGIC_VECTOR o
STRING.
Arrays de Seales y variables: slo se aceptan arrays con elementos que sean arrays
unidimensionales o bits simples
Multiplicacin y divisin solo cuando el operador de la derecha es potencia de dos

ES EL CASO DE DISEOS SIMPLES


Guillermo Jaquenod, 2001

El uso de GENERATE debe tener lmites estticos locales


Fuente: ALTERA

Lmites de diseos en VHDL con MAX+plus II

Fuente: ALTERA

Guillermo Jaquenod, 2001

Flujo de diseo usando slo MAX+plus II

Ciertas otras construcciones NO son soportadas en MAX+plus II:

funciones de resolucin
declaracin de seales globales en packages
bloques de configuracin
seales fsicas, objetos tipo file o de punto flotante, ports tipo LINKAGE
objetos tipo access, y alocacin o dealocacin de objetos
declaracin de grupos (objetos con el mismo atributo, definidos en VHDL93)
sentencias DISCONNECT o EXIT
operadores de shift (definidos en VHDL93)
record aggregates
retardos AFTER o TRANSPORT
identificadores extendidos
sentencias RETURN dentro de PROCEDUREs o LOOPs

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Fuente: ALTERA

Ingreso del diseo

Functional
SNF
Extractor

Timing
SNF
Extractor

Compilacin
1
Funcional
Simulacin

No

Temporal
Simulacin

OK?

Si

OK?
Si

1 Recomendado: Primero compilar y simular


en modo funcional, y recin luego en modo
temporal
Prueba fsica

Guillermo Jaquenod, 2001

Probar otra
arquitectura
No
Habilitar Design
Doctor
Probar otras
Logic Options

Anlisis Temporal

Velo.?

No

Fuente: ALTERA

51

VHDL: Lenguaje de descripcin de hardware


Editor de textos VHDL del MAX+plus II

MAX+plus II: Plantillas (Templates) de VHDL

En el editor de texto del MAX+plus II es posible el uso


de plantillas con la estructura sintctica de cualquier
construccin VHDL; esta facilidad est activa slo
mientras se est editando un archivo.

Sintaxis coloreada
Sintaxis coloreada

File -> New -> Text Editor


File -> Save As
File name = nombre de la entidad con
extensin .vhd
File -> Project -> Set Project To Current File
Fuente: ALTERA

Guillermo Jaquenod, 2001

Compiladores VHDL87 y 93 en MAX+plus II


Mantener abierta la
ventana del Compiler
En el men Interfaces
elegir VHDL Netlist
Readers Settings
Y dentro de esa ventana,
en la zona VHDL Version,
elegir VHDL 1987 o VHDL
1993
Por defecto, MAX+plus II
elige VHDL 1987

Posicionar el cursor, en el archivo en edicin, en el


lugar donde se desea insertar el Template
Desplegar el menu Templates
Seleccionar VHDL Template
Elegir en la ventana la construccin a insertar
Apretar OK.

Una vez insertado, slo es necesario reemplazar las


variables generalizadas del Template, que
comienzan con dos underscores (_ _), con los
nombres de las variables propias
Fuente: ALTERA

Guillermo Jaquenod, 2001

MAX+plus II: modificaciones en VHDL 93


La sintaxis de apertura y cierre de entidades, arquitecturas, componentes,
procesos, etc, ahora es consistente
entity NombreE is..end entity NombreE;
architecture NombreA of NombreE is..end architecture NombreA;
component NombreC is..end component NombreC;

La sintaxis de VHDL87 es aceptada por VHDL 93


Sobre los nuevos operadores definidos en VHDL93:
xnor: aceptado por MAX+PLUS II, si es usado sobre objetos de tipo Boolean, Bit,
Bit_vector, Std_logic, Std_logic_vector
sla, sll, sra, srl, rol, ror: no son aceptados por el MAX+plus II

Bit String Literals:


Los valores a asignar a objetos tipo std_logic_vector ahora pueden ser escritos en
hexadecimal u octal, as como strings binarios de 0's y 1's
Antes (VHDL87)

Fuente: ALTERA

Guillermo Jaquenod, 2001

D(7 DOWNTO 0)<= to_stdlogicvector(x"FC");

Ahora (VHDL93)

D <= x"FC";

Segundo escenario
3rd
party
EDA

edif

Segundo escenario: archivos en juego

.edo

.lmf

MAX+plus II

Fuente: ALTERA

Guillermo Jaquenod, 2001

.vho

3rd
party
EDA

3rd
party
EDA

.edo

.lmf

edif

MAX+plus II

.vho

3rd
party
EDA

.sdo

.sdo
EDA: Electronic Design Automation

La sntesis es realizada mediante otra herramienta EDA (Leonardo, Synplify,


FPGA Express, etc..)
MAX+plus II realiza el Place and route
La simulacin es realizada usando otra herramienta EDA (ModelSIM,...)

LMF: Library Mapping File. Son usadas por el compilador para saber cmo reemplazar
celdas EDIF no estndar por funciones lgicas propias del MAX+PLUS II.
EDIF: Electronic Data Interchange Format. Formato estndar para describir circuitos. En
general las herramientas EDA interactan entre s usando archivos EDIF 2 0 0 o EDIF 3 0 0.
EDO: archivo creado por el EDIF Netlist Writer para ser usado por un simulador estndar
VHO: idem EDO, pero con formato VHDL
SDO: es un archivo VHDL con formato SDF (Standard Delay Format). Este archivo tiene
informacin de los retardos del dispositivo usada para simulacin en VHDL con bibliotecas
de simulacion compatibles con VITAL (VHDL Initiative Toward ASIC Libraries)

CASO TIPICO: DISEOS MUY COMPLEJOS

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Fuente: ALTERA

Guillermo Jaquenod, 2001

Fuente: ALTERA

52

VHDL: Lenguaje de descripcin de hardware


Flujo de diseo EDA => MAX+Plus II => EDA

Netlists y EDIF

Ingreso del diseo


Constraints

Sntesis
OK?
Si

ModelSIM

edif
No

lmf

acf

vho

Si

Simulacin

sdo

Velocidad?

Place&Route
Lgica OK?

edo

No
Anlisis temporal
No
rea?

OK?
Si

No

Si

Si

Leonardo,
FPGA
Express,
Synplify, etc..

rea?

Timing OK?

No

Velocidad?

No

Si
No

Si

pof

Prueba fsica

No
sof

Si

jam/jbc

OK?

Un net es un camino elctrico en un circuito, que toma el mismo valor


en todos los puntos. Un componente complejo puede ser visto como
una suma de componentes y sus conexiones, donde cada componente
es una caja negra con determinadas puertas.
El netlist de un circuito es una representacin en forma de listado de
cada net y de su conectividad elctrica, y por ello ignora elementos
pasivos tal como conectores o terminales que no afectan la
propagacin de una seal en un net, as como efectos fsicos tales
como retardos o acoplamientos.
Un netlist puede ser:

No

Si
MAX+plus II

Guillermo Jaquenod, 2001

Jerrquico: describe interconexiones entre jerarquas de bloques, en algo


que copia la estructura jerquica del diseo
Plano (FLAT): cuando todas las interconexiones de TODO el diseo se
llevan al mnimo nivel, en una nica descripcin. Esta descripcin es til
para procesos de simulacin o Place&Route, aunque no es demasiado
prctica para el anlisis.
Guillermo Jaquenod, 2001

Netlists y EDIF

Netlists y EDIF

EDIF significa Electronic Data Interchange Format, y es un estndar


ANSI/EIA. Un archivo EDIF es un archivo de texto ASCII, con
estructura sintctica similar a la del lenguaje LISP (List Processing) y
muestra una enorme cantidad de parntesis que limitan datos. Es un
tipo de descripcin verborrgica sumamente extensa, pensada para
facilitar su parsing mediante un programa de computacin.
EDIF tiene cierto nmero de posibles niveles de complejidad:
Level_0: nivel bsico, con constantes simple
Level_1: soporta variables y expresiones
Level_2: agrega loops y ejecucin condicional

Los archivos EDIF consisten de un conjunto de libraries, que


contienen conjunto de cells, cada una de las cuales contiene una o
ms views. Estas views, por su parte tiene una porcin de interface
que describe sus puertas, y una porcin de contents.

Guillermo Jaquenod, 2001

Los archivos *.LMF son


archivos ASCII de texto, y son
especificados mediante una
opcin del MAX+plus II
definida en el men EDIF
Netlist Reader Settings.

(edif miand3 (edifVersion 22 00 0) (edifLevel 0) (keywordMap (keywordLevel 0))


(edif miand3 (edifVersion
0) (edifLevel 0) (keywordMap (keywordLevel 0))
(status (written(timeStamp 2001 66 16 10 22 56)(authorxx")(program xx" (version xx"))))
(status (written(timeStamp 2001
16 10
56)(authorxx")(program xx" (version xx"))))
(library ALTERA (edifLevel 0)(technology (numberDefinition ))
(library ALTERA (edifLevel 0)(technology (numberDefinition ))
(cell LUT (cellType GENERIC)
(cell LUT (cellType GENERIC)
(view PRIM (viewType NETLIST)
(view PRIM (viewType NETLIST)
(interface (port IN1 (direction INPUT))(port IN2 (direction INPUT))
(interface (port IN1 (direction INPUT))(port IN2 (direction INPUT))
a
(port IN3 (direction INPUT))(port IN4 (direction INPUT))
(port IN3 (direction INPUT))(port IN4 (direction INPUT))
(port A_OUT (direction OUTPUT))))))
(port A_OUT (direction OUTPUT))))))
b
(library PrimLib (edifLevel 0)(technology (numberDefinition )))
(library PrimLib (edifLevel 0)(technology (numberDefinition )))
c
(library work (edifLevel 0)(technology (numberDefinition ))
(library work (edifLevel 0)(technology (numberDefinition ))
(cell miand3 (cellType GENERIC)
(cell miand3 (cellType GENERIC)
(view aa (viewType NETLIST)
(view
(viewType NETLIST)
(interface (port aa (direction INPUT))(port bb (direction INPUT))
(interface (port
(direction INPUT))(port
(direction INPUT))
(port cc (direction INPUT))(port sal (direction OUTPUT)))
(port
(direction INPUT))(port sal (direction OUTPUT)))
(contents (instance(rename sal1 "sal")(viewRef PRIM (cellref LUT (libraryRef ALTERA)))
(contents (instance(rename sal1 "sal")(viewRef PRIM (cellref LUT (libraryRef ALTERA)))
(property lut_function (string "((IN3 IN2 IN1))")))
(property lut_function (string "((IN3 IN2 IN1))")))
(net aa (joined(portRef a)(portRef IN1 (instanceRef sal1))))
(net
(joined(portRef a)(portRef IN1 (instanceRef sal1))))
(net bb (joined(portRef b)(portRef IN2 (instanceRef sal1))))
(net
(joined(portRef b)(portRef IN2 (instanceRef sal1))))
(net cc (joined(portRef c)(portRef IN3 (instanceRef sal1))))
(net
(joined(portRef c)(portRef IN3 (instanceRef sal1))))
(net VCC (joined))(net GND (joined(portRef IN4 (instanceRef sal1))))
(net VCC (joined))(net GND (joined(portRef IN4 (instanceRef sal1))))
(net sal (joined(portRef A_OUT (instanceRef sal1))(portRef sal)))))))
(net sal (joined(portRef A_OUT (instanceRef sal1))(portRef sal)))))))
(design miand3 (cellRef miand3 (libraryRef work))))
(design miand3 (cellRef miand3 (libraryRef work))))

miand3

Guillermo Jaquenod, 2001

LIBRARY synplify
LIBRARY synplify
BEGIN
BEGIN

Guillermo Jaquenod, 2001

Fuente: SYNPLIFY

Con la ventana del Compilador activa


Abrir el men Interfaces
Si se desea salidas VHDL
Elegir VHDL Netlist Writer Settings
Seleccionar entre VHDL87 o
VHDL93
Elegir las salidas deseadas:
.vho
.sdo ver.2.1 (VITAL)
.sdo ver.1.0
Aceptar (Click OK)
Si se desea salidas EDIF
Ir al men Interfaces
Elegir EDIF Netlist Writer Settings
Aceptar (Click OK)

Extracto de Synplify.lmf
Extracto de Synplify.lmf

FUNCTION and3 (IN1,IN2,IN3) RETURNS (OUT)


FUNCTION and3 (IN1,IN2,IN3) RETURNS (OUT)
FUNCTION "AND3" ("I0","I1","I2") RETURNS ("OUT")
FUNCTION "AND3" ("I0","I1","I2") RETURNS ("OUT")
END
END
...
...
BEGIN
BEGIN
FUNCTION dff (D,CLK,CLRN,PRN) RETURNS (Q)
FUNCTION dff (D,CLK,CLRN,PRN) RETURNS (Q)
FUNCTION "DFFNRS1" ("D0","C","RN","SN") RETURNS ("Q0")
FUNCTION "DFFNRS1" ("D0","C","RN","SN") RETURNS ("Q0")
END
END
...
...
BEGIN
BEGIN
FUNCTION tri (IN,OE) RETURNS (OUT)
FUNCTION tri (IN,OE) RETURNS (OUT)
FUNCTION "TRI1" ("I0","E") RETURNS ("OUT0")
FUNCTION "TRI1" ("I0","E") RETURNS ("OUT0")
END
END
...
...
BEGIN
BEGIN
FUNCTION carry (IN) RETURNS (OUT)
FUNCTION carry (IN) RETURNS (OUT)
FUNCTION "CARRY" ("A_IN") RETURNS ("A_OUT")
FUNCTION "CARRY" ("A_IN") RETURNS ("A_OUT")
END
END
...
...
BEGIN
BEGIN
FUNCTION global (IN) RETURNS (OUT)
FUNCTION global (IN) RETURNS (OUT)
FUNCTION "GLOBAL" ("A_IN") RETURNS ("A_OUT")
FUNCTION "GLOBAL" ("A_IN") RETURNS ("A_OUT")
END
END
...
...
BEGIN
BEGIN
FUNCTION lcell (IN) RETURNS (OUT)
FUNCTION lcell (IN) RETURNS (OUT)
FUNCTION "LCELL" ("A_IN") RETURNS ("A_OUT")
FUNCTION "LCELL" ("A_IN") RETURNS ("A_OUT")
END
END
...
...
END
END

Guillermo Jaquenod, 2001

sal

Salidas del MAX+plus II a herramientas EDA

Library Mapping Files (*.LMF)


Para procesar un archivo EDIF
generado por un producto EDA
externo, el MAX+plus II utiliza
ciertos archivos de mapeado
para convertir cells definidas
en EDIF a primitivas propias
del MAX+plus II

Descripcin EDIF luego de la etapa de sntesis de una funcin AND


de 3 entradas usando FLEX10K

Fuente: ALTERA

Guillermo Jaquenod, 2001

Fuente: ALTERA

53

VHDL: Lenguaje de descripcin de hardware


Tercer escenario
La edicin, depuracin
sintctica, sntesis y Place &
Route es realizada por el
MAX+plus II
La simulacin se realiza de
igual modo que en el primer
escenario, mediante una
herramienta estndar,
externa al MAX+plus II
(ModelSIM,...)
Es una solucin usual
cuando se desea realizar un
testbench que emplea el
modelo de diseo de FPL
pero tambin otros
dispositivos

Editor de texto VHDL

MAX+plus II

Bases de VHDL

Compilador

.edo

.sdo

.vho

design
simulation
3rd party
EDA
Fuente: ALTERA

Guillermo Jaquenod, 2001

Iteracin del proceso de diseo


El control del proceso de
sntesis es realizado casi
exclusivamente dentro del
proceso de sntesis, con poca
interaccin con el proceso de
PLACE&ROUTE
Existen dos acciones
claramente distintas:
La edicin y modificacin del
cdigo fuente, incluyendo el
test de distintas arquitecturas
La edicin y modificacin de
constraints, que puede ser
realizada tanto dentro del
cdigo VHDL (en algunos
casos) como mediante
asignaciones externas

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


y cmo cada arquitectura se acomoda a ciertas soluciones

Constraints

Que un diseo haya sido escrito en un HDL no quiere decir que est bien hecho, ni
que sea eficiente, ni de costo ptimo

Sntesis

edif
No

OK?

Guillermo Jaquenod, 2001

Tcnicas de diseo eficaz usando HDLs

Ingreso del diseo

Si

Reglas generales de diseo para


optimizar la performance

Disear pensando en el posterior proceso de sntesis!

lmf

acf

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

Si
Velocidad?

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!

Place&Route

No
Anlisis temporal

OK?
Si

No
rea?

No

Velocidad?

Si

Pensar sincrnico!
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.

No

Si
rea?

No

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


tiempos de propagacin.

Si

SINTESIS

PLACE & ROUTE


Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Tcnicas de diseo eficaz usando HDLs

Tcnicas de diseo eficaz usando HDLs


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!

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
Permite el trabajo en equipo, disminuyendo el Time-To-Market
Permite probar alternativas de arquitectura sin tener que realizar
enormes modificaciones del cdigo
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

Una parte importantsima del proceso de diseo se ocupa en la


validacin del mismo a travs de la simulacin

Cuidado con
el OverConstraint!

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!!!

!!

Aunque el diseo funcione en simulacin, su prototipo luego debe


funcionar en el hardware real, donde debe poder ser testeado
En produccin debe ser posible detectar la correcta operacin del
sistema antes de salir a la venta
En reworking debe ser posible detectar las causas de las fallas

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

54

VHDL: Lenguaje de descripcin de hardware


Tcnicas de diseo eficaz usando HDLs

Tcnicas de diseo eficaz usando HDLs

Especificar completamente los mdulos a sintetizar antes de inicar el


proceso de sntesis, evitando estados desconocidos u operaciones
presumidas.

Para el caso de CASE:


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

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).

!!

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


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

!!

no olvidar el uso de OTHERS

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


uso de recursos

Para el caso de FOR:

En el caso de lgica combinatoria, ser cuidadoso para evitar la inferencia de


elementos de memoria:

asignar valores de default a todos los objetos inmediatamente antes de


comenzar un FOR.

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

tratar de realizar asignaciones a variables en lugar de a seales


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.

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


seales de entrada deben estar presentes en la lista de sensibilidad
Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Tcnicas de diseo eficaz usando HDLs

Tcnicas de diseo eficaz usando HDLs


fronteras del proceso de optimizacin

Evaluar post-sntesis las posibles inferencias indeseadas de memoria


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
Lgica
combinatoria

Analizar de dnde surgen esos nuevos registros

Asignacin de estilos y valores a FSMs


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.

LOGICA
DE NUEVO
ESTADO

MOORE de salida decodificada

Lgica
combinatoria

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.

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


los registros.

MOORE de salida registrada

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Tcnicas de diseo eficaz usando HDLs

Tcnicas de diseo eficaz usando HDLs


FF2

FF1
Lgica
combinatoria

Lgica
combinatoria

D Q
Ck
CL

Por eso conviene ubicar los registros en las fronteras de los bloques
jerrquicos (a la entrada o a la salida)

LOGICA
DE NUEVO
ESTADO

DECOD

D Q
Ck
CL

D Q
Ck
CL

T0

Lgica
combinatoria

D Q
Ck
CL

Lgica
combinatoria

T1~T0

Lgica
combinatoria

D Q
Ck
CL

T2~T0

Lgica
combinatoria

D Q
Ck
CL

T0

Balancear la complejidad combinatoria entre registros

D Q
Ck
CL

FF3
Lgica
combinatoria

T1~2xT0

D Q
Ck
CL

T2~T0

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

Cmo? Analizando la lista de worst paths!!

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

Lgica
combinatoria

T0

D Q
Ck
CL

Lgica
combinatoria

T1~T0/2

Lgica
combinatoria

T2~T0/2

D Q
Ck
CL

Lgica
combinatoria

D Q
Ck
CL

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).
Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Pin

Lo mismo en relacin a los


False Path que suelen
aparecer cuando se usan
puertas bidireccionales:

FFx
D Q
Ck
CL

True Path

True Path
Lgica
combinatoria

Lgica
combinatoria

FFy
D Q
Ck
CL

False Path

Guillermo Jaquenod, 2001

55

VHDL: Lenguaje de descripcin de hardware


Manejo de archivos en VHDL
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

Bases de VHDL

Para el manejo de archivos, VHDL cuenta con el package TEXTIO (no


sintetizable), para operar sobre objetos de clase FILE.

Manejo de archivos en VHDL

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.
Los cinco subprogramas a utilizar son:
WRITE(), WRITELINE(), READ(), READLINE(), ENDFILE()

y operan con objetos de los tipos definidos en STANDARD/STD:


BIT,BIT_VECTOR,BOOLEAN,CHARACTER,INTEGER,REAL,STRING,TIME;

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Tipos definidos en TEXTIO

Subprogramas definidos en TEXTIO

TEXTIO define 4 nuevos tipos a usar:

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);

por enumeracin, define la forma de justificar los datos de salida en los


campos de salida, y es usada en el procedure WRITE ()
subtype WIDTH is NATURAL;

ancho de los campos de datos de salida, usado en el procedure WRITE ()

Guillermo Jaquenod, 2001

PROCEDURE readline (FILE f: TEXT; l: INOUT LINE);


PROCEDURE read (l: INOUT LINE; value: OUT <tipo>
[;good: OUT BOOLEAN]);

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
Guillermo Jaquenod, 2001

Ejemplo de escritura

Ejemplo de escritura

Se cuenta con una variable llamada ahora, de tipo TIME y 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 ahora, A y B con el siguiente
formato:

5 caracteres para el valor de ahora en microsegundos, justificado a derecha


dos espacios de separacin
un carcter que indique el valor de A
reloj
dos espacios de separacin
A
y un carcter que indique el valor de B
...tt..A..B

B
ahora

Proceso
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

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

FILE wrfile: TEXT IS OUT salida.vct;

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

wrfile

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;
...

Guillermo Jaquenod, 2001

56

VHDL: Lenguaje de descripcin de hardware


Manejo de archivos y textos: txt_util.vhd
VHDL es pobre en procedimientos para el manejo de archivos, y muchos
usuarios han desarrollado packages para facilitar esa tarea.
Por ejemplo, en http://www.i2.i-2000.com/~stefan/vcourse/html se
encuentra un package llamado txt_util.vhd, que ofrece distintos
procedimientos.
Por ejemplo, para salida a consola:
procedure print (text: string); -- sacar un mensaje a consola (STD_OUTPUT),
combina un WRITE () con un WRITELINE ()
procedure print (active: boolean; text: string); -- saca un mensaje por
consola slo si active vale TRUE, es util para debug

Para lectura o escritura desde archivos:


procedure str_read(file in_file: TEXT; res_string: out string); -- para
leer un string de largo variable desde el archivo de entrada
procedure print(file out_file: TEXT; new_string: in string); -- para
escribir un string en un FILE y pasar a una nueva lnea
procedure print(file out_file: TEXT; char: in character); -- para imprimir
un caracter en un FILE y pasar a una nueva lnea
Guillermo Jaquenod, 2001

Conversin de tipos en txt_util.vhd


Para conversin entre otros tipos y los tipos STRING o character:
FUNCTION chr(sl: std_logic) RETURN character; -- convierte un
std_logic en un carcter
FUNCTION chr(int: integer) RETURN character; -- convierte un entero de
valor 0..35 en los caracteres 0..9 y A..Z. Los dems son convertidos en ?.
FUNCTION str(sl: std_logic) RETURN string; -- convierte un std_logic en
un STRING de tamao 1 (RANGO 1 TO 1)
FUNCTION str(slv: std_logic_vector) RETURN string; -- convierte un
std_logic_vector en un STRING de unos y ceros
FUNCTION str(b: boolean) RETURN string; -- convierte un Boolean en los
strings constantes TRUE o FALSE
FUNCTION str(int: integer; base: integer) RETURN string;-convierte un entero en un string de caracteres de una dada base
FUNCTION str(int: integer) RETURN string; -- convierte un entero en un
string suponiendo base=10
FUNCTION hstr(slv: std_logic_vector) RETURN string; -- convierte un
entero en un string hexadecimal (supone base=16)
Guillermo Jaquenod, 2001

Conversin de tipos en txt_util.vhd


Para conversin entre otros tipos y los tipos STRING o character:
function to_upper(c:character) return character; -- Conversin de
lower case a upper case
function to_lower(c:character) return character; -- Conversin de

Bases de VHDL

upper case a lower case


function to_upper(s:string) return string; -- Traslada un STRING
completo a upper case
function to_lower(s:string) return string; -- Traslada un STRING
completo a lower case
function to_std_logic(c:character) return std_logic; -- Dado un
caracter lo convierte en std_logic. Si es invlido lo convierte a X

Modelado del tiempo en VHDL

function to_std_logic_vector(s:string) return std_logic_vector;


-- Convierte un STRING de caracteres en un STD-LOGIC_VECTOR,
donde los caracteres invlidos del STRING son reemplazados por X

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

VHDL: el mundo real


Adems de las aplicaciones que operan procesando sentencias simultneas

El tiempo en la asignacin simple a seales


Las sentencias de asignacin a seales son de la forma

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


se resuelven sentencias secuenciales, todos los eventos que se interrelacionan con el mundo real deben sincronizarse con EVENTOS FSICOS
(seales que cambian de estado) y con la variable TIEMPO
Un evento fsico: importante en la seccin de hardware y en el monitor de
salidas
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

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Recin en VHDL93!
Recin en VHDL93!

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


[TRANSPORT] <expresin> [AFTER <expresin temporal>];
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:
[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.

Guillermo Jaquenod, 2001

57

VHDL: Lenguaje de descripcin de hardware


Uso de after para asignaciones demoradas

Resolucin de asignaciones demoradas

Todo dispositivo real presenta retardos de propagacin, que


dependen intimamente de la arquitectura del dispositivo

Para modelar el comportamiento de un dispositivo (behavioral


modelling) se hace necesario poder modelar estos retardos

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:

La asignacin de retardos a seales puede hacerse tanto dentro


como fuera de Procesos, habiendo dos tipos de retardos:

reloj <= NOT reloj after 50 ns;

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, .

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


al retardo es enmascarado (caso tpico de una compuerta)
Retardo de Transporte: este enmascaramiento no existe,
siendo el caso de una lnea de retardo

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


definir ciertas formas especficas:

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


0

10

15

20

25

Fuente: SJOHOLM

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Resolucin de asignaciones demoradas


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
El modelo transport
propaga la expresin a la
seal, sin modificaciones
El modelo inertial filtra
cambios de duracin inferior
a un mnimo

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

tiempo
valor

tiempo
valor

10ns
0

10ns
0

La posibilidad de asignar varios valores futuros a seales en


distintos momentos del tiempo futuro obliga a ciertos metodos de
resolucin

Ejemplos de INERTIAL y TRANSPORT


C

20ns
1

C<= 0,
1 AFTER
0 AFTER
1 AFTER
0 AFTER
1 AFTER
0 AFTER

20ns
1

Ai

10 ns,
12 ns,
20 ns,
25 ns,
40 ns,
57;

A1 <= INERTIAL C
AFTER 10 ns;
tiempo
valor

20ns
1

A2 <= TRANSPORT C
AFTER 10 ns;

10ns
0

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

Guillermo Jaquenod, 2001

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

Guillermo Jaquenod, 2001

10

20

30

40

50

60

70

Fuente: SJOHOLM

Funciona de acuerdo a lo deseado?

Bases de VHDL

Verificacin funcional
de modelos VHDL

EL PROBLEMA NO ES CMO DISEAR Y SINTETIZAR UN


DISPOSITIVO DE VARIOS MILLONES DE COMPUERTAS
CORRIENDO A CIENTOS DE MEGAHERTZ, SINO CMO
VERIFICARLO!!!

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

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:

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


escritura de Test-Bench se hace imprescindible

Guillermo Jaquenod, 2001

58

VHDL: Lenguaje de descripcin de hardware


Verificacin funcional en distintas etapas de
un diseo

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

La simulacion es actualmente la unica herramienta de uso efectivo


para el debug y verificacin de sistemas de alta complejidad

Informacin de
estmulos y repuestas
SOFTWARE

Simulador VHDL

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
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)

HARDWARE

Modelo VHDL de tipo


Behavioral

La necesidad de poder simular

Guillermo Jaquenod, 2001

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

Guillermo Jaquenod, 2001

Simulacin con HDLs

Simulacin de eventos discretos


Dado el carcter concurrente de los sistemas simulados, la resolucin
de la simulacin debe hacerse en dos pasos:

Se inicializan seales y variables

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)

Se atienden los procesos con eventos activos pendientes


(en el caso de los procesos secuenciales, actualizando de
inmediato las variables locales en el orden indicado)
En base al valor actual de las seales se calcula la cola
con sus valores futuros
Se genera/actualiza la lista temporal ordenada de eventos
futuros

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;

Guillermo Jaquenod, 2001

Se actualiza el valor de las seales


Se avanza el reloj de simulacin hacia
el momento de ocurrencia del evento mas cercano

Fin de la simulacin?

Guillermo Jaquenod, 2001

El test bench en VHDL

no

Para el proceso de diseo y debug de Hardware, el VHDL es usado


de distintas maneras:
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.
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)
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)

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Qu es el test bench?
TEST BENCH
Generador de
estmulos

Otros mdulos ya
operativos

Mdulo del diseo


de nivel tope o DUT
(Design Under Test)

Monitor de
salidas

Se llama as cuando al mdulo de mayor nivel del diseo (DUT) se agrega:


un generador de estmulos, conectado a las entradas del DUT
un monitor de salidas, conectado a las salidas del DUT
otros posibles modulos predisenados

Se crea un mdulo de an mayor nivel, sin puertas de entrada o salida,


llamado test bench, de uso fundamental en la simulacin
Nota: A veces tambin se insertan dentro del DUT funciones no sintetizables
de verificacin, en lo que se llama embedded test.
Guillermo Jaquenod, 2001

59

VHDL: Lenguaje de descripcin de hardware


Cmo se usa un HDL en el test bench?
HDL behavioral, con el
modelo de comportamiento
temporal del dispositivo real

Event-Driven Simulation

El testbench no tiene
entradas ni salidas!

TEST BENCH

Otros mdulos ya
operativos

TEST BENCH

Mdulo del diseo


de nivel tope
(DUT)

Generador de
estmulos

Generador de
estmulos

Monitor de
salidas

Otros mdulos ya
operativos
Mdulo del diseo
de nivel tope o DUT
(Design Under Test)

Monitor de
salidas

HDL sintetizable, con el diseo a testear, a


veces con funciones de embedded test
HDL no sintetizable, con manejo de archivos, allocacin
dinmica de memoria, entrada salida por consola, y referencias
temporales
Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Generacin de vectores de Test


La generacin de estmulos (vectores de test) puede ser hecha de tres
grandes maneras:
mediante un algoritmo:
mediante una secuencia de asignaciones simples
mediante procesos explcitos que produzcan la repeticin de seales, y la
consiguiente (generacin de seales peridicas
mediante patrones complejos generados algortmicamente

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)

leyendo constantes almacenadas en un archivo separado


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.
Guillermo Jaquenod, 2001

Asignaciones simples y WAIT FOR


ENTITY testbench IS END ENTITY testbench;
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;
Guillermo Jaquenod, 2001

Asignaciones simples y WAIT FOR


(simulacin)

Fuente: ASHENDEN

Vectores repetitivos y simtricos


Generacin de relojes simtricos con una secuencia de asignaciones simples
ENTITY relojes IS PORT (clk1, clk2, clk3 :OUT BIT);
END ENTITY relojes;

reloj <= '1'; WAIT FOR 15 ns;


enable <= '1'; WAIT FOR 20 ns;

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

d0<='1'; d1<='0'; enable<='0'; reloj<='0'; WAIT FOR 5 ns;


Guillermo Jaquenod, 2001

Fuente de los grficos: VERIBEST 99.0 VHDL Simulator

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

60

VHDL: Lenguaje de descripcin de hardware


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;

Vectores repetitivos y asimtricos


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;
END ARCHITECTURE usoproc;

Guillermo Jaquenod, 2001

Fuente de los grficos: VERIBEST 99.0 VHDL Simulator

Vectores repetitivos y asimtricos (simulacin)


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
dut:reloj_asimetrico PORT MAP (reloj1,reloj2);
END;
PROCESS BEGIN
PROCESS BEGIN
reloj1 <= '1','0' AFTER ton;
reloj1 <= '1','0' AFTER ton;
WAIT FOR (ton+toff);
WAIT FOR (ton+toff);
END PROCESS asym1;
END PROCESS asym1;
asym2: PROCESS BEGIN
asym2: PROCESS BEGIN
reloj2 <= '1'; WAIT FOR (ton);
reloj2 <= '1'; WAIT FOR (ton);
reloj2 <= '0'; WAIT FOR (toff);
reloj2 <= '0'; WAIT FOR (toff);
END PROCESS asym2;
END PROCESS asym2;

Guillermo Jaquenod, 2001

Fuente de los 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;
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;

Guillermo Jaquenod, 2001

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;
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
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;

Guillermo Jaquenod, 2001

Vectores complejos usando algoritmos


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:
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;
Guillermo Jaquenod, 2001

Fuente de los grficos: VERIBEST 99.0 VHDL Simulator

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

61

VHDL: Lenguaje de descripcin de hardware


Vectores complejos usando algoritmos
(simulacin)

Generacin de vectores mediante arrays


el uso de vectores de test almacenados en forma de arrays permite
separar los procesos de asignacin de los valores a asignar

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;

LIBRARY ieee;USE ieee.std_logic_1164.ALL;


USE ieee.numeric_std.ALL;
ENTITY usoarray IS PORT (bus: OUT UNSIGNED (7 DOWNTO 0));
END ENTITY usoarray ;
valores a asignar
valores a 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 cclico
proceso cclico
WAIT FOR periodo;
de asignacin
de asignacin
END LOOP;
END PROCESS p0;
END ARCHITECTURE a;

Fuente de los grficos: VERIBEST 99.0 VHDL Simulator

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Vectores complejos usando algoritmos


(simulacin)

Leyendo estmulos desde un archivo

LIBRARY ieee;USE ieee.std_logic_1164.ALL; USE ieee.numeric_std.ALL;


LIBRARY ieee;USE ieee.std_logic_1164.ALL; USE ieee.numeric_std.ALL;
ENTITY testbench IS END;
ENTITY testbench IS END;
ARCHITECTURE xx OF testbench IS
ARCHITECTURE xx OF testbench IS
COMPONENT usoarray IS PORT (tabular_bus: OUT UNSIGNED (7 DOWNTO 0));
COMPONENT usoarray IS PORT (tabular_bus: OUT UNSIGNED (7 DOWNTO 0));
END COMPONENT;
END COMPONENT;
SIGNAL out_tab: UNSIGNED (7 DOWNTO 0);
SIGNAL out_tab: UNSIGNED (7 DOWNTO 0);
BEGIN
BEGIN
dut: usoarray PORT MAP (out_tab);
dut: usoarray PORT MAP (out_tab);
END;
END;

Guillermo Jaquenod, 2001

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:
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;

5....

Fuente de los grficos: VERIBEST 99.0 VHDL Simulator

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;
Guillermo Jaquenod, 2001

Modelos de otros mdulos anexos

Ejemplo: test de salidas usando ASSERT


Otros mdulos ya
operativos

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;
relojd <= relojDELAYED(t_hold);
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;

Generador de
estmulos

Mdulo del diseo


de nivel tope
(DUT)

TEST BENCH

Monitor de
salidas

Otros mdulos ya
operativos

ac se activa chk_thold

datos

reloj

tsetup

Generador de
estmulos

thold

Mdulo del diseo


de nivel tope o DUT
(Design Under Test)

Monitor de
salidas

violacion
de tsetup
relojd
violacion
de thold

S
ac se activa chk_thold

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

62

VHDL: Lenguaje de descripcin de hardware


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;
Mdulo del diseo
de nivel tope
(DUT)

Dos procesos:
uno para modelar el behavior
otro para modelar los retardos

Tiempos de
propagacion
distintos!

Ejemplos con MAX+plus II VHDL


Casos combinatorios

tr1 INERTIAL 1 AFTER tp1;


tr0 INERTIAL 0 AFTER tp0;
trx INERTIAL X AFTER tpx;
Cuando a o b son X o Z

Uso REJECT --> VHDL93

Guillermo Jaquenod, 2001

Fuente: ASHENDEN

Ejemplos: voto por mayoria con 3 votantes


LIBRARY ieee; USE ieee.std_logic_1164.ALL;
ENTITY mayoria IS PORT(
vot_a,vot_b,vot_c : IN STD_LOGIC;
y : OUT STD_LOGIC);
END ENTITY mayoria ;
SI
ARCHITECTURE rtl
BEGIN
y <= (vot_a AND
OR (vot_b AND
OR (vot_a AND
END ARCHITECTURE

Bases de VHDL

Monitor de
salidas

NO

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

Guillermo Jaquenod, 2001

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,...).
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

Guillermo Jaquenod, 2001

Ejemplos: voto por mayoria parametrizado


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;

Trascodificador Binario a GRAY


Binario

Guillermo Jaquenod, 2001

0000=0

0001=1

0001=1

0010=2

0011=3

0011=3

0010=2

0100=4

0110=6

0101=5

0111=7

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;

GRAY

0000=0

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;

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

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

NO

Guillermo Jaquenod, 2001

GRAY

Generador de
estmulos

BINARIO

ARCHITECTURE completa OF and2 IS


SIGNAL valor : std_ulogic;
BEGIN
compuerta: PROCESS (a,b) IS BEGIN
valor <= a AND b;
END PROCESS compuerta;
retardos: PROCESS (valor) IS BEGIN
IF valor=1 THEN
y <= REJECT
ELSIF valor=0 THEN y <= REJECT
ELSE
y <= REJECT
END IF;
END PROCESS retardos;
END ARCHITECTURE completa ;

1000=8

Guillermo Jaquenod, 2001

63

VHDL: Lenguaje de descripcin de hardware


Ejemplo: comparador de magnitud de N bits

Ejemplos: comparador de 4 bits tipo 7485

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;

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 ;
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;

7485

> = <

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
dibit := a(i) & b(i);
CASE dibit IS
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;

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Sumador CarryLookAhead

p=a OR b; Funcin PROPAGATE, vale 1 si


alguna entrada vale 1
El Carry de entrada a una etapa puede ser
calculado en base a las seales G y P de las
etapas previas (bloque amarillo):
cin(1)=g(0)OR(p(0)ANDcin(0))
cin(2)=g(1)OR
(p(1) AND (g(0) OR (p(0)AND cin(0)))

a(0) a cin
b(0) b

a(1) a cin
b(1) b

cin(0)
s s(0)
g
p

g(0)

s s(1)
g
p

g(1)

p(0)
cin(1)

s s(2)
g
p

a(n) a cin
b(n) b

s s(n)
g
p

g(2)
p(2)
cin(n)
g(n)

ARCHITECTURE ecuaciones OF adder_LAC IS


BEGIN
s <= a XOR b XOR cin;
g <= a AND b;
p <= a OR b;
END ecuaciones;

Guillermo Jaquenod, 2001

Sumador CarryLookAhead completo

Porqu en un
caso usa FOR
GENERATE y en
otro FOR LOOP?

ARCHITECTURE a OF NadderLAC IS
SIGNAL gtemp,ptemp : bit_vector (N-1 DOWNTO 0);
SIGNAL cent : bit_vector (N DOWNTO 0);
COMPONENT adder_LAC IS PORT(a,b,cin:IN BIT;s,g,p:OUT BIT);
END COMPONENT adder_LAC;
BEGIN
slicegen: FOR i IN 0 TO N-1 GENERATE
adder_slice : adder_LAC
PORT MAP(a(i),b(i),cent(i),s(i),gtemp(i),ptemp(i));
END GENERATE slicegen;
proclac: PROCESS (cin,gtemp,ptemp) IS
BEGIN
cent(0) <= cin;
FOR i IN 0 TO N-1 LOOP
cent (i+1) <= gtemp(i) OR (cent(i) AND ptemp(i));
END LOOP;
cout <= cent(N);
END PROCESS proclac;
END ARCHITECTURE a;

Guillermo Jaquenod, 2001

s
g

co(0)

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

a
b

p(n)

etcetera.....

ENTITY NadderLAC IS GENERIC (N: INTEGER := 4);


PORT (a,b: IN bit_vector (N-1 DOWNTO 0); cin: IN bit;
s: OUT bit_vector (N-1 DOWNTO 0); cout: OUT bit);
END ENTITY NadderLAC ;

cin

p(1)
cin(2)

a(2) a cin
b(2) b

ENTITY adder_LAC IS PORT(


a,b,cin : IN BIT;
s,g,p : OUT BIT);
END adder_LAC ;

Barrel Shifter
El barrel shifter es un circuito muy usado en
operaciones numricas.
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)
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

dato de salida

suma de las entradas


s=a XOR b XOR cin;
a y b y el carry de entrada
g=a AND b; Funcin GENERATE, vale 1 si
ambas entradas valen 1

cin(0)

dato de entrada

El mtodo evita el proceso de propagacin de


Carry. Para ello cada sumador (bloques celestes)
genera 3 funciones de 3 variables:

Sumador CarryLookAhead

cantidad de
desplazamientos

Guillermo Jaquenod, 2001

64

VHDL: Lenguaje de descripcin de hardware


Barrel Shifter solo hacia el LSB (a derecha)
ENTITY bsder IS
PORT (din: IN
sel: IN
dout: OUT
END ENTITY bsder

bit_vector (15 DOWNTO 0);


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

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;

sel(2)

Ejemplos (Shift +, Shift -) de Barrel Shift signed sobre datos de 16 bits


ENTRADA

0101

0 0 0 0 0 0 0 0 a b c d e f g h i j k l m n o p

0101

0 0 0 0 0 0 0 0 a b c d e f g h i j k l m n o p

despl (3)=0
despl (0)=1

0101

p 0 0 0 0 0 0 0 0 a b c d e f g h i j k l m n o

0101

p 0 0 0 0 0 0 0 0 a b c d e f g h i j k l m n o

despl (1)=0

0 0 0 0 0 a b c d e f g h i j k
SALIDA
despl (3..0)=1101=-3
despl (3)=-8

0101

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);

Guillermo Jaquenod, 2001

Operacin de un Barrel Shifter Signed

despl (2)=4

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 ;

sel(3)

Guillermo Jaquenod, 2001

despl (3..0)=0101=+5

Barrel Rotator hacia la derecha

ENTRADA

0 0 0 0 0 0 0 0 a b c d e f g h i j k l m n o p

0101

a b c d e f g h i j k l m n o p 0 0 0 0 0 0 0 0

0101

0 a b c d e f g h i j k l m n o p 0 0 0 0 0 0 0

despl (0)=1

S15: 0 si d>0 sino s(15+d)


S14: 0 si d>1 sino s(14+d)
S13: 0 si d>2 sino s(13+d)
S12: 0 si d>3 sino s(12+d)
S11: 0 si d>4 sino s(11+d)
S10: 0 si d>5 sino s(10+d)
S9: 0 si d>6 sino s(9+d)
S8: s(8+d)
S7: 0 si d= -8 sino s(7+d)
S6: 0 si d<= -7 sino s(6+d)
S5: 0 si d<= -6 sino s(5+d)
S4: 0 si d<= -5 sino s(4+d)
S3: 0 si d<= -4 sino s(3+d)
S2: 0 si d<= -3 sino s(2+d)
S1: 0 si d<= -2 sino s(1+d)
S0: 0 si d<= -1 sino s(0+d)

Operacin de un Barrel Shifter Signed


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;

despl (1)=0

0101

0 a b c d e f g h i j k l m n o p 0 0 0 0 0 0 0

0101

despl (2)=4

0 0 0 0 0 a b c d e f g h i j k l m n o p 0 0 0
SALIDA

Excepto el MSB, los


shifts no dependen del
signo del selector de
desplazamiento!

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Barrel Shifter usando LPM_CLSHIFT

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

LIBRARY ieee; USE ieee.std_logic_1164.ALL;


LIBRARY lpm; USE lpm.lpm_components.ALL;
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 ;
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;

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Recreando instrucciones de SHIFT: SLL

Fuente: ALTERA MAX+plus II HELP

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?
Guillermo Jaquenod, 2001

65

VHDL: Lenguaje de descripcin de hardware


Uso de recursos de mi_SLL

Recreando instrucciones de SHIFT: SRL

Cuntos recursos requiere la implementacin de una operacin de shift una


cantidad CONSTANTE de veces?

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_SLL (dato: IN std_logic_vector; cuenta: IN INTEGER)


RETURN std_logic_vector IS
Cuantos LEs
VARIABLE 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;

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

NINGUNA!

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Recreando instrucciones de SHIFT: SLA

Recreando instrucciones de SHIFT: SRA

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

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_SLA (dato: IN std_logic_vector; cuenta: IN INTEGER)


RETURN std_logic_vector IS
VARIABLE tempo: std_logic_vector (dato'RANGE);
SLA con shift negativo
VARIABLE izq,der: INTEGER;
llama a SRA
BEGIN
tempo := dato; izq := dato'LEFT; der := dato'RIGHT;
IF cuenta = 0
THEN RETURN tempo;
ELSIF cuenta < 0
THEN RETURN mi_SRA (dato,-cuenta);
ELSIF dato'LENGTH = 1 THEN RETURN tempo;
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);
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);
END LOOP;
END IF;
SLA
RETURN tempo;
END FUNCTION mi_SLA;

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


RETURN std_logic_vector IS
VARIABLE tempo: std_logic_vector (dato'RANGE);
SRA con shift
VARIABLE izq,der: INTEGER;
negativo llama a SLA
BEGIN
tempo := dato; izq := dato'LEFT; der := dato'RIGHT;
IF cuenta = 0
THEN RETURN tempo;
ELSIF cuenta < 0
THEN RETURN mi_SLA (dato,-cuenta);
ELSIF dato'LENGTH = 1 THEN RETURN tempo;
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);
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);
END LOOP;
END IF;
SRA
RETURN tempo;
END FUNCTION mi_SRA;

Guillermo Jaquenod, 2001

Recreando instrucciones de SHIFT: ROL

Guillermo Jaquenod, 2001

Recreando instrucciones de SHIFT: ROR

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

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_ROL (dato: IN std_logic_vector; cuenta: IN INTEGER)


RETURN std_logic_vector IS
VARIABLE temp: std_logic_vector (dato'RANGE); VARIABLE rond: std_logic;
VARIABLE iz,de: INTEGER;
ROL con shift negativo
BEGIN
llama a ROR
temp:=dato; iz:=dato'LEFT; de:=dato'RIGHT;
IF cuenta=0 THEN RETURN temp;
ELSIF cuenta < 0
THEN RETURN mi_ROR (dato,-cuenta);
ELSIF dato'LENGTH = 1 THEN RETURN temp;
ELSIF iz > de THEN -- rango de dato es xx DOWNTO yy, con xx > yy
FOR i IN 1 TO cuenta LOOP
rond:=temp(iz); temp(iz DOWNTO de+1):=temp(iz-1 DOWNTO de); temp(de):=rond;
END LOOP;
ELSE
-- rango de dato es xx TO yy, con xx < yy
FOR i IN 1 TO cuenta LOOP
rond:=temp(iz); temp(iz TO de-1):=temp(iz+1 TO de); temp(de):=rond;
END LOOP;
END IF;
ROL
RETURN temp;
END FUNCTION mi_ROL;

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


RETURN std_logic_vector IS
VARIABLE temp: std_logic_vector (dato'RANGE); VARIABLE rond: std_logic;
VARIABLE iz,de: INTEGER;
ROR con shift negativo
BEGIN
llama a ROL
temp:=dato; iz:=dato'LEFT; de:=dato'RIGHT;
IF cuenta=0 THEN RETURN temp;
ELSIF cuenta < 0
THEN RETURN mi_ROL (dato,-cuenta);
ELSIF dato'LENGTH = 1 THEN RETURN temp;
ELSIF iz > de THEN -- rango de dato es xx DOWNTO yy, con xx > yy
FOR i IN 1 TO cuenta LOOP
rond:=temp(de); temp(iz-1 DOWNTO de):=temp(iz DOWNTO de+1); temp(iz):=rond;
END LOOP;
ELSE
-- rango de dato es xx TO yy, con xx < yy
FOR i IN 1 TO cuenta LOOP
rond:=temp(de); temp(iz+1 TO de):=temp(iz TO de-1); temp(iz):=rond;
END LOOP;
END IF;
ROR
RETURN temp;
END FUNCTION mi_ROR;

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

66

VHDL: Lenguaje de descripcin de hardware


Interfase a Shaft Encoder Incremental
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;

Bases de VHDL
Ejemplos con MAX+plus II VHDL

Intentar optimizar el diseo

A
B
Giro Horario
A
B
Giro Antihorario

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

Uso de elementos de memoria

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Interfase a Shaft Encoder usando LPMs

Shaft Encoder: aumento 4x de la resolucin

A
B

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

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


pos:OUT INTEGER RANGE 0 TO 359);
END shaft1;
ARCHITECTURE a OF shaft1 IS BEGIN
PROCESS (reloj)
VARIABLE cont :INTEGER RANGE -1 TO 360;
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=360 THEN cont:=0; END IF;
IF cont=-1 THEN cont:=359; END IF;
END IF;
pos <= cont;
END PROCESS;
END a;

Giro Horario
A

ENTITY shaftlpm IS PORT (


a,b,z:IN std_logic;
pos:OUT std_logic_vector(8 DOWNTO 0));
END shaftlpm;
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;

B
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!

Guillermo Jaquenod, 2001

A0
B0

Giro Horario
A0

B1

Giro Antihorario
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...

Guillermo Jaquenod, 2001

Contadores Cdigo GRAY

Contador Cdigo GRAY genrico

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.
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

ARCHITECTURE a OF graycont IS
SIGNAL d: BIT_VECTOR (NBITS-1 downto 0); SIGNAL qt: BIT_VECTOR (NBITS downto 0);
BEGIN
BEGIN
IF clr_n='0' THEN qt <=

T Q Gi
clk

(others =>'0');

ELSIF reloj'EVENT AND reloj='1' THEN

Di

Evaluar los posibles usos de los modos de operacion

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


END ENTITY graycont;

sync: PROCESS (reloj,clr_n)

Excepto la primer etapa (generacin de D-1) y la ltima etapa, las dems etapas tienen
una arquitectura como sigue
Ei

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

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

Ci

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));

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

END IF;
END PROCESS sync;

TQ
clk

TQ
clk

TQ
clk

TQ
clk

D0

D1

D2

d(0) <= '1';

DN-1

TQ
clk

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;

Q0

Q1

Q2

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

QN-1

QN
Guillermo Jaquenod, 2001

67

VHDL: Lenguaje de descripcin de hardware


Contadores Cdigo GRAY
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

Resultados
de la
simulacin
funcional
usando
MAX+plus II

0100=4

1000=8

Contadores Johnson

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
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
Estos beneficios ya no son tales
al usar lgica programable,
donde tienen igual performance
que un contador LFSR

Guillermo Jaquenod, 2001

CL

CL

CL

Q
CL

Q
CL

ENTITY johnson IS GENERIC (n:INTEGER:= 8);


PORT (reloj,init: IN BIT;
q: BUFFER BIT_VECTOR (n DOWNTO 1));
END ENTITY johnson;
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;

Guillermo Jaquenod, 2001

Contador Linear Feedback Shift Register


Un Linear Feedback Shift Register
(LFSR) es un caso de mquina sincrnica
de enorme simplicidad circuital

LFSR genrico, de 3 a 16 etapas


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

Realimentacion desde
2 etapas

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


END ENTITY lfsrn;
ARCHITECTURE a OF lfsrn IS
SUBTYPE mascara IS BIT_VECTOR (16 DOWNTO 1); TYPE tabla IS ARRAY (3 TO 16) OF mascara;
CONSTANT tablaxor : tabla := (X"0006",X"000C",X"0014",X"0030",X"0060",X"00B8",X"0110",

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).

X"0240",X"0500",X"0829",X"100D",X"2015",X"6000",X"D008");
SIGNAL

fftaps : BIT_VECTOR (LFSRTAPS DOWNTO 1); SIGNAL

xorout : BIT;

BEGIN
p0: PROCESS (reloj,n_init) BEGIN
IF n_init = '0' THEN fftaps <= (others=>'0');
ELSIF reloj'EVENT AND reloj = '1' THEN
FOR i IN 2 TO LFSRTAPS LOOP fftaps(i) <= fftaps (i-1); END LOOP;

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)

fftaps (1) <= xorout;


END IF;
END PROCESS p0;
p1: PROCESS (fftaps)
DQ

DQ

LUT

DQ

LUT

LUT

LUT

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


DQ

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;

Pero los recursos de cableado que usa


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

xorout <= NOT (temp);

Al ser funcin de 2 o 4
Al ser funcin de 2 o 4
realimentaciones, bastan N elementos
realimentaciones, bastan N elementos
lgicos para un LFSR de N bits
lgicos para un LFSR de N bits

Guillermo Jaquenod, 2001

END PROCESS p1;


taps <= fftaps;
END ARCHITECTURE a;

Guillermo Jaquenod, 2001

Generador/testeador de CRC

Generador/testeador de CRC

CRC-16: 1+X2+X15+X16
x1

x2

x3

x4

x5

x6

x7

x8

x9

x10

x11

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


x12

x13

x14

x15

CRC-12: 1 + X + X2 + X3 + X11 + X12

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
Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

CRC-CCITT: 1 + X5 + X12 + X16


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

reloj
init

Fuente: 74F401 en www.fairchildsemi.com

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).
din

dout

reloj
init
Tx/Rx

xpass

x0

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

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
Guillermo Jaquenod, 2001

68

VHDL: Lenguaje de descripcin de hardware


Generador/testeador de CRC-16

Generador/testeador de CRC-16

Uso 22 LEs:

LIBRARY ieee; USE ieee.std_logic_1164.ALL;

16 para shift
ENTITY crcshft IS PORT (dout,zero: OUT std_logic;
din,init,xpass,reloj: IN std_logic);
END crcshft;

1 para MUX dout


4 para zero

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;

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)

Guillermo Jaquenod, 2001

Porqu usa 3
LIBRARY ieee; USE ieee.std_logic_1164.ALL;
Uso 38 LEs:
Uso 38 LEs:
LEs para ena?
LIBRARY ieee; USE ieee.std_logic_unsigned.ALL;
22 para crcshift
22 para crcshift
LIBRARY lpm; USE lpm.lpm_components.ALL;
9 para el contador
9 para el contador
ENTITY crc16 IS PORT (
3 para ena
3 para ena
init,reloj,txrx,din: IN std_logic;
3 para xpass
3 para xpass
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;
Guillermo Jaquenod, 2001

Cmputo paralelo de CRC-16


Q16 Q15

Q14 Q13 Q12 Q11 Q10 Q9 Q8 Q7 Q6 Q5 Q4 Q3 Q2

Cmputo paralelo de CRC-16


Siguiendo el anlisis hasta T=8, y llamando Xi a Di XOR Qi, se puede llegar a:

Q1

R16

di
reloj
init

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
R16
T=0

R15

R14

R13

R12

R11

R10

R9

R8

R7

R6

R5

R4

R3

R2

R1

Q16

Q15

Q14

Q13

Q12

Q11

Q10

Q9

Q8

Q7

Q6

Q5

Q4

Q3

Q2

Q1

Q14

Q13

Q12

Q11

Q10

Q9

Q8

Q7

Q6

Q5

Q4

Q3

Q2
Q1
D1

Q15
Q1
Di

Q14

Q13

Q12

Q11

Q10

Q9

Q8

Q7

Q6

Q5

Q4

Q3
Q2
Q1
D1
D2

T=1

Q1
D1

Q16

Q15
Q1
D1

T=2

Q2
Q1
D1
D2

Q1
Di

Q16
Q2
Q1
D1
D2

Perez, A. 1983. "Byte-wise CRC Calculations." IEEE Micro. June. 40-50

Guillermo Jaquenod, 2001

Cmputo paralelo de CRC-16

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]
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
Guillermo Jaquenod, 2001

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]

Perez, A. 1983. "Byte-wise CRC Calculations." IEEE Micro. June. 40-50

Guillermo Jaquenod, 2001

X7
X6
X5
X4
X3
X2
X1

R14

X8
X7

R13

X7
X6

R12

X6
X5

R11

X5
X4

R10

X4
X3

R9

X3
X2

R8

Q16
X2
X1

R7

Q15
X1

R6

Q14

R5

Q13

R4

Q12

R3

Q11

R2

R1

Q10

Q9
X8
X7
X6
X5
X4
X3
X2
X1

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

T=8

R15

X87
X65
X43
X21

X76
X54
X32
X1

R14

X87

Guillermo Jaquenod, 2001

R13

X76

R12

X65

R11

X54

R10

X43

R9

R8

R7

X32

Q16
X21

Q15
X1

R6

Q14

R5

Q13

R4

Q12

R3

Q11

R2

R1

Q10

Q9
Xf

Perez, A. 1983. "Byte-wise CRC Calculations." IEEE Micro. June. 40-50

Cmputo paralelo de CRC-16

En base a las expresiones resultantes puede evaluarse la red de conexiones:

T8

T=8

R15

X8
X7
X6
X5
X4
X3
X2
X1

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;
Guillermo Jaquenod, 2001

69

VHDL: Lenguaje de descripcin de hardware


Shift Register Parallel Input, Serial Output

Cmputo paralelo de CRC-32


Con idntico anlisis, luego de 16 shifts el CRC-32 queda como sigue,
y puede calcularse en slo dos ciclos de reloj:
R32

R31

R30

R29

R28

R27

R26

R25

R24

R23

R22

R21

R20

R19

R18

R17

T16

X6
X7
X10
X16

X5
X6
X9
X15
X16

X4
X5
X8
X14
X15
X16

X3
X4
X7
X13
X14
X15

X2
X3
X6
X12
X13
X14
X16

X1
X2
X5
X11
X12
X13
X15
X16

X1
X4
X10
X11
X12
X14
X15

X3
X9
X10
X11
X13
X14
X16

X2
X8
X9
X10
X12
X13
X15
X16

X1
X7
X8
X9
X11
X12
X14
X15

X6
X7
X8
X10
X11
X13
X14
X16

X5
X6
X7
X9
X10
X12
X13
X15
X16

X4
X5
X6
X8
X9
X11
X12
X14
X15
X16

X3
X4
X5
X7
X10
X11
X13
X14
X15

X2
X3
X4
X6
X7
X9
X10
X12
X13
X14

X1
X2
X3
X5
X6
X8
X9
X11
X12
X13

R16

R15

R14

R13

R12

R11

R10

R9

R8

R7

R6

R5

R4

R3

R2

R1

T16

Q32
X1
X2
X4
X5
X7
X8
X10
X11
X12
X16

Q31
X1
X3
X4
X6
X7
X9
X10
X11
X15

Q30
X2
X3
X5
X6
X8
X9
X10
X14

Q29
X1
X2
X4
X5
X7
X8
X9
X13

Q28
X1
X3
X4
X6
X7
X8
X12

Q27
X2
X3
X5
X6
X7
X11

Q26
X1
X2
X4
X5
X6
X10
X16

Q25
X1
X3
X4
X5
X9
X15
X16

Q24
X2
X3
X4
X8
X14
X15

Q23
X1
X2
X3
X7
X13
X14

Q22
X1
X2
X6
X12
X13
X16

Q21
X1
X5
X11
X12
X15

Q20
X4
X10
X11
X14

Q19
X3
X9
X10
X13

Q18
X2
X8
X9
X12

Q17
X1
X7
X8
X11

Cypress Application Handbook,1994, p5-105. Parallel CRC for HOTLink"

Shift & Store (tipo CMOS 4094)

data

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;

Guillermo Jaquenod, 2001

e1

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;

e8

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

e4

IF;
IF;
IF;
IF;
IF;
IF;
IF;

e5
el flanco se
engancha ac

Este diseo, compilado


Este diseo, compilado
con MAX+Plus II,
con MAX+Plus II,
requiere 32 LEs
requiere 32 LEs

Guillermo Jaquenod, 2001

Recuperador de reloj pensando en la sntesis


ENTITY recupclka IS PORT (rxd,rxck_8x,nreset: IN bit; rxck: OUT bit);
END ENTITY recupclka;

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

ENTITY recupclk IS PORT (rxd,rxck_8x: IN bit; rxck: OUT bit);


END ENTITY recupclk;

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;

Guillermo Jaquenod, 2001

sal

Recuperador de reloj behavioral

LIBRARY ieee; USE ieee.std_logic_1164.ALL;

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;

ENTITY sr_PISO IS GENERIC (largo: INTEGER := 8);


PORT (reloj,d,sl:IN STD_LOGIC;
data:IN STD_LOGIC_VECTOR (largo-1 DOWNTO 0);
data
sal: OUT STD_LOGIC);
END sr_PISO ;
sl
d
ARCHITECTURE a OF sr_PISO IS BEGIN
reloj
PROCESS (reloj)
VARIABLE regs:STD_LOGIC_VECTOR (largo-1 DOWNTO 0);
BEGIN
IF reloj=1 THEN
IF sl = '1' THEN -- modo shift
regs(largo-1 DOWNTO 1) := (largo-2 DOWNTO 0);
regs (0) := d;
ELSE regs := data; -- carga paralela
END IF;
END IF;
sal <= regs (largo-1);
END PROCESS;
END a;

En CRC-32 el nmero inicial del registro CRC es C704DD7B


Guillermo Jaquenod, 2001

LIBRARY ieee; USE ieee.std_logic_1164.ALL;

LIBRARY ieee; USE ieee.std_logic_1164.ALL;


ENTITY ras IS PORT (reloj,sc_n,comp:IN STD_LOGIC;
to_da:OUT STD_LOGIC_VECTOR (7 DOWNTO 0); eoc: BUFFER STD_LOGIC);
END ENTITY ras;

e1
e8

e2

e3

e7

e6

e4
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!!

Registro de aproximaciones sucesivas

+
ARCHITECTURE a OF ras IS
BEGIN
PROCESS (reloj,sc_n)
VARIABLE cnt : INTEGER RANGE 0 TO 7;
D/A
VARIABLE rasreg: STD_LOGIC_VECTOR (7 DOWNTO 0);
BEGIN
IF sc_n='0' THEN rasreg (7):='1'; cnt:= 7; eoc <= '0';
FOR i IN 6 DOWNTO 0 LOOP rasreg(i) := '0'; END LOOP;
ELSIF rising_edge (reloj) THEN
IF eoc='0' THEN rasreg (cnt):=comp;
IF cnt = 0 THEN eoc <= '1';
ELSE cnt:=cnt-1; rasreg(cnt):='1';
END IF;
END IF;
END IF;
to_da <= rasreg;
END PROCESS;
END a;

Buscar una
solucin ms
eficiente!

RAS

Guillermo Jaquenod, 2001

70

VHDL: Lenguaje de descripcin de hardware

TxCk

lado del
usuario

THRF=1?

Cnt=0?
Cnt /=0?

TxD

S/L=1
Ack=0
Cnt=run
TxC=0

S/L=1
Ack=1
Cnt=run
TxC=0

THRF=0?

lado del
canal

THRF=1?

La etapa transmisora de una UART puede verse como compuesta por dos mquinas
sincronicas, cada una de 4 estados:
Una mquina activada por Clk, responsable de la interfase al bus del usuario
Otra mquina activada por TxCk responsable del proceso de transmisin
Ambas mquinas se sincronizan mediante Handshake usando THRF (TxReg Full) y Ack.
Ambas mquinas poseen adems registros operativos (Holding, Shift y Contador de bits) y
pueden complicarse mediante el agregado de generador de paridad, control de flujo, etc..
Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

ARCHITECTURE txa OF uart_txA IS


TYPE sttxa IS (s0,s1,s2,s3); SIGNAL estado: sttxa;
BEGIN
a: PROCESS (clk,reset) BEGIN
IF reset='0' THEN estado<=s0; thr<=(others=>'0');thrf <='0';
ELSIF (clk'EVENT AND clk = '1') THEN
CASE estado IS
WHEN s0=>
THRF=0
thrf <='0'; IF ack='0' THEN estado <= s1; END IF;
Ena=0
WHEN s1=>
thrf <= '0'; IF we='1' THEN estado<=s2; thr<=din; END IF;
Ack=1?
WHEN s2=>
Ack=0?
thrf <='1';
IF we='0' THEN estado <= s3; ELSE thr <= din; END IF;
WHEN s3=>
THRF=1
thrf <='1'; IF ack='1' THEN estado <= s0; END IF;
Ena=0
We=0?
END CASE;
END IF;
THRF=1
END PROCESS a;
Ena=1
END ARCHITECTURE txa;

Ack=1?
THRF=0
Ena=0
Ack=0?
We=0?

We=1?

We=1?

Ejemplos: etapa TX completa de una UART

TxC
THRF

Ctl

Ack

S/L

TxCk

TxReg (PISO)

ARCHITECTURE txB OF uart_txB IS


TYPE sttxb IS (s0,s1,s2,s3); SIGNAL estado: sttxb;
SIGNAL shf:bit_vector(8 downto 0);
SIGNAL cnt:INTEGER RANGE 0 to 11;
BEGIN
a: PROCESS (txck,reset) BEGIN
IF reset='0' THEN estado<=s0; cnt <= 0; ack <= '0'; shf <= (others =>'1');
ELSIF txck'EVENT AND txck='1' THEN
CASE estado IS
WHEN s0=> shf(7 downto 0)<=shf(8 downto 1); shf(8) <= '1';
cnt <= 0; ack <= '0'; IF thrf='1' THEN estado <= s1; END IF;
WHEN s1=>
shf(8 downto 1)<=thro(7 downto 0); shf(0)<='0'; ack<='1'; cnt <= 0;
estado<=s2;
WHEN s2=>
shf(7 downto 0)<=shf(8 downto 1);shf(8)<='1';
IF txc='0' THEN cnt <= cnt+1; END IF;
IF thrf='0' THEN ack<='0'; estado<= s3; END IF;
WHEN s3=>
Cnt /=11?
shf(7 downto 0)<=shf(8 downto 1);shf(8)<='1'; ack<='0';
IF txc='0' THEN cnt <= cnt+1; ELSE estado <= s0; END IF;
END CASE;
END IF;
S/L=1
END PROCESS a;
Ack=0
txd <= shf (0); txc <= '1' WHEN cnt=11 ELSE '0';
Cnt++
END ARCHITECTURE txB;
TxC=0

Ctl Ack
Ena

Clk

Guillermo Jaquenod, 2001

Ejemplos: una UART, etapa TX, lado canal


ENTITY uart_txB IS PORT (txc: BUFFER bit; ack,txd: OUT bit;
reset,txck,thrf:IN bit; thro:IN bit_vector (7 downto 0));
END ENTITY uart_txB;

THRF
We

TxHoldRegister

ENTITY uart_txA IS PORT (


reset,clk,we,ack:IN bit; din:IN bit_vector (7 downto 0);
thrf: OUT bit; thr: OUT bit_vector (7 downto 0));
END ENTITY uart_txA;

TxD

S/L=1
Ack=0
Cnt=0
TxC=1
Cnt=11?

THRF=0?

THRF=1?

S/L=1
Ack=1
Cnt++
TxC=0

THRF=0?

THRF=1?

Simulacin de la etapa TX de la UART


Se muestra la simulacin funcional usando MAX+plus II.
Y vale notar un punto importante: mientras la compilacin con MAX+plus II
consume 54 LEs, el mismo archivo compilado con Synplify slo usa 31 LEs!

S/L=0
Ack=0
Cnt=0
TxC=0

ENTITY uart_tx IS PORT( reset,clk,we,txck:IN bit;


din:IN bit_vector (7 downto 0);
txd: OUT bit; txc,thrf: BUFFER bit);
END uart_tx;

TxC
THRF
We
Clk

Ctl Ack Ctl

ARCHITECTURE a OF uart_tx IS
COMPONENT uart_txA PORT (reset,clk,we,ack:IN bit;
din:IN bit_vector (7 downto 0);
thrf: OUT bit; thr: OUT bit_vector (7 downto 0));
END COMPONENT uart_txA;
COMPONENT uart_txB PORT (reset,txck,thrf:IN bit;
txc: BUFFER bit; ack,txd: OUT bit;
thro:IN bit_vector (7 downto 0));
END COMPONENT uart_txB;
SIGNAL ack:BIT; SIGNAL thro:BIT_VECTOR (7 DOWNTO 0);
BEGIN
ladousu: uart_txA
PORT MAP(reset,clk,we,ack,din,thrf,thro);
ladotx: uart_txB
PORT MAP(txc,ack,txd,reset,txck,thrf,thro);
END ARCHITECTURE a;

S/L

Ena

TxCk

TxReg (PISO)

We=1?

S/L

S/L=0
Ack=0
Cnt=11
TxC=0

TxHoldRegister

We=0?
THRF=1
Ena=1

Ena

THRF=0?

D_In (7 downto 0)

We=1?

S/L=1
Ack=0
Cnt=11
TxC=1

Ctl Ack Ctl

TxReg (PISO)

Clk
We=0?

D_In (7 downto 0)

Ack=1?

Ack=0?

Ack=0?

THRF=1
Ena=0

TxC
THRF
We

THRF=0
Ena=0

TxHoldRegister

Ack=1?
THRF=0
Ena=0

Ejemplos: una UART, etapa TX, lado usuario

D_In (7 downto 0)

Ejemplos: una UART, etapa TX

TxD

Armo el
Armo el
conjuntoII!
conjuntoII!

Guillermo Jaquenod, 2001

Mejora de UART_TX, lado usuario


ENTITY uart_txA IS PORT (
reset,clk,we,ack:IN bit; din:IN bit_vector (7 downto 0);
thrf: OUT bit; thr: OUT bit_vector (7 downto 0));
END ENTITY uart_txA;
ARCHITECTURE txa OF uart_txA IS
SIGNAL estado: bit_vector (1 downto 0);
BEGIN
a: PROCESS (clk,reset) BEGIN
IF reset='0' THEN estado<=B"00"; thr<=(others=>'0');
ELSIF (clk'EVENT AND clk = '1') THEN
CASE estado IS
WHEN B"00" => IF ack='0' THEN estado <= B"01"; END IF;
WHEN B"01" =>
IF we='1' THEN estado <=B"10"; thr<=din; END IF;
WHEN B"10" =>
IF we='0 THEN estado <= B"11"; ELSE thr<=din; END IF;
WHEN B"11" => IF ack='1' THEN estado <= B"00"; END IF;
END CASE;
END IF;
END PROCESS a;
thrf <= estado(1);
END ARCHITECTURE txa;

Dos estados tienen THRF en


1 y dos en 0. Puedo usar
THRF como bit de estado!!

Ack=1?
THRF=0
Ena=0
Ack=1?

THRF=0
Ena=0
Ack=0?
We=0?

Ack=0?

We=1?
THRF=1
Ena=0

We=0?
THRF=1
Ena=1
We=1?

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

71

VHDL: Lenguaje de descripcin de hardware


Mejora de UART_TXB: bajo de 20 a 17 LEs
ENTITY uart_txB IS PORT (txc: BUFFER bit; ack,txd: OUT bit;
reset,txck,thrf:IN bit; thro:IN bit_vector (7 downto 0));
END ENTITY uart_txB;

Ejemplos: multiplicador iterativo por shift/suma


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

Dos estados tienen Ack en 1

y dos en 0. Puedo usar Ack


ARCHITECTURE txB OF uart_txB IS
TYPE sttxb IS (s0,s1,s2,s3); SIGNAL estado: sttxb;
como bit de estado!!
SIGNAL shf:bit_vector(8 downto 0);
SIGNAL cnt:INTEGER RANGE 0 to 11;
BEGIN
a: PROCESS (txck,reset) BEGIN
IF reset='0' THEN estado<=s0; cnt <= 0; ack <= '0'; shf <= (others =>'1');
ELSIF txck'EVENT AND txck='1' THEN
CASE estado IS
WHEN s0=> shf(7 downto 0)<=shf(8 downto 1); shf(8) <= '1';
cnt <= 0; ack <= '0'; IF thrf='1' THEN estado <= s1; END IF;
WHEN s1=>
shf(8 downto 1)<=thro(7 downto 0); shf(0)<='0'; ack<='1'; cnt <= 0;
S/L=1
THRF=0?
estado<=s2;
Ack=0
Cnt=0
WHEN s2=>
TxC=1
shf(7 downto 0)<=shf(8 downto 1);shf(8)<='1';
IF txc='0' THEN cnt <= cnt+1; END IF;
THRF=1?
IF thrf='0' THEN ack<='0'; estado<= s3; END IF;
Cnt=11?
WHEN s3=>
shf(7 downto 0)<=shf(8 downto 1);shf(8)<='1'; ack<='0';
IF txc='0' THEN cnt <= cnt+1; ELSE estado <= s0; END IF;
END CASE;
END IF;
END PROCESS a;
txd <= shf (0); txc <= '1' WHEN cnt=11 ELSE '0';
END ARCHITECTURE txB;

S/L=0
Ack=0
Cnt=0
TxC=0

S/L=1
Ack=1
Cnt++
TxC=0

THRF=0?

Guillermo Jaquenod, 2001

Ejemplos: sumador Carry-select


AH

BH

AH

N/2 Adder

Ci

Co
ARCHITECTURE a OF cysel64 IS
ARCHITECTURE a OF cysel64 IS
SIGNAL slo,shi0,shi1:
SIGNAL slo,shi0,shi1:
std_logic_vector(33 DOWNTO 1);
std_logic_vector(33 DOWNTO 1);
BEGIN
BEGIN
slo <= '0'& a(32 DOWNTO 1)
slo <= '0'& a(32 DOWNTO 1)
+ b(32 DOWNTO 1) + cin;
+ b(32 DOWNTO 1) + cin;
shi0 <= '0'& a(64 DOWNTO 33)
shi0 <= '0'& a(64 DOWNTO 33)
+ b(64 DOWNTO 33);
+ b(64 DOWNTO 33);
shi1 <= '0'& a(64 DOWNTO 33)
shi1 <= '0'& a(64 DOWNTO 33)
+ b(64 DOWNTO 33) + '1';
+ b(64 DOWNTO 33) + '1';
s(32 DOWNTO 1) <= slo(32 DOWNTO 1);
s(32 DOWNTO 1) <= slo(32 DOWNTO 1);
s(64 DOWNTO 33) <=
s(64 DOWNTO 33) <=
shi0 (32 DOWNTO 1) WHEN slo(33)='0'
shi0 (32 DOWNTO 1) WHEN 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 shi1 (33);
ELSE shi1 (33);
END a;
END a;

AL

Co
1

Ci
Co

SH

SL

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

m
s
s/r

reloj
init

A
B
x
Ci

A
B
C

D Q
Ck
CL

S
c0

reloj

D Q
Ck
CL

init

CSA

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.
Fuente: R.Andraka.

Guillermo Jaquenod, 2001

Ejemplos: Sumador/restador Serial

ARCHITECTURE a OF seraddsub IS
ARCHITECTURE a OF seraddsub IS
SIGNAL c: BIT; -- carry/borrow
SIGNAL c: BIT; -- carry/borrow
BEGIN
BEGIN
PROCESS (reloj,init) BEGIN
PROCESS (reloj,init) BEGIN
IF (init=1) THEN s<=0; c<=0;
IF (init=1) THEN s<=0; c<=0;
ELSIF relojEVENT AND reloj=1 THEN
ELSIF relojEVENT AND reloj=1 THEN
s <= a XOR b XOR c;
s <= a XOR b XOR c;
IF sr=1
IF sr=1
THEN -- sr=1 indica suma
THEN -- sr=1 indica suma
c <= (m AND s)
c <= (m AND s)
OR (m AND c)
OR (m AND c)
OR (s AND c);
OR (s AND c);
ELSE -- sr=0 indica resta
ELSE -- sr=0 indica resta
c <= (NOT(m) AND s)
c <= (NOT(m) AND s)
OR (NOT(m) AND c)
OR (NOT(m) AND c)
OR (s AND c);
OR (s AND c);
END IF;
END IF;
END IF;
END IF;
END PROCESS;
END PROCESS;
END a;
END a;

a
b

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

ENTITY seraddsub IS PORT (


ENTITY seraddsub IS PORT (
m,s,sr,reloj,init:IN BIT; s:OUT BIT);
m,s,sr,reloj,init:IN BIT; s:OUT BIT);
END seraddsub;
END seraddsub;

Hacerlo
genrico!

ARCHITECTURE a OF seradd IS
ARCHITECTURE a OF seradd IS
SIGNAL c: BIT;
SIGNAL c: BIT;
BEGIN
BEGIN
PROCESS (reloj,init) BEGIN
PROCESS (reloj,init) BEGIN
IF (init=1) THEN s<=0; c<=0;
IF (init=1) THEN s<=0; c<=0;
ELSIF relojEVENT AND reloj=1 THEN
ELSIF relojEVENT AND reloj=1 THEN
s <= a XOR b XOR c;
s <= a XOR b XOR c;
c <= (a AND b) OR (a AND c) OR (b AND c);
c <= (a AND b) OR (a AND c) OR (b AND c);
END IF;
END IF;
END PROCESS;
END PROCESS;
END a;
END a;

N/2 Adder

Cout

ACUMULADOR

ENTITY seradd IS PORT (


ENTITY seradd IS PORT (
a,b,reloj,init:IN BIT; s:OUT BIT);
a,b,reloj,init:IN BIT; s:OUT BIT);
END seradd ;
END seradd ;

BL

0
N/2 Adder

CONTROL

Ejemplos: Sumador serial Carry Save Adder

BH

SUMADOR

Guillermo Jaquenod, 2001

THRF=1?

LIBRARY ieee;USE ieee.std_logic_1164.ALL;


LIBRARY ieee;USE ieee.std_logic_1164.ALL;
LIBRARY ieee;USE ieee.std_logic_unsigned.ALL;
LIBRARY ieee;USE ieee.std_logic_unsigned.ALL;
ENTITY cysel64 IS
ENTITY cysel64 IS
PORT (a,b:IN std_logic_vector(64 DOWNTO 1);
PORT (a,b:IN std_logic_vector(64 DOWNTO 1);
s: OUT std_logic_vector(64 DOWNTO 1);
s: OUT std_logic_vector(64 DOWNTO 1);
cin:IN std_logic; cout:OUT std_logic);
cin:IN std_logic; cout:OUT std_logic);
END cysel64;
END cysel64;

MULTIPLICADOR

ARCHITECTURE a OF iteramult IS
ARCHITECTURE a OF iteramult IS
BEGIN
BEGIN
PROCESS (reloj) IS
PROCESS (reloj) IS
VARIABLE cnt : INTEGER RANGE 0 TO 8;
VARIABLE cnt : INTEGER RANGE 0 TO 8;
VARIABLE moshf:std_logic_vector(16 DOWNTO 1);
VARIABLE moshf:std_logic_vector(16 DOWNTO 1);
VARIABLE mrshf:std_logic_vector(8 DOWNTO 1);
VARIABLE mrshf:std_logic_vector(8 DOWNTO 1);
BEGIN
BEGIN
IF reloj='1' THEN
IF reloj='1' THEN
IF init = '1' THEN moshf:= X"00" & mo; cnt:=0;
IF init = '1' THEN moshf:= X"00" & mo; cnt:=0;
mrshf := mr; res <= X"0000";rdy <= '0';
mrshf := mr; res <= X"0000";rdy <= '0';
ELSIF cnt < 8 THEN
ELSIF cnt < 8 THEN
IF mrshf(1) = '1' THEN res <= moshf+res; END IF;
IF mrshf(1) = '1' THEN res <= moshf+res; END IF;
moshf := moshf (15 DOWNTO 1) & '0';
moshf := moshf (15 DOWNTO 1) & '0';
mrshf := '0' & mrshf(8 DOWNTO 2);
mrshf := '0' & mrshf(8 DOWNTO 2);
if cnt/=7 THEN rdy<='0'; ELSE rdy<='1'; END IF;
if cnt/=7 THEN rdy<='0'; ELSE rdy<='1'; END IF;
cnt := cnt+1;
cnt := cnt+1;
END IF;
END IF;
END IF;
END IF;
END PROCESS;
END PROCESS;
END ARCHITECTURE a;
END ARCHITECTURE a;

Cnt /=11?

S/L=1
Ack=0
Cnt++
TxC=0

MULTIPLICANDO

ENTITY iteramult IS PORT (


ENTITY iteramult IS PORT (
mr,mo:IN std_logic_vector (8 DOWNTO 1);
mr,mo:IN std_logic_vector (8 DOWNTO 1);
init,reloj: IN std_logic; rdy:OUT std_logic;
init,reloj: IN std_logic; rdy:OUT std_logic;
res: BUFFER std_logic_vector (16 DOWNTO 1));
res: BUFFER std_logic_vector (16 DOWNTO 1));
END ENTITY iteramult ;
END ENTITY iteramult ;

Ejemplos: Complementador serial

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.

ENTITY com2dos IS PORT (


ENTITY com2dos IS PORT (
a,reloj,init:IN BIT; s:OUT BIT);
a,reloj,init:IN BIT; s:OUT BIT);
END com2dos;
END com2dos;
ARCHITECTURE a OF com2dos IS
ARCHITECTURE a OF com2dos IS
SIGNAL flg: BIT;
SIGNAL flg: BIT;
BEGIN
BEGIN
PROCESS (reloj,init) BEGIN
PROCESS (reloj,init) BEGIN
IF (init=1) THEN
IF (init=1) THEN
s<=0; flg <=0;
s<=0; flg <=0;
ELSIF relojEVENT AND reloj=1 THEN
ELSIF relojEVENT AND reloj=1 THEN
s
<= a XOR flg;
s
<= a XOR flg;
flg <= a OR flg;
flg <= a OR flg;
END IF;
END IF;
END PROCESS;
END PROCESS;
END a;
END a;

a
D Q
Ck
CL
reloj
init

D Q
Ck
CL

El complementador serial implementa el algoritmo tradicional para calcular el


complementar a dos de un nmero:
Desde el LSB hacia adelante, hasta encontrar el primer 1 (inclusive), la entrada es
copiada en forma textual en la salida
A partir de all los bits restantes se invierten
Guillermo Jaquenod, 2001

Fuente: R.Andraka.

72

VHDL: Lenguaje de descripcin de hardware


Ejemplos: Multiplicador serial sin signo
mr(N-1)

mr(N-2)

mr(1)

Ejemplos: Multiplicador serial sin signo

mr(0)

ENTITY umulser IS GENERIC (N:INTEGER:= 16);


ENTITY umulser IS GENERIC (N:INTEGER:= 16);
PORT (rel,init,m0:IN BIT; mr:IN BIT_VECTOR(N DOWNTO 1);
PORT (rel,init,m0:IN BIT; mr:IN BIT_VECTOR(N DOWNTO 1);
res:OUT BIT);
res:OUT BIT);
END umulser;
END umulser;

mo

a
b

DFF

a
b

CSA

a
b

CSA

res

ARCHITECTURE a OF umulser IS
ARCHITECTURE a OF umulser IS
COMPONENT seradd PORT (a,b,reloj,init:IN BIT; s:OUT BIT); END COMPONENT;
COMPONENT seradd PORT (a,b,reloj,init:IN BIT; s:OUT BIT); END COMPONENT;
SIGNAL prod,chain: BIT_VECTOR (N DOWNTO 1);
SIGNAL prod,chain: BIT_VECTOR (N DOWNTO 1);

CSA

rel
init

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
Fuente: R.Andraka.

Guillermo Jaquenod, 2001

BEGIN
BEGIN
genprod: FOR i IN N DOWNTO 1
genprod: FOR i IN N DOWNTO 1
GENERATE prod(i) <= mr(i) AND m0;
GENERATE prod(i) <= mr(i) AND m0;
END GENERATE;
END GENERATE;
gencsa: FOR i IN N-1 DOWNTO 1
gencsa: FOR i IN N-1 DOWNTO 1
GENERATE chaincsa: seradd PORT MAP(a=>prod(i),b=>chain(i+1),reloj=>rel,
GENERATE chaincsa: seradd PORT MAP(a=>prod(i),b=>chain(i+1),reloj=>rel,
init=>init, s=>chain(i));
init=>init, s=>chain(i));
END GENERATE;
END GENERATE;
PROCESS (rel,init) BEGIN
PROCESS (rel,init) BEGIN
IF (init=1) THEN chain(N)<=0;
IF (init=1) THEN chain(N)<=0;
ELSIF relEVENT AND rel=1 THEN chain(N) <= prod(N);
ELSIF relEVENT AND rel=1 THEN chain(N) <= prod(N);
END IF;
END IF;
END PROCESS;
END PROCESS;
res <= chain(1);
res <= chain(1);
END a;
END a;
Guillermo Jaquenod, 2001

Ejemplos: Multiplicador serial con signo


mr(N-1)

mr(N-2)

m(1)

Ejemplos: Multiplicador serial con signo


ENTITY smulser IS GENERIC (N:INTEGER:= 16);
ENTITY smulser IS GENERIC (N:INTEGER:= 16);
PORT (rel,init,m0:IN BIT; mr:IN BIT_VECTOR(N DOWNTO 1); res:OUT BIT);
PORT (rel,init,m0:IN BIT; mr:IN BIT_VECTOR(N DOWNTO 1); res:OUT BIT);
END smulser;
END smulser;

m(0)

mo

res
D

Q
Ca2

a
b

a
b

CSA

a
b

CSA

s
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

Fuente: R.Andraka.

Guillermo Jaquenod, 2001

Modelado temporal de un rbitro asincrnico


LIBRARY ieee; USE ieee.std_logic_1164.ALL;
ENTITY arb0 IS PORT (
areq_n,breq_n: IN std_logic;
ardy_n,brdy_n,agnt,bgnt: OUT std_logic);
END ENTITY arb0 ;

Breq_n
Brdy_n
Bgnt

Areq_n
Ardy_n
Agnt
Areq_n

ARCHITECTURE async OF arb0 IS


SIGNAL a1,a2,a3,b1,b2,b3,sa,sb: std_logic;
BEGIN
a1 <= NOT (areq_n AND a2) AFTER 2 ns;
a2 <= NOT (breq_n AND a1) AFTER 2 ns;
b1 <= NOT (breq_n AND b2) AFTER 2 ns;
b2 <= NOT (areq_n AND b1) AFTER 2 ns;
sa <= NOT (a2 AND sb) AFTER 2 ns;
sb <= NOT (b2 AND sa) AFTER 2 ns;
ardy_n <= sa OR areq_n AFTER 2 ns;
brdy_n <= sb OR breq_n AFTER 2 ns;
agnt <= sa; bgnt <= sb;
END ARCHITECTURE async ;
Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

a1

a2

b2

Breq_n

b1

a3

ARCHITECTURE a OF smulser IS
ARCHITECTURE a OF smulser IS
COMPONENT seradd PORT (a,b,reloj,init:IN BIT; s:OUT BIT); END COMPONENT;
COMPONENT seradd PORT (a,b,reloj,init:IN BIT; s:OUT BIT); END COMPONENT;
COMPONENT com2dos PORT (a,reloj,init:IN BIT; s:OUT BIT); END COMPONENT;
COMPONENT com2dos PORT (a,reloj,init:IN BIT; s:OUT BIT); END COMPONENT;
SIGNAL prod,chain: BIT_VECTOR (N DOWNTO 1);
SIGNAL prod,chain: BIT_VECTOR (N DOWNTO 1);
BEGIN
BEGIN
genprod: FOR i IN N DOWNTO 1
genprod: FOR i IN N DOWNTO 1
GENERATE prod(i) <= mr(i) AND m0;
GENERATE prod(i) <= mr(i) AND m0;
END GENERATE;
END GENERATE;
gencsa: FOR i IN N-1 DOWNTO 1
gencsa: FOR i IN N-1 DOWNTO 1
GENERATE
GENERATE
chaincsa: seradd PORT MAP(a=>prod(i), b=>chain(i+1),reloj=>rel,
chaincsa: seradd PORT MAP(a=>prod(i), b=>chain(i+1),reloj=>rel,
init=>init, s=>chain(i));
init=>init, s=>chain(i));
END GENERATE;
END GENERATE;
first: com2dos PORT MAP (a=>prod(i),reloj=>rel,init=>init,s=>chain(N));
first: com2dos PORT MAP (a=>prod(i),reloj=>rel,init=>init,s=>chain(N));
res <= chain(1);
res <= chain(1);
END a;
END a;

Guillermo Jaquenod, 2001

El rbitro asincrnico sintetizado con FLEX


Areq_n
a1

a2

Ardy_n
b2

sa

Agnt

sb

a3

Areq_n
sa

Agnt

sb

Ardy_n

LUT

Ardy_n

LUT

LUT

Agnt

LUT

LUT

Bgnt
Breq_n

Bgnt

Brdy_n

!!

Bgnt

b3

Breq_n

b1

b3

LUT

Brdy_n

Es vlido el uso de este tipo de


circuitos usando FLEX10K?
Porqu?

Brdy_n

Un circuito tipo Latch RS realizado en base a tablas de LookUp es


Un circuito tipo Latch RS realizado en base a tablas de LookUp es
sumamente riesgoso, por cuanto no cumple con la simetra de
sumamente riesgoso, por cuanto no cumple con la simetra de
retardos propia de uno realizado en base a dos compuertas NAND
retardos propia de uno realizado en base a dos compuertas NAND
La realimentacin de la salida de la LUT (datos de RAM) a la entrada
La realimentacin de la salida de la LUT (datos de RAM) a la entrada
(direcciones de RAM) puede dar lugar a hazards imprevisibles
(direcciones de RAM) puede dar lugar a hazards imprevisibles
NO CONVIENE EL USO DE ESTE TIPO DE CIRCUITOS!
NO CONVIENE EL USO DE ESTE TIPO DE CIRCUITOS!
Adems...qu pasa si A y B piden el bus simultneamente?
Adems...qu pasa si A y B piden el bus simultneamente?
Guillermo Jaquenod, 2001

73

VHDL: Lenguaje de descripcin de hardware


Un rbitro sincrnico Round Robin
gnt0

gnt3

gnt1

gnt2

reloj
req0
req1
req2
req3

gnt0
gnt1
gnt2
gnt3

cycle
start

rbitro Round Robin: tabla de decisin

Un arbitro ROUND ROBIN implementa un circuito


Un arbitro ROUND ROBIN implementa un circuito
de prioridad variable, donde en funcin del estado
de prioridad variable, donde en funcin del estado
actual (gnt0..3) y las entradas req0..3 se define la
actual (gnt0..3) y las entradas req0..3 se define la
prioridad de atencin a esas entradas.
prioridad de atencin a esas entradas.
por ejemplo, si gnt0 est activa, req1 tendr la
por ejemplo, si gnt0 est activa, req1 tendr la
mxima prioridad, seguido por req2 y slo
mxima prioridad, seguido por req2 y slo
despus por req3; al activarse gnt1, la prioridad
despus por req3; al activarse gnt1, la prioridad
ser ahora de req2 seguida por req3 y luego por
ser ahora de req2 seguida por req3 y luego por
req0.
req0.
de este modo se trata de asegurar una asignacin
de este modo se trata de asegurar una asignacin
de prioridades equitativa.
de prioridades equitativa.
Como seales auxiliares:
Como seales auxiliares:
start avisa cuando el control del sistema se
start avisa cuando el control del sistema se
asigna a un nuevo master
asigna a un nuevo master
cycle indica al rbitro que el tiempo disponible
cycle indica al rbitro que el tiempo disponible
para el master actual se agot, por lo que si
para el master actual se agot, por lo que si
hay algun otro en espera le ser asignado el
hay algun otro en espera le ser asignado el
control
control

Guillermo Jaquenod, 2001

req0
req1
req2
req3

actual
nuevo

Este diseo
ARCHITECTURE a OF rrobtab IS
ARCHITECTURE a OF rrobtab IS
no funciona.
SIGNAL concat: std_logic_vector (7 DOWNTO 0);
SIGNAL concat: std_logic_vector (7 DOWNTO 0);
Porqu?
BEGIN
BEGIN
concat <= actual&req;
concat <= actual&req;
WITH concat SELECT
WITH concat SELECT
nuevo <= "0001" WHEN "0001000X"|"001000X1"|"01000XX1"|"1000XXX1",
nuevo <= "0001" WHEN "0001000X"|"001000X1"|"01000XX1"|"1000XXX1",
"0010" WHEN "0001XX1X"|"001000X0"|"01000X10"|"1000XX10",
"0010" WHEN "0001XX1X"|"001000X0"|"01000X10"|"1000XX10",
"0100" WHEN "0001X10X"|"0010X1XX"|"01000X00"|"1000X100",
"0100" WHEN "0001X10X"|"0010X1XX"|"01000X00"|"1000X100",
"1000" WHEN "0001100X"|"001010XX"|"01001XXX"|"1000X000",
"1000" WHEN "0001100X"|"001010XX"|"01001XXX"|"1000X000",
"XXXX" WHEN OTHERS;
"XXXX" WHEN OTHERS;
END a;
END a;

rbitro Round Robin: tope de jerarqua

LIBRARY ieee; USE ieee.std_logic_1164.ALL;


LIBRARY ieee; USE ieee.std_logic_1164.ALL;

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


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

ENTITY rrobtab IS PORT (req: IN std_logic_vector (3 DOWNTO 0);


ENTITY rrobtab IS PORT (req: IN std_logic_vector (3 DOWNTO 0);
actual : IN std_logic_vector (3 DOWNTO 0);
actual : IN std_logic_vector (3 DOWNTO 0);
nuevo:OUT std_logic_vector (3 DOWNTO 0));
nuevo:OUT std_logic_vector (3 DOWNTO 0));
END rrobtab ;
END rrobtab ;

req0
req1
req2
req3

actual
nuevo

0);
0);

X2"; ELSIF req(2)='1' THEN vnuevo := X4";


X2"; ELSIF req(2)='1' THEN vnuevo := X4";
:= X8"; ELSE vnuevo := actual; END IF;
:= X8"; ELSE vnuevo := actual; END IF;
X"4"; ELSIF req(3)='1' THEN vnuevo := X"8";
X"4"; ELSIF req(3)='1' THEN vnuevo := X"8";
:= X"1"; ELSE vnuevo := actual; END IF;
:= X"1"; ELSE vnuevo := actual; END IF;
X8"; ELSIF req(0)='1' THEN vnuevo := X"1";
X8"; ELSIF req(0)='1' THEN vnuevo := X"1";
:= X2"; ELSE vnuevo := actual; END IF;
:= X2"; ELSE vnuevo := actual; END IF;
X"1"; ELSIF req(1)='1' THEN vnuevo := X2";
X"1"; ELSIF req(1)='1' THEN vnuevo := X2";
:= X4"; ELSE vnuevo := actual; END IF;
:= X4"; ELSE vnuevo := actual; END IF;

Guillermo Jaquenod, 2001

ENTITY rndrob IS PORT (reloj,ini : IN std_logic; req: IN std_logic_vector (3 DOWNTO 0);


ENTITY rndrob IS PORT (reloj,ini : IN std_logic; req: IN std_logic_vector (3 DOWNTO 0);
grant:OUT std_logic_vector (3 DOWNTO 0));
grant:OUT std_logic_vector (3 DOWNTO 0));
END rndrob;
END rndrob;
ARCHITECTURE a OF rndrob IS
ARCHITECTURE a OF rndrob IS
COMPONENT rrobtab PORT (req: IN std_logic_vector(3 DOWNTO 0);
COMPONENT rrobtab PORT (req: IN std_logic_vector(3 DOWNTO 0);
actual: IN std_logic_vector(3 DOWNTO 0); nuevo:OUT std_logic_vector (3 DOWNTO 0));
actual: IN std_logic_vector(3 DOWNTO 0); nuevo:OUT std_logic_vector (3 DOWNTO 0));
END COMPONENT;
END COMPONENT;
SIGNAL act,nov:std_logic_vector(3 DOWNTO 0); SIGNAL tstop,rini,tout,lib: std_logic;
SIGNAL act,nov:std_logic_vector(3 DOWNTO 0); SIGNAL tstop,rini,tout,lib: std_logic;
BEGIN
BEGIN
decis: rrobtab PORT MAP (req => req,actual=>act,nuevo=>nov);
decis: rrobtab PORT MAP (req => req,actual=>act,nuevo=>nov);
tstop <= NOT(tout);
tstop <= NOT(tout);
timer: lpm_counter GENERIC MAP (LPM_WIDTH => 3)
timer: lpm_counter GENERIC MAP (LPM_WIDTH => 3)
PORT MAP (clock=>reloj,cnt_en => tstop, aclr=>rini,cout=>tout);
PORT MAP (clock=>reloj,cnt_en => tstop, aclr=>rini,cout=>tout);
lib <= (not(req(0)) AND act(0) AND not(nov(0))) OR (not(req(1)) AND act(1) AND not(nov(1)))
lib <= (not(req(0)) AND act(0) AND not(nov(0))) OR (not(req(1)) AND act(1) AND not(nov(1)))
OR (not(req(2)) AND act(2) AND not(nov(2))) OR (not(req(3)) AND act(3) AND not(nov(3)));
OR (not(req(2)) AND act(2) AND not(nov(2))) OR (not(req(3)) AND act(3) AND not(nov(3)));
grant <= act WHEN (tout='0') OR (nov=act) ELSE "0000";
grant <= act WHEN (tout='0') OR (nov=act) ELSE "0000";
PROCESS (reloj) BEGIN
PROCESS (reloj) BEGIN
IF reloj='1' THEN
IF reloj='1' THEN
IF
IF ini='1' THEN act <= X"1"; rini <= '1'; ELSIF lib='1' THEN act <= nov; rini <= '1';
ini='1' THEN act <= X"1"; rini <= '1'; ELSIF lib='1' THEN act <= nov; rini <= '1';
ELSE rini <= '0'; END IF;
ELSE rini <= '0'; END IF;
END IF;
END IF;
END PROCESS;
END PROCESS;
END a;
END a;
Guillermo Jaquenod, 2001

Un FIFO basado en registros

Un slice del FIFO basado en registros

Un FIFO basado en registros puede ser til cuando la


necesidad de buffering es reducida y no se justifica el
empleo de un EAB. Todas las etapas intermedias de este
FIFO son similares y en su versin ms simple siguen el
siguiente comportamiento:
IF

ENTITY rrobtab IS PORT (


ENTITY rrobtab IS PORT (
req: IN std_logic_vector (3 DOWNTO 0);
req: IN std_logic_vector (3 DOWNTO 0);
actual : IN std_logic_vector (3 DOWNTO 0);
actual : IN std_logic_vector (3 DOWNTO 0);
nuevo:OUT std_logic_vector (3 DOWNTO 0));
nuevo:OUT std_logic_vector (3 DOWNTO 0));
END rrobtab;
END rrobtab;

Guillermo Jaquenod, 2001

rbitro Round Robin: tabla de decisin

ARCHITECTURE a OF rrobtab IS
ARCHITECTURE a OF rrobtab IS
BEGIN
BEGIN
PROCESS (actual,req) IS
PROCESS (actual,req) IS
variable vnuevo: std_logic_vector (3 DOWNTO
variable vnuevo: std_logic_vector (3 DOWNTO
BEGIN
BEGIN
CASE actual IS
CASE actual IS
WHEN X"0" => vnuevo := X"1";
WHEN X"0" => vnuevo := X"1";
WHEN X"1" => IF req(1)='1' THEN vnuevo :=
WHEN X"1" => IF req(1)='1' THEN vnuevo :=
ELSIF req(3)='1' THEN vnuevo
ELSIF req(3)='1' THEN vnuevo
WHEN X2" => IF req(2)='1' THEN vnuevo :=
WHEN X2" => IF req(2)='1' THEN vnuevo :=
ELSIF req(0)='1' THEN vnuevo
ELSIF req(0)='1' THEN vnuevo
WHEN X4" => IF req(3)='1' THEN vnuevo :=
WHEN X4" => IF req(3)='1' THEN vnuevo :=
ELSIF req(1)='1' THEN vnuevo
ELSIF req(1)='1' THEN vnuevo
WHEN X8" => IF req(0)='1' THEN vnuevo :=
WHEN X8" => IF req(0)='1' THEN vnuevo :=
ELSIF req(2)='1' THEN vnuevo
ELSIF req(2)='1' THEN vnuevo
WHEN OTHERS => vnuevo := actual;
WHEN OTHERS => vnuevo := actual;
END CASE;
END CASE;
nuevo <= vnuevo;
nuevo <= vnuevo;
END PROCESS;
END PROCESS;
END a;
END a;

LIBRARY ieee; USE ieee.std_logic_1164.ALL;


LIBRARY ieee; USE ieee.std_logic_1164.ALL;

LIBRARY ieee; USE ieee.std_logic_1164.ALL;

DIN

la etapa actual est vacante

WR FULL

ENTITY FIFO_slice IS GENERIC (datw: INTEGER := 8);


PORT (prevv,nextv,reloj,init:IN STD_LOGIC;
din:IN STD_LOGIC_VECTOR (datw-1 DOWNTO 0);
actv: BUFFER STD_LOGIC;
dout:OUT STD_LOGIC_VECTOR (datw-1 DOWNTO 0));
END ENTITY FIFO_slice;
CLK

AND la etapa anterior tiene datos vlidos

CLK

ENA

THEN:

CLK

ENA

CLK

ENA

CLK

ENA

se copian los datos de la etapa anterior


la etapa actual pasa a tener datos validos
y la etapa anterior queda vacante.

DOUT

Esta solucin puede hacerse mucho ms efectiva


propagando la posibilidad de shift desde la etapa de
Podr aprovecharse
salida hacia la entrada
algn modo de
operacin de los LEs?
Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

RD EMPT

ARCHITECTURE a OF FIFO_slice IS
CLK
SIGNAL reg: STD_LOGIC_VECTOR (datw-1 DOWNTO 0);
BEGIN
CLK
PROCESS (reloj,init) IS
CLK
BEGIN
IF init='1' THEN actv <= '0'; dout <= (others => '0');
ELSIF reloj'EVENT AND reloj='1' THEN
IF (actv='1') AND (nextv='0') THEN actv <= '0';
ELSIF (actv='0') AND (prevv='1') THEN actv <= '1'; dout <= din;
END IF;
END IF;
END PROCESS;
END ARCHITECTURE a;

ENA
ENA
ENA
ENA

Guillermo Jaquenod, 2001

74

VHDL: Lenguaje de descripcin de hardware


Un FIFO basado en registros

Un FIFO 8x8 basado en registros

LIBRARY ieee; USE ieee.std_logic_1164.ALL;

La simulacin muestra la propagacin de cada dato a medida que es escrito,


cmo los dos datos llegan a las dos ltimas etapas, y los procesos de lectura

ENTITY ripple_FIFO IS GENERIC (largo: INTEGER := 8;datw: INTEGER := 8);


PORT (wr,rd,clk,init:IN STD_LOGIC; din:IN STD_LOGIC_VECTOR (datw-1 DOWNTO 0);
full,empty: OUT STD_LOGIC;
dout:OUT STD_LOGIC_VECTOR (datw-1 DOWNTO 0));
END ENTITY ripple_FIFO;

El primer dato llega al ltimo registro

ARCHITECTURE a OF ripple_FIFO IS
TYPE membank IS ARRAY (largo-1 DOWNTO 0) OF STD_LOGIC_VECTOR (datw-1 DOWNTO 0);
SIGNAL memoria: membank ; SIGNAL status: STD_LOGIC_VECTOR (largo-1 DOWNTO 0);
COMPONENT FIFO_slice GENERIC (datw: INTEGER := 8);
PORT (prevv,nextv,reloj,init:IN STD_LOGIC; din:IN STD_LOGIC_VECTOR (datw-1 DOWNTO 0);
actv: BUFFER STD_LOGIC; dout:OUT STD_LOGIC_VECTOR (datw-1 DOWNTO 0));
END COMPONENT FIFO_slice;

Se vaca el ultimo registro,


los datos del anteltimo
pasan al ltimo, con lo que
se vaca el anteltimo y
vuelve a ocuparse el ltimo

BEGIN
midslices: FOR i IN 1 TO largo-2 GENERATE -- etapas intermedias
instslice: FIFO_slice GENERIC MAP (datw=>datw) PORT MAP (prevv=>status(i-1),nextv=>status(i+1),
actv=>status(i),reloj=>clk,init=>init,din=>memoria(i-1),dout=>memoria(i));
END GENERATE;

La segunda lectura
borra el ultimo
registro; al no
haber nuevo dato
el FIFO queda
vaco de forma
permanente

PROCESS (clk, init) IS BEGIN -- primera y ultima etapa


IF init='1' THEN status (0)<= '0'; memoria(0) <= (others => '0');
status (7)<= '0'; memoria(7) <= (others => '0');
ELSIF clk'EVENT AND clk='1' THEN
IF (wr='1') THEN status(0) <= '1'; memoria(0) <= din;
ELSIF (status(0)='1') AND (status(1)='0') THEN status(0) <= '0'; END IF;
IF (rd='1') THEN status(largo-1) <= '0';
ELSIF (status(largo-1)='0') AND (status(largo-2)='1')
THEN status(largo-1) <= '1'; memoria(largo-1) <= memoria(largo-2); END IF;
END IF;
END PROCESS;
dout <= memoria (largo-1); full <= status(0); empty <= NOT(status(largo-1));
END ARCHITECTURE a;

Los dos datos estn en el


ultimo y anteltimo registro

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Ejemplos: Switch Fabric con Multiplexores


La difusin de redes de datos de alta velocidad en canales de
baja tasa de error ha dado origen a nuevas normas de
transmisin. Tal es el caso del ATM (Asynchronous Transfer
Mode), que requiere mnimo procesamiento en nodos,
routers, repetidores, brigdes.

Reloj

red Banyan invertida

entradas

Guillermo Jaquenod, 2001

La idea del algoritmo CORDIC es muy ingeniosa:


Dado un punto con coordenadas (x,y) que es
rotado un ngulo A respecto al origen, las nuevas
coordenadas del punto sern:

algoritmo CORDIC puede ser usado para calcular la


hipotenusa y el ngulo A, formado entre x y h

y= x.senA + y.cosA

(x,y)

convertirlo en un nuevo punto (x,0), con lo que x ser el

h
A
x

(x,0)

A. Analizando las ecuaciones vistas:


Parece el mtodo de
aproximaciones sucesivas!
Que condiciones se
debern cumplir?

Como cos(A)=cos(-A) los efectos de los


sucesivos productos por cos (Ai) se transforman en
un nico coeficiente final, que tiende a 0,6073 a
medida que la cantidad de iteraciones (i) crece.
Fuente: R.Andraka. A survey of CORDIC algorithms for FPGA based computers

Guillermo Jaquenod, 2001

(x,y)

La idea es rotar el punto (x,y) hacia el eje X, para


valor el de la hpotenusa y el ngulo rotado coincidir con

y=cosA.(y + x.tanA)

Si el ngulo A es aproximado mediante la suma o


resta de sucesivos Ai=artan(2-i), para i desde 0
hasta un mximo, se tiene que tanAi=(+/-)2-i, y el
producto de x o y por tanAi se transforma en un
simple shift.

Uso de CORDIC en vez de Pitgoras


Dado un tringulo con catetos de dimensin x e y, el

(x,y)

Sacando cosA como factor comn tengo

Guillermo Jaquenod, 2001

red Banyan 16:16

S1
Sel

Una red Banyan N:N provee un nico camino entre cualquier entrada y cualquier salida,
pero a la vez bloquea otros caminos entre otras entradas y salidas
En un switch fabric MIN (Multipath Interconnect Network) se usan dos redes Banyan N:N,
que proveen N posibles caminos desde cualquier entrada a cualquier salida
El elemento bsico de un MIN es un multiplexor 2:2, que usa 2 LEs, y que puede operar
de modo combinatorio o usar registros (en el caso de desear una switch con pipelines)
Una MIN 16:16 tendr 8 LE de retardo, requerir 8x8x2=128 LEs y 64 lneas de control

CORDIC: COordinate Rotation DIgital Computer

x=cosA.(x - y.tanA)

16 salidas

16 entradas
salidas

Guillermo Jaquenod, 2001

x=x.cosA - y.senA

S0

ATM es un sistema basado en el establecimiento de una


conexin temporaria punto a punto, que transporta a alta
velocidad celdas de informacin entre interlocutores, y un
elemento clave en la creacin de este camino son los
sistemas de ruteado, y dentro de ellos las matrices de
ruteado (switch fabrics).
Un switch fabric puede ser homologado a un conjunto de
tantos multiplexores como canales de salida, donde cada
multiplexor tiene tantas entradas como canales de entrada
haya. Esta solucin es rpida (menos de 3 LE de retardo),
consume bastantes recursos (160 LEs en un switch 16:16 y
64 lneas de control), y solo permite un camino entre una
dada entrada y una dada salida

Switch Fabric MIN (Multipath Interconnect Net)

x=cosA.(x - y.tanA)

y=cosA.(y + x.tanA)

en cada paso i, si y es positivo se aplica una rotacin


horaria de Ai= artan(-2-i), y si y es negativo una rotacin
antihoraria de valor Ai= artan(+2-i). Estas decisiones
son almacenadas en un registro de decisiones.
luego de N iteraciones el valor de x= 0,6073. h (o dicho
de otro modo h=1,6466.x) y el registro de decisiones
corresponde al ngulo A
Guillermo Jaquenod, 2001

Fuente: R.Andraka. A survey of CORDIC algorithms for FPGA based computers

75

VHDL: Lenguaje de descripcin de hardware


Otros usos de CORDIC

Hardware iterativo para CORDIC en paralelo


x

Analizando las ecuaciones. la iteracin queda descripta por:

Calculo de SENO y COSENO: si se parte de (1.6466,0) y se gira un ngulo A,


en (x,y) se obtiene sen(A) y cos(A). De igual modo, con (R*1.6466 , 0) al girar

xi+1 = xi - yi.di.2-i

un ngulo A se convierte (R,A)=>(x,y) de coordenadas polares a cartesianas

s0

Ai+1 = Ai - di.artan(2-i)

A=0, y se rota el vector hacia el eje X el valor resultante A es Atan(y/x).


Clculo de ARCOSEN(YS) y ARCOS(Xc): si se parte de x=1, y=0 y A=0, y se
rota el vector en base a decisiones tomadas comparando y con Ys, se obtendra
en A el arsen (Ys); de igual modo, tomando decisiones en base a comparar x
con Xc se puede calcular arcos (Xc).
prefijado. En este caso la representacin de dicho ngulo como suma de
arcotangentes (2-i) puede ser calculada de antemano y guardado en tabla,
Otros: una estructura CORDIC modificada puede ser empleada tambin para la
realizacin de multiplicaciones, y para el clculo de funciones hiperblicas.

Hardware iterativo para CORDIC en serie

16 LEs

sgex
Ry

di
sgex

FSM

%16
rdy

CSAS

s0
y

FSM

init
A

2 LEs
sgex
Ry

rdy

s1,s0
RA
i
ROM

-di

+/-

-di

i
16 LEs

i
sgex

b
di

s0
sgex

CSAS

%16

di,s1,s0
i

x
i

2 LEs

y
init

-di
s0

y
s0

10 LEs
i

CSAS

+/-

16 LEs

di

Rx

A
x

-di
s0

-di

Hardware iterativo para CORDIC en serie

Rx
A

Fuente: R.Andraka. A survey of CORDIC


algorithms for FPGA based computers

Guillermo Jaquenod, 2001

+/-

Ry

EVALUAR LA COMPLEJIDAD CIRCUITAL APROXIMADA

Fuente: R.Andraka. A survey of CORDIC algorithms for FPGA based computers

-di

SRA

Esta solucin emplea bloques constructivos estndar, como


sumadores/restadores, barrel shifters, tablas de lookup y
una mquina de estados

obviando el circuito de iteracin de ngulos.

SRA

Si se desea calcula la hipotenusa/angulo, el registro RA


es inicialmente borrado y las decisiones se toman en
funcin del bit de signo del registro Ry

Rotaciones fijas: en algunos casos es necesario rotar un vector un ngulo

Rx

Si se desea aplicar una rotacin, en funcin de bit de


signo de RA este registro es incrementado o
decrementado (controlado por -di) en un valor obtenido
de tabla, que corresponde a Ai= artan(-2-i); esta decisin
es usada tambin para controlar los sumadores /
restadores que generan los nuevos x e y.

Clculo de la funcin ARCOTANGENTE (T): si se parte de x=1, y=T=tan(A) y

Guillermo Jaquenod, 2001

yi+1 = yi + xi.di.2-i

10 LEs

2 LEs

CSAS

Es posible resolver CORDIC en forma serie, usando


registros de desplazamiento, sumadores/restadores
CarrySave, multiplexores y bloques de extensin de
signo. Si bien este circuito sera N veces ms lento, la
simplicidad del conexionado permite que esta penalidad
sea menor

Analizar y discutir
la arquitectura
de los distintos
bloques!!!

Guillermo Jaquenod, 2001

El anlisis de la arquitectura muestra que el registro X necesita 16 LEs para el shift


register (includo el MUX de entrada), 10 LEs para un multiplexor 16:1, 2 LEs para el
circuito de extensin de signo y otros 2 LEs para el sumador Carry Save, totalizando 30
LEs para X, y por lo mismo otros 30 LEs para el registro Y.
El registro A necesita 16 LEs para el shift register, 16 LEs para la tabla de ngulos, 10
LEs para un mux 16:1, y 2 LEs para el circuito Carry Save, totalizando otros 44 LEs
Guillermo Jaquenod, 2001

ALU serial

ACUMULADOR
memoria
I/O
0
1
memoria
constantes

Bases de VHDL

aritmetica
ADD
SUB
lgica
AND
OR
XOR

out
Z
Cyout
Cyin
V
N

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

El bloque de procesamiento cuenta con dos unidades separadas, una


para las funciones lgicas y otra para las funciones aritmticas

Ejercicios complejos conVHDL

Una unidad artimtico-lgica serial puede ser muy til para elaborar
microcontroladores empotrados de baja performance pero a la vez muy
limitado uso de recursos

Los operandos pueden ser datos variables provenientes de alguno de


los mapas de memoria (datos o instrucciones), de la I/O o ciertas
constantes tales como 0, 1, u otras (P.Ej: valores para ajuste decimal).

Guillermo Jaquenod, 2001

76

VHDL: Lenguaje de descripcin de hardware

Shifter
Mux

Suma
Ajuste

Control

AND

Sumador

Acumulador
Shifter

Fuente: POLLARD

Guillermo Jaquenod, 2001

Ejercicio: una UART, etapa RX


TxC

Ack=0?

Ena

We=0?

RXD

THRF=1
Ena=1
We=1?

lado del
canal

RxRegister

R16ck
We=1?

Rx_Reg (SIPO)

We=0?

Ack=0?

THRF=1
Ena=0

Ctl

Re
RDRF
Clk

lado del
usuario

La etapa RX de una UART puede verse como compuesta por dos mquinas sincronicas:
Una mquina activada por Rck16x, responsable de sincronizarse con los datos
entrantes, recibir los bits de datos, y avisar cuando hay un nuevo dato disponible
Otra mquina activada por Clk, responsable de la interfase al bus del usuario
Al igual que en el transmisor el circuito puede complicarse, para detectar Overrun, Break,
Noise, etc..

Guillermo Jaquenod, 2001

1. se pone una parte (filas) de la direccin a


leer
2. se baja /RAS para capturarla
3. se pone la otra parte (columnas) de la
direccin a leer
4. se baja /CAS para capturarla
5. se baja /OE para sacar las lneas DQ de
alta impedancia
6. los datos quedan disponibles para su uso
7. se termina el ciclo subiendo /RAS y /CAS
8. se sube /OE para pasar DQ[..] a Tri-State
9. los datos DQ[..] quedan en Tri-State
10.se debe esperar un tiempo de precarga
hasta empezar otro ciclo

En simultneo con la lectura, este ciclo


refresca todas las columnas de esta fila.
Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Cada dispositivo tiene una


lnea /RAS dedicada pero
dos lneas /CAS, las que
permiten el control de
lectura y escritura a nivel de
byte
Tienen mltiples modos de
operacin, de los que slo
se desea implementar
single read, early Write y
CBR refresh.
Guillermo Jaquenod, 2001

Ejercicio: DRAM controller. Ciclo de lectura


El ciclo de lectura se compone de varios
pasos:

Guillermo Jaquenod, 2001

En este caso el mdulo


est basado en 4
dispositivos MT4LC4M16
de 4M x 16 conectados
como en la figura

RxF

Ctl Ack
Syn

Ack=1?

THRF=0
Ena=0

generar los ciclos de lectura, de escritura


y de refresco
operar en modo cuasi-asincrnico
(AS/ACK + reloj)
permitir el control de acceso a nivel de
byte (BE[3..0])
multiplexar el bus de direcciones
aislar el bus de datos
generar las seales de control /RAS[],
/CAS[], /OE y /WE

CAS#
ROW

COLUMN

WE#
DQ

DATA

OE#
1

select
arbitro
RAS/CAS
BE[]
control

/RAS[3..0]
/CAS[3..0]
/OE
/WE
DQ[31..0]

Contador de
refresco

Fuente: MICRON 4,8MEG x 32 DRAM DIMMs DM85.p65-Rev2/99

A0..A11

5 6 7 8 9 10

T1-10

110

T5-6

15

T1-2

T2-6

60

T2-3

15

T2-4

20

T3-4

T8-9

15

T4-6

15

T7-9

15

T4-7

15

T7-10

40

A0~A11
/WE
DQ0/CASL
DQ15
/CASH
/RAS
4M x 16
/OE

/CAS0
/CAS0
/RAS0
/OE

A0..A11

A0-A11

16

A0~A11
/WE
DQ0/CASL
DQ15
/CASH
/RAS
4M x 16
/OE

/WE
/CAS2
/CAS3
/RAS2

A0..A11

16
DQ[31..0]

A0~A11
/WE
DQ0/CASL
DQ15
/CASH
/RAS
4M x 16
/OE

/RAS1

A0..A11

16

A0~A11
/WE
DQ0/CASL
DQ15
/CASH
/RAS
4M x 16
/OE

/RAS3

16

Fuente: MICRON 4,8MEG x 32 DRAM DIMMs DM85.p65-Rev2/99

Ejercicio: DRAM controller. Ciclo de escritura


El ciclo de escritura (early write) se
compone de varios pasos:

RAS#
ADDR

RW
AS
BE[3..0]
ACK
reloj

direcciones
A[11..0]

DRAM controller: la memoria a controlar

D_Out (7 downto 0)

Ack=1?
THRF=0
Ena=0

Es posible conseguir a muy bajo costo


mdulos de alta densidad y bajo tiempo
de acceso,
Tener una interfase resuelta facilita su
uso en sistemas de cmputo pero
tambin en tareas de instrumentacin
(ej: data-logging).
La interfase debe poder:

MICRON 8MEG x 32 DRAM


DIMM Module MT4LDT432U

Multiplicando

latches

Multiplicador

mux a filas
y columnas

Pollard 87

direcciones A[24..2]

Ejercicio: DRAM controller

datos

Ejercicio: multiplicador de punto flotante

1. se pone una parte (filas) de la direccin a


leer
2. se baja /RAS para capturarla
3. se activa /WE en cero
4. se pone la otra parte (columnas) de la
direccin a leer
5. se ponen los datos a escribir
6. se baja /CAS para capturarlos
7. se desactiva /WE
8. se pueden sacar los datos
9. se termina el ciclo subiendo /RAS y /CAS
10.se espera un tiempo de precarga hasta
empezar otro ciclo

En simultneo con la escritura, este ciclo


refresca todas las columnas de esta fila.

RAS#
CAS#
ADDR

ROW

COLUMN

WE#
DATA

DQ
OE#
1

3 45 6

7 8 9 10 11

T2-11

110

T5-6

T1-2

T6-7

10

T2-4

10

T6-8

10

T2-6

20

T6-9

10

T3-6

T6-10

15

T4-6

T10-11

40

Guillermo Jaquenod, 2001

77

VHDL: Lenguaje de descripcin de hardware


Ejercicio: DRAM controller. Ciclo de refresco

CAS#
ADDR

se asegura /WE en 1
se baja /CAS
se baja /RAS
se sube /CAS
se sube /RAS
se espera un tiempo de precarga
hasta empezar otro ciclo

ADDRESS=dont care

WE#
DATA = dont care

DQ
OE#
1

23 4

T1-3

El refresco de toda la memoria


requiere de al menos 4096 ciclos de
refresco CBR cada 64 milisegundos
(uno cada 15,625 microsegundos).
Cada ciclo CBR refresca todas las
columnas de una fila

10

T3-4

T1-4

10

T4-5

Incluso puede pensarse en un reloj


de slo 33MHz, usando ciertos
flipflops activados por el flanco
positivo y otros activados por el
flanco negativo de la seal de reloj

7 ... 0

RAS#
CAS#
ADDR
WE#
DQ
OE#
RAS#

10

CAS#
ADDR
WE#
DQ
OE#
RAS#

T2-3

T4-6

15

T2-4

10

T4-7

60

CAS#
ADDR
WE#
DQ
OE#

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Ejercicio: generacin de video SVGA 640x480


hper
hsyn

Suponiendo un reloj de 66MHz


(15ns de perodo) pueden definirse
los ciclos de lectura, escritura y
CBR en mltiplos de ellos

READ

RAS#

WRITE

1.
2.
3.
4.
5.
6.

Un ciclo CBR (Cas_Before_Ras) es


usado para el regenerar los datos
(refresco) de la memoria dinmica:

REFRESH

Ejercicio: DRAM controller

hcnt

ALTERA Corp. MAX+PLUS II VHDL, Version 7.1. December 1996.

25.175MHz

hsi

Bibliografa: libros sobre VHDL


P.Ashenden. The Students Guide to VHDL. Morgan Kaufmann Publishers Inc, 1998, ISBN 1-55860-520-7

pixel
hsyn
pixel

L.Baker. VHDL Programming With Advanced Topics. John Wiley and Sons, Inc. 1993, ISBN 0-471-57464-3

vsyn

hsw

hval

J.Bhasker. A VHDL Primer, Revised Edition. Prentice Hall 1995. ISBN 0-13-181447-

val

vper

J.Bhasker. A Guide to VHDL Syntax. Prentice Hall 1995, ISBN: 0-13-324351-6.

lineas

vsi
vcnt

row

0..479

K.C.Chang. Digital Systems Design With VHDL and Synthesis. An inteegrated Approach. IEEE Computer
Society 1999. ISBN 0-7695-0023-4

lineas

hsyn

column

0..639

R. Dueck. Digital Design with CPLD. Applications and VHDL. DELMAR, Thomson Learning. ISBN 0-76681160-3

vsw

hval
val

S.S.Leung & M.AA.Shanblatt. ASIC System Design with VHDL: A Paradigm. 2nd.Edition, Kluwer Academic
Publishers, 1989, ISBN:0-7923-9032-6

lineas

Horizontal (unidad: pixels @ 25.175MHz)


hper

Vertical (unidad: lneas)

F.Pardo & J.Boluda. VHDL Lenguaje para sntesis y modelado de circuitos. AlfaOmega 2000. ISBN 970-150443-7.

800

vper

hsw

95

vsw

hsi

657

vsi

491

M.J.S.Smith. Application Specific Integrated Circuits. Addison Wesley 1997. ISBN 0-201-50022-1

hcnt

640

vcnt

480

L.Ters et al. VHDL Lenguaje Estndar de Diseo Electrnico. McGraw Hill 1998, ISBN 84-481-1196-6

522

Guillermo Jaquenod, 2001

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.

Guillermo Jaquenod, 2001

Bibliografa: manuales y notas de aplicacin


Cypress Semiconductor. Applications Handbook. April 1994.
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
A.Perez. "Byte-wise CRC Calculations." IEEE Micro. June. 40-50, 1983.

La interfase JTAG
Conceptos bsicos y detalles de
operacin de una moderna
metodologa de test

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

78

VHDL: Lenguaje de descripcin de hardware


Boundary Scan Testing

A medida que los circuitos impresos se hacen ms complejos, la


necesidad de un test ms completo se hace imprescindible

El encapsulado de componentes en envases de altsima densidad


(Ej: BGA de ms de 600 patas) invalida mtodos tradicionales, tales
como las camas de clavos, o los hace enormemente caros.

Mtodos clsicos: deteccin de fallas usando


cama de clavos

La necesidad de mtodos econmicos y de rpida implementacin


para el test de circuitos complejos determin la necesidad de definir
un estndar, y a mediados de los 80 se cre el Joint European Test
Action Group (JETAG), que con la incorporacon de USA llev a la
creacin del Joint Test Action Group (JTAG)

Mediante el uso de camas de clavos es posible testear la cadena:


clavo (excitador), PTH, pista de PCB, soldadura, pata del
chip, interconexin interna, dispositivo, interconexin
interna, pata del chip, soldadura, pista de PCB, PTH,
clavo (sensor)

En 1990 el IEEE present el estndar IEEE 1149.1. Test Access


Port and Boundary Scan Architecture

Guillermo Jaquenod, 2001

Sensor

Excitador

Guillermo Jaquenod, 2001

Limitaciones propias del uso de cama de


clavos

Boundary Scan Testing


dispositivos a testear

lneas JTAG/BST

Limitaciones de acceso en componentes de montaje superficial,


plaquetas con componentes en ambas caras, o circuitos

Test Access Port

Test Access Port

Test Access Port

Ncleo
lgico

Ncleo
lgico

Ncleo
lgico

multilayer

Costo: tanto del bed test como del equipamiento de generacin


y captura de seales.

Problemas de confiabilidad de los contactos

Necesidad de disponer de un modo protegido (guarded) en los

lneas a testear

componentes del sistema en test, de modo de evitar colisiones

entre las seales del sistema de test y las generadas dentro de


la plaqueta

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Uso de BST para verificar el chip internamente


.....

.....

Ncleo
interno

TAP CONTROLLER

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Uso de BST para verificar el chip internamente

Usando BST es posible


medir y/o excitar nodos
internos de un chip

.....

TDI
TMS
TCK
nTRST
TDO

La cadena BST se intercala entre el ncleo y las patas de cada chip, y puede
forzar valores lgicos en las patas de salida y capturar el estado de las patas
de entrada (test esttico del PCB)
En ciertos casos esta cadena puede excitar a los ncleos con valores de
entrada programables y capturar sus respuestas (test esttico del chip)
Todo el esquema funciona como un gigantesco shift-register

Este acceso puede ser


slo a nodos asociados a
patas de I/O, o tambin a
nodos internos
Dada la forma serial de
lectura/escritura, la
principal limitacin del
mtodo es que slo
permite realizar test cuasi
estticos

Usando BST para el test interno del chip (INTEST) la cadena de


elementos testeada es:
celda BST, dispositivo, celda BST
Este modo es til para verificar la funcionalidad de los chips

Guillermo Jaquenod, 2001

79

VHDL: Lenguaje de descripcin de hardware


Uso de BST para verificar el PCB

JTAG
Dispositivo
con BST

Dispositivo
con BST

Dispositivo
con BST

C2

Dispositivo
sin BST

La verificacin del PCB puede ser realizada forzando


valores en las patas de salida y capturando el valor de
las patas de entrada:
Para forzar valores de salida se usa la Instruccin
EXTEST.

C1
B

Uso de BST para verificar el PCB

Dispositivo
sin BST

La interfase BST permite:


el chequeo pleno de conexiones entre dispositivos BST (flecha A)
y el chequeo parcial (mediante estmulos y respuestas) cuando
algn dispositivo no tiene BST (flecha B)
si hay caminos no medibles (entre dispositivos sin BST, caso C)
conviene rehacerlos a travs de dispositivos con BST (C1 y C2)
Guillermo Jaquenod, 2001

En la fase CAPTURE los valores presentes en las


entradas son almacenados.
En la siguiente fase SHIFT los datos capturados son
ledos en forma serial a la salida del registro BST; a la
vez se carga el shift register BST.
En la fase UPDATE las lineas de control son
reemplazadas por los valores de este shift register.
Guillermo Jaquenod, 2001

Monitoreo en operacin

Uso de BST para verificar el PCB

Usando BST para el test del conexionado (EXTEST), la cadena


posible de testear es:
celda BST, interconexin interna, pata del chip,
soldadura, pista de PCB, PTHs, soldadura, pata del chip,
interconexin interna, celda BST
Este modo es til para detectar problemas de manufactura
Guillermo Jaquenod, 2001

Usando BST para la captura de las entradas y/o salidas del chip
permite usar la cadena BST como un sistema de test funcional del
sistema, sin afectar su funcionamiento
Las celdas BST toman una muestra snapshot en forma
independiente de la operacin

Guillermo Jaquenod, 2001

La celda bsica BST

La celda bsica BST


SO

PI

SI

SO

ncleo
lgico

PO
Las tareas bsicas de una celda BST son:
capturar datos presentes en su entrada paralela (PI)
forzar datos en su salida paralela (PO)
transferir datos en forma serial desde SI a SO
comportarse en modo transparente (PI aparece en PO)
Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Scan
Una celda bsica BST ofrece
Output
ShiftDR
4 modos de operacin:
PI
capturar datos presentes
en su entrada paralela sin
afectar la salida: ShiftDR =
0
Mode = 0, ClockDR^
D Q
D Q
1
forzar un dato en la salida
Ck
Ck
paralela: Mode = 1
actualizar los registros de
Update: UpdateDR^
ClockDR
UpdateDR
SI
recargar el shift register y
Scan
sacar los datos capturados Input
en modoserial: ShiftDR=1
y ClckDR^

Mode

0
1

PO

Guillermo Jaquenod, 2001

80

VHDL: Lenguaje de descripcin de hardware


Registros asociados a BST

Registros asociados a BST

.valor a definir..

REGISTRO DE INSTRUCCION

TDI

......
UPDATEIR
CLOCKIR
SHIFTIR

TAP CONTROLLER

TMS
TCK

a TDO

Capture
clock

Shift Register

DECODIFICACION

Decodificacin

datos

REGISTRO DE BST

CLOCKDR
UPDATEDR
SHIFTDR

TAP
Controller

instrucciones

REGISTRO DE BYPASS

Update

......

Mantenimiento

REGISTRO IDCODE

......

REGISTRO UESCODE

......
REGISTROS ISP/ICR

......

..

nTRST

......

Guillermo Jaquenod, 2001

Registro de Instruccin: este registro, de largo variable (aunque


como mnimo de 2 bits) puede ser intercalado entre TDI y TDO. En
l puede capturarse un valor cableado dentro del chip
(Capture_IR), ingresarse una instruccin (Shift_IR) en modo serial,
y decodificar dicha instruccin cuando est lista (Update_IR). En
modo Capture_IR los dos bits LSB deben copiar el patrn 01.

Guillermo Jaquenod, 2001

Registros asociados a BST

01

de TDI

TDO

Registros asociados a BST


bits 31

ShiftDR

Registro de ByPass: este


registro, de slo un bit, provee
el camino ms corto entre TDI y

28 27

versin
de TDI

TDO. Es habilitado cuando se

0
1

decodifica la instruccin ByPass

a TDO

1 0
fabricante

Shift Register de 32 bits PISO

a TDO

Registro de identificacin (IDCODE): este registro opcional de 32 bits


permite identificar mediante la cadena BST al fabricante, tipo de dispositivo y
versin de cada chip.

Ck

o todo codigo de instruccin


desconocido (default). Al

Al salir de Power Up se especifica que aquellos dispositivos que tengan


IDCODE lo deben intercalar en la cadena DR, y los que no, deben intercalar
el registro de ByPass. Ello permite, mediante la accin ShiftDR, saber si un
chip tiene IDCODE (si viene un 1 los siguientes 31 bits son esa
identificacin) o no, caso en que va por default a ByPass y captura un 0.

ClockDR

ejecutarse sobre l la accin

ShiftDR
de TDI

12 11
nmero de parte

Capture_DR (ShiftDR=1) debe


capturar un 0.

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Registro de test perifrico:


tipos de celda BST

Otros registros en BST

Segn el tipo de pin, las celdas BSTagregan 1 a


3 flipflops a la cadena de Test. Ntese que en
todos los casos se usan 4 lneas de control:
1:Mode, 2:UpdateDR, 3:ShiftDR, 4:ClockDR

La arquitectura IEEE 1149.1 permite a cada fabricante definir


instrucciones y registros propios
Ello permite ampliar la cadena BST para realizar el test de no slo
elementos perifericos sino tambin internos (InScan), o usar la

3
4

salida
tristate

instruccin RunBist (definida en la norma, aunque opcional) para

3
1

activar un Auto-Test del chip, y capturar el resultado en un registro


dedicado

entrada 2

4
3

Los chips de ALTERA ofrecen un registro Registro del usuario

(UESCODE), y para que el usuario pueda programar informacion

propia, y en las lneas MAX7000s y MAX9000, registros para la

4
2
4

salida

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

programacin en circuito (ISP)

bidireccional
Guillermo Jaquenod, 2001

81

VHDL: Lenguaje de descripcin de hardware


Mquina de estados BST

Lneas de control del TAP Controller


TDI (TEST DATA INPUT): entrada serie para instrucciones, asi como para
datos de test y programacin. Los datos son capturados en el flanco
creciente de TCK

TDO (TEST DATA OUTPUT): salida serie de instrucciones, asi como datos
de test y programacin, actualizados en el flanco de bajada de TCK; va a
Tri-state cuando no se est sacando datos del dispositivo

Toda la operacin del TAP controller est definida por las lneas de
control TMS y el reloj TCK.

El JTAG TAP Controller est descripto en base a una mquina


sincrnica de estados, con 16 estados distintos, donde las
transiciones entre estados son funcin exclusiva del valor de TMS.

En el encendido el TAP Controller queda en el estado


TEST_LOGIC/RESET, donde toda la lgica de BST est
deshabilitada, y permanece all mientras TMS=1 (MAX) o nTRST=0
(FLEX)

Desde cualquier estado, se vuelve a TEST_LOGIC/RESET si TMS


permanece en 1 durante al menos 5 ciclos de TCK (MAX) o
nTRST va a 0 (FLEX)

TMS (TEST MODE SELECT): seal de control de las transiciones de la


mquina de estado del TAP CONTROLLER; su valor es capturado en el
flanco creciente de TCK

TCK (TEST CLOCK): entrada de reloj para el control de BST

TRST (TEST RESET): seal asincrnica activa baja para reinicializar los
circuitos de test. La norma IEEE1149.1 la define como seal opcional, y est
disponible slo en ciertos dispositivos de ALTERA

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Mquina de estados BST


nTRST=0

Mquina de estados BST


nTRST=0

TMS=1

TMS=1

TMS=1
TEST_LOGIC
/RESET

SELECT
DR_SCAN

TMS=0

TMS=0
CAPTURE_DR

TMS=0
TMS=0

TMS=1
RUN_TEST
/IDLE

TMS=1

TMS=1
SELECT
IR_SCAN

SHIFT_DR

TMS=1

TEST_LOGIC
/RESET

TMS=0

CAPTURE_IR

RUN_TEST
/IDLE

TMS=1

TMS=1
TMS=0

EXIT1_IR

EXIT2_DR

TMS=0

TMS=0

TMS=1
TMS=1

PAUSE_IR
TMS=0
UPDATE_DR

TMS=0

TMS=1
TMS=1

EXIT2_IR

TMS=1

TMS=1
UPDATE_IR

TMS=0

Guillermo Jaquenod, 2001

nTRST=0

TMS=0

CAPTURE_IR

TMS=0

TMS=1

Instrucciones BST

TMS=1

Obligatorias:

TMS=1
SELECT
DR_SCAN

TMS=0

RUN_TEST
/IDLE

SELECT
IR_SCAN

TMS=0
CAPTURE_DR

TMS=0
TMS=0

TMS=1

TMS=1

SHIFT_DR

TMS=1

Guillermo Jaquenod, 2001

Mquina de estados BST: ejemplo

TEST_LOGIC
/RESET

CAPTURE_DR

TMS=0
TMS=0

Los cuatro estados bsicos son TMS=1


EXIT1_DR
TMS=0
SHIFT_IR
TMS=0
TEST_LOGIC/RESET
RUN_TEST/IDLE TMS=1
PAUSE_DR
TMS=1
TMS=1
SELECT_DR_SCAN
TMS=0
EXIT1_IR

EXIT2_DR
TMS=0 SELECT_IR_SCAN
TMS=0
Se sale TMS=1primero con TMS=0 y se recircula
del
TMS=1
con TMS=1 hasta el estado inicialPAUSE_IR
TMS=0

UPDATE_DR
TMS=0SELECT_DR_SCAN permite hacer el shift de
TMS=1
EXIT2_IR
TMS=1
TMS=1
los registros de datos
SELECT_IR_SCAN permite hacer el shift del
TMS=1
UPDATE_IR
TMS=0
registro de instrucciones

SHIFT_IR
TMS=1

PAUSE_DR

SELECT
IR_SCAN

TMS=0

TMS=0

TMS=0

TMS=1

EXIT1_DR

TMS=0

TMS=0

TMS=1

TMS=1

TMS=0
TMS=0

TMS=0

TMS=0

TMS=1

SELECT
DR_SCAN

SHIFT_DR

TMS=1

TMS=0

BYPASS: intercala un registro de 1 bit entre TDI y TDO, lo que

CAPTURE_IR

TMS=0

TMS=0
TMS=0
TMS=0

TMS=1

EXIT1_DR

TMS=0

TCK

SHIFT_IR
TMS=1

PAUSE_DR

TMS=1

TMS=1

TMS

TMS=0

para dichos pines. Su valor no est definido por la norma


TMS=0

TMS=1
TMS=1

EXTEST: permite el test de las interconexiones en el PCB forzando

PAUSE_IR

TDO

TMS=0
TMS=0

UPDATE_DR

TMS=1
TMS=1

TAP

definido como un cdigo con todos los bits en 1.


SAMPLE/PRELOAD: captura una muestra del estado de las seales
de entrada, y prepara la cadena DR para forzar un valor de precarga

EXIT1_IR

EXIT2_DR

TMS=0

TDI

permite que la cadena BST ignore la existencia del dispositivo


(excepto por el agregado de un retardo de clock). Su valor est

TMS=1

EXIT2_IR

TMS=1

un dado patrn precargado en las patas de salida. Su valor no est


ms definido por la norma (inicialmente era todos ceros)

TMS=1
UPDATE_IR
TMS=0
TEST_LOGIC RUN_TEST
SELECT_IR_SCAN CAPTURE__IR
/RESET
/IDLE
SELECT_DR_SCAN
SHIFT_IR

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

EXIT1_IR

Guillermo Jaquenod, 2001

82

VHDL: Lenguaje de descripcin de hardware


Instrucciones BST

Instrucciones BST
Otras instrucciones opcionales definidas por cada fabricante (en

Opcionales pero definidas en la norma:

este caso ALTERA):

Intest: prepara la cadena BST para realizar un test interno del


dispositivo

UESCODE: propio de los circuitos EEPROM, permite que se lea un

Runbist: permite disparar un autotest y ubicar el registro con el


resultado en la cadena DR

codigo definido por el usuario en instancias de la programacin. Facilita


disponer informaciones tales como version o modelo del producto,

Idcode: permite leer el registro IDCODE (Identification Code) que


indica marca y modelo del chip

nmero de veces que el chip fue reprogramado, u otra informacin clave


programacin ISP: para la programacin en circuito, ALTERA ha

Clamp: parecida a EXTEST permite forzar valores lgicos en las


salidas poniendo al registro ByPass en la cadena DR

definido registros adicionales que permiten controlar los circuitos de


direccionamiento y datos de las celdas EEPROM para su programacin.

Highz: similar a Clamp, para poner ciertas patas en estado de alta


impedancia

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Momentos de uso de BST

Momentos de uso de BST


Debugging del diseo:

Instancias de aplicacion

Un adecuado diseo no slo incluye el diseo en el aspecto

Debugging del diseo

funcional sino tambin para el test

Tests durante el proceso de manufactura

Y as como un prototipo puede tener problemas de

Creacin de vectores

concepcin, tambien puede sufrir los mismos problemas de

Para la validacin estructural del sistema

manufactura que un equipo en produccin

Para la validacin funcional del sistema


Definicin del programa de test

Las herramientas de test en esta instancia deben proveer la

Ejecucin del programa de test

capacidad de generar vectores para:

Diagnosticos sobre dispositivos que no pasan el test


Test y reparacin a posteriori

test de interconexiones
test de memoria
identificacin de zonas no cubiertas por herramientas BST

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Momentos de uso de BST

Momentos de uso de BST


Tests durante el proceso de manufactura

Tests durante el proceso de manufactura

Definicin y ejecucin del programa de test: esto significa no

Creacin de vectores
Para la validacin estructural del sistema: deteccin de
problemas

fsicos

ocasionados

por

el

proceso

de

manufactura (Extest). Se compone de dos grandes etapas


Test del tester
Verificacin de conexiones (cortos, circuitos abiertos,
lineas pegadas a 0 o a 1)
Para la validacin funcional del sistema: deteccin de la

slo definir qu vectores de test se han de aplicar, sino en qu


orden y qu acciones tomar si se detecta una falla. Puede ir
desde un simple PASA/NO_PASA al uso de estmulos
alternativos para identificar con ms precisin la falla
Diagnosticos sobre dispositivos que no pasan el test: esta
accin es muy parecida a la del proceso de diseo, slo que
ac se sabe que la falla es de tipo estructural o funcional, pero
que el diseo es conceptualmente correcto.

operacin correcta de los dispositivos (Intest)

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

83

VHDL: Lenguaje de descripcin de hardware


Momentos de uso de BST
Test y reparacin a posteriori : esta accin es muy parecida a la del
proceso de diseo o al diagnstico durante la manufactura, slo que
ac:
se puede llegar a tener que ubicar inicialmente fallas en
sistemas, ms que en plaquetas o mdulos

Uso de BST en ALTERA

la tarea de test no es hecha en fabrica ni por el fabricante, sino


en el campo y quizas por un tercero, por lo que las herramientas
y mtodos deben ser lo suficientemente simples y bien
documentadas para poder ser utilizadas donde el usuario final
es deseable la mayor automatizacin posible del proceso de test,
e incluso el poder realizarlo en modo remoto.

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Uso de BST en ALTERA

Largo de la cadena BST

Permite el test del ncleo y el PCB a travs de la


periferia (intercalndose en las celdas de entrada/salida)
Disponible en todos los dispositivos de las familias
MAX9000
MAX7000A
FLEX 6K
FLEX 10K

La cadena BST en los chips de ALTERA no cubre todas las


macroceldas, sino solo aquellas que pueden llegar a estar asociadas
a un pin de entrada/salida. Por ejemplo:
La EPM7128S, pese a tener 128 macroceldas, slo puede tener
96 patas de I/O como mximo, en su encapsulado PQFP de 160
patas (92 de I/O y 4 de entradas dedicadas): por ello su registro
BST es de 96x3 = 288 bits
La EPF10K20 posee 189 patas de I/O como mximo (en el
encapsulado de 240 patas) a las cuales se pueden sumar 14
lineas dedicadas a las tareas de configuracion, llevando la
cantidad de pines medibles a 203; posee adems 5 celdas para
uso interno, con lo que su registro BST es de (203+5)x3= 624 bits

Y en ciertos dispositivos de las familias


MAX 7000S (EPM7128S y mayores)
FLEX 8K

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Instrucciones de BST en ALTERA

Bloque bsico de I/O en MAX9000, FLEX10K y


FLEX8K
puntos de
intercalacin

CDIGO DE INSTRUCCIN
OE[7..0]

Modo

FLEX10K FLEX 8K

FLEX 6K

MAX9000 MAX7000S

10 bits

3 bits

3 bits

10 bits

10 bits

SAMPLE/

10H055

3B101

3B101

10H055

10H055

EXTEST

10H000

3B000

3B000

10H000

10H000

BYPASS

10H3FF

3B111

3B111

10H3FF

10H3FF

PRELOAD

D
CLK[3..0]
ENA
CLRN

UESCODE

10H007

-------

---------

IDCODE

10H006

-------

- ? -

--------10H059

--------

ENA[5..0]

CLR [1..0]

10H059

Ntese que no existe la instruccin INTEST


Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Al igual que en la
familia MAX7000S se
acta sobre la salida,
su control de tri-state
y la entrada
A diferencia de la
familia MAX7000S es
posible intercalarse
(adems de capturar
su valor) sobre la
lnea de entrada

Guillermo Jaquenod, 2001

84

VHDL: Lenguaje de descripcin de hardware


Bloque de I/O con BST en MAX9000, FLEX10K
y FLEX8K

Patas de entrada dedicadas en FLEX

SDO
0
1

OE[7..0]

D Q

D Q

CK

CK

D Q

D Q

CK

CK

D Q

D Q

SDO

pin
dedicado

a la lgica
interna

0
1

0
1

CLK[3..0]

0
1

D Q

CK

0
1

D Q

CK

0
1
VCC

0
1

D Q
CK

ENA
CLRN
ENA[5..0]

0
1

CK
CLR [1..0]

SDI SHIFT

CLOCK

0
1
GND

CK

UPDATE

0
1

D Q
CK

MODE
SHIFT

OPERACION NORMAL

Guillermo Jaquenod, 2001

CLOCK

SDI

UPDATE

MODE

Asociado a las patas globales


de reloj, Output Enable y Clear
Es posible capturar el valor
lgico de la entrada, y tambin
intercalarse en dicha lnea (la
cadena de UPDATE tiene un
flipflop)
Para mantener compatibilidad
con los pines no dedicados, la
cadena de CAPTURE tiene
tres flipflops, de los cuales dos
tienen valores fijos

Guillermo Jaquenod, 2001

El lenguaje estandar de test


Otros lenguajes de Test usando
la interfase JTAG

BSDL
Boundary Scan Description
Languaje

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Componentes de un archivo
de descripcin BSDL

BSDL: Boundary Scan Description Language

BSDL es un lenguaje de descripcin de hardware subset de

Entitys: define cosas tales como el nombre del chip, etc.

VHDL, definido en la norma IEEE1149.1b, que permite describir

Generic parameters: parmetro que pueden venir desde fuera de una


entidad, o tener un valor por defecto, tal como el tipo de encapsulado

en forma estndar las caractersticas de un dispositivo capaz de


ser testeado mediante BST

Esta definicin de cada dispositivo, junto con la descripcin

Logical port description: asigna nombres a las patas de entrada/salida, e


indica su tipo:
Use: referencias a definiciones dadas por packages predefinidos
Pin mapping(s): asociacin entre nombres lgicos y nmero de pata

circuital (netlist) de cmo los distintos dispositivos estn

Scan port identification: niveles activos de las lneas JTAG, y fmax de TCK

interconectados en una plaqueta, puede ser usada tanto por

Instruction Register description: valor y longitud de cada instruccin

programas de generacin automtica de vectores de test

Register access description: qu registro es ubicado entre TDI y TDO para


cada diferente instruccin.

(ATPG: Automatic Test Pattern Generator) como por


equipamiento de test automtico (ATE).

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Boundary Register description: identificacin de cada celda de test, a que


pata est asociada, y su modo de control

Guillermo Jaquenod, 2001

85

VHDL: Lenguaje de descripcin de hardware


BSDL: Entidades, parmetros genricos, y
sentencias USE
La descripcin de entidades es tipo VHDL, y define cosas tales como el nombre
del chip, etc. Su sintaxis es:
entity XYZ is {sentencias de descripcin de la entidad}; end XYZ
Un parmetro genrico puede venir desde fuera de una entidad, o tener un
valor por defecto, tal como el tipo de encapsulado. Su forma es:

BSDL: definicin de las puertas de la entidad

Esta descripcin da nombres a las patas de entrada/salida


(normales y de manejo del TAP Controller) e indica su tipo:
entrada, salida, bidireccionales,...
La sintaxis es:

generic (PHYSICAL_PIN_MAP : string := <encapsulado>);


La sentencia USE hace referencia a definiciones dadas por packages
predefinidos

port (

<NOMBRE SIMBLICO : modo tipo >;


<NOMBRE SIMBLICO : modo tipo >);

La descripcin BSDL de la EPM7128SLC84 dice:


entity EPM7128SL84 is
generic (PHYSICAL_PIN_MAP : string := "PLCC84");
use STD_1149_1_1994.all;
....
end EPM7128SL84;
Guillermo Jaquenod, 2001

<NOMBRE SIMBLICO : modo tipo >;

Guillermo Jaquenod, 2001

BSDL: Mapeo de las seales lgicas en el


encapsulado

BSDL: definicin de las puertas de la entidad


En la descripcin BSDL de la EM7128SLC84:
port (------------------------------- I/O Pins ----------------------------------------IO4 , IO5 , IO6 , IO8 , IO9 , IO10 , IO11 , IO12 , IO15 , IO16 , IO17 ,
IO18 , IO20,IO21 , IO22, IO24, IO25 , IO27, IO28 , IO29,IO30,IO31,
IO33 , IO34 , IO35, IO36,IO37 , IO39, IO40,IO41, IO44, IO45, IO46,
IO48, IO49, IO50, IO51 , IO52 , IO54 , IO55, IO56, IO57,IO58, IO60,
IO61, IO63, IO64, IO65, IO67, IO68 , IO69,IO70,IO73,IO74,IO75,IO76,
IO77,IO79,IO80,IO81: inout bit;
IN1 , IN2 , IN83 , IN84 : in bit; --Dedicated Input Pins
TCK , TMS , TDI : in bit; TDO : out bit; --JTAG Ports
VCC : linkage bit_vector (1 to 8); --Power Pins
GND : linkage bit_vector (1 to 8) --Ground Pins
);

Guillermo Jaquenod, 2001

Esta sentencia permite asociar los nombres lgicos definidos al


nmero de pata que corresponde a cada encapsulado
Su sintaxis es:
attribute PIN_MAP of XYZ : entity is PHYSICAL_PIN_MAP;
constant <encapsulado>:PIN_MAP_STRING:=
"OE:1, Y:(2,3,4), A:(5,6,7), GND:8, VCC:9, "&
"TDO:10, TDI:11, TMS:12, TCK:13, NC:14";
donde PIN_MAP_STRING es un subtipo string definido en el
package STD_1149_1_1994

Guillermo Jaquenod, 2001

BSDL: Mapeo de las seales lgicas en el


encapsulado

BSDL: Lneas JTAG

En la descripcin BSDL de la EMP7128SLC84:


attribute PIN_MAP
of EPM7128SL84:entity
is PHYSICAL_PIN_MAP;
constant PLCC84 : PIN_MAP_STRING :=
------------------------------------------------I/O Pins-----------------------------------"IO4:4 , IO5:5 , IO6:6 , IO8:8 , IO9:9 , IO10:10 , IO11:11 , IO12:12 , &
" .... , IO77 : 77 , IO79 : 79 , IO80 : 80 , IO81 : 81 , "&

De este modo se definen los niveles activos, as como la frecuencia de


clock mxima posible en la lnea TCK para el manejo del TAP
Controller. Como ejemplo, en el archivo BSDL de la 7128SLC84 se
define una frecuencia mxima para TCK de 10 MHz:
attribute TAP_SCAN_IN of TDI : signal is true;
attribute TAP_SCAN_MODE of TMS : signal is true;

------------------------------------- Dedicated Input Pins -----------------------------"IN1 : 1 , IN2 : 2 , IN83 : 83 , IN84 : 84 , "&


"TCK : 62 , TMS : 23 , TDI : 14 , TDO : 71 , "&--JTAG ports
"VCC : (3 , 13 , 26 , 38 , 43 , 53 , 66 , 78 ), "&--Power Pins
"GND : (7 , 19 , 32 , 42 , 47 , 59 , 72 , 82 )"; --Ground Pins
Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

attribute TAP_SCAN_OUT of TDO : signal is true;


attribute TAP_SCAN_CLOCK of TCK : signal is (10.00e6,BOTH);

Guillermo Jaquenod, 2001

86

VHDL: Lenguaje de descripcin de hardware


BSDL: cdigos de las instrucciones

BSDL: relacin entre registros e instrucciones

Como estos cdigos no estn definidos en la norma, este campo


indica valor y longitud de cada instruccin. En la EPM7128SLC84:

La descripcin del modo de acceso a cada registro indica qu


registro es ubicado entre TDI y TDO para cada diferente
instruccin.

attribute INSTRUCTION_LENGTH of EPM7128SL84 : entity is 10;

attribute REGISTER_ACCESS of XYZ : entity is


<registro>(<instruccion>[,<instruccion>), "&
....
"<registro>(<instruccion>[,<instruccion>) ";

attribute INSTRUCTION_OPCODE of EPM7128SL84 : entity is


"BYPASS (1111111111), EXTEST (0000000000)," &
"SAMPLE (0001010101), IDCODE (0001011001)";
attribute INSTRUCTION_CAPTURE of EPM7128SL84 : entity is "0101010101";

En la EMP7128SLC84

attribute IDCODE_REGISTER of EPM7128SL84 : entity is


"0000"& --4-bit Version
"0111000100101000"& --16-bit Part Number (hex 7128)
"00001101110"& --11-bit Manufacturer's Identity
"1"; --Mandatory LSB

Guillermo Jaquenod, 2001

attribute REGISTER_ACCESS
of EPM7128SL84 : entity
is "DEVICE_ID (IDCODE)";
Guillermo Jaquenod, 2001

BSDL: descripcin del registro de TEST


perifrico

Descripcion de una pata bidireccional


6 (BC_4,IO81, input, X)

La descripcin del registro de test, finalmente, contiene una


identificacin de cada celda de test, a que pata est asociada, y su
modo de control. En la EPM7128SLC84:
attribute BOUNDARY_LENGTH of EPM7128SL84 : entity is 288;
attribute BOUNDARY_REGISTER of EPM7128SL84 : entity is
--BSC group 0 for dedicated input pin 84
"0 (BC_4,IN84, input, X),1 (BC_4,*,internal, X),2 (BC_4,*,internal, X)," &
--BSC group 2 for I/O pin 81
"6 (BC_4,IO81,input, X),7 (BC_1,*,control,0), 8 (BC_1,IO81,output3,X,7,0,Z),"&
....-- asi sigue hasta completar las 96 celdas triples de la 7128
--BSC group 95 for dedicated input pin 1
"285 (BC_4, IN1, input, X),286 (BC_4, *, internal, X),287 (BC_4, *, internal, X)" ;

Guillermo Jaquenod, 2001

Control
de OE

SDO

285 (BC_4, IN1, input, X):


pin
dedicado

D Q
CK

GND

0
1

285
286

Celda tipo BC_4


Asociada al port IN1
Opera como entrada
Valor inicial desconocido

286 (BC_4, *, internal, X)


287 (BC_4, *, internal, X)

D Q
CK

SHIFT

D Q
CK

0
1

6
D Q

7 (BC_1,*,control, 0)

de la
macrocelda

Celda tipo BC_1


Opera en tareas de control
Valor inicial cero

8(BC_1,IO81,output3,X,7,0,Z)

0
0

D Q

al PIA

D Q

SDI

SHIFT

D Q

CLOCK

UPDATE

MODE

Celda tipo BC_1


Asociada al pin IO81
Opera como salida TriState
Valor inicial desconocido
La celda 7, en 0, la pone en
TriState

Guillermo Jaquenod, 2001

a la lgica
interna

VCC

D Q

0
0

Descripcion de la pata de entrada


dedicada IN1

0
1

Celda tipo BC_4


Asociada al port IO81
Opera como entrada
Valor inicial desconocido

SDO
0

287

CLOCK

SDI

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Celdas tipo BC_4


No asociadas a ningun port
De uso interno
Valor inicial desconocido

HSDL: superset de BSDL

Creado por Texas Instruments, el Hierarchical Scan Description Language


(HSDL) complementa al BSDL, usando las mismas sentencias de VHDL
HSDL permite salir del dispositivo y generar atributos adicionales de la norma
IEEE 1149 indicando cmo los dispositivos IEEE 1149 estn conectados a
nivel de plaqueta y de sistema; para ello agrega dos nuevos packages
Las entidades en HSDL permiten describir tanto modulos como dispositivos.
HSDL cubre tres area no incluidas en BSDL
Descripcin de las redes de interconexin a testear, a nivel de plaqueta o
de mdulo
Descripcin de plaquetas con arquitecturas dinmicas y/o reconfigurables
Facilidad de uso y mejoras en el proceso de diseo interactivo, debug, y
verificacin
BSDL y HSDL pueden ser usados conjuntamente para generar una
descripcion completa del dispositivo en test (unit under test, o UUT).
Guillermo Jaquenod, 2001

87

VHDL: Lenguaje de descripcin de hardware


Bibliografa

Uso de Arrays: modelo de una RAM 64x8

TEXAS INSTRUMENTS: IEEE 1149.1/ JTAG/ BOUNDARY SCAN.


Optimizing Fault Detection for Boundary Scan Testing.
http://www.ti.com/sc/docs/jtag/scbdopt.htm
ASSET-INTERTECH Inc. BOUNDARY SCAN TUTORIAL:
http://www.asset-intertech.com/tutorial/tutorial.htm
ALTERA Corp.: JAM Programming & Test Language Specification,
version 1.1, October 1997
ALTERA Corp.: DIGITAL LIBRAY, September 1998
ALTERA Corp.: USING THE JAM LANGUAGE FOR ISP & ICR VIA AN
EMBEDDED PROCESSOR, Application Note 88, ver.3.0, October
1988.
ALTERA Corp.: Boundary Scan Description Files:
http://www.altera.com/html/atlas/bsdl/bsdl.htm

Guillermo Jaquenod, 2001

TYPE direcciones IS INTEGER RANGE 0 TO 63;


TYPE octeto IS INTEGER RANGE 255 DOWNTO 0;
TYPE ramblock IS ARRAY (direcciones) OF octeto;
ENTITY miram IS PORT (
cs,oe,wr: IN BIT; dir: IN direcciones;
d_ent: IN octeto; d_sal: OUT octeto);
END ENTITY miram;

RAM
64 x 8

cs
oe
wr

Fuente: ASHENDEN

Preguntas

Preguntas
Dibuje la cola de eventos de la seal z antes de la ejecucin
de cada sentencia WAIT y muestre la secuencia de valores
en el tiempo que toma la seal z

Escriba el valor de las siguientes expresiones:


booleanHIGH
booleanLEFT
booleanVAL(1)
positiveLOW
naturalLOW
naturalRANGE
bitRIGHT
bitRANGE
bitLOW
characterPOS(C)
characterVAL(79)
characterPRED(C)
characterSUCC(C)
characterPRED(characterSUCC(C))

Guillermo Jaquenod, 2001

ARCHITECTURE ejemplo OF miram IS BEGIN


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 oe)='1' THEN d_sal <= esta_ram(dir); END IF;
IF (cs AND wr)='1' THEN esta_ram(dir) := d_ent; END IF;
END LOOP;
Loop eterno
END PROCESS memoria;
Loop eterno
END ARCHITECTURE ejemplo ;
Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

En algn package
En algn package
defino los tipos y en
defino los tipos y en
base a ellos el array
base a ellos el array

z <=
wait
z <=
wait
z <=
wait
z <=
wait

Fuente: TERS

Guillermo Jaquenod, 2001

transport
for 5 ns;
transport
for 8 ns;
transport
for 2 ns;
transport
for 1 ns;

1 after 10 ns;
0 after 7 ns;
1 after 10 ns;
0 after 3 ns;

Fuente: TERS

88

You might also like