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