You are on page 1of 88

VHDL: Lenguaje de descripción de hardware

HDLs discretos vs. continuos

VHDL

IMPORTANTE!

Very High Speed Integrated Circuits
Hardware Description Language

Existen lenguajes de descripción de hardware
pensados para el diseño de sistemas continuos
(analógicos), y otros concebidos para trabajar con
sistemas discretos (usualmente binarios)

Breve visión sobre su uso para tareas de síntesis.
Análisis de casos usando ALTERA FLEX10K
y el ambiente de diseño MAX+plus II de ALTERA

Este curso trata sobre lenguajes de descripción
de hardware de sistemas discretos

Nota sobre Copyright: muchas láminas de este curso han sido influenciadas, en mayor o menor medida, por
los libros que se mencionan en la bibliografía, de los cuales se han tomado a veces ejemplos textuales, o en
otros casos ideas para la elaboración de ejemplos propios. Esta múltiple 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?

Características de un HDL

Un lenguaje HDL para descripción de hardware (HDL: Hardware

Description Language) es una herramienta formal para describir

(CONCURRENCIA)

el comportamiento y la estructura de sistemas (usualmente

electrónicos pero a veces también de otros tipos) usando un

Permite describir módulos con acciones que serán evaluadas en
forma secuencial (procedural), donde todo el módulo será visto

esquema textual

Describe actividades que ocurren en forma simultánea

como una acción concurrente más

Usando HDL el diseñador puede describir la operación del

sistema con diferentes niveles de abstracción (o “estilos”):

Posibilita la construcción de una estructura jerárquica, 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 CÓMO hacerlo (algorítmico)

Permite modelizar el concepto de “tiempo”, fundamental para la
descripción de sistemas electrónicos

– 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 especificación

De bajo nivel: permiten definir un circuito a nivel de arquitectura
(FlipFlops, compuertas básicas, ecuaciones lógicas)

De nivel medio: superset de los previos, permiten definir un circuito
en modo jerárquico, así como la generación condicional/iterativa de
hardware; en ciertos permiten el uso de descripciones de
comportamiento (funciones aritméticas, máquinas de estado).

De alto nivel: superset de los previos, no sólo posibilitan mayor nivel
de abstracción, sino que también son usados para la simulación,
para la síntesis del generador de estímulos y el monitor de salidas

– es posible su uso para la de especificación 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 diseño
– Mejor documentación y facilidad de reuso
– Posibilidad de parametrización
– Portabilidad de un diseño. Independencia tecnológica

Como herramienta de simulación
– Disponibilidad de modelos de distintos componentes de
fabricantes variados en HDLs normalizados

– AHDL (ALTERA Hardware Description Language)

– VHDL, VERILOG HDL

– Facilidad para la generación de vectores de test complejos
Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

1

VHDL: Lenguaje de descripción de hardware
HDLs estándar 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 década del 80, como medio de documentación de sus
desarrollos de ASICs. Por este origen, copia muchas características
del lenguaje ADA
• Fué actualizado y corregido en 1993 (VHDL’93)
• Permite la descripción en alto nivel del comportamiento del hardware,
ya sea a nivel de comportamiento (behavior) o de registros (RTL)

HDLs estándar 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 síntesis que soportan VERILOG
toleren sólo un subconjunto del lenguaje completo
– Estas limitaciones pueden deberse a imposibilidades físicas (P.Ej: en un
diseño basado en PLD es imposible fijar externamente el retardo que
añadirá una compuerta, porque eso está predefinido por el tipo de chip)
– O a limitaciones del propio compilador

abstracción a veces oscurece la relación final entre la especificación

• Es un lenguaje de sintaxis más simple que VHDL, pero también
menos potente, y en ciertos aspectos incluso más limitado que AHDL
(por ejemplo, ausencia de construcciones FOR..GENERATE)

de un diseño y los recursos que terminan siendo empleados

• Tiene ciertas similitudes formales con el lenguaje C

• Especialmente útil en diseños MUY complejos, aunque su elevada

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Dónde es posible usar HDL?

Flujo de diseño con VHDL

ESPECIFICACIÓN DEL SISTEMA
Fase del desarrollo

Resultado

Documentación

Análisis

Especificación

Descripción de qué
debe hacerse

Diseño

Código VHDL

Mapeo a una dada
tecnología

Netlists

Simulación

Validación
simulada

Detalle del
funcionamiento

PARTICIÓN HARDWARE/SOFTWARE

Test-Bench y vectores

Prototipo

ESPECIFICACIÓN

Prototipado

Elaboración de cómo
llegar a los resultados

SINTESIS!!

ESPECIFICACIÓN
DE HARDWARE

ESPECIFICACIÓN
DE SOFTWARE

ASIC
FPGA
PLD

SINTESIS!!

Partes
Estándar

• “VHDL for Synthesis” comprende a sólo un subconjunto de las aplicaciones de
VHDL, y emplea sólo parte de las facilidades del lenguaje.

PLAQUETAS
Y
SISTEMAS

SOFTWARE
DISEÑO

• El diseñador de hardware debe estar plenamente conciente de esas diferencias
Guillermo Jaquenod, 2001

Qué es un “estilo de descripción de hardware”?
Es la manera en que el diseñador describe el sistema. Puede ser:
– Comportamiento (Behavioral): detalla la función entrada-salida
del diseño, 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)
Sólo se describe la funcionalidad del sistema, pero ningún
circuito o estructura
No se hace ningún intento de especificar hardware
Sirve tanto para especificación y simulación, como para síntesis
(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 solución en forma
de una máquina secuencial, detallando los registros y la lógica que
los une, sin incluir cómo resolver esa lógica. Es una descripción de

input1, .., inputn

la arquitectura del sistema, pero no de la tecnología
– 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 conexión

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Fuente: ALTERA

2

VHDL: Lenguaje de descripción de hardware
Modelado estructural

Estructura jerárquica

Se describen la funcionalidad y la estructura del circuito
Se aproxima a la descripción del hardware
Se usan señales a las que se asigna valores mediante
ecuaciones lógicas
Es usado mayormente para la síntesis
input1

Componente de mayor nivel

diseño de jerarquía tope
subdiseño tope

output1

subdiseño 2

subdiseño 1

subdiseño 4

Componente1
de menor nivel
Componente1
de menor nivel

Fuente: ALTERA

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

Instancias y Jerarquías
Como elementos constructivos de su
comportamiento, un módulo puede incluir
dentro de sí bloques de menor nivel (otros
módulos) definidos separadamente, los que
serán usados a través de sus puertas,
excitando sus entradas y utilizando los
valores que aparezcan en sus salidas

La inclusión de un módulo dentro de otro de
mayor nivel se llama crear una INSTANCIA
de ese módulo

.....

.....

.....

.....
outputn

inputn

subdiseño 3

Esta facilidad permite generar estructuras
jerárquicas sin restricciones de anidamiento,
así como el reuso de subdiseños

Diseño jerárquico
modulo A

instancia del
módulo B

full_adder
half
adder
half
adder

instancia del
módulo C

otra instancia
del módulo B

OR

módulo full_adder
...
instancia de half_adder
...
instancia de half_adder
....
módulo half_adder
.....

• El diseño jerárquico permite
– descomponer un sistema complejo en subsistemas, y asignar
el diseño de cada subsistema a una persona diferente

módulo B
módulo C

Guillermo Jaquenod, 2001

– generar sudiseños reutilizables
– posibilidad de usar diseños realizados por terceros (IP:
Intellectual Property)
Guillermo Jaquenod, 2001

Encapsulamiento de módulos

La interfase de un módulo con los
demás se realiza mediante puertas,
que pueden ser de entrada, de
salida, o bidireccionales, y esta
interfase es la única parte visible del
módulo por el resto del diseño

El comportamiento interno de un
módulo puede ser definido mediante
diferentes estilos, y sólo puede ser
observado desde el exterior del
módulo por los efectos que provoca
en la interfase

INTERFASE

Bases de VHDL

PUERTAS

Generalidades
Identificadores
Tipos y objetos
Atributos
Operadores

Este tipo de operación permite el
encapsulamiento del diseño

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

COMPORTAMIENTO
INTERNO

Guillermo Jaquenod, 2001

3

VHDL: Lenguaje de descripción 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 léxico: 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 numérico, expresado en la forma de entero (sin punto
decimal), o real (con punto decimal):
– enteros (INTEGER): son números positivos y negativos

5

29 0 -5 999

– punto flotante (REAL): deben incluir un punto decimal, y al menos un dígito antes y
uno después de él.
0.68

• Los reales pueden usar notación exponencial, donde el número 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

Además 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 léxico: caracteres
Los caracteres son literales que se escriben en VHDL encerrándolos
entre comillas simples. Corresponden a los caracteres ASCII
imprimibles:
‘a’ ‘Z’ ‘1’ ‘ ’
Los caracteres han sido descriptos en VHDL por enumeración, 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 número 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 léxico: números

3.1415927

– Sólo pueden contener letras del alfabeto (‘A’ hasta ‘Z’, ‘a’ hasta ‘z’), los números
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 más 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 léxico: 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 ningún carácter (string nulo “”)
– A los fines de la escritura, un string debe caber en una línea. De ser
necesario un string tan largo que no quepa en una línea 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 léxico: bit_strings
En muchas ocasiones los números 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 número deseado expresado en esa base, entre comillas dobles.
–Es importante notar que si se expresa un numero en base octal, cada
número (incluso el ‘0’) es asociado a 3 bits. De igual modo cada símbolo
hexadecimal ocupa 4 bits.Por ejemplo, B”11” no es lo mismo que O”3” o
que X”3”
–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 línea,”
& “se lo arma concatenando dos strings en lineas sucesivas”

Guillermo Jaquenod, 2001

Guillermo Jaquenod, 2001

B”0110_1101”

O”537” X”F5AA”

Guillermo Jaquenod, 2001

4

ejemplos de los cuales taambién pueden verse en el Package STANDARD TYPE integer IS RANGE -2147483648 TO 2147483647. enteros.índigo. type complejo is record real:INTEGER. así se define el tipo NATURAL en STANDARD. etc.verde.vie. es posible declarar un nuevo tipo (como rango restringido del primero)..ma.elemento]). –compuestos: Tipos. type MVL4 is (‘X’.’2’.5 33 Cuál es la diferencia entre ‘Q’ y “Q”? Cuál es la diferencia entre B”1001” y “1001”? Fuente: ASHENDEN Guillermo Jaquenod.’4’) no puedo asignar una variable tipo caso1 a otra de tipo caso2. Los 2 primeros se llaman discretos. de punto flotante.VHD Guillermo Jaquenod. SUBTYPE despegue IS RANGE 10 DOWNTO 0.’3’. 2001 Si defino type caso1 is (‘1’.) –de acceso: punteros Ejemplos de subtipos: subtype nibble is byte (3 downto 0).azul. ….0 TO 999. type byte is array (NATURAL range 7 downto 0) of BIT. Donde el subtipo corresponde a los tipos integer o real según sea la forma de especificar su rango. dado un tipo enumerado pueden definirse subtipos de él como un rango limitado de las opciones enumeradas TYPE dia_semana IS (lu.. SUBTYPE natural IS integer RANGE 0 TO integer'HIGH..jue. imag : INTEGER. end record.999. aunque compartan los mismos posibles valores.01# 2#1#E3 16#F0_0F# 8#31# Cual es la diferencia entre 8#1234# y O”1234”? Convertir a bit-string binarios Escriba los siguientes literales decimales en formato hexadecimal O”176” X”5F” X”0002” 1024 1 256. of) • aunque también existe el agrupamiento (is record . 2001 Tipos definidos por enumeración Su sintaxis es TYPE nombre IS (elemento[.SOH. Para declarar un subtipo entero o real especificando su rango puede emplearse tanto TO como DOWNTO. • un caso muy usual en una matriz o vector (is array . ‘1’.naranja.. 2001 5 . FAILURE). donde los elementos usados para definir los posibles valores del tipo pueden ser identificadores o caracteres. Un objeto de tipo enumerado se incializa por defecto al valor del primer elemento de la lista.VHD de la Library STD se observan ciertas definiciones por enumeración: type BOOLEAN is (FALSE.'?'). '1').’3’. –archivos: para manejo de I/O en archivos Dado un type. voltajes.do).. type arcoiris is (rojo. TRUE). type SEVERITY_LEVEL is (NOTE. type BIT is ('0'. Son dos tipos distintos!!!! Guillermo Jaquenod. en tanto los tipos físicos corresponden a tiempo.0 0.sa.. WARNING.’4’) y type caso2 is (‘1’. y Subtipos en VHDL En VHDL se requiere necesariamente especificar el tipo (type) de cada objeto. llamado subtype Guillermo Jaquenod. y Subtipos en VHDL por enumeracion! Ejemplos de tipos: type word is array (0 to 31) of BIT.. existiendo cuatro clases de tipos: –escalares: pueden ser por enumeración. ERROR. ‘Z’).mie.end record. ‘0’. 2001 Guillermo Jaquenod. 2001 Guillermo Jaquenod.amarillo.’2’.. TYPE real IS RANGE -1.violeta).7e38. 2001 Guillermo Jaquenod.7e38 to 1. Tipos INTEGER y REAL Son tipos numéricos predefinidos. esta decisión puede hacerse explícita poniendo el tipo base antes de RANGE. type CHARACTER IS (NUL. del siguiente modo: SUBTYPE tres_coma_tres IS RANGE 0. A su vez. SUBTYPE no_laboral IS dia_semana RANGE sa TO do. físicos. 2001 Tipos.VHDL: Lenguaje de descripción de hardware Preguntas Preguntas Cuáles de los siguientes identificadores son válidos y cuáles no? Porqué? Cuáles es el equivalente decimal de los siguientes literales? mi-nombre mi nombre mi_nombre mi__nombre _mi_nombre_ #mi_nombre# 8#21# 2#10. Si se revisa el package STANDARD. Alternativamente. los 3 últimos numéricos.

subtype DELAY_LENGTH is TIME range 0 fs to TIME'HIGH.dm. tales como distancia. voltaje. • Las variables sólo pueden ser declaradas en estructuras secuenciales (procesos o subprogramas) antes de BEGIN. llevan asociada una unidad de medida.m. Por ejemplo. Unconstrained Unconstrained Un array puede tener varias dimensiones.dem. 0 TO 63 Filas Filas ) OF BIT. Guillermo Jaquenod..VHD TYPE nombre IS RECORD identificador{. con sintaxis: TYPE nombre IS ARRAY (rango) OF tipo_de_objetos. resistencia e inductancia. 2001 Guillermo Jaquenod. mes: integer RANGE 1 TO 12. con sintaxis: Ir al subdirectorio \MAXPLUS2\VHDL93\STD y editar el package STANDARD. TYPE word_1 IS ARRAY (0 TO 31) OF BIT. Declarar una variable entera representable con 8 bits Definir un tipo “distancia” con unidades desde micrómetros hasta kilómetros (um.km) Guillermo Jaquenod. min = 60 sec.hm. ns = 1000 ns. puede pensarse que una variable es un dato en memoria de la computadora que calcula la sintesis y no tiene analogía directa con el hardware como una señal.horas end units. o quedar abierta (unconstrained). TYPE string IS ARRAY (positive RANGE <>) OF character.).segundos y minutos hr = 60 min.nada).pico y nanosegundos us = 1000 ns. como: type TIME is range -9223372036854775808 to 9223372036854775807 units fs. END RECORD fecha. • Para un mismo tipo fisico es posible definir varias unidades de medida y la relación entre ellas. peso.. Cómo están definidos los tipos BOOLEAN.mm. 2001 Declaración de objetos en VHDL Preguntas y ejercicios Definir un tipo escalar entero llamado dia_mes que comprenda los números 1 a 31 Definir un tipo escalar por enumeracion llamado mes. -. 2001 Guillermo Jaquenod. TYPE alertas IS ARRAY (semaforo RANGE rojo TO nada) OF BIT. TYPE one_hot IS ARRAY (semaforo) OF BIT. signal y file. variable. Columnas Columnas Guillermo Jaquenod.} END RECORD [nombre]. tiempo. 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 indicación de tipo. donde el rango puede definirse de modo explícito (usando TO o DOWNTO). con los nombres de los 12 meses del año 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. que identifica la variable física que se quiere cuantificar. -. Declarar una constante de nombre “tercio” y valor 1/3.cm. corriente. por mención a algún tipo de rango definido. temperatura.unidad base: femtosegundo ps = 1000 fs.VHDL: Lenguaje de descripción de hardware Tipos físicos Tipos compuestos: los ARRAYs • Permiten representar objetos que usan unidades de medida. etc. A una variable se le puede asignar un valor inicial explicito cuando se declara su tipo VARIABLE <nombre> : <tipo> [:= <expresion>]. Además de un literal numérico.ama. Guillermo Jaquenod. capacidad. 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. -.rojo. Por ejemplo: VARIABLE largovar : INTEGER := 16. -. velocidad. año: integer RANGE 1900 TO 2100. ms = 1000 us. y por ejemplo una memoria RAM de 64 palabras de 7 bits puede definirse como: TYPE mem64x8 IS ARRAY ( 0 TO 7 . 2001 6 . TYPE word_2 IS ARRAY (31 DOWNTO 0) OF BIT. -. en STANDARD. 2001 Fuente: ASHENDEN • En VHDL existen cuatro clases de objetos: constant. Por ejemplo: CONSTANT largocte : INTEGER := 16. 2001 UN ARRAY es un conjunto de objetos de igual tipo. 2001 Tipos compuestos: RECORD Preguntas Un RECORD es un conjunto de objetos que pueden ser de distinto tipo.VHD se define el tipo time y el subtipo delay_length.. Array Array de 5 de 5 bits bits Array de 4 bits Array de 4 bits TYPE semaforo IS (verde.micro y milisegundos sec = 1000 ms.amaroj. {...}: tipo. cuya declaración se hace en conjunto con una especificación de tipo • Una constante es un objeto que mantiene siempre su valor inicial CONSTANT <nombre> : <tipo> [:= <expresion>].

y en el caso de inferirse registros ello resultará en el uso innecesario de una importante cantidad de recursos !!!. 2001 Declaración de atributos – Un atributo es una característica posible de asociar a un objeto. -. 2001 Atributos predefinidos en VHDL Atributos predefinidos para tipos enumerados Ciertos atributos se acomodan especialmente a tipos enumerados (aunque también sirven para otros tipos).declaro ubicacion como un atributo de tipo “coordenada”. se tiene: colores’SUCC (amarillo) devuelve azul colores’PRED (amarillo) devuelve rojo colores’POS (amarillo) devuelve 2 Sólo para tipos físicos y discretos Sólo para tipos físicos y discretos colores’VAL (4) devuelve verde colores’LOW devuelve rojo colores’HIGH devuelve rosa colores’LENGTH devuelve 7 oscuro’LEFT vale azul oscuro’RANGE vale azul TO negro ‘BASE sólo se usa junto con otro atributo! ‘BASE sólo se usa junto con otro atributo! oscuro’BASE’LEFT vale rojo oscuro’BASE’RANGE vale rojo TO rosa Guillermo Jaquenod. dado un tipo: TYPE colores IS (rojo. Cuando una señal/variable es tipo INTEGER es importante definir su rango: XX : INTEGER RANGE uu DOWNTO dd (o dd TO uu). y activar o suspender la ejecución de procesos • Durante la simulación. 2001 Ciertos atributos predefinidos de VHDL están pensados para señales. Guillermo Jaquenod. 2001 Guillermo Jaquenod. 2001 7 .rosa). y por eso su alcance no está restringido al interior de un proceso. y debe tener un tipo especificado en su declaración. – si tengo definida una variable posic de tipo “coord”. 2001 Atributos predefinidos en VHDL Guillermo Jaquenod. le puedo asignar el atributo “ubicación” de mi_variable mediante: posic := mi_variable’ubicacion – El uso de atributos puede ser útil para asignar a una dada señal ciertas características requeridas para su posterior síntesis.blanco.defino el tipo “coordenada” TYPE coord IS RECORD X.15). ATTRIBUTE ubicacion: coord. SUBTYPE oscuro IS colores RANGE azul TO negro. 2001 Ciertos atributos ya están predefinidos en VHDL. dada una señal “muestra” definida por: muestra : IN STD_LOGIC_VECTOR(7 DOWNTO 0) Los atributos definidos para rangos de vectores son muestra‘HIGH valdrá 7 muestra‘LOW valdrá 0 muestra‘RIGHT valdrá 0 muestra‘LEFT valdrá 7 muestra‘RANGE valdrá 7 DOWNTO 0 muestra‘REVERSE RANGE valdrá 0 TO 7 muestra‘LENGTH valdrá 8 muestra’ASCENDING será falso Recordarlos! Son MUY usados! Guillermo Jaquenod. definir la codificación a usar para un tipo enumerado Guillermo Jaquenod. Por ejemplo. Por ejemplo. dada una señal S: S’DELAYED (T) genera una nueva señal que copia el valor de S con una demora T S‘STABLE (T) devuelve TRUE si S no ha cambiado durante el lapso previo de tiempo T S‘QUIET (T) devuelve TRUE si no se han asignado nuevos valores a S durante el lapso previo de tiempo T S‘TRANSACTION es TRUE si se ha asignado un nuevo valor a S S‘LAST_EVENT devuelve el tiempo pasado desde el último evento S‘EVENT devuelve TRUE si S ha cambiado Recordarlos! Son MUY usados! Guillermo Jaquenod.verde. Si esto no se hace el compilador asignará 32 bits para su representación.VHDL: Lenguaje de descripción de hardware Declaración de objetos en VHDL • Las señales (signal) sólo pueden ser declaradas en la sección de arquitectura.asigno el atributo a mi_variable y le doy valor ATTRIBUTE ubicacion OF mi_variable:otrotipo IS (10. END RECORD. FILE file_name: file_type_name [[OPEN mode] IS <string>]. antes de BEGIN. -. Por ejemplo.negro. pueden servir para el generador de estimulos del testbench • La declaración 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>]. aunque en general no son sintetizables en hardware. sino que puede ser usado para inteconectar componentes.azul. Por ejemplo. o en momentos futuros que se registran en una cola de eventos default Declaración de objetos en VHDL • Las variables de clase file permiten el manejo de archivos desde VHDL. una señal no se actualiza cuando se analiza la sentencia sino al fin de cada ciclo de simulación. Ejemplo: -.amarillo.Y:INTEGER. • Puede pensarse que un objeto tipo signal representa uno o varios cables de conexionado.

<. en tanto MOD y REM sólo para enteros.low.. resistencia’ASCENDING = TRUE.. loglev’LOW = unknown. ‘HIGH. loglev’ASCENDING = TRUE. Y debe hacerse usando los atributos ‘VAL y ‘POS.’2’. y el resultado es BOOLEAN – de shift: SLL. BOOLEAN. y el derecho un INTEGER – suma y resta: + y -. resistencia’LOW = 0 ohm. ‘LENGTH y ‘ASCENDING de cada uno de ellos type muestra IS bit_vector (15 DOWNTO 0) type numeros IS (‘0’.’5’. END UNITS resistencia.’6’. Preguntas Dados los siguientes tipos definir cuáles son los valores de los atributos ‘LEFT. Guillermo Jaquenod. loglev’HIGH = high. donde los operandos deben ser del mismo tipo. ATTRIBUTE numero_de_pata OF CONTROL:alguntipo IS 23. <=. definir cuales de las siguientes expresiones son válidas.high). * y / están predefinidos para los tipos numéricos (enteros y punto flotante). 2001 El usuario puede definir nuevos atributos que pueden ser asociados a cualquier elemento del lenguaje. donde el operando izquierdo debe ser un array de BIT o BOOLEAN. Y luego preguntar: VHDL ofrece un conjunto de operadores predefinidos sólo para los tipos “primitivos” de VHDL(definidos en el package Standard): – logicos: AND. type loglev is (unknown. loglev’SUCC (unknown) = low. Estos operadores están predefinidos para el tipo numéricos INTEGER y sus subtipos.’3’. Por ejemplo. /= B”10010” * D / D Guillermo Jaquenod.L2: longitud. + B. resistencia’IMAGE (2 kohm) = “2000 ohm”. SRA. 2001 8 . y arrays de ellos – relacionales: =. ATTRIBUTE numero_de_pata : NATURAL. 2001 loglev’RIGHT = high.ELSE. Fuente: ASHENDEN Guillermo Jaquenod. y valor absoluto (ABS ) Texto remarcado: Operadores definidos en VHDL 1993 Los de shift no son soportados por MAX+plus II VHDL IF (CONTROL’numero_de_pata = 23) THEN. loglev’VALUE (“low”) = low. Mohm = 1000kohm. Para ello son necesarios dos pasos: Se define el atributo: S1 := L1 * L2. NAND.tristate). Por ejemplo. XNOR. index_range’VALUE (“20”) = 20. index_range’IMAGE (14) = “14”. ATTRIBUTE tipo_de_salida : SALIDA. resistencia’VALUE (“5 Mohm”) = 5_000_000 ohm.’1’. TYPE resistencia IS RANGE 0 TO 1E9 UNITS ohm. SRL. TYPE superficie IS NATURAL UNITS mmcuad. loglev’IMAGE (undriven) = “undriven”. SLA. XOR B.VHDL: Lenguaje de descripción de hardware Ejemplos de atributos de tipos escalares Dado los tipos siguientes Dado el tipo siguiente: type index_range is range 21 downto 11. para un objeto CONTROL de tipo alguntipo pueden definirse: VARIABLE L1. para trabajar con BITs o BIT_VECTORs debe usarse el operador de concatenación & o hacer el “overload” de + o -. index_range’HIGH = 21. >=.undriven. index_range’ASCENDING = FALSE. TYPE SALIDA IS (pushpull. resistencia’HIGH = 1E9 ohm. loglev’IMAGE (undriven) = 2.opendrain. /=. 2001 Al querer realizar operaciones aritméticas con tipos no numéricos puede ser necesario definir una función de overload o directamente hacer uso de atributos. 2001 Se asocia el atributo al objeto ATTRIBUTE <identificador> OF <objeto:tipo> IS <expresión>. 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 numérico coincide con el valor numérico Y las variables Guillermo Jaquenod. REM. loglev’LEFT = unknown. END UNITS superficie. kohm = 1000ohm. resistencia’RIGHT = 1E9 ohm. 2001 index_range’RIGHT = 11. para tipos BIT. ‘RIGHT. Para A y B de tipo bit_vector de 5 bits de largo. 2001 VHDL: Operadores Guillermo Jaquenod. resistencia’LEFT = 0 ohm. un objeto físico puede ser multiplicado o dividido por un tipo numérico. VARIABLE S1:superficie.’8’. Fuente: ASHENDEN Guillermo Jaquenod.’7’. SRL 3. Los siguientes atributos asumiran los siguientes valores: Los siguientes atributos asumiran los siguientes valores: index_range’LEFT = 21. ATTRIBUTE <identificador> : <tipo del identificador>. MOD. ‘LOW. ‘RANGE.’9’). como A := superficie’VAL(longitud’POS(L1)*longitud’POS(L2)). dando como resultado un valor físico – miscelaneos: exponenciación (**).’4’. Fuente: ASHENDEN Guillermo Jaquenod. >. index_range’LOW = 11. NOR. NOT. ROL. XOR. END UNITS longitud. dados los tipos “longitud” y “superficie” TYPE longitud IS NATURAL UNITS mm. y C y D de tipo TIME. ROR. y de serlo el tipo del resultado A A A A B C C – de multiplicación y división: *. Atributos definidos por el usuario Ejemplo de uso de atributos No es válido hacer: Ejemplos de atributos de tipos escalares == X”F3”. /. OR. ATTRIBUTE tipo_de_salida OF CONTROL:alguntipo IS pushpull. loglev’VAL(1) = low.

.IS .descripcion del nombre y -. BEGIN .) de la entidad o del package...’1’.OF. 2001 9 .. END.’6’.. Guillermo Jaquenod.’6’.. END ENTITY ejemplo_1.-y del comportamiento ARCHITECTURE comporta OF ejemplo_1 IS BEGIN c <= a AND b.b. d <= e.OF.VHDL: Lenguaje de descripción de hardware Preguntas Preguntas Dado el type numeros IS (‘0’.Ej: Max+Plus II) Guillermo Jaquenod.’2’. ARCHITECTURE.IS.. IS.. 2001 “DESIGN FILE” a b LIBRARY.. 2001 Guillermo Jaquenod. consiste en dos partes: Package Declaration y Package Body.’0’). ENTITY.12 DOWNTO 0. END ARCHITECTURE comporta.. y cada una se compone a su vez de varios campos: – una posible referencia al uso de otras “libraries” y “packages” – Un campo primario..’5’.e : IN BIT.’5’.’1’.’4’.’3’. Cuánto Cuánto Cuánto Cuánto Cuánto Cuánto Cuánto vale vale vale vale vale vale vale Dado el type numeros’SUCC (‘3’)? numeros’RIGHTOF(‘3’)? numeros’LOW? numeros’HIGH? numeros’POS(‘3’)? numeros’VAL(2)? numeros’ASCENDING? matrix IS ARRAY(0 TO 15. Cuánto Cuánto Cuánto Cuánto Cuánto Cuánto Cuánto vale vale vale vale vale vale vale numdwn’SUCC (‘3’)? numdwn’LOW? numdwn’HIGH? numdwn’POS(‘3’)? numdwn’VAL(2)? numdwn’ASCENDING? numdwn’SUCC (numdwn’HIGH)? Guillermo Jaquenod... LIBRARY. END..2 TO 31) OF character.USE.. con la descripción de una entre varias posibles arquitecturas (ARCHITECTURE. c.’9’). END... Guillermo Jaquenod..’8’... design unit END..USE.’4’.d : OUT BIT ). e 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 realización interna (ARCHITECTURE) Es posible definir distintas arquitecturas de un mismo bloque funcional -..las puertas ENTITY ejemplo_1 IS PORT ( a.’8’..’2’. – Architecture Construcciones básicas: Entidad Arquitectura Package Configuración • Para definir una posible funcionalidad de un modelo – Package • Colección de información que puede ser referenciada en modelos de VHDL..’7’.. y/o de un “package” – Un campo secundario. 2001 Estructuras de VHDL • Un diseño en VHDL emplea cuatro grandes bloques constructivos: – Entity Bases de VHDL • Para definir la vista externa de un modelo (puertas y parámetros).. asociado a la declaración de una entidad (“entity”)... 2001 Guillermo Jaquenod. 2001 Un ejemplo en VHDL Estructuras de VHDL: organización • La estructura de mayor nivel en VHDL se llama “design file”. Decir cuál es el valor de las siguientes expresiones: matrix’LEFT matrix’LEFT(1) matrix’LEFT(2) matrix’RIGHT(3) matrix’LOW matrix’LOW(2) matrix’HIGH(3) matrix’RANGE matrix’RANGE(2) matrix’ASCENDING(3) matrix’REVERSE_RANGE(2) matrix’LENGTH(3) Dado el type numdwn IS (‘9’.’7’.. • Un “design file” se compone de una o más “design units”. . END. 2001 Fuente: Terés Guillermo Jaquenod..’3’. . – Configuration • Usado para asociar Architectures con Entities. no disponible en varios paquetes de síntesis (P.

llamado bloque “CONFIGURATION”. PORT .). Es un método útil para definir parámetros. buffer). sum. identificador:tipo[:=default]. cnt_dir : string := “up”. 2001 Entidades en VHDL: las puertas • Las puertas de una entidad se declaran con la palabra port.. 2001 La arquitectura de una entidad VHDL • La resolución interna de la función asociada a una dada entidad es resuelta en el bloque “ARCHITECTURE”. su tipo. identificador:tipo[:=default]. que podría asociarse al “schematic” que describe qué hay dentro de un símbolo ARCHITECTURE <identificador> OF <entidad> IS Declaración de señales locales Declaración de constantes locales Declaración de tipos y subtipos locales Declaración de Componentes Declaración de atributos Declaración y cuerpo de Subprogramas BEGIN Instanciación de componentes Asignaciones concurrentes a señales Procesos Activación de procedimientos concurrentes Sentencias Generate END ARCHITECTURE <identificador> . inout.. ENTITY nombre_entidad IS generics declaración de port END ENTITY nombre_entidad. •Estas tres secciones son soportadas por todos los programas de diseño •La sección de configuración es aceptada en pocos casos ARCHITECTURE nombre_arquitectura OF nombre_entidad IS declaración de tipos y subtipos locales declaración de señales locales declaración de componentes BEGIN sentencias de asignación a señales sentencias de procesos instanciación de componentes END ARCHITECTURE nombre_arquitectura. para los modos definidos en STANDARD: – una puerta in puede ser leída (estar en el lado derecho de una asignación ó RHS) pero no puede ser modificada (LHS) – una puerta out puede ser modificada (LHS) pero no leída (RHS) – una puerta buffer es una puerta de salida siempre activa. out... 2001 Fuente: ALTERA 10 . END ENTITY half_add . que asocia el nombre de una entidad a una descripción de un componente. USE nombre_de_package. capaces de transportar parametros o información estática (constante) entre entidades • El campo GENERIC de una entidad define ciertos valores propios de la entidad cuyo valor puede ser cambiado durante la compilación.tphl:time := 5 ns. ). VALUE: STRING := "UNUSED". --se asume CONSTANTE tphz. así como los nombres de las puertas de la entidad con las puertas locales del componente • Este esquema de vinculación facilita el reuso del código y el cambio de “LIBRARIES”. Agregado Agregado en VHDL’93 en VHDL’93 Guillermo Jaquenod. default_value : integer := 1. [GENERIC(. Guillermo Jaquenod. seguida de una listal formal de señales • Cada señal (o grupo de señales de igual tipo) se compone de su <identificador>. • Una entidad. o símbolo.. donde sólo se declara su interfase: –las conexiones de esa caja (puertas) capaces de transportar información variable entre entidades –valores genéricos. es necesario un modo de interconectar entre sí estos bloques.cout: OUT BIT).). 2001 Estructura básica de modelado en VHDL LIBRARY nombre_de library. .] END [ENTITY] [<identificador>] . su modo de operación (in.. • Por ejemplo: ENTITY half_add IS PORT (x. • Las puertas corresponden a señales físicas (signals) y.VHDL: Lenguaje de descripción de hardware Entidades en VHDL: datos genéricos Entidades en VHDL • Una entidad (“entity”) corresponde a la definición de un diseño a manera de “caja negra”.y:IN BIT :=‘0’.. Guillermo Jaquenod. 2001 Guillermo Jaquenod. en tanto una puerta inout se asocia a una puerta bidireccional (por ejemplo: con TRISTATE). 2001 La dupla VHDL “Entidad + Arquitectura” • La separación entre la declaración de una entidad y su arquitectura simplifica cambiar el modo de realización de una función sin afectar a quienes usen ese módulo desde un nivel de mayor jerarquía • Si la descripción de una entidad y su arquitectura se mantienen en archivos separados. MODULUS: NATURAL := '0'. 2001 identificador identificador modo modo tipo tipo Guillermo Jaquenod. tplz : time := 3 ns.descripción de las puertas de la entidad END ENTITY <nombre de la entidad>. sus posibles arquitecturas y los eventuales bloques de configuracion se denominan “DESIGN UNITS” Guillermo Jaquenod.componentes_o_subprogramas. y un eventual valor por defecto para señales de tipo in o inout que queden sin conectar.] [PORT(. DIRECTION: STRING := "UNUSED". en megafunciones parametrizadas • Agregado Agregado en VHDL’93 en VHDL’93 • La sintaxis es: ENTITY <identificador> IS ENTITY <nombre de la entidad> IS GENERIC(CONSTANT tplh. Ambas pueden ser leídas y modificadas Guillermo Jaquenod.

• • Una “library unit” es un conjunto de bloques elementales de diseño (entidades. ps = 1000 fs. b : integer) RETURN boolean.. type TIME is range <.. de componentes. LIBRARY <nombre de la library>. 2001 Guillermo Jaquenod. ERROR. type BIT is (‘0’. arquitecturas y configuraciones: “design units”) El uso de un package se indica con la secuencia: • PACKAGE <package_name> IS Declaración de Constantes Declaración de tipos Declaración de señales Declaración de subprogramas Declaración de Componentes --y otras Declaraciones END PACKAGE <package_name> .us. operadores complejos. 2001 Guillermo Jaquenod. end if. de punto flotante.min. etc... . 2001 La library STD y el package STANDARD • El VHDL estándar tiene dos Packages nativos en la Library STD: • En la library STD el package STANDARD. USE <nombre del package. sec = 1000 ms. 2001 Declaración Declaración del Package del Package Cuerpo del Cuerpo del Package Package Fuente: ALTERA 11 .TRUE)... us = 1000 ns. 2001 Tipos definidos en el package STANDARD Natural Natural Positive Positive Agregados Agregados en VHDL-93 en VHDL-93 PACKAGE BODY <package_name> IS Declaración de Constantes Declaración de tipos Cuerpo de los Subprogramas END PACKAGE BODY <package_name> .ns. tap1. END COMPONENT.ps. ms = 1000 us.ms. else temp := false . definiciones de tipo y subtipo. END PACKAGE filt_cmp. que forma parte de la library STD. constantes.all. estadísticas.std_logic_1164.min. clk. COMPONENT acc port(xh : in std_logic_vector(10 downto 0). tap2. tap3. Guillermo Jaquenod. trigonométricas. subtype NATURAL is INTEGER range 0 to INTEGER’HIGH. o la forma de contabilización del tiempo) se declara la implementación de varios tipos de variable • Esta library y package. TRUE package STANDARD is . etc. define tipos asociados a la creacion de líneas de texto (LINE. y los tipos que define son inherentes al VHDL y no necesitan ser declarados – Standard: donde se definen los tipos lógicos y numéricos básicos – TEXTIO: este package.> units fs. o a diseños realizados por otra empresa.sec. RETURN temp . WARNING.. • Packages de síntesis: estos packages usualmente permiten que la herramienta de síntesis pueda detectar ciertas funciones y sintetizarlas de modo óptimo para su tipo especial de tecnología Guillermo Jaquenod. tap4). TEXT) a partir del tipo STRING (definido en el package STANDARD de STD). y forma parte de una “library”. type BIT_VECTOR is array (NATURAL range <>) of BIT. TRUE FALSE.ps. Es de uso importante para elaborar el generador de estímulos y el monitor de salidas del Test_Bench • Packages matemáticos: suministrados por algunas compañias. yn : out std_logic_vector(11 downto 4)). Guillermo Jaquenod. a partir de ciertos elementos implícitos dependientes de la implementación (como INTEGER y REAL.. de señales.b: integer) IS VARIABLE temp : boolean. Los Packages están formados por una declaración de Package (necesaria). y un cuerpo “Package Body” opcional Físicos Físicos Enumerados Enumerados Carácter Carácter Bit Bit ‘0’. ns = 1000 ps. a diseños previos del usuario. min = 60 sec.. subtype POSITIVE is INTEGER range 1 to INTEGER’HIGH.’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. end units. FAILURE NOTE. USE ieee. end package STANDARD. Guillermo Jaquenod.. type BOOLEAN is (FALSE.us. hr = 60 min. resuelven funciones de conversión. Begin If a < b then temp := true . END PACKAGE BODY filt_cmp .’1’ ‘0’. FAILURE revisar STANDARD. END compare . WARNING.. 2001 Tipos Tipos Escalares Escalares De acceso De acceso Discretos Discretos Boolean Boolean FALSE. ERROR.hr fs.funciones o procedimientos usados de ese package>.sec.VHD en C:\maxplus2\vhdl93\std revisar STANDARD. así como procedimientos para el ingreso e impresión de textos usando los streams de entrada y salida. Packages del VHDL Enteros Enteros Los Packages son una forma conveniente para almacenar y usar innformación útil para todo un modelo.’1’).ns. PACKAGE BODY filt_cmp IS FUNCTION compare (variable a.ms. subtype DELAY_LENGTH is TIME range 0 fs to TIME’HIGH. 2001 Ejemplo de un Package cualquiera LIBRARY ieee. FUNCTION compare (variable a .hr Fuente: ALTERA MAX+plus II Fuente: ASHENDEN PACKAGE filt_cmp IS TYPE state_type IS (idle.VHDL: Lenguaje de descripción de hardware Estructuras de VHDL: “libraries” y “packages” Los Packages en VHDL • • Una “library unit” puede corresponder al diseño en curso (“working library”). first: in std_logic.Está asociada a un subdirectorio • Un “package” es el nombre dado a un conjunto de subprogramas. Tiempo Tiempo fs.VHD en C:\maxplus2\vhdl93\std Guillermo Jaquenod.

‘Z’ : alta impedancia En VHDL la interpretación de los valores ‘X’ (desconocido) y ‘-’ (sin importancia) es distinta al caso habitual en diseño lógico o en AHDL. y los tipos SIGNED y UNSIGNED – std_logic_signed: • funciones aritméticas para STD_LOGIC_VECTOR con signo – std_logic_unsigned: • funciones aritméticas para STD_LOGIC_VECTOR sin signo – IEEE: packages desarrollados por el IEEE – ALTERA. 2001 Entidad E3 –Entre una entidad y la arquitectura elegida para resolverla en una dada aplicación –Entre una arquitectura y una entidad usada como parte de esa arquitectura Guillermo Jaquenod. y desde ese punto de vista el ‘1’ y el ‘-’ son caracteres distintos q <=‘0’. 2001 Arq2 Arq1 Arq2 Arq3 Guillermo Jaquenod.‘1’ : uno. ‘L’ : cero.‘H’ : uno.‘-’ : sin importancia. Estructuras de VHDL: configuracion CONFIGURATION E1A3 OF E1 IS FOR Arq3 END FOR. END CONFIGURATION. • Este package a su vez redefine (overload) los valores de retorno de los operadores lógicos sobre este tipo de variables • STD_LOGIC. STD_LOGIC_VECTOR y overload de las funciones relacionadas con estos tipos – std_logic_arith: • overload de funciones aritméticas. pues no sólo define nuevos tipos de señales. es un subtipo de STD_ULOGIC resuelve los conflictos entre señales fuertes y débiles • no se dará el primer caso. – débiles:‘W’ : desconocido. indicada por WORK. Entidad E1 Entidad E2 Arq1 Arq2 Arq3 Arq1 Al asociar una Entidad con una Arquitectura se definen dos tipos de vinculos: Guillermo Jaquenod. de ejecutarse la sentencia CUIDADO! IF s=“0110--10” THEN q <= ‘1’. donde la ‘X’ se usa para indicar al proggrama de síntesis que un valor puede ser asignado tanto a ‘0’ como a ‘1’ a los fines de optimización. ELSE q <=‘0’. 2001 Guillermo Jaquenod. 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. y esta sentencia equivaldrá a • Eso es así porque se están comparando dos strings de caracteres. 2001 Estructuras de VHDL: la Configuración • • • La configuración 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 simulación. LPM: Packages desarrollados por un dado fabricante – VITAL: package que define ciertos modelos temporales • Pero además existe la llamada Working Library.all. END CONFIGURATION. porque habilita una forma eficiente de chequear alternativas. -. use IEEE. • La Library IEEE contiene los siguientes packages: Una Library puede ser asociada a un subdirectorio. donde se almacena uno o más packages. de conversión. ‘0’ : cero. 2001 12 . 2001 Interpretación de ‘X’ y de ‘Z’ El package IEEE.std_logic_1164. • La Library IEEE Existen Libraries de donde se copian elementos de referencia estándar (llamadas Resource Libraries). tales como: – STD: contiene al Standard Package y es inherente al VHDL – std_logic_1164: • tipos STD_LOGIC. Por ejemplo. En instancias de Síntesis tiene soporte limitado o nulo CONFIGURATION <identifier> OF <entity_name> IS FOR <architecture_name> END FOR. 2001 Guillermo Jaquenod.Std_logic_1164 • El package STANDARD define sólo los valores lógicos ‘0’y ‘1’ para objetos tipo BIT y BIT_VECTOR.01100110 distinto a 0110--10 ! library IEEE. dado un valor s=“01100110”. que es aquel directorio donde el diseño actual está siendo procesado visitar los demás subdirectorios disponibles en C:\MAXPLUS2\VHDL93 buscar en C:\MAXPLUS2\VHDL93\IEEE\ Guillermo Jaquenod. • La necesidad de contar con la posibilidad de modelizar los estados de alta impedancia y el estado desconocido llevó a la creación por el IEEE de un package llamado Std_logic_1164 o MVL9 Alli se define el tipo STD_ULOGIC con 9 posibles valores lógicos: • • – fuertes: ‘U’ : sin inicializar. ‘X’ : desconocido. sino también el comportamiento de los operadores aritméticos y lógicos sobre esos nuevos tipos.VHDL: Lenguaje de descripción de hardware Las Libraries en VHDL • • La Library IEEE es muy usada en VHDL.

sea: SIGNAL temp : STD_LOGIC_VECTOR (7 downto 0). g. y son resueltas de forma concurrente.) – Selecciones. qb <= (qa and not(g xor h))..ELSE Sentencia WITH. son analizados internamente en forma secuencial para su síntesis y/o simulación. asignación simple de señales! Guillermo Jaquenod.. temp <= x”AA” . qb : OUT STD_LOGIC).<= WHEN. usando (WITH.. USE ieee. que si bien describen eventos que acontecen como cualquier otra sentencia concurrente. • BEGIN • qa <= r or t. 2001 Fuente: ALTERA Guillermo Jaquenod. 2001 Guillermo Jaquenod.. y VHDL no es una excepción.ELSE Sentencia CASE Sentencia LOOP Sentencia RETURN Sentencia NULL Sentencia WAIT Cómo se asignan valores a las señales? • Dada una señal se usa el operador <= para asignarle un valor • Dado un array de señales. others => ‘1’). pues en la arquitectura de una entidad (entre BEGIN y END) se definen sentencias concurrentes. • Bases de VHDL Cualquier HDL.. como elementos de interconexión VHDL ofrece tres posibles tipos de asignaciones concurrentes: LIBRARY ieee. hay varias formas de asignarles valores.SELECT Sentencia PROCESS Sentencias BLOCK Guillermo Jaquenod. t. 2001 Asignaciones concurrentes Las señales.) h r.all... usando (. h.. (VHDL’93) – Para asignar un valor a un único elemento del array: temp(7) <= ‘1’. – Para asignar valores sólo a ciertos elementos del array (slicing): temp (7 downto 4) <= “1010”.4=>’0’. inevitablemente describe sucesos que son inherentemente concurrentes. r OR qa t – Asignaciones simples (<=) AND g qb XOR – Condicionales. END ENTITY simp. Por ejemplo. por lo que no importa el orden en que son escritas en el campo de la ARQUITECTURA END ARCHITECTURE logic. t.std_logic_1164. process process signals Asignación a señales Declaración de tipos y constantes Declaracion de atributos de señales Invocación a funciones y procedimientos Sentencia ASSERT Retardos (AFTER) Guillermo Jaquenod.SELECT. ENTITY simp IS PORT(r. y qb son señales (default) qa es una señal interna (buried) que debe ser declarada en el bloque ARQUITECTURA Las asignaciones concurrentes suelen ser usadas para modelar lógica de tipo combinatorio.. ARCHITECTURE logic OF simp IS SIGNAL qa : STD_LOGIC.. en tanto a un grupo emplea comillas dobles (“) Fuente: ALTERA Guillermo Jaquenod. h : IN STD_LOGIC..VHDL: Lenguaje de descripción de hardware Tipos de descripciones en VHDL • • Concurrencia y Secuencialidad Señales y Variables Sentencias de asignación Secuenciales Declaración de variables Asignación a variables Sentencia IF. – Para asignar valores a todos los elementos del array: temp <= “10101010”.ELSE. 2001 Las señales representan vínculos físicos que comunican información entre procesos concurrentes Las señales pueden ser declaradas en los bloques: – Packages: al describir componentes – Entity: al describir las puertas de una entidad – Architecture: al definir líneas internas signals Concurrentes y secuenciales Concurrentes Qué son las señales (Signals) en VHDL • Es por eso que en VHDL se encuentran sentencias de asignación propias de acciones concurrentes y otras exclusivas para procesos secuenciales Declaración de señales Sentencia WHEN. 2001 13 . 2001 • Sin embargo en VHDL aparece la noción de procesos. 2001 Guillermo Jaquenod. signals – Para asignar valores en forma mixta: temp <= (7=>’0’. Bloque signals Bloque Funcional Funcional – Para asignar un valor similar a todos los elementos del array: temp <= (others => ‘1’). Debe notarse que la referencia a un elemento aislado emplea comillas simple (‘).THEN.<= WHEN. g.

. a WHEN sela = ‘1’ ELSE b WHEN selb = ‘1’ ELSE c. busA.busB: IN STD_LOGIC_VECTOR (7 DOWNTO 0). USE ieee.std_logic_1164.ELSE -. END ENTITY octal_mux2to1.ALL. priori : OUT INTEGER RANGE 0 TO 3). 2001 14 . la asignación a realizarse corresponde a la primera que sea válida ( prioridad!! ) q <= y2 Asignaciones condicionales concurrentes: WHEN. END ENTITY prioriencod. END ENTITY decod2a4.min : IN BIT. Fuente del gráfico: SYNPLIFY HDL Analyst Ejemplos: codificador de prioridad 7:3 ENTITY prioricoder8 IS PORT( d : IN BIT_VECTOR(7 downto 1). Por eso se los llama “procesos implícitos”.. END ARCHITECTURE logica.y2.. USE ieee. 2001 [label:] <señal> <= <expresión> WHEN <expresión booleana> ELSE <expresión> WHEN <expresión booleana> .ELSE • ARCHITECTURE logica OF decod2a4 IS BEGIN y0 <= (NOT sel1) AND (NOT sel0). y0. END ARCHITECTURE usowhen. y2 <= (sel1) AND (NOT sel0). Guillermo Jaquenod. LIBRARY ieee.std_logic_1164.multiplexor 2:1 de buses de 8 bits LIBRARY ieee. qb <= (qa and not(g xor h)). ARCHITECTURE usowhen OF octal_mux2to1 IS BEGIN salida <= busB WHEN sel='1' ELSE busA. 2001 Fuente del gráfico: SYNPLIFY HDL Analyst Fuente: DUECK ENTITY prioriencod IS PORT ( max. 2001 Guillermo Jaquenod. r OR ENTITY decod2a4 IS PORT( sel1.ALL.y1. • 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 prioricoder8 . 2001 Porqué? cada salida es función combinatoria de 3 entradas requiere ocho macroceldas. END ARCHITECTURE usowhen. 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. salida: OUT STD_LOGIC_VECTOR (7 DOWNTO 0)).med.sel0: IN STD_LOGIC. ELSE <expresión> WHEN <expresión booleana> ELSE <expresión>. proceso implícito b selb 0 a q 1 sela Guillermo Jaquenod. el término de la derecha de la sentencia de asignación genera una lista de uno o más valores a ser asignados al término de la izquierda instantáneamente y/o en momentos posteriores.. END usowhen .y3: OUT STD_LOGIC). Fuente: ALTERA Guillermo Jaquenod. y1 <= (NOT sel1) AND (sel0).codificador de prioridad Si dos o más expresiones booleanas son ciertas..VHDL: Lenguaje de descripción de hardware Asignaciones simples a señales Ejemplos: decodificador 2 a 4 estilo RTL Formato: <nombre de señal> <= <expresión>. 2001 Asignaciones condicionales concurrentes: WHEN. qa procesos implícitos t AND g qb XOR h Más allá de su simplicidad o complejidad. ENTITY octal_mux2to1 IS PORT ( sel: IN STD_LOGIC. 0 1 y3 -.. 2001 Asignaciones condicionales concurrentes a señales: WHEN. q : OUT INTEGER RANGE 0 to 7). q(2) q(1) q(0) Guillermo Jaquenod. y3 <= (sel1) AND (sel0).ELSE Permite asignar a una dada señal resultados variables en función de la validez o no de expresiones booleanas (parecido a un IF) c y1 sel1 Guillermo Jaquenod. una por cada salida dos funciones combinatorias de 3 entradas solo requiere dos macroceldas Guillermo Jaquenod. qa <= r or t .

Porqué 78? • Deben considerarse TODOS los casos. 9. b WHEN '1'. sólo que los posibles valores constantes de una expresión sólo controlan una única asignación. z : OUT STD_LOGIC. a b c d e f g Quiénes son los OTHERS? seg(3).. Guillermo Jaquenod. "0001" WHEN “00". sel es de tipo STD_LOGIC !! WHEN OTHERS considera los 7 casos restantes Guillermo Jaquenod. y : OUT STD_LOGIC_VECTOR (3 downto 0)). d(1) WHEN B"001". BEGIN WITH codbcd SELECT seg <= B"0000001" WHEN X"0". END mux_8a1. a <= seg(6). Guillermo Jaquenod. d WHEN OTHERS. y(2) y(3) ARCHITECTURE usowith OF decod2a4 IS BEGIN WITH sel SELECT Quiénes y <= "1000" WHEN “11".. c WHEN “10”.d. 3. uso WHEN OTHERS? d(3) WHEN B"011". d : IN BIT_VECTOR(7 downto 0). ARCHITECTURE logic OF mux2a1 IS BEGIN -. a. END ARCHITECTURE logic. sevsegs : OUT BIT_VECTOR (6 DOWNTO END ENTITY bcd7seg. X“3".. END ENTITY bcd7seg.B"0001111" WHEN B"0000000" WHEN X“8".B"1111001" B"0110011" WHEN 4. X“5". 2001 Ejemplos: decodificador 2 a 4 usando WITH Guillermo Jaquenod. 5. X“9". d(5) WHEN B"101".decodificador BCD a 7 segmentos ENTITY bcd7seg IS port ( codbcd : IN INTEGER RANGE 0 TO 9.b.B"1001111" WHEN B"0010010" WHEN X“2". b WHEN “01”. 2001 ENTITY mux_8a1 IS PORT( sel : IN BIT_VECTOR(2 downto 0).SELECT • Parecida a CASE.std_logic_1164.. . WITH sel SELECT q <= a WHEN “00”. USE ieee. a b c d sel 00 01 10 ? Asignaciones condicionales concurrentes a señales: WITH. <expresión> WHEN <constante>. 7.sel:IN STD_LOGIC. y sel(2) sel(1) sel(0) ARCHITECTURE usowhen OF mux_8a1 IS BEGIN MUX8: WITH sel SELECT y <= d(0) WHEN B"000". '0' WHEN OTHERS. son los OTHERS? "0100" WHEN “10".B"1110000" B"1111111" WHEN 8. Guillermo Jaquenod. END usowhen . "0000" WHEN others. END ARCHITECTURE usowith. g <= seg(0).std_logic_1164. END ARCHITECTURE usowith.e. 2001 1. b <= seg(5).b. d(4) WHEN B"100". c <= seg(4).B"0000110" WHEN B"1001100" WHEN X“4". 2001 Asignaciones usando SELECT: el uso de WHEN OTHERS Ejemplos: multiplexor 8 a 1 usando WITH Guillermo Jaquenod.B"0100100" WHEN B"1100000" WHEN X“6". d(7) WHEN B"111". END ENTITY mux2a1.VHDL: Lenguaje de descripción de hardware Asignaciones condicionales concurrentes a señales: WITH.B"1011011" B"1011111" WHEN 6.selected signal assignment WITH sel SELECT z <= a WHEN '0'. "0010" WHEN “01".ALL. y no la ejecución de sentencias varias como en CASE [label:] WITH <expresión> SELECT <señal> <= <expresión> WHEN <constante>.c.g : OUT BIT).B"0001100" WHEN B"1111111" WHEN others. y(0) codbcd y(1) ARCHITECTURE usowith_segment OF bcd7seg IS SIGNAL seg: BIT_VECTOR (6 DOWNTO 0). 0)). X“7". <expresión> WHEN OTHERS.f. 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. una por cada salida ENTITY mux2a1_sig IS PORT ( a. sel(0) sel(1) END ENTITY decod2a4 ..B"0110000" B"1101101" WHEN 2.B"1111011" B“0000000” WHEN OTHERS. d <= e <= seg(2). y en STD-LOGIC cada señal 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.SELECT --. d(6) WHEN B"110". USE ieee. Ejemplos: decodificador BCD a 7 segmentos ENTITY bcd7seg IS PORT ( codbcd : BIT_VECTOR (3 DOWNTO 0). f <= seg(1). 2001 X"1". ARCHITECTURE usoselect OF bcd7seg IS BEGIN WITH codbcd SELECT sevsegs <= B"1111110" WHEN 0. END ARCHITECTURE usoselect. y : OUT BIT). q 2 LIBRARY ieee.ALL. cada salida es función combinatoria de 4 entradas requiere siete macroceldas. Porqué acá no d(2) WHEN B"010". 2001 15 . ENTITY decod2a4 IS PORT ( sel : IN STD_LOGIC_VECTOR (1 downto 0).

tsteq: OUT BIT).. END ENTITY tst_rangos . END ARCHITECTURE tst. 2001 Cuánto valen wires (2). cuyo cambio (ya sea de valor numérico o lógico) activa la ejecución del proceso por un barrido –una sentencia WAIT (aceptada con restricciones por las herramientas de síntesis) lista de lista de sensibilidad sensibilidad • La sintaxis de un proceso es: Un proceso conforma un loop infinito.. tsteq <='1' WHEN enttest=wires ELSE '0'. sale_DOWN(1) y sale_DOWN (0)? Valen ‘1’. END ARCHITECTURE tst. ARCHITECTURE tst OF tst_rangos IS SIGNAL wires: BIT_VECTOR (2 downto 0).constantes. Cuánto vale sale_UP(2) y cuánto sale_UP(0)? 4. que comienza luego de PROCESS. ‘1’ y ‘0’ Cuánto valen sale_UP(2). sino sólo un ordenamiento de dependencias Guillermo Jaquenod. 2001 Guillermo Jaquenod. en vez de concurrente Esta descripción secuencial de la resolución facilita la realización de descripciones algorítmicas. sale_DOWN <= wires. Sin embargo. ARCHITECTURE tst OF tst_rangos IS SIGNAL wires: BIT_VECTOR (2 downto 0). Cuánto vale sale_DOWN(2) y cuánto sale_DOWN (0)? 3. ‘1’ y ‘0’ Cuánto valen sale_DOWN(2). 1. sale_DOWN: OUT BIT_VECTOR (2 DOWNTO 0). El label es opcional! Guillermo Jaquenod. tsteq: OUT BIT). • • • • Guillermo Jaquenod. 2001 [(nombre de señal/es)] [IS] [declaraciones locales: señales. sale_UP <= wires. sale_DOWN <= wires. END PROCESS [label]. 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). END ENTITY tst_rangos . compuesto internamente por un conjunto de sentencias que son analizadas en forma secuencial.<>.. 2001 16 . sale_UP: OUT BIT_VECTOR (0 TO 2). Qué valor deben tener enttest(2). tsteq <='1' WHEN enttest=wires ELSE '0'. Cuánto vale wires (2) y cuánto wires (0)? 2. no implica que una vez en hardware esto signifique una jerarquía temporal. o behaviorales.variables. ‘1’ y ‘1’ Qué valor deben tener enttest(2). ‘1’ y ‘1’ Guillermo Jaquenod..] <sentencias secuenciales>. 2001 Mezclas de (a DOWNTO b) con (c TO d) ‘LEFT B”110” ‘RIGHT ‘1’ ‘1’ Bases de VHDL ‘0’ 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 sólo sirven para definir cuál 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 quién está a la izquierda y quien a la derecha.etc.. BEGIN Guillermo Jaquenod.wires (1) y wires (0)? Valen ‘1’. sale_UP: OUT BIT_VECTOR (0 TO 2). resuelta en forma concurrente con otros procesos. llega hasta END PROCESS y vuelve al inicio [label:] PROCESS Para que un proceso pueda resolverse en cada ciclo de simulación se requiere algún medio de detención y activación.VHDL: Lenguaje de descripción 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). enttest(1) y enttest(0) para que tsteq valga ‘1’? Deben valer ‘0’. 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. BEGIN wires <= B"110".BEGIN. • 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. sale_UP(1) y sale_UP(0)? Valen ‘0’. BEGIN wires <= B"110". sale_DOWN: OUT BIT_VECTOR (2 DOWNTO 0). 2001 Otras acciones concurrentes: los PROCESOS • • • • Un proceso se comporta como una única sentencia. que puede ser una lista de sensibilidad o alguna de las 3 posibles variantes de la sentencia WAIT. sale_UP <= wires.

X4 <= NOT(X). USE ieee. WAIT UNTIL X=‘1’ FOR 10 ns. X3 PROCESS BEGIN WAIT UNTIL X=‘1’. END IF. Por su lado. ENTITY wdff IS PORT ( d. q <= d. END PROCESS.ALL.b. 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 síntesis. se satisface (se sale de WAIT) si alguna de las 3 condiciones es válidas Ejemplos de WAIT a.. una función o un procedimiento. END PROCESS. un lazo LOOP) hasta el cumplimiento de un dado evento: – [label:] WAIT ON <lista de sensibilidad>. ELSIF y=‘1’ THEN q<=b. A la vez: WAIT FOR 2 ns. • De igual modo. END PROCESS. no importa de qué valor a qué valor – [label:] WAIT UNTIL <condición>. ATENCION: WAIT FOR no es sintetizable! [label:] WAIT ON <lista de sensibilidad>. • Hay un proceso implícito: PROCESS (qa. 2001 17 . y que sólo pueden almacenar valores temporarios dentro de esa estructura. definida mediante: TYPE semáforo IS (rojo. el proceso se detiene hasta el momento en que la condición cambia de FALSA a VERDADERA – [label:] WAIT FOR <expresión temporal>. 2001 Sentencias asociadas a eventos: ejemplos del uso de WAIT Dada una variable luz. indica las reglas que debe cumplir un conductor frente al semáforo en una intersección. Guillermo Jaquenod. X3 <= NOT(X).c. 2001 Un WAIT UNTIL al comienzo de un proceso es el único tipo de WAIT soportado por MAX+plus II VHDL Guillermo Jaquenod.d: eventos para WAIT ON a. X4 PROCESS BEGIN X5 <= NOT(X). 2001 Guillermo Jaquenod. puede ser usada en procesos de simulación.c.g.f. la sentencia: WAIT ON luz. 2001 Diseño de un Flipflop usando WAIT LIBRARY ieee.ama.c: eventos para WAIT UNTIL a. la resolución del proceso se detiene hasta que alguna de las señales en la lista de sensibilidad cambia. la sentencia IF luz=(rojo OR ama) WAIT UNTIL luz=verde. END PROCESS. [label:] WAIT UNTIL <condición>. un procedimiento. y la sintaxis de su uso es: WAIT UNTIL espera a que la condición pase de falsa a verdadera => flanco positivo! SHARED VARIABLE <nombre> : <tipo>. 0 f 10 20 30 40 Guillermo Jaquenod. [label:] WAIT FOR <expresión temporal>. asociadas a eventos: WAIT La sentencia WAIT ofrece 3 variantes para detener la resolución de un conjunto de sentencias secuenciales (un proceso. WAIT ON X.f. X2 PROCESS BEGIN WAIT ON X. la resolución se detiene por un dado tiempo. q : OUT std_logic ). ARCHITECTURE usowait OF wdff IS BEGIN PROCESS BEGIN WAIT UNTIL reloj='1'.no hay lista de sensibilidad! d X1 PROCESS BEGIN X2 <= NOT(X).g. detiene el proceso hasta que cambie alguna luz.verde).b. END IF.VHDL: Lenguaje de descripción de hardware Asignaciones concurrentes y procesos implícitos • Se ha visto que el cambio de valor de cualquiera de las variables definidas en la lista de sensibilidad de un procesos activa su evaluación • Un bloque combinatorio puede ser entonces visto como un proceso “implícito” donde todas las variables en juego están en la lista de sensibilidad. END PROCESS.b.. END PROCESS. • Por ejemplo q <= a WHEN x=‘1’ ELSE b WHEN y=‘1’ ELSE c. No sintetizable!!! No sintetizable!!! Las 3 variantes pueden combinarse entre sí.g.h: eventos para WAIT FOR X a b PROCESS (X) BEGIN X1 <= not (X).h) IS BEGIN Sentencias de control de procesos.d: eventos para WAIT ON a.SELECT y la construcción secuencial CASE. END ARCHITECTURE usowait. antes del BEGIN. END PROCESS. hay similitud entre la construcción concurrente WITH. 2001 MAX+plusII sólo soporta una instrucción wait until para una señal simple Otras variedades de wait (ej: wait on) o señales complejas no son toleradas para la síntesis .c: eventos para WAIT UNTIL e. qb<=(qa and not(g xor h)).. X5 e No sintetizable!!! No sintetizable!!! Guillermo Jaquenod.y) IS BEGIN IF x=‘1’ THEN q<=a. • VHDL’93 agrega las variables globales. • E incluso para una asignación simple qb <= (qa and not(g xor h))..std_logic_1164. c g h 50 60 70 Fuente: SJOHOLM Variables locales y globales • Al definir las variables se indicó que sólo pueden ser declaradas en un proceso. 2001 Guillermo Jaquenod. SIGNAL luz:semáforo.c.END CASE. ELSE q<=c. END ENTITY wdff. No es soportado por MAX+plus II VHDL No es soportado por MAX+plus II VHDL Guillermo Jaquenod. y la sentencia WAIT ON x1 UNTIL x2=‘1’ FOR x3 ns.x.reloj : IN std_logic. que pueden ser usadas para compartir información entre distintos procesos secuenciales (pero no ser usadas fuera de ellos en sentencias concurrentes. END PROCESS. Es decir no pueden ser usadas para sacar información fuera de la estructura secuencial donde son declaradas.h: eventos para WAIT FOR e. • equivale a PROCESS (a.

ELSE <sentencia>. PROCESS BEGIN IF nclr=‘0’ THEN data_alu <= 0. s3. <sentencia>. <sentencia>.. END PROCESS. BEGIN s1 <= s2.luego de esta sentencia v2 vale 2 ... s2 <= s1.r.hasta acá s1 sigue en 0 y s2 en 1 WAIT FOR 1 ns. sólo usable dentro de PROCESOS. Por ejemplo: SIGNAL data_alu:INTEGER.. es como si estas sentencias quedaran pendientes y luego se ejecutaran en un tiempo “cero”. ENTITY octal_mux2to1 IS PORT (sel: IN STD_LOGIC. todas a la vez. una por cada salida Fuente del gráfico: SYNPLIFY HDL Analyst 18 .THEN: Ejemplo • PROCESS(a.. Guillermo Jaquenod. y la actualización de la variable con el valor de la expresión es realizada inmediatamente Ejemplo: si se intercambia el orden el resultado final es distinto . • Si a una misma señal se le asignan dos valores distintos dentro de una serie de sentencias secuenciales.recien antes del wait s2 va a 0 y s1 s3 <= s1. ELSE .al llegar a wait se le asigna a s1 el valor de s2 -- •• CUIDADO! No confundirse: Si a una misma señal se le CUIDADO! No confundirse: Si a una misma señal se le asignan dos valores dentro de dos procesos secuenciales asignan dos valores dentro de dos procesos secuenciales diferentes.. será necesaria alguna funcion de resolución! Guillermo Jaquenod.std_logic_1164. USE ieee.. -.. . ELSE q <= t. ELSIF b = ‘1’ THEN q <= s... END IF. s1 <= s2.. ELSIF <expressión> THEN <sentencia>.. -. esta característica es útil para definir asignaciones por “default” Opera como una única sentencia que habilita el procesamiento secuencial o no de otras sentencias..... Estas asignaciones son SIEMPRE secuenciales. -.. END PROCESS. sólo es válida la última asignación. definiendo una prioridad de hecho PROCESS SIGNAL s1.SON SECUENCIALES! PROCESS VARIABLE v1. 2001 IF . 2001 cada salida es función combinatoria de 3 entradas requiere ocho macroceldas.t) BEGIN IF a = ‘1’ THEN q <= r.. salida: OUT STD_LOGIC_VECTOR (7 DOWNTO 0))..s. será necesaria alguna funcion de resolución! diferentes.luego de esta sentencia v1 vale 1 v2 := v1 + 1.se superpone la asignacion previa a s1 -. Guillermo Jaquenod.. s2 <= s3. WAIT FOR 1 ns. En este caso no importa cuál de las sentencias se escribe primero PROCESS SIGNAL s1. END ARCHITECTURE usowhen.. busA. END IF..busB) BEGIN IF sel='1' THEN salida <= busB. END PROCESS.. -. s3: INTEGER := ‘0‘.acá s3 pasa a uno un nanosegundo después END PROCESS. Guillermo Jaquenod.valor inicial BEGIN v1 := v1 + 1.. Proceso “implícito” Las sentencias son analizadas secuencialemente. END ENTITY octal_mux2to1. BEGIN s1 <= s3.. 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. ELSE salida <= busA. -.busA. s2 <= s1.. ARCHITECTURE usowhen OF octal_mux2to1 IS BEGIN PROCESS (sel..b. END PROCESS.. ELSIF pass=‘1’ THEN data_alu <= data_A. SIGNAL s2: INTEGER := ‘1‘. cuando los valores a asignar en TODAS las asignaciones ya han sido resueltos. <sentencia>. -..multiplexor 2:1 de buses de 8 bits como PROCESO LIBRARY ieee.. END IF. -. END PROCESS. 2001 Guillermo Jaquenod. 2001 IF <expressión> THEN <sentencia>.... 2001 Asignaciones a señales en un proceso Las sentencias de asignación a señales se efectivizan recien al final de cada ciclo de simulación..v2: INTEGER := 0..ALL. cuando un proceso se detiene...busB: IN STD_LOGIC_VECTOR (7 DOWNTO 0). WAIT FOR 1 ns. y resulta en circuitos con codificación de prioridad cuando es sintetizada en hardware Guillermo Jaquenod. 2001 Asignaciones múltiples a señales Asignaciones condicionales en procesos: IF • Dentro de un proceso secuencial. las sentencias de asignación a señales se efectivizan recien al final de cada ciclo de simulación. WAIT FOR 1 ns. 2001 Fuente del gráfico: SYNPLIFY HDL Analyst Uso de IF en PROCESOS combinatorios -. Es una sentencia secuencial.VHDL: Lenguaje de descripción de hardware Asignaciones a variables en un proceso Las sentencias de asignación a variables son de la forma [label:] <nombre de variable> := <expresión>. s2..

• ASIGNACIONES MULTIPLES: Si a una misma señal se le asignan dos valores dentro de un mismo bloque secuencial en un proceso. ELSE output2 <= ‘0’. END PROCESS.<sentencia>..ALL.. b.... excluyentes IF current_state = (s1 | s3 | s4) Para calcular output3 se THEN output1 <= x.. END PROCESS. 2001 01 q 10 11 sel 2 <= <= <= <= a. output2 <= ‘0’. ELSE output3 <= ‘0’. ARCHITECTURE a OF bufferts IS data BEGIN PROCESS (oe.x. output3 = z and END PROCESS. vale la última asignación! • No hay colisión y no es necesaria ninguna resolución • Y el código puede ser más simple PROCESS(current_state.<sentencia>. que las salidas output(i) output2 <= ‘0’. END IF. 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.THEN separadas . a b sel0 sel1 c d Guillermo Jaquenod. USE ieee. •• CUIDADO! No olvidar: Si a una misma señal se le CUIDADO! No olvidar: Si a una misma señal se le asignan dos valores dentro de dos procesos secuenciales asignan dos valores dentro de dos procesos secuenciales diferentes. ELSE output1 <= ‘0’. END IF. d.s8 sean ELSIF current_state = (s0 | s2 | s5) verdaderas pero también THEN output2 <= y. a c..THEN • PROCESS(current_state. END IF. IF current_state = (s0 | s2 | s5) THEN output2 <= y. para evitar la síntesis de codificadores de prioridad Ésto reduce la logica. donde se sabe output1 <= ‘0’... IF current_state = (s6 | s7 | s8) THEN output3 <= z..THEN Fuente: ALTERA Guillermo Jaquenod.y. ELSE triout <= data.. su uso es habitual al describir máquinas de estado. END PROCESS.. 2001 • • PROCESS(current_state. que s1. END IF. 2001 Uso eficiente de IF .. 2001 19 . o ‘TO’ (o DOWNTO) para expresar un rango. data:IN STD_LOGIC. • En el campo <constante> cada posible valor debe figurar una y sólo una vez. c. ELSIF causa el uso de lógica innecesaria! END IF. triout : OUT STD_LOGIC). b. son mutuamente output3 <= ‘0’. ENTITY bufferts IS PORT ( oe. END IF. pudiendo emplearse ‘|’ (el operador OR) para agrupar posibles valores..z) BEGIN output1 <= ‘0’. BEGIN CASE sel IS => q WHEN “00” => q WHEN “01” => q WHEN “10” WHEN OTHERS => q END CASE.. el cableado. Guillermo Jaquenod. .. IF current_state = (s0 | s2 | s5) THEN output2 <= y. será necesaria alguna funcion de resolución! Fuente: ALTERA Guillermo Jaquenod. IF current_state = (s1 | s3 | s4) THEN output1 <= x. 2001 Uso eficiente de IF . WHEN OTHERS <sentencia>. IF current_state = (s6 | s7 | s8) THEN output3 <= z. triout Uso eficiente de IF .z) Tómese el ejemplo BEGIN siguiente.y.std_logic_1164. chequea que s6. output3 <= ‘0’. END CASE..z) BEGIN IF current_state = (s1 | s3 | s4) THEN output1 <= x. END IF.x.THEN mediante defaults Cómo corregir el ejemplo previo? Usando para cada salida sentencias IF.VHDL: Lenguaje de descripción de hardware Uso de IF en PROCESOS combinatorios LIBRARY ieee. data) BEGIN IF oe = '0' THEN triout <= 'Z'. WHEN <constante> => <sentencia>. 2001 Asignaciones condicionales en procesos: CASE Ejemplo: un multiplexor 4:1 PROCESS(sel. y evitar la inferencia de elementos de memoria [label:] CASE <expresión> IS WHEN <constante> => <sentencia>. • La sentencia final WHEN OTHERS permite definir la acción ante los posibles valores aun indefinidos del campo constante.x. END PROCESS. oe END ENTITY bufferts. a. 2001 00 b c d requiere sólo 2 macroceldas operando en Cascade Chain q Guillermo Jaquenod. END IF. d) Guillermo Jaquenod..<sentencia>.y. END ARCHITECTURE a.. 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. . será necesaria alguna funcion de resolución! diferentes.s5 sean falsas ELSIF current_state = (s6 | s7 | s8) THEN output3 <= z.

FOR LOOP. b: OUT INTEGER RANGE 0 TO 3).<sentencia>.. END CASE..<sentencia>.s) BEGIN IF (d = '1') THEN output <= "11111111". Rango Rango WHEN 24 DOWNTO 16|27 => b <= 2.. WHEN 2 => sal <= B"11011111". WHEN OTHERS => y <= '0'. END ENTITY case_rango. ELSE CASE s IS WHEN 0 => sal <= B"01111111". c. BEGIN PROCESS (d. d) BEGIN CASE sel IS WHEN “00” => q <= a.. END mux4to1. 2001 20 . WHEN 3 => sal <= B"11101111". Porqué acá uso WHEN B"10" => y <= d2. END mux4case. y <= sal .d1.. WHEN 5 => sal <= B"11111011". END dmux8. END PROCESS micase. El uso de hardware es más evidente y predecible El compilador obliga a definir todos los casos. d WHEN OTHERS.d3: IN BIT. 2001 Ejemplos: demux 3:8 negado tipo 74138 ENTITY dmux8 IS PORT( s: IN INTEGER Range 0 to 7. a. END PROCESS. por: la posibilidad de inferir registros (IF incompletos) generar circuitos de complejidad innecesaria (prioridades indeseadas) El uso de sentencias CASE es más conveniente: q 2 Permiten reemplazar la enunciación explícita de sentencias secuenciales. WHEN “10” => q <= c.. b WHEN “01”. WHEN OTHERS? WHEN B"11" => y <= d3. y: OUT BIT). que varían en relación a las condiciones que determinan el final de la iteración..<sentencia>... END LOOP label. • Para ello se usa el carácter ‘|’ que considera el OR de esos casos ARCHITECTURE rangovar OF case_rango IS BEGIN micase: PROCESS(a) • También puede BEGIN especificarse un rango OR OR CASE a IS de valores WHEN 0|28 => b <= 0. WHEN 4 => sal <= B"11110111". La sentencia LOOP permite tres construcciones distintas: LOOP. evitando la inferencia indeseada de registros [label:] FOR <variable local> IN <rango> LOOP <sentencia>. 2001 Ejemplos: multiplexor 4 a 1 usando CASE ENTITY mux4case IS PORT( d0. END PROCESS.. en forma de un lazo de iteración. sal5 lsb sal4 sal3 sal2 sal1 ena sal0 Comparación entre CASE y WITH. WHEN OTHERS => q <= d. END CASE. 2001 El uso de sentencias IF debe ser controlado cuidadosamente. 2001 Proceso Explícito WITH sel SELECT q <= a WHEN “00”.. c WHEN “10”. WHEN B"01" => y <= d1. WHEN 6 => sal <= B"11111101". 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 1 to 15 => b <= 1.VHDL: Lenguaje de descripción 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. s2 s1 s0 d y7 y6 y5 y4 y3 y2 y1 y0 msb sal7 sal6 . END CASE.d2. d: IN BIT.. WHEN “01” => q <= b. s(1) s(0) Asignaciones condicionales en procesos: CASE usando rangos u OR Guillermo Jaquenod. Rango + OR Rango + OR END CASE. 2001 Guillermo Jaquenod. Fuente: ALTERA Guillermo Jaquenod. y WHILE LOOP. 2001 00 01 10 11 PROCESS(sel. b. Distintas formas de incluir Distintas formas de incluir múltiples casos en una múltiples casos en una sola línea sola línea Guillermo Jaquenod. y: OUT BIT_VECTOR(0 to 7)). y además es de tipo secuencial (permite usar asignaciones múltiples para definir defaults) Proceso Implícito Quiénes son los OTHERS? a b c d sel Guillermo Jaquenod. END a. Recomendación: donde pueda reemplace IF por CASE Guillermo Jaquenod. FOR LOOP y WHILE LOOP IF-ELSE versus CASE Guillermo Jaquenod. END ARCHITECTURE rangovar... Iteraciones en procesos usando LOOP. END IF. Más próximo al comportamiento de una tabla de verdad Usado por el MAX+plus II para definir la tabla de transición de estados en máquinas de estado [label:] WHILE <expresión booleana> LOOP <sentencia>. No induce prioridades [label:] LOOP <sentencia>. En el primer caso el lazo debe incluir al menos una sentencia WAIT. WHEN 1 => sal <= B"10111111". WHEN OTHERS => b <= 3. END LOOP label. WHEN OTHERS => sal <= B"11111110". ARCHITECTURE a OF dmux8 IS SIGNAL sal : BIT_VECTOR(0 to 7).SELECT • Ambas sentencias comparan una expresión contra una tabla de valores CONSTANTES y operan en consecuencia • Pero CASE permite describir varias sentencias en cada caso. s: IN BIT_VECTOR (1 downto 0). END PROCESS. END LOOP label.

2001 Guillermo Jaquenod. END ARCHITECTURE usoloop. b. PORT (entradas : IN BIT_VECTOR (fanin-1 DOWNTO 0). END ARCHITECTURE ripple. END IF. • Tanto para NEXT como para EXIT hay dos posibles modos. VARIABLE carry : STD_LOGIC. 2001 21 .por defecto: 4 bits PORT (a : IN STD_LOGIC_VECTOR (num_bits DOWNTO 1). END. END PROCESS xor_loop.. estas sentencias se comportan como las sentencias CONTINUE y BREAK del C. una PROCESS ( d ) VARIABLE num_bits : INTEGER. m := 4. Structural? Fuente: ALTERA Guillermo Jaquenod. sin indicar su rango! END ENTITY generador_paridad_impar. sum <= vsum. END LOOP. -. sum := sum + data (i).. por cada salida BEGIN num_bits := 0. q <= num_bits. Guillermo Jaquenod. -. ARCHITECTURE maxpld OF proc IS requiere solo dos BEGIN macroceldas. para sumar los términos positivos de un vector: VARIABLE sum : INTEGER.acá k sigue valiendo 7 y m vale 15 Guillermo Jaquenod. END ENTITY sumpara. BIT_VECTOR. entradas(n-2) entradas(n-3) ------------ARCHITECTURE ejemplo OF and_parametrizada IS ------------BEGIN entradas(1) proceso: PROCESS (entradas) entradas(0) VARIABLE tempo: BIT := ‘1’. ENTITY sumpara IS GENERIC(num_bits : INTEGER:= 4). paridad <= tempo. USE ieee. cin) VARIABLE vsum : STD_LOGIC_VECTOR (num_bits DOWNTO 1). Behavioral o ENTITY generador_paridad_impar IS PORT ( entra: IN BIT_VECTOR. fanin: POSITIVE := 4). END LOOP. carry := (a(i) AND b(i)) OR (carry AND (a(i) OR b(i))). siendo inválido cualquier intento de cambiar este valor ex1: FOR i IN 1 TO 10 LOOP . END LOOP ex1. dentro del LOOP esta variable local deshabilita cualquier otra posible variable de igual nombre k := 7. FOR i IN 1 TO num_bits LOOP vsum(i) := a(i) XOR b(i) XOR carry. sumapos: FOR i IN data’RANGE LOOP NEXT sumapos WHEN data(i) <= 0. -. END LOOP sumapos. END IF. entradas(n-1) END ENTITY and_parametrizada. END LOOP. BEGIN FOR i IN entradas’LENGTH-1 DOWNTO 0 LOOP IF entradas(i) = ‘0’ THEN tempo := 0. sum := 0. cada salida es q :OUT INTEGER RANGE 0 TO 3 ). salida <= tempo AFTER retardo.std_logic_1164. • Además. 2001 Controles de LOOP: NEXT y EXIT • Para las estructuras LOOP existen dos sentencias capaces de alterar la iteración: NEXT y EXIT. salida: OUT BIT). sin indicar su rango! ARCHITECTURE usoloop OF generador_paridad_impar IS BEGIN xor_loop: PROCESS (entra) IS VARIABLE tempo: BIT. función combinatoria END ENTITY proc. END PROCESS.VHDL: Lenguaje de descripción de hardware Ejemplo: iteraciones usando LOOP Generador de paridad: LOOP de rango abierto -. 2001 Ejemplo: AND(N) con parametros y LOOP Guillermo Jaquenod. END ARCHITECTURE maxpld. 2001 Ejemplo: suma(N) con parametros y LOOP LIBRARY ieee. cin : IN STD_LOGIC. i := 4. de un vector de 3 entradas. y sólo son soportadas por algunas las herramientas de síntesis. END LOOP. BEGIN tempo := '0'. END LOOP ex2. 2001 Behavioral o ARCHITECTURE ripple OF sumpara IS Structural? BEGIN PROCESS (a. END PROCESS. Guillermo Jaquenod. b : IN STD_LOGIC_VECTOR (num_bits DOWNTO 1). cout <= carry. absoluto y condicional: – NEXT y NEXT WHEN <condición> – EXIT y EXIT WHEN <condición> • Por ejemplo.vector de “rango abierto” paridad: OUT BIT). -. END PROCESS proceso. • Sólo el valor de la <variable de iteracion> puede ser usado en las asignaciones. FOR i IN d'RANGE LOOP IF d(i) = '1’ THEN num_bits := num_bits + 1.ALL. sum : OUT STD_LOGIC_VECTOR (num_bits DOWNTO 1)). END LOOP..cuento la cantidad de unos en una palabra “d” ENTITY proc IS PORT (d :IN BIT_VECTOR (2 DOWNTO 0). Sólo se dice que entra es Sólo se dice que entra es BIT_VECTOR. cout : OUT STD_LOGIC..se inicializa en ‘1’ para paridad par FOR i IN entra'RANGE LOOP tempo := tempo XOR entra(i). ex2: FOR k IN 1 TO 15 LOOP m := k. ENTITY and_parametrizada IS GENERIC (retardo: TIME := 10 ns. BEGIN carry := cin. salida Guillermo Jaquenod. 2001 Alcance de la variable de iteración en un FOR En una sentencia FOR <variable local> IN <> LOOP .

2001 Variables en procesos Combinatorios Uso de señales y de variables LIBRARY ieee. END PROCESS. WHEN 1 => q <= i1. USE ieee.’1’) una del tipo STD_LOGIC tiene 9 valores posibles. y por lo tanto se agregan los recursos necesarios para ello (es decir. END PROCESS. Guillermo Jaquenod. 2001 Guillermo Jaquenod. END IF.data) BEGIN IF enable = '1' THEN q <= datos. a : IN BIT. data: IN STD_LOGIC. datos D Q q END IF. c:OUT BIT). 2001 Guillermo Jaquenod. END PROCESS. se asume que se desea que ésta mantenga el valor previo. END CASE. ENTITY mi_latch IS PORT (datos.Ej: AHDL) si a una señal no se le asigna un valor.. END CASE. pero. CASE val IS WHEN 0 => q <= i0. 0 data 1 enable q Cascade In Carry In Data1 Data2 Data3 Data4 PRN 4 inp.. q : OUT BIT).ALL. q : OUT STD_LOGIC). END ENTITY cmb_var. END ENTITY cmb_var. USE ieee. ELSE val <= val + 1. ENTITY cmb_var IS PORT(i0. ARCHITECTURE logic OF cmb_var IS SIGNAL val : INTEGER RANGE 0 TO 1. pero funciona como se desea???? ahora se ha logrado que val se actualice en el momento en que es le asignado un valor. BEGIN IF (a = '0') THEN val := val.. END ENTITY mi_latch. END maxpld. ARCHITECTURE logic OF cmb_var IS BEGIN PROCESS(i0.. END ARCHITECTURE logic. ENTITY cmb_var IS PORT(i0. i1. q:OUT BIT). END IF. i1. enable GATE END ARCHITECTURE a. LUT D Q ENA CLRN Cascade Out Fuente: ALTERA MAX+plus II HELP Guillermo Jaquenod. 2001 Guillermo Jaquenod. q : OUT BIT). a : IN BIT.VHDL: Lenguaje de descripción de hardware Asignaciones combinatorias incompletas: inferencia de elementos de memoria • En algunos HDLs (P. 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. a) BEGIN IF (a = '0') THEN val <= val. 2001 i0 0 i1 1 q a deseo este circuito. ésta toma por default un valor estático (GND o VCC).std_logic_1164. sin olvidar que si bien una señal tipo BIT tiene dos valores posibles (‘0’. en una asignación condicional debe especificarse el comportamiento para TODOS los casos... el uso de cláusulas de tipo OTHERS permite garantizar que todos los casos restantes queden cubiertos Guillermo Jaquenod. END ARCHITECTURE logic.funciona???' 0' Fuente: ALTERA 22 .ALL. Ejemplos: latches deseo este circuito.. 2001 ENTITY latchinf IS PORT (enable.std_logic_1164. WHEN 1 => q <= i1. se infiere un elemento de memoria). Inferencia de elementos de memoria (voluntaria e involuntaria) • Si se desea evitar este problema. pero funciona como se desea???? Si val es una señal.enable:IN BIT. i1. data) BEGIN IF (enable = '1') THEN q <= data. END ENTITY latchconcu.b:IN BIT. Bases de VHDL • EN VHDL y VERILOG el criterio es distinto: si a una señal no se le asigna un valor. ELSE val := val + 1. END latchinf. Guillermo Jaquenod. END IF. a) VARIABLE val : INTEGER RANGE 0 TO 1.cuando se actualiza? R: al fin del proceso Como logro que la actualización sea inmediata? R: usando una VARIABLE Fuente: ALTERA LIBRARY ieee. b D Q c a GATE ARCHITECTURE concu OF latchconcu IS BEGIN Qué pasa si a=‘0’? c <= b when a='1'. • CUIDADO! No ver a ‘X’ como un joker que reemplaza a 0 o 1! • Como alternativa. i1.. 2001 Inferencia de latches dentro/fuera de procesos ENTITY latchconcu IS PORT(a. i0 0 i1 1 a q Cuál es el riesgo de usar LATCHES al usar FLEX10K? ARCHITECTURE maxpld OF latchinf IS BEGIN latch: PROCESS (enable. el valor previo se conserva --> se crea un latch END ARCHITECTURE concu... CASE val IS WHEN 0 => q <= i0. END PROCESS latch. BEGIN PROCESS(i0.

WHEN 1 => q <= i1.a :IN BIT. END reginf. END PROCESS.clk: IN STD_LOGIC. BEGIN val := '0'.clk: IN STD_LOGIC. no es usada para síntesis ‘1’. i1. IF (a = '0') THEN val := val. END PROCESS. y otras no soportadas para su síntesis por las herramientas EDA (Electronic Design Automation) PROCESS (reloj) BEGIN IF reloj’EVENT AND reloj=‘1’ THEN q <= d. WHEN OTHERS => NULL. q Fuente: CHANG Guillermo Jaquenod. ENTITY cmb_vari IS PORT(i0. i1. PROCESS BEGIN WAIT UNTIL rising_edge (reloj). WHEN “11”=> q <= NOT q. END PROCESS. a) VARIABLE val : INTEGER RANGE 0 TO 1. END maxpld. 2001 Fuente: ALTERA MAX+plus II HELP Ejemplos: Flipflop JK sensible al flanco + ENTITY ff_JK IS PORT (J. BEGIN T T PROCESS BEGIN clk WAIT UNTIL clk = ‘1’. Muy usada Muy usada Necesita IEEE_1164 Necesita IEEE_1164 yyseñales STD_LOGIC señales STD_LOGIC PROCESS (reloj) BEGIN IF reloj’EVENT AND reloj=‘1’ AND reloj’LAST_VALUE=‘0’ THEN q <= d. Carry In END PROCESS. 0 i1 Guillermo Jaquenod. clk: IN STD_LOGIC. 2001 Fuente: CHANG 23 . 2001 Guillermo Jaquenod. Data1 END maxpld. Acepta flancos de ‘X’ o ‘Z’ ‘1’ También sirve para señales BIT También sirve para señales BIT END PROCESS. END maxpld. WHEN 1 => q <= i1. Descarta flancos que no sean de ‘0’ aa Descarta flancos que no sean de ‘0’ END IF. i0 Guillermo Jaquenod.std_logic_1164. 2001 q a ahora funciona. WHEN “10”=> q <= '1‘. END CASE. Equivalente aala de abajo.VHDL: Lenguaje de descripción de hardware Mal uso de variable: inferencia de latches Evitar los latches mediante la asignación permanente de un valor a una variable val i0 0 i1 LIBRARY ieee. WHEN OTHERS => NULL. END CASE. LUT D Q ENA CLRN Cascade Out Fuente: SJOHOLM Porqué debo definir q_interno? Cómo podría evitarlo? q 1 Ejemplos: un Flipflop D sensible al flanco+ ANALIZAR CÓMO FUNCIONA CADA MÉTODO! ANALIZAR CÓMO FUNCIONA CADA MÉTODO! ARCHITECTURE maxpld OF ff_T IS SIGNAL q_interno : std_logic. END IF. ARCHITECTURE logic OF cmb_var IS BEGIN PROCESS(i0. END PROCESS. END IF. END ARCHITECTURE logic. q <= d. Data2 Data3 Data4 d d q q clk Cascade In PRN 4 inp. Así evité tener que definir ARCHITECTURE maxpld OF ff_JK IS una señal interna BEGIN PROCESS VARIABLE JK : std_logic_vector (1 DOWNTO 0).ALL. definir JK? JK := J & K. END CASE. END ARCHITECTURE logic. no es usada para síntesis END PROCESS. PROCESS (reloj) BEGIN IF rising_edge (reloj) THEN q <= d. Fuente: ALTERA Guillermo Jaquenod. al usar FLEX10K? ENTITY reginf IS PORT ( d. q: BUFFER STD_LOGIC). CASE val IS WHEN 0 => q <= i0. gnd) VARIABLE val : INTEGER RANGE 0 TO 1. 2001 ENTITY ff_T IS PORT (T. 2001 Flipflops: las formas de definir el reloj La creación de flipflops requiere definir procesos sensibles a flancos. algunas de ellas más generales. END IF. pero cómo se podría hacer más simple? PROCESS(i0. También sirve para señales BIT PROCESS (reloj) BEGIN IF reloj=‘1’ Sólo si no se necesita Sólo si no se necesita THEN q <= d. Sólo si no se necesita RESET/SET Sólo si no se necesita RESET/SET END PROCESS. BEGIN IF (a = '0') THEN val := val. END CASE. q <= q_interno. USE ieee. a. Fuente: ALTERA Cuáles son los beneficios de usar flipflops en vez de latches. END ff_JK . BEGIN Porqué debo WAIT UNTIL clk = ‘1’. CASE JK is WHEN “01”=> q <= ‘0‘.q :OUT BIT). END PROCESS. ELSE val := val + 1. END ff_T . q <= d. Equivalente la de abajo. END CASE. ELSE val := val + 1. RESET/SET asincrónicos RESET/SET asincrónicos Acepta flancos de ‘X’ o ‘Z’ aa‘1’ END IF. END ENTITY cmb_vari. gnd) BEGIN CASE a IS WHEN 0 => q <= i0. 2001 Acepta flancos de ‘X’ o ‘Z’ aa‘1’ Acepta flancos de ‘X’ o ‘Z’ ‘1’ También sirve para señales BIT También sirve para señales BIT Guillermo Jaquenod. i1. END PROCESS. ARCHITECTURE maxpld OF reginf IS BEGIN PROCESS BEGIN WAIT UNTIL clk = '1'. CASE val IS WHEN 0 => q <= i0. pero redundante pero redundante PROCESS BEGIN WAIT UNTIL reloj=‘1’. i1. asincrónicos asincrónicos Ejemplos: Flipflop Toggle sensible al flanco + Guillermo Jaquenod. END PROCESS. q: OUT STD_LOGIC). a. WHEN 1 => q <= i1.K. CASE T is WHEN “1”=> q_interno <= NOT (q_interno). q: OUT STD_LOGIC). Acepta flancos de ‘X’ o ‘Z’ aa‘1’ Acepta flancos de ‘X’ o ‘Z’ ‘1’ También sirve para señales BIT END PROCESS. ‘1’. 1 q 0 a la forma de uso de val fuerza que se cree un fedback combinatorio!!!! 1 ARCHITECTURE logic OF cmb_vari IS BEGIN PROCESS(i0. q <= d. Muy usada Muy usada END IF. y puede adoptar distintas formas.

Guillermo Jaquenod. pre : IN STD_LOGIC. clk: IN STD_LOGIC. END IF. ENTITY reginf IS PORT (d. – Si se usan ASET y ACLR. pre) BEGIN IF clr = '1' THEN q <= '0'.std_logic_1164. d q LIBRARY ieee. ELSIF clk'EVENT AND clk = '1' THEN q <= d. clr :IN STD_LOGIC. clk. 2001 Flipflop con SET y RESET asíncrono ENTITY reginf IS PORT ( d. Guillermo Jaquenod. Asynchronous load w/preset. q con lista de sensibilidad ARCHITECTURE maxpld OF reginf IS BEGIN PROCESS (clk. END reginf. ENTITY reginf IS PORT (d.ALL. USE ieee. 2001 Consideraciones al usar ASET. según el estilo que se use para su definición LABCTL1 LABCTL2 Fuente: ALTERA MAX+plus II HELP Guillermo Jaquenod. END maxpld. 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 PROCESS.d. d ARCHITECTURE maxpld OF reginf IS BEGIN PROCESS BEGIN WAIT UNTIL clk = '0'. ELSIF clk'EVENT AND clk='1' THEN q <= d. disminuyendo la capacidad combinatoria. END IF. USE ieee. END not_so_good. 2001 Guillermo Jaquenod. – Sólo ACLR es realizado mediante una de las lineas de control de LAB junto al CHIP-WIDE reset. LIBRARY ieee. END IF. q <= d. y en ciertos casos el uso de ciertas opciones limitan la disponibilidad de variables de entrada. 2001 Flipflop con SET o RESET asíncrono Fuente: ALTERA Guillermo Jaquenod. q :OUT STD_LOGIC). clk d q clk clr Quién tiene prioridad? clk o clr? Fuente: ALTERA MAX+plus II HELP Guillermo Jaquenod. clr :IN STD_LOGIC. END PROCESS. END PROCESS. END ENTITY reginf. y Asynchronous load without clear or preset) requieren además el uso de una de las entradas de datos al LE (DATA 3) como dato de carga asincrónica. clr ELSE q <= d. clr. END ARCHITECTURE maxpld. END IF. END good. END maxpld. q: OUT STD_LOGIC). END ffwena . y existen 6 posibles Clear&Preset Control Modes. sin afectar timing o uso de recursos. clr) BEGIN IF clr='1' THEN q <= '0'. clr y pre? RETURN BOOLEAN.VHDL: Lenguaje de descripción de hardware Ejemplos: flipflop D sensible al flanco- Flipflop con SET o RESET asíncrono Tiene algún beneficio o perjuicio usar flipflops sensibles al flanco . END ARCHITECTURE maxpld. se consumen las dos líneas de control disponibles en el LAB! – Los otros 3 modos (Asynchronous load with clear. 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 . END PROCESS. pre d d clk ARCHITECTURE maxpld OF reginf IS sin lista de sensibilidad! BEGIN PROCESS BEGIN WAIT UNTIL (rising_edge(clk) OR clr='1'). END IF. clk.clk:IN BIT. ACLR y ALOAD Al usar ASET. END PROCESS. 2001 Chip wide RESET PRN D Q ENTITY ffwena IS PORT(enable. q:OUT BIT). END reginf. CLRN ARCHITECTURE good OF ffwena IS BEGIN PROCESS(clk) BEGIN IF (enable = '0' ) then null. d q IF clr='1' clk THEN q <= '0'. q : OUT STD_LOGIC).std_logic_1164. LABCTL1 (asyn load) DATA3 (data) LABCTL2 (clear) Chip wide RESET Diseño de un flipflop c/ENABLE en MAX+plus II VHDL El diseño de un simple flifpflop con ENABLE puede aprovechar (o no) la existencia de este tipo de recursos en los FLEX10K. ELSIF pre = '1' THEN q <= '1'.std_logic_1164 junto a falling_edge()!! Fuente: ALTERA Guillermo Jaquenod. ELSIF (clk = '1') then q <= d. clr.. ACLR y ALOAD no todas las combinaciones son válidas. END ENTITY reginf. END IF. al usar FLEX10K? ENTITY reginf IS PORT ( d. clk. FUNCTION rising_edge (SIGNAL s:std_ulogic) q q cl ARCHITECTURE maxpld OF reginf IS clr BEGIN PROCESS (clk. END PROCESS. Cómo son las prioridades de clk.ALL. – Sólo ASET puede realizarse por hardware pero también por software (llamado “NOT-Gate Push Back”) donde ASET es reemplazado con ACLR y se trabaja con la señal negada. definida en IEEE. q :OUT STD_LOGIC).

i1 ELSE val := val + 1. 2001 Inferencia de registros: cuántos flipflops? ENTITY reg1 IS PORT (d. q:OUT BIT).std_logic_1164. END ARCHITECTURE reg1. ARCHITECTURE a OF ff_cl_ena IS SIGNAL q_aux: STD_LOGIC. sel(0) sel(1) d ‘1’ q y gate sel(2) clrn sel(3) Fuente: ALTERA Guillermo Jaquenod.std_logic_1164. y : OUT std_logic). 1 END IF. b : BIT.VHDL: Lenguaje de descripción de hardware Inferencia de latches en IFs anidados LIBRARY ieee. val END IF. ENTITY if_wrng is port (sel : IN std_logic_vector (3 DOWNTO 0). END IF. END IF.clrn. END IF.ALL. q : out BIT). USE ieee.std_logic_1164. clrn) BEGIN IF clrn = '0' THEN q_aux <= '0'. en el flanco de subida de clk clk D D QQ b ARCHITECTURE reg1 OF reg1 IS BEGIN PROCESS (clk) VARIABLE a. q: BUFFER STD_LOGIC). ENA CLRN clr D Q q ENA CLRN clr Q ENA CLRN clk Guillermo Jaquenod. clk) obtengo ésto!! VARIABLE val : INTEGER RANGE 0 TO 1. ELSIF rising_edge (clk) THEN IF ena = '1' THEN q_aux <= d. END ARCHITECTURE a. END ENTITY if_wrng. b : BIT. ELSE q_aux <= q. END IF. q Q Inferencia de registros: cuántos flipflops? ENTITY reg1 IS PORT (d.ena : IN STD_LOGIC. b : BIT. WHEN 1 => q <= i1.ALL. Flipflop con SET/RESET asíncrono y ENABLE Sólo 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. BEGIN IF clr = '1' THEN q <= '0'. b y q se actualizan al mismo tiempo. END ENTITY reg1. 2001 clk D d Guillermo Jaquenod. END PROCESS. USE ieee. BEGIN PROCESS (clk) BEGIN IF rising_edge(clk) THEN a <= d. b <= a. b := a. ARCHITECTURE reg1 OF reg1 IS SIGNAL a. END IF. q : out BIT). BEGIN IF rising_edge(clk) THEN a := d. ELSE y <= '0'. END PROCESS. a END PROCESS. q <= b. clk Fuente: ALTERA d clrn ENTITY reg1 IS PORT (d. a q:OUT BIT). 2001 Fuente: ALTERA 25 . ENTITY ff_cl_ena IS PORT ( porqué d. END ARCHITECTURE behavior.clk:IN BIT. 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 ARCHITECTURE reg1. b <= a. 2001 Guillermo Jaquenod. END PROCESS. ELSIF rising_edge(clk) THEN i0 IF (a = '0') THEN val := val. q <= b.clk: in BIT. 2001 q ena Fuente: ALTERA Guillermo Jaquenod. END PROCESS. 2001 Errores de inferencia de flipflops LIBRARY ieee.a:IN BIT. END ENTITY reg1.clk: in BIT. clk Inferencia de registros: cuántos flipflops? D Guillermo Jaquenod. BEGIN PROCESS (clk) BEGIN IF rising_edge(clk) THEN a <= d. i0 ENTITY reg_var IS i1 PORT(i0. BUFFER? END ENTITY ff_cl_ena. USE ieee.clk:IN STD_LOGIC. clr. clk.i1. a a. ARCHITECTURE logic OF reg_var IS BEGIN deseo ésto PROCESS(clr. END ENTITY reg1. CASE val IS WHEN 0 => q <= i0. END ENTITY reg_var. END ARCHITECTURE logic. END IF. q <= q_aux. END IF. q clk clk Fuente: ALTERA Fuente: ALTERA Guillermo Jaquenod.ALL. END PROCESS. BEGIN lista de sensibilidad PROCESS (clk. 2001 D D QQ D D QQ ARCHITECTURE reg1 OF reg1 IS SIGNAL a. END ARCHITECTURE reg1. q <= b. END IF. END IF. 0 END CASE.

en vez de sólo poner INTEGER? ARCHITECTURE a OF counter IS BEGIN PROCESS (clk) VARIABLE cnt : INTEGER RANGE 0 TO 255.b:BIT.VHDL: Lenguaje de descripción de hardware Inferencia de registros: cuántos flipflops? ENTITY reg1 IS PORT (d. b q ARCHITECTURE regx OF regx IS BEGIN PROCESS (reloj) VARIABLE c: STD_LOGIC_VECTOR (1 DOWNTO 0). q:OUT BIT). END PROCESS. la compuerta en rojo detecta “10”? Fuente: ALTERA Fuente: ALTERA Guillermo Jaquenod. END IF.std_logic_unsigned. q <= b. 2001 ARCHITECTURE reg1 OF reg1 IS SIGNAL a. ELSE s <= '0'. BEGIN PROCESS (clk) BEGIN IF rising_edge(clk) THEN a <= d.std_logic_1164.std_logic_unsigned. END ARCHITECTURE reg1.ALL. Guillermo Jaquenod. clk END PROCESS. IF c = "11" THEN s <= '1'. 2001 ARCHITECTURE regx OF regx IS BEGIN PROCESS (reloj) VARIABLE c: STD_LOGIC_VECTOR (1 DOWNTO 0). END PROCESS. BEGIN IF reloj'EVENT and reloj='1' THEN c:= c + 1. END IF. Inferencia de registros: cuántos flipflops? s clk Porqué.ALL. END PROCESS. y a en b. En cambio la copia de b en q es concurrente.clk:IN BIT. END ENTITY regx.USE ieee. 2001 a Guillermo Jaquenod. END PROCESS. END ENTITY reg1. USE ieee. IF c = "11" THEN s <= '1'. 2001 q Fuente: ALTERA MAX+plus II HELP 26 . si la comparación es con “11”.clk:IN BIT. BEGIN IF reloj'EVENT and reloj='1' THEN c:= c + 1. ENTITY reg1 IS PORT (d. END ENTITY reg1. D Q ENTITY regx IS (reloj:IN STD_LOGIC. q <= b. clk Guillermo Jaquenod. s:OUT STD_LOGIC). en forma secuencial. d D Q D Q d se copia en a. END ARCHITECTURE regx. ENTITY regx IS PORT (reloj:IN STD_LOGIC. b : BIT. END IF. BEGIN IF rising_edge(clk) THEN a := d.b:BIT. ENTITY reg1 IS PORT (d. clk clk La copia de d en a y de a en b se hace recién al final del proceso. END IF. USE ieee. BEGIN IF (clk = '1') THEN IF enable = '1' THEN cnt := cnt + 1. Fuente: ALTERA Inferencia de registros: cuántos flipflops? LIBRARY ieee.USE ieee. END ARCHITECTURE reg1. s:OUT STD_LOGIC). 2001 Inferencia de registros: cuántos flipflops? clk D D QQ c(1) clk D Q reloj Fuente: ALTERA Guillermo Jaquenod. END IF. 2001 Ejemplos: contador con ENABLE ENTITY counter IS PORT ( clk.ALL. LIBRARY ieee. END IF. enable q <= cnt.std_logic_1164. END PROCESS. LIBRARY ieee. END ENTITY regx. b <= a. ARCHITECTURE reg1 OF reg1 IS SIGNAL a. ELSE s <= '0'. END IF.ALL. q:OUT BIT). 2001 c(0) clk D Q Guillermo Jaquenod. q <= b. q:OUT BIT). END IF. BEGIN PROCESS (clk) BEGIN IF rising_edge(clk) THEN a <= d. END ARCHITECTURE reg1. END ENTITY reg1. Guillermo Jaquenod. END counter. END a.clk:IN BIT. a q b clk ARCHITECTURE reg1 OF reg1 IS BEGIN PROCESS (clk) VARIABLE a. b <= a. Porqué defino el rango de cnt. END ARCHITECTURE regx. y sólo b es copiado en q recién al fin del PROCESS Fuente: ALTERA Inferencia de registros: cuántos flipflops? d D D QQ LIBRARY ieee. b := a. enable : IN STD_LOGIC. q : OUT INTEGER RANGE 0 TO 255). END IF.

clear : IN STD_LOGIC. BEGIN IF (up_dn='1') THEN sentido :=1. END IF. ELSE sentido:= -1. ELSE sentido:= -1. q <= cnt. q <= cnt. 2001 q ARCHITECTURE a OF counter IS BEGIN PROCESS (clk) VARIABLE cnt : INTEGER RANGE 0 TO 255. END IF. END counter. END IF. END PROCESS. END IF. END IF. BEGIN IF (clk='1') THEN IF (up_dn='1') THEN cnt := cnt+1. BEGIN IF (clk = '1') THEN IF ld = '0' THEN cnt := d. END PROCESS. ARCHITECTURE a OF counter IS BEGIN PROCESS (clk) VARIABLE cnt : INTEGER RANGE 0 TO 255. q <= cnt. Fuente: ALTERA MAX+plus II HELP PROCESS (clk) VARIABLE cnt : INTEGER RANGE 0 TO 255. VARIABLE sentido : INTEGER. 2001 Guillermo Jaquenod. ELSE cnt:= cnt + sentido . END IF. BEGIN IF (up_dn='1') THEN sentido:= 1. Ejemplos: contador con SCLR ENTITY counter IS PORT ( clk. BEGIN IF (clk = '1') THEN IF clear = '0' THEN cnt := 0. END IF.up_dn: IN STD_LOGIC. Usando “sentido” q + up_dn 1 clk -1 Sin usar “sentido” +1 + + q up_dn clk Guillermo Jaquenod. BEGIN IF (up_dn='1') THEN sentido:= 1. ELSE cnt := cnt + 1. END IF. END PROCESS. IF (clk='1') THEN cnt:=cnt + sentido. END IF. d q up_dn ARCHITECTURE a OF counter IS BEGIN clk PROCESS (clk) ld VARIABLE cnt : INTEGER RANGE 0 TO 255. END a. IF (clk='1') THEN cnt:=cnt + sentido. clk. d q clk ld Fuente: ALTERA MAX+plus II HELP Guillermo Jaquenod. 2001 Fuente: ALTERA MAX+plus II HELP 27 . 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. END IF. END a.clear. END IF. ELSE cnt:= cnt + sentido . END PROCESS. END a. END a. 2001 Síntesis alternativas del contador UpDown ARCHITECTURE a OF counter IS BEGIN up_dn PROCESS (clk) q VARIABLE cnt : INTEGER RANGE 0 TO 255. Guillermo Jaquenod. STD_LOGIC. 2001 clear clk Fuente: ALTERA MAX+plus II HELP Guillermo Jaquenod. END PROCESS. END a. IF (clk = '1') THEN IF ld='0' THEN cnt:= d. BEGIN IF (up_dn='1') THEN sentido:= 1. q:OUT INTEGER RANGE 0 TO 255). VARIABLE sentido : INTEGER. ld : IN q : OUT INTEGER RANGE 0 TO 255). VARIABLE sentido : INTEGER. STD_LOGIC. END counter. q <= cnt. PROCESS (clk) VARIABLE cnt : INTEGER RANGE 0 TO 255. IF (clk = '1') THEN IF clear ='0' THEN cnt:= 0. END IF. q <= cnt. ARCHITECTURE a OF counter IS BEGIN PROCESS (clk) VARIABLE cnt : INTEGER RANGE 0 TO 255. END PROCESS. END IF. END IF. END counter. Guillermo Jaquenod.VHDL: Lenguaje de descripción de hardware Ejemplos: contador con SLOAD ENTITY counter IS PORT ( d : IN INTEGER RANGE 0 TO 255. q <= cnt. ELSE sentido :=-1. END counter. q : OUT INTEGER RANGE 0 TO 255). clk VARIABLE sentido : INTEGER. Guillermo Jaquenod. clk. up_dn:IN STD_LOGIC. q : OUT INTEGER RANGE 0 TO 255). END IF. END counter. END PROCESS. END IF. 2001 Ejemplos: contador UpDown ENTITY counter IS PORT ( clk.ld. 2001 Ejemplos: contador con SCLR y UpDown ENTITY counter IS PORT (clk. ELSE sentido:= -1. ELSE cnt := cnt + 1. q <= cnt. ELSE cnt := cnt-1.up_dn : IN q : OUT INTEGER RANGE 0 TO 255).

2001 s2 Esto crea un “conflicto”(colisión) donde 2 drivers excitan la misma señal. Señales públicas. PROCESS (s2) BEGIN a <= s21. ‘0’. se intercala el nombre de esta función antes de especificar el tipo: SIGNAL resuelta: funcion_de_resolución tipo_no_resuelto.‘W’. ELSIF rising_edge(clk) THEN reg <= mux_out. END PROCESS combinatorio. ELSE cuenta := cuenta + 1.ENA1. SALIDA: OUT STD_LOGIC). ‘X’. q : OUT std_logic). o en un procedure sentencia utilidad SCOPE BEHAVIOR destino := fuente. ENA1 Guillermo Jaquenod. ENA1 A SALIDA !! ok ENA2 B STD_LOGIC_1164 define dos nuevos tipos/subtipos: • STD_ULOGIC con 9 posibles valores lógicos: ‘U’. ELSE mux_out <= b. 2001 Fuente: BAKER 28 .sel. END IF.s2 como vector de entrada y decide el valor de a. PORT (reloj: IN STD_LOGIC. END PROCESS. BEGIN FOR indice IN bocas’RANGE LOOP IF bocas(indice) = ‘0’ THEN resultado := ‘0’. END IF. 2001 Las funciones de resolución Para definir la función de resolución a emplear en una dada señal de un tipo no resuelto.std_logic_1164. Guillermo Jaquenod. ARCHITECTURE X OF NORES IS BEGIN SALIDA <= A WHEN ENA1=‘1’ ELSE ‘Z’. END LOOP. combinatorio: PROCESS(a. END X. ARCHITECTURE X OF SIRES IS BEGIN SALIDA <= A WHEN ENA1=‘1’ ELSE ‘Z’. donde las asignaciones concurrentes múltiples están resueltas.ENA2: IN STD_LOGIC. sal: OUT INTEGER RANGE 0 TO modulo). 2001 Señales versus Variables q D Dada una señal. 2001 SALIDA A TYPE opndrn IS (‘0’.clk: IN std_logic. Guillermo Jaquenod. END FUNCTION resolve_opndrn. ENTITY clk_per IS PORT(a. BEGIN ARCHITECTURE a OF contador IS BEGIN PROCESS (reloj) VARIABLE cuenta : INTEGER RANGE 0 TO modulo -1.VHDL: Lenguaje de descripción de hardware Ejemplos: contadores con cualquier módulo ENTITY contador IS GENERIC (modulo : INTEGER := 200). b. END IF. si se ejecutan los siguiente procesos: Fuente: ALTERA Guillermo Jaquenod. SIGNAL reg : STD_LOGIC. SALIDA <= B WHEN ENA2=‘1’ ELSE ‘Z’. END X. END ARCHITECTURE logic. END PROCESS. donde las asignaciones concurrentes múltiples no están resueltas.1 THEN cuenta := 0.ENA2: IN STD_ULOGIC. END a.clr. Si más de un driver va a manejar una señal. que toma a s1. SIGNAL s1: resolve_opndrn opndrn. destino <= fuente.ENA1.USE ieee. dentro o fuera de un proceso. Por ejemplo. END IF. en VHDL se crea un “driver” que excita esa señal en diferentes ocasiones: • al ejecutar una sentencia de asignación. De igual modo puede definirse un subtipo resuelto del tipo no resuelto: SUBTYPE tipo_resuelto IS funcion_de_resolución Guillermo Jaquenod. 2001 Funciones de resolución en STD_LOGIC_1164 ENTITY NORES IS PORT (A. a s1 ENA2 B L!! MA ENTITY SIRES IS PORT (A. TYPE opndrn_array IS ARRAY (integer RANGE<>) OF opndrn. ésta deba ser de tipo STD_LOGIC. Señales locales mux_out a ARCHITECTURE logic OF clk_per IS SIGNAL mux_out : STD_LOGIC. ‘L’. END IF. la función siguiente resuelve conflictos de señales open-drain: FUNCTION resolve_opndrn (bocas: IN opndrn_array) RETURN opndrn IS VARIABLE resultado : opndrn := ‘H’. q <='0'.‘H’ y ‘-’. END PROCESS secuencial.B. Guillermo Jaquenod. END contador . END. RETURN resultado.b. • Y su subtipo STD_LOGIC. Representa una interconexión del circuito Representa una memoria local usada para la compilación Cobertura local y global (puede intercomunicar procesos) Actualizada inmediatamente PROCESS (s1) BEGIN a <= s1.‘1’. 2001 b sel D Q reg ENA CLR N clr clr ENA CLR N solo dos macroceldas Fuente: ALTERA Asignaciones concurrentes múltiples VARIABLES ( := ) SEÑALES ( <= ) Q clk clk Guillermo Jaquenod. sal <= cuenta. que debe ser resuelto mediante una función de resolución. locales y procesos LIBRARY ieee.’H’).B. clr) BEGIN IF clr='0' THEN reg <='0'. END.ALL. END PROCESS. secuencial: PROCESS(clk. ‘Z’. sel) BEGIN IF sel = '0' THEN mux_out <= a. q <= reg. SALIDA: OUT STD_ULOGIC). END ENTITY clk_per. Cobertura local (sólo 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 señal (cola de transacciones) Por ejemplo. SALIDA <= B WHEN ENA2=‘1’ ELSE ‘Z’. tipo_no_resuelto. BEGIN IF reloj=‘1’ THEN IF cnt = modulo .

FUNCTION resolved ( s : std_ulogic_vector ) RETURN std_ulogic IS VARIABLE result : std_ulogic := 'Z'. 'X' ). 2001 Guillermo Jaquenod.H | ( 'U'. 'U'. 2001 29 .std_logic_1164.Z | ( 'U'. 'W'. si se desea usar strings de bit para inicializar objetos que no son BIT_VECTOR (ej: STD_LOGIC) deben invocarse funciones de conversión: a (4 DOWNTO 0) <= word (1 TO 5) a <= to_stdlogicvector (X”F3”). -. 'W'. '0'.Hexadecimal b <= O”765”. • Y al aplicarles operadores lógicos se logran operaciones “bit a bit”: BITWISE AND BITWISE AND a <= “0110”.vhd Guillermo Jaquenod. 'L'. 'X'. BEGIN IF (s'LENGTH = 1) THEN RETURN s(s'LOW). 'W'. Se usa el operador sobre los nuevos tipos Guillermo Jaquenod. 'X'. 'U'.Decimal • En VHDL’87. CONSTANT resolution_table : stdlogic_table := ( ---------------------------------------------------------Ejemplo: -| U X 0 1 Z W L H | ‘Z’ y ‘1’ ( 'U'. s(i)). END ARCHITECTURE ejemplo. 2001 Bases de VHDL Otras estructuras y sentencias: Overload de Operadores Arrays Subprogramas Generate Assert y Report NULL Buffers y buses TriState Guillermo Jaquenod.| ). 'X'. '0'. USE ieee. 'X'. USE ieee. 'X' ). -. '0'. -. que decide el valor final RETURN result. 'X' ). -.vhd y std1164. –Esta definición se hace usualmente en un package.Octal -.std_ulogic) OF std_ulogic. -. c <= a AND b. '1'. 'U'. '1'.. '1'. '1'.0 | ( 'U'. 'X'. '1'. 'H'. 'W'. • Un operador es reemplazado (overloaded) definiendo una función cuyo símbolo es igual que el del operador a reemplazar. 'X'. '0'. END ENTITY overload. 'X'. '1'.Binario c <= X”1F2D”. b) BEGIN sum <= a + b. 'Z'. d <= 381. 'X'. ARCHITECTURE ejemplo OF overload IS BEGIN sumador: PROCESS (a. 'X'. b : IN STD_LOGIC_VECTOR (3 DOWNTO 0). -. '0'. 'U' ). 'X' ). 'X'. 'X'. -. END PROCESS sumador. -.U | dan ‘1’ ( 'U'. 'W'. 'X'. 'X'. para que su alcance sea global Guillermo Jaquenod. 'U'. • std_logic es definido como resolved std_ulogic END resolved. 'X'. 2001 Guillermo Jaquenod. 'X' ) -. 'X'. 'X'. 'H'.W | ( 'U'. 'X'. • A través de una tabla se calcula la función resolved END IF. '0'. '1'. el nombre de la función se encierra entre comillas dobles para diferenciarlo. END LOOP. 2001 Los arrays: referencias a elementos y slices • Se incluye el package donde se describen los nuevos operadores LIBRARY ieee.VHDL: Lenguaje de descripción de hardware Resolución entre señales std_ulogic TYPE stdlogic_table IS ARRAY(std_ulogic. 'X' ). '1'. Un elemento del array es referenciado mediante un índice (que puede ser de un tipo discreto tal como INTEGER o enumerado) word(3) <= ‘1’. 'X'. -. 'X'. 'L'.ALL. • 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 VHDL’93 existen strings de bit predefinidos que pueden ser usados para asignar valores a objetos tipo bit_vector: a <= B”11010”. 'H'. –En la definición. Fuente: maxplus2\vhdl93\ieee std1164b.1 | ( 'U'. 'X'. sum : OUT STD_LOGIC_VECTOR (3 DOWNTO 0)). y dado que el operador a reemplazar y la nueva función tienen idéntico nombre. 'X' ). incluir std_logic_unsigned incluir std_logic_unsigned y std_logic_1164) y std_logic_1164) Cuidado! Una cosa es B”011” (bit_string) y otra “011” (string de std_logic) Guillermo Jaquenod. 2001 Overload de Operadores • Cómo se hace si se desea usar los operadores aritméticos y booleanos con otros tipos de datos? Operator Overloading . 'U'. Asignaciones a arreglos • Las asignaciones a un vector unidimensional (vector_a:std_logic_vector) pueden realizarse a través de la indicación de todo sus elementos como un string: vector_a <= “10011”. 'W'.L | ( 'U'. 'W'. 'W'.X | ( 'U'.ALL. '0'. -. 'X'. '0'. '1'. 'W'. '0'. 'X'. 'L'.std_logic_unsigned. b <= “1101”. 'X' ). -. 2001 Uso de Overload de Operadores ENTITY overload IS PORT ( a : IN STD_LOGIC_VECTOR (3 DOWNTO 0). 'U'. ELSE FOR i IN s'RANGE LOOP result := resolution_table(result.redefinición de funciones Aritméticas y Booleanas sobre nuevos tipos de objetos. 'U'.

cout <= sumtmp(ancho).c de tipo STD_LOGIC: s <= '1' WHEN a&b&c = "110" ELSE '0'. subarrays. 3 => ‘1’. • TYPE STRING IS ARRAY (POSITIVE RANGE <>) OF CHARACTER. puede usarse others para completar los restantes: 3 Filas 3 Filas • a <= (1 =>’1’. con ('0'&a) lo SIGNAL sumtmp : STD_LOGIC_VECTOR (8 DOWNTO 0). cout: OUT STD_LOGIC). Guillermo Jaquenod. El tipo STRING • a <= (OTHERS => ‘1’).ALL. sin indicar su rango! sale: OUT BIT). END ENTITY sumador.4. ARCHITECTURE concat OF sum_acum IS SIGNAL sumtmp : STD_LOGIC_VECTOR (ancho DOWNTO 0).(1. END PROCESS or_loop. Concatenado Concatenado ELSIF rising_edge (reloj) THEN sumtmp <= cin + sumtmp(ancho-1 DOWNTO 0) + ('0'&a). 2001 Concatenado de arreglos (operador “&”) • • Dos arrays. requiere 9 requiere 9 bits! a. USE ieee. concatenado. OTHERS => ‘0’). Guillermo Jaquenod.b : nibble. generics.std_logic_unsigned.std_logic_1164. • Donde estas asignaciones no necesariamente deben ser constantes: a <= (1 => b(3). a := b.b. cuyo rango se define al instanciarlas como componentes de una jerarquia superior ENTITY or_gate IS PORT ( Sólo se dice que entra es Sólo se dice que entra es BIT_VECTOR. OTHERS => f(0) ).b : IN STD_LOGIC_VECTOR (7 DOWNTO 0). Como a es de 8 Como a es de 8 ARCHITECTURE uso_concat OF sumador IS bits. PORT (reloj... cout: OUT STD_LOGIC). El tipo STRING es un array de caracteres predefinido como: SubArray SubArray Fuente: BAKER Ports tipo array. sumout: OUT STD_LOGIC_VECTOR (ancho-1 DOWNTO 0).std_logic_unsigned. y de los 9 bits de sumtmp.. • De igual modo.3). • De igual modo se pueden definir entidades con ports de rango indefinido.. USE ieee.VHDL: Lenguaje de descripción de hardware Asignaciones a arreglos: uso de aggregates • Si se está trabajando con vectores de muchos bits. Guillermo Jaquenod. Un array puede ser multidimensional. 2001 CONSTANT dat2d:word_2d := ((7. los valores de todo un array pueden ser asignados a otro array de igual dimensión en una única asignación: TYPE nibble IS ARRAY (0 TO 3) OF BIT. Es posible agregar un carácter a un objeto tipo STRING o unir dos STRINGs De igual modo. o de largo parametrizable.2). El valor de todo el array b es El valor de todo el array b es VARIABLE a. overload de suma. sale <= tempo. es posible concatenar: – – – – – – • Existen limitaciones al concatenado de dos objetos tipo STD_LOGIC/BIT.. .nreset.5).std_logic_1164. Elemento de un array Elemento de un array END ARCHITECTURE concat. de rango indefinido • En STANDARD.. a: IN STD_LOGIC_VECTOR (ancho-1 DOWNTO 0). Guillermo Jaquenod.ALL.. 6 => d(5).. END ENTITY sum_acum. el primer índice es el que cambia más lento.. A suma se genera con solo 8 de los 9 bits de sumtmp.cin : IN STD_LOGIC. ENTITY sumador IS PORT (cin : IN STD_LOGIC. 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!). END IF. 2 DOWNTO 0) OF INTEGER. 2001 LIBRARY ieee. luego de haber definido el valor de ciertos elementos de un vector. bits! sumout: OUT STD_LOGIC_VECTOR (7 DOWNTO 0). dados tres objetos a. FOR i IN entra’RANGE LOOP tempo := tempo OR entra(i).. tal como: 4 Columnas 4 Columnas TYPE word_2d IS ARRAY (0 TO 3. 2001 Ejemplo con arrays. cout con un bit aislado cout con un bit aislado END ARCHITECTURE uso_concat.9)). • La inicialización de un array se hace como un vector unidimensional de objetos (un “aggregate”). END ENTITY or_gate.(2. END ARCHITECTURE usoloop. ('0'&a) lo fuerzo a 9 bits fuerzo a 9 bits BEGIN sumtmp <= ('0'&a)+ b + cin.ALL. 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).nreset) BEGIN IF nreset='0' THEN sumtmp <= (others => '0'). others. BIT_VECTOR. AGGREGATE AGGREGATE • Asi como a elementos de un array pueden serle asignados elementos de otro array.. Parámetros! Parámetros! USE ieee. y cout <= sumtmp(8). por cuanto el rango (creciente o decreciente) del vector formado es ambiguo. puede asignarse un mismo valor a todos los elementos de un vector usando (others => <valor>) Arreglos multidimensionales. conocer el tamaño de entra conocer el tamaño de entra BEGIN tempo := ‘0’. ENTITY sum_acum IS GENERIC(ancho: INTEGER := 8).VHD el tipo BIT_VECTOR está definido como type BIT_VECTOR is array (NATURAL range <>) of BIT. Por ejemplo. Others! Others! BEGIN PROCESS (reloj.2. El programa Synplify da Error: Expression has ambiguious type Guillermo Jaquenod.ALL. sin indicar su rango! entra: IN BIT_VECTOR. sin rango definido.etc. 2001 30 . USE ieee.(8. donde estos son a su vez vectores (también aggregates) de menor dimensionalidad.8. Como en C. Overload de (+) Overload de (+) END PROCESS. Guillermo Jaquenod. A suma se genera con solo 8 sumout <= sumtmp (7 DOWNTO 0). Guillermo Jaquenod. En un array 2D los datos son almacenados fila por fila. con bits. 2001 • Para sumar dos vectores de 8 bits y no perder el Carry de salida: LIBRARY ieee. copiado en todo el array a copiado en todo el array a . END LOOP. 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.2.

Guillermo Jaquenod.. END PROCESS chk_tsu. sum: OUT BIT_VECTOR(4 downto 1)). ARCHITECTURE usogenerate OF sumgen IS SIGNAL c: BIT_VECTOR (5 downto 1). Guillermo Jaquenod. END sumgen. BEGIN] sentencia. WHEN B”01” => WHEN B”01” => s2 <= ‘1’. c(i+1) <= (a(i) AND b(i)) OR (a(i) AND c(i)) OR (b(i) AND c(i)).. Al sólo poder ser usada dentro de un proceso.WARNING. incluyendo sentencias de instanciación de componentes. 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”. chk_thold:PROCESS (relojd) BEGIN IF relojd’EVENT AND relojd=‘1’ THEN ASSERT (dato’STABLE(t_hold)) REPORT “violacion de tiempo de hold” SEVERITY ERROR. para indicar que una de las aternativas de un CASE no debe hacerse nada. END PROCESS chk_thold. Atención: IF Atención: IF GENERATE no tiene GENERATE no tiene ELSE GENERATE ELSE GENERATE como el AHDL! como el AHDL! Guillermo Jaquenod. s3 <= ‘1’. s1 <= ‘0’. END ARCHITECTURE nullex. END PROCESS ejemplo. 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.. END ARCHITECTURE nullex. • Donde los posibles niveles de gravedad son definidos por enumeración en el package STANDARD. END usogenerate. Fuente: DUECK Guillermo Jaquenod. s2 <= ‘0’. s3 <= ‘0’. END CASE. END CASE. cout <= c(5).. violacion de tsetup relojd violacion de thold • Es como la sentencia vacía (. Su sintaxis es: [ASSERT <condición booleana>] REPORT <mensaje> SEVERITY <nivel de gravedad>. cout: OUT BIT. relojd <= reloj’DELAYED(t_hold). BEGIN] sentencia. adders: FOR i IN 1 to 4 GENERATE sum(i) <= a(i) XOR b(i) XOR c(i). 2001 31 .. s2 <= ‘1’. BEGIN c(1) <= ‘0’. END PROCESS ejemplo. ASSERT puede ser usada para definir TestPoints que ante una dada condición generen un mensaje (SEVERITY NOTE) o aborten la simulación (SEVERITY ERROR) • REPORT es equivalente a ASSERT FALSE ...). . END IF... y sirve para realizar una especificación más completa. . con sus correspondientes PORT MAP y GENERIC MAP. END GENERATE. de la forma: TYPE SEVERITY_LEVEL IS (NOTE.. END GENERATE. sentencia... sentencia. s3 <= ‘1’.. s1 <= ‘1’.GENERATE y LOOP • LOOP es una sentencia secuencial. 2001 Ejemplo: test de salidas usando ASSERT chk_tsu:PROCESS (reloj) BEGIN IF reloj’EVENT AND reloj=‘1’ THEN ASSERT (dato’STABLE(t_setup)) REPORT “violacion de tiempo de setup” SEVERITY ERROR. • FOR. – Condicional label: IF <expresión booleana> GENERATE [declaraciones. s3 <= ‘0’. válida sólo dentro de procesos. que luego son minimizadas por el compilador al ser trasladadas a hardware.GENERATE es un modo eficiente de especificar múltiples sentencias concurrentes. END GENERATE. LOOP sólo sirve para describir algorítmicamente una secuencia de operaciones. END IF.) 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’.. 2001 • En tareas de síntesis.VHDL: Lenguaje de descripción de hardware La sentencia GENERATE Ejemplo de GENERATE: sumador • “Una sentencia GENERATE provee un mecanismo para la elaboración condicional o iterativa de una porción de una descripción”.b: IN BIT_VECTOR(4 downto 1). Guillermo Jaquenod. en número parametrizable. Guillermo Jaquenod. s2 <= ‘0’. 2001 Diferencias entre FOR. Puede ser usada de dos modos distintos: – Iterativa label: FOR <índice> IN <rango> GENERATE [declaraciones. WHEN OTHERS => NULL. 2001 ENTITY sumgen IS PORT( a. ASSERT puede emplearse para chequear que un determinado objeto tenga un valor adecuado (junto a RANGE. Qué circuito se CASE (a) IS CASE (a) IS generará acá? Se inferirá un WHEN B”00” => WHEN B”00” => LATCH? s1 <= ‘1’. • Por ejemplo. WHEN OTHERS => NULL.ERROR FAILURE). 2001 Guillermo Jaquenod. A los fines de síntesis.. • En una simulación.

Si se indica un valor negativo se asume un desplazamiento en el sentido opuesto SRA SLL VHDL’93 define 2 operandos de shift lógico llamados SLL y SRL. Si se indica un valor negativo se asume un desplazamiento en el sentido opuesto Las instrucciones de rotación VHDL’93 define 2 operandos de rotación llamados ROL y ROR. end if. oe. 2001 a b1 oe a oe b2 Fuente: ALTERA LIBRARY ieee. USE ieee. 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. ROR. END PROCESS tri. 2001 Buses TriState: modelo de un 74374 La forma de crear un buffer TRISTATE es definir una señal tipo STD_LOGIC y asignarle el valor ‘Z’. 2001 ROL -3 es lo mismo que ROR 3!! Guillermo Jaquenod.ALL. ROL. 2001 Guillermo Jaquenod. END ENTITY tri_state_buffs.b2: OUT std_logic). asignar el mismo valor a todo el vector END PROCESS registros. En el MAX+plus II hay un modo preferencial. donde el operando izquierdo debe ser un array de BIT o BOOLEAN.a) BEGIN IF oe = '0' THEN salida <= (others => 'Z').VHDL: Lenguaje de descripción de hardware Las instrucciones de SHIFT Las instrucciones de SHIFT lógico VHDL’93 define 6 operandos de shift. Guillermo Jaquenod. END ARCHITECTURE x.clk:IN std_logic. y el derecho un INTEGER que indica la cantidad de desplazamientos a realizar. que usan dos operandos: FALSE ‘0’ B”10011010” SLL 3 = B”11010000” B”10011010” SLL 3 = B”11010000” B”00001000” SLL -1 = B”00000100” B”00001000” SLL -1 = B”00000100” SRL FALSE ‘0’ B”10011010” SRL 3 = B”00010011” B”10011010” SRL 3 = B”00010011” B”00001000” SRL -1 = B”00010000” B”00001000” SRL -1 = B”00010000” 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.std_logic_1164. END ENTITY mi74374. SLA. Notese que los desplazamientos se refieren a izquierda o derecha y no al valor del índce de rango. 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).ALL. a todo el vector tri: PROCESS (oe.std_logic_1164. llamados SLL. WHEN oe = '1‘ ELSE 'Z' . b1. Guillermo Jaquenod. ELSE salida <= a. 2001 Guillermo Jaquenod. 2001 Las instrucciones de SHIFT aritmético VHDL’93 define 2 operandos de shift aritmético llamados SLA y SRA. END IF. datos Maneras de definir buffers TriState b2 <= a – el operando derecho es un INTEGER que indica la cantidad de rotaciones a realizar. ENTITY mi74374 IS PORT (salida:INOUT std_logic_vector (7 DOWNTO 0).oe : IN std_logic. datos:IN std_logic_vector (7 DOWNTO 0)). salida LIBRARY ieee. USE ieee. por lo que no importa si el elemento a desplazar es de rango (xx TO yy) o (xx DOWNTO yy) x‘LEFT SLL x‘RIGHT SLA FALSE ‘0’ SRL FALSE ‘0’ Shifts lógicos Shifts aritméticos 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. SRA. SRL. definiendo primero los casos en que vale ‘Z’ ARCHITECTURE x OF tri_state_buffs IS BEGIN b1 <= 'Z' WHEN oe = '0‘ ELSE a . que usan dos operandos: SLA B”10011011” SLA 3 = B”11011111” B”10011011” SLA 3 = B”11011111” B”00001000” SLA -1 = B”00000100” B”00001000” SLA -1 = B”00000100” – el operando izquierdo es un array de BIT o BOOLEAN cuyo valor será desplazado SRA B”10011010” SRA 3 = B”11110011” B”10011010” SRA 3 = B”11110011” B”00001000” SRA -1 = B”00010000” B”00001000” SRA -1 = B”00010000” En el SHIFT ARITMÉTICO se conserva el valor del sitio que queda vacante (‘LEFT en SRA y ‘RIGHT en SLA) B”10011010” ROL 3 = B”11010100” B”10011010” ROL 3 = B”11010100” B”00001001” ROL -1 = B”10000100” B”00001001” ROL -1 = B”10000100” ROR B”10011010” ROR 3 = B”01010011” B”10011010” ROR 3 = B”01010011” B”10001000” ROR -1 = B”00010001” B”10001000” ROR -1 = B”00010001” 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. END ARCHITECTURE bts. --FlipFlop internos BEGIN registros: PROCESS (clk) BEGIN Forma rápida de Forma rápida de asignar el mismo valor IF clk=‘1' THEN a <= datos. 2001 32 . ENTITY tri_state_buffs IS PORT (a.

package mypack is FUNCTION string_match (a. • Su formato es: FUNCTION <nombre de función> (<parámetros de entrada>) RETURN <tipo de datos> IS {declaraciones locales: tipos. Guillermo Jaquenod. PARAMETERS PROCEDURE PARAMETERS ARCHITECTURE begin .reloj :IN STD_LOGIC.b): –Ejemplo de función 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 reloj’EVENT). SIGNAL salida : OUT STD_LOGIC) IS BEGIN LOOP WAIT UNTIL reloj = ‘1’.... sino (P.std_logic_1164.all. LIBRARY ieee. puedo definir una función string_match (a. INOUT como OUT.VHDL: Lenguaje de descripción de hardware Subprogramas: funciones y procedimientos Los subprogramas permiten implementar algoritmos reutilizables. 2001 Subprogramas: las funciones Función para comparar strings con don’t care Una funcion se dice pura (pure) si al ser llamada con identicos parametros devuelve igual valor de retorno. • Si los parámetros son VARIABLE los PROCEDURE sólo pueden ser llamados desde dentro de procesos. –Ejemplo de función impura (algo así como stack_allocate () ) IMPURE FUNCTION memuso (pidmem:POSITIVE) RETURN POSITIVE IS BEGIN -.R1. 2001 Fuente: ALTERA END FUNCTION <nombre de función>. BEGIN Llamadas concurrentes al Llamadas concurrentes al flipflop (D1.. por lo que el resultado de la evaluación debe devolverse al programa que la invoca mediante una o más RETURN. Una FUNCTION sólo puede llamar otra FUNCTION. package body mypack is FUNCTION string_match (a.} BEGIN {functionalidad} PARAMETERS RETURN VALUE RETURN <variable o sentencia> FUNCTION Guillermo Jaquenod.variables. VHDL ofrece dos tipos de subprogramas: – FUNCIONES: usadas para el computo de un unico valor. y son siempre modo IN (no es posible a una funcion modificar un parámetro) – todas los objetos locales son volátiles.R2. P1: PROCESS BEGIN Llamadas secuenciales Llamadas secuenciales flipflop (D1.suponiendo que memo_top es una variable global compartida (SHARED variable) memo_top := memo_top + pidmem.R1. end package mypack. END FUNCTION memuso. al PROCEDURE con al PROCEDURE con PORT MAP END PROCESS P1. si son SIGNAL pueden ser llamados concurrentemente Guillermo Jaquenod. PORT MAP (dentro de un proceso) (dentro de un proceso) . END IF. Guillermo Jaquenod. y su ejecucion puede extenderse en el tiempo incluyendo sentencias tipo WAIT •Un PROCEDURE puede llamar a otro PROCEDURE o a una FUNCTION. PROCEDURE con PORT MAP PROCEDURE con PORT MAP flipflop (D2. o en un PACKAGE (prototipo) y PACKAGE BODY(cuerpo).S2). 2001 Subprogramas: los procedimientos • Los procedimientos (PROCEDURE) pueden ser usados para descomponer grandes bloques de comportamiento secuencial • Su ejecución puede afectar uno o más objetos dado que sus parámetros pueden ser tanto de modo IN. USE ieee.. END ARCHITECTURE usoproc. end Subprogramas: las funciones • Usadas para tareas tales como conversión de tipo o resolución de conflictos (P. Descripción del Descripción del salida <= dato. deben ser resueltas en el mismo ciclo de simulacion en que son llamadas. ELSIF (a(i) /= b(i)) THEN RETURN FALSE.S1).Ej: NOW) se dice impure. Para comparar dos operandos tipos std_logic_vector. Son declarados en la sección ARCHITECTURE de una entidad (previo al BEGIN).constantes.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.S1).b: IN std_logic_vector) RETURN BOOLEAN.Ej: doble asignación a una misma señal) – los parámetros de llamada (o invocacion) pueden ser tanto de tipo variable como signal. END FUNCTION flancopos. 2001 33 . END LOOP. PROCEDURE dentro PROCEDURE dentro END LOOP.. de sentido de crecimiento del rango END FUNCTION string_match. Ejercicio: agregar test de longitud y RETURN TRUE. cuyos elementos puedan ser ‘X’ (desconocido). 2001 Guillermo Jaquenod. RETURN memo_top. (DOWNTO o TO) end package body mypack. • 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>. 2001 Subprogramas: un flipflop como procedimiento ARCHITECTURE usoproc OF ejemplo IS PROCEDURE flipflop (SIGNAL dato. 2001 Guillermo Jaquenod. de una arquitectura de una arquitectura END PROCEDURE flipflop. por ello no aceptan sentencias WAIT – PROCEDIMIENTOS: usados para descomponer grandes bloques de comportamiento. Guillermo Jaquenod.

y STD_LOGIC_VECTOR –de . 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')). >=. 2001 Guillermo Jaquenod.vhd y arithb. END ARCHITECTURE rangoabierto. 0)). 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')). con retorno de identico tipo revisar c:\MAXPLUS2\VHDL93\IEEE\arith. con retorno UNSIGNED. SIGNED y STD_LOGIC_VECTOR respectivamente • Funciones ZERO_EXTEND y SIGN_EXTEND para operandos STD_LOGIC_VECTOR. • Un PROCEDURE puede ser visto en modo similar a una MACRO en muchas aplicaciones de software. con retorno INTEGER.. Bases de VHDL Descripción de la Descripción 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. bmax <= max (b1. tal como han sido definidos en el package estándar IEEE. 2001 Tipos y Packages aritméticos Uso eficiente de operadores aritméticos Guillermo Jaquenod. SIGNED. 2001 Fuente: MAXPLUS2\VHDL93\IEEE\STD1164. • Dentro de los subprogramas el código VHDL es secuencial (así como lo es en un PROCESO).VHD Subprogramas: parámetros de rango “abierto” LIBRARY ieee. Altera recomienda el uso de los siguientes tipos: – STD_LOGIC y STD_LOGIC_VECTOR. su carácter instantáneo no permite el uso de objetos locales tipo SIGNAL o sentencias WAIT Guillermo Jaquenod.vhd !! revisar c:\MAXPLUS2\VHDL93\IEEE\arith. . END std_logic_1164. END IF. END. 0). <=. STD_ULOGIC. en la IEEE library del MAX+plus II se encuentra una copia de los packages: – STD_LOGIC_ARITH.ELSE. – STD_LOGIC_SIGNED. con retorno UNSIGNED. BEGIN amax <= max (a1.ALL. <. en el package STANDARD. UNSIGNED y SIGNED. ELSE RETURN op2. Prototipos Prototipos PACKAGE BODY std_logic_1164 IS .VHD y STD1164B. END std_logic_1164. WHEN.. SIGNED. para operandos UNSIGNED y SIGNED. Guillermo Jaquenod..vhd y arithb.b2: IN std_logic_vector bmax: OUT std_logic_vector END ENTITY usoprocs. INTEGER.a2: IN std_logic_vector amax: OUT std_logic_vector b1. ENTITY usoprocs IS PORT ( a1. ARCHITECTURE rangoabierto OF usoprocs IS FUNCTION max (SIGNAL op1. – STD_LOGIC_UNSIGNED. . =. UNSIGNED.VHDL: Lenguaje de descripción de hardware Subprogramas: funciones y procedimientos • Todas las funciones y procedimientos pueden ser escritos sin especificar el rango de los parámetros.(24 en cada caso) para operandos UNSIGNED.. • De todos modos.. SIGNED.std_logic_1164. para la realizacion de operaciones aritméticas. y /= (8 funciones en cada caso). STD_ULOGIC y retorno UNSIGNED. y en 1995 el IEEE los integró (con modificaciones) en NUMERIC_STD.STD_LOGIC_1164). FUNCTION rising_edge (SIGNAL s:std_ulogic) RETURN BOOLEAN. END max. Guillermo Jaquenod. porque eso fuerza al agregado de funciones de conversión. Si no se explicita que sus parámetros son de tipo SIGNAL. • No se recomienda el uso mezclado de tipos en un mismo diseño. 0). USE ieee. END.. WITH. • En el caso de las FUNCTIONS. >. la declaración se describe en la parte declarativa del PACKAGE y la funcionalidad en el PACKAGE BODY. • Estos packages fueron desarrollados por Synopsis. y STD_LOGIC_VECTOR –de *. que complican el código y la comprensión.. CONV_SIGNED y CONV_STD_LOGIC_VECTOR (4 funciones en cada caso) para operandos INTEGER. en este caso.. y STD_LOGIC_VECTOR –de + unario (4 funciones) para operandos UNSIGNED y SIGNED.b2). FUNCTION falling_edge (SIGNAL s:std_ulogic) RETURN BOOLEAN. 2001 Definición de Subprogramas en un package PACKAGE std_logic_1164 IS . con retorno STD_LOGIC_VECTOR • Funciones de Overload: –de + y .a2).vhd !! Guillermo Jaquenod. y STD_LOGIC_VECTOR –de SHL y de SHR (2 funciones en cada caso) para operandos UNSIGNED y SIGNED. – BIT y BIT_VECTOR.vhd? Operaciones y tipos aritméticos • Para Operaciones y tipos aritméticos.. 2001 Fuente: ALTERA 34 . SIGNED. por lo no es posible usar dentro de ellos estructuras como PROCESS.unario y de ABS (2 funciones en cada caso) para operandos SIGNED. CONV_UNSIGNED. (3 (3 (6 (6 DOWNTO DOWNTO DOWNTO DOWNTO 0). lo que aumenta su versatilidad • Los subprogramas pueden ser definidos luego de ARCHITECTURE (de alcance local) o en un PACKAGE (para tener alcance global).op2: IN std_logic_vector) RETURN std_logic_vector IS BEGIN IF (op1 > op2) THEN RETURN op1. 2001 Fuente: ALTERA • Definición de los nuevos tipos UNSIGNED y SIGNED como array (NATURAL range <>) of STD_LOGIC • Funciones de Conversión CONV_INTEGER.SELECT.. se asume que son VARIABLE. con retorno SIGNED. tal como han sido definidos en la STD library. 2001 Qué incluye logic_arith.

R: UNSIGNED) return STD_LOGIC_VECTOR. USE ieee. 2001 Guillermo Jaquenod. result:OUT INTEGER). <=. /=. e INTEGER. con retorno BOOLEAN – function CONV_INTEGER (STD_LOGIC_VECTOR) return INTEGER. UNSIGNED. _SIGNED y _UNSIGNED • La IEEE library tiene dos packages adicionales para facilitar operaciones aritméticas sobre objetos tipo STD_LOGIC_VECTOR: los packages STD_LOGIC_UNSIGNED y STD_LOGIC_SIGNED. function "+“ (L: SIGNED. -.all. largo=5 bits largo=5 bits largo=6 bits largo=6 bits • Tanto caso1 como caso2 serán STD_LOGIC_VECTOR (4 DOWNTO 0).vhd !! así como unsigned. caso1 <= CONV_UNSIGNED (a) + CONV_UNSIGNED (b).. END maxpld. caso2 <= CONV_SIGNED (a) + CONV_SIGNED (b). pero caso3 y caso4 serán STD_LOGIC_VECTOR (5 DOWNTO 0). y extiende el signo en SIGNEDs Fuente: ALTERA _LOGIC_ARITH. – CONV_STD_LOGIC_VECTOR: convierte un INTEGER. UNSIGNED. 2001 – Un tipo UNSIGNED representa un valor numérico que sólo puede ser positivo o cero.VHDL: Lenguaje de descripción de hardware Qué incluyen std_logic_signed y .vhd. revisar c:\MAXPLUS2\VHDL93\IEEE\signed.vhd !! Guillermo Jaquenod. END adder. UNSIGNED. 2001 Fuente: SJOHOLM 35 . USE ieee. SIGNED. Fuente: ALTERA Conversión de tipos aritméticos – CONV_INTEGER: convierte un INTEGER.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. es necesario además del dato a convertir el tamaño del resultado. ENTITY adder IS PORT ( op1. en el package STD_LOGIC_ARITH como array (NATURAL range <>) of STD_LOGIC Por ejemplo: revisar c:\MAXPLUS2\VHDL93\IEEE\signed. Guillermo Jaquenod._unsigned? Usan los tipos y funciones definidos en std_logic_arith.sin signo cs <= CONV_SIGNED(a) + CONV_SIGNED(b) . • Para CONV_STD_LOGIC_VECTOR.vhd.con signo END ARCHITECTURE mixta. 2001 Agregado de bits en una conversión • Es importante tener qué sucede cuando una operación aritmética devuelve un objeto tipo STD_LOGIC_VECTOR.ALL. UNSIGNED e INTEGER. 2001 Tipos SIGNED y UNSIGNED •Ejemplo: un sumador con entradas UNSIGNED y salida INTEGER LIBRARY ieee. UNSIGNED. cero o negativo. 2001 Ejemplo de conversión aritmética • 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. SIGNED. seleccionadas según el tipo de sus operandos Guillermo Jaquenod. Guillermo Jaquenod.vhd y signedb. SIGNED. MAX+PLUS II agrega ceros en UNSIGNEDs. o STD_ULOGIC en un INTEGER.b : STD_LOGIC_VECTOR (4 DOWNTO 0).vhd y signedb.std_logic_1164. >=. De cada función hay cuatro versiones.std_logic_1164. Por ejemplo: SIGNED'("0110") representa +6 – Un tipo SIGNED representa un valor numérico que puede ser positivo. así como unsigned. Guillermo Jaquenod.all. SIGNED. caso3 <= CONV_UNSIGNED (a) + CONV_SIGNED (b). • Según cuál de estos packages haya sido incluído los objetos serán 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 conversión LIBRARY ieee. En el MAX+PLUS II se codifica en complemento a dos.ALL. uno SIGNED y otro UNSIGNED: SIGNAL a. (2 funciones en cada caso) para operandos STD_LOGIC_VECTOR e INTEGER.(5 funciones en cada caso) para operandos STD_LOGIC_VECTOR. STD_LOGIC. – CONV_UNSIGNED: convierte un INTEGER. ARCHITECTURE maxpld OF adder IS BEGIN result <= CONV_INTEGER(op1 + op2). 2001 • Los tipos SIGNED y UNSIGNED están definidos dentro de la IEEE library. USE ieee. caso4 <= CONV_SIGNED (a) + CONV_UNSIGNED (b). con retorno STD_LOGIC_VECTOR – Funciones de Overload de <. ARCHITECTURE mixta OF ejemplo IS ss <= CONV_UNSIGNED(a) + CONV_UNSIGNED(b) .op2:IN UNSIGNED(7 DOWNTO 0).vhd y unsignb.std_logic_arith. En el MAX+plus II se codifica con un número binario puro. o STD_ULOGIC en un UNSIGNED. y agregan nuevas funciones de Overload para operaciones aritméticas sobre objetos de tipo STD_LOGIC_VECTOR: – Funciones de Overload de + y de . =. • Y se suman dos operandos. >. -. – CONV_SIGNED: convierte un INTEGER.all. o STD_LOGIC en un STD_LOGIC_VECTOR.vhd y unsignb.std_logic_arith. • En el package STD_LOGIC_ARITH se agregan funciones para convertir valores a los tipos SIGNED. y por ello extender ambos operandos en 1 bit. con retorno STD_LOGIC_VECTOR – Funciones de Overload de + y – unario y de ABS (1 funciones en cada caso) para operando STD_LOGIC_VECTOR. porque para poder resolver estos casos (SIGNED mezclado con UNSIGNED) no hay otra solución que realizar la suma en modo SIGNED. donde el MSB está asociado al signo SIGNED'("1010") representa -6 Guillermo Jaquenod. con retorno STD_LOGIC_VECTOR – Funcion de Overload de * (1 funcion) para operandos STD_LOGIC_VECTOR. o STD_ULOGIC en un SIGNED. CONV_UNSIGNED. y CONV_SIGNED. USE ieee.

Definida por el diseñador MAXIMUM (integer. 2001 ARITMETICO 3 inp. ACEX y APEX: los “modos de operación” NORMAL 4 inp.integer) RETURN (integer).all. END ENTITY add_ex1.std_logic_1164. 2001 Uso eficiente de operadores aritméticos LIBRARY ieee. sum:OUT std_logic_vector(15 DOWNTO 0)). END ARCHITECTURE behavior. en las familias FLEX. BEGIN PROCESS(a. COMPILADOR + sum a • 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. ELSE a_in1 <= c. Definida en STD_LOGIC_ARITH •• MAXIMUM (integer. b d + Uso eficiente de operadores aritméticos LIBRARY ieee. Definida en STD_LOGIC_ARITH STD_LOGIC_VECTOR UNSIGNED. LIBRARY ieee. END ARCHITECTURE behavior.d.all. 2001 Fuente: ALTERA 36 . distintas herramientas EDA ofrecen muy diferentes niveles de optimización Guillermo Jaquenod. Guillermo Jaquenod. IF input='0' THEN sum <= a + b. Definida en STD_LOGIC_ARITH •• CONV_STD_LOGIC_VECTOR (integer. END ENTITY add_ex1.d.all. 2001 Uso aritmético de las familias FLEX.all. USE ieee. éste no debe perder la idea que cada vez que pone un operador ”+” o “-” está instanciando un sumador en silicio. 2001 Fuente: ALTERA • Al disponer una entrada alternativa a Data 3 desde la cadena de Carry (señal Carry_In) sirve para terminar una suma cuando es necesario tener acceso a la señal Cout de la etapa más significativa para su uso por otros circuitos • Permite uso pleno de las cadenas de Cascada y de funciones adicionales como registerpacking.input) BEGIN IF input = '0' THEN a_in1 <= a. pero también 48 LEs. D a c ENTITY add_ex1 IS PORT(a. 2001 Sin bien el nivel de abstracción mayor “libera” al diseñador de pensar en detalles de arquitectura.integer) RETURN (std_logic_vector) CONV_STD_LOGIC_VECTOR (integer. ACEX y APEX.c. USE ieee. LUT PRN D Q ENA CLRN Cascade Out 3 inp. 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. redefinen las conexiones de los recursos internos de cada macrocelda. return CONV_STD_LOGIC_VECTOR (result. input:IN std_logic. Definida en STD_LOGIC_ARITH para la funcion opuesta.c. USE ieee. LUT • En este modo cada LE puede resolver funciones de Fan-In 4. USE ieee. USE ieee.integer) RETURN (integer). sum:OUT std_logic_vector(15 DOWNTO 0)). pues el diseñador sólo describe qué es lo que desea (behavior) y el compilador resuelve cómo hacerlo (estructura) b sum <= a + b. R: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR is constant length: INTEGER := MAXIMUM (L'length. END IF. LUT 3 inp. LUT 3 inp. END ARCHITECTURE behavior. a_in2 <= b. de modo de hacer más eficiente la realización de ciertas aplicaciones típicas. begin result := CONV_INTEGER(L) + CONV_INTEGER(R). END PROCESS. end. y que el grado de optimización o minimización depende fuertemente del estilo en que se describa el diseño.b.c.d:IN std_logic_vector(15 DOWNTO 0). • Y no engañarse: para el mismo programa fuente en VHD.all. sum:OUT std_logic_vector(15 DOWNTO 0)). R'length). PRN D Q ENA CLRN COUNTER C/CLEAR • Los modos de operación de los elementos lógicos.input) PROCESS(a. la suma está definida para tipos numéricos) • • Si se desea ampliar el significado del operador para otros tipos se debe definir una función “+” para esos tipos: function "+” (L: STD_LOGIC_VECTOR.length).integer) RETURN (std_logic_vector) para la funcion opuesta.b:IN std_logic_vector(15 DOWNTO 0). LUT 3 inp. input:IN std_logic. c. registradas o no.b.c.b:IN std_logic_vector(15 DOWNTO 0). a c ENTITY add_ex1 IS ENTITY add_ex1 IS PORT(a. ENA CLRN Data3 Data4 4 inp.std_logic_arith. 2001 Guillermo Jaquenod.VHDL: Lenguaje de descripción de hardware Ejemplo de Overload de un operador aritmético Uso eficiente de operadores aritméticos • Los operadores están definidos sólo para ciertos tipos de operandos (por ejemplo. c. pero sólo 1 bloque de 16 LEs sólo 1 bloque de 16 LEs usa cadenas de Carry usa cadenas de Carry El “modo de operación” NORMAL en FLEX/ACEX/APEX PRN D 1 sumador 1 sumador + + 2 multiplexer: 2 multiplexer: Guillermo Jaquenod. o de flipflops con enable se hace a costa de perder fan-in (Data 4 o Data 1. END IF.a_in2: std_logic_vector(15 DOWNTO 0).d:IN std_logic_vector(15 DOWNTO 0). ELSE sum <= c + d. sum <= a_in1 + a_in2. END PROCESS. • El uso de register packing.std_logic_1164. END ENTITY add_ex1. LUT Fuente: ALTERA Cascade In Carry In Data1 Data2 Q Q ENA CLRN también 48 LEs. variable result : INTEGER.input) BEGIN BEGIN IF input='0' THEN sum <= a + b.all.std_logic_arith. USE ieee. END PROCESS. LUT PRN D Q ENA CLRN U/D COUNTER 3 inp. PORT(a.d:IN std_logic_vector(15 DOWNTO 0). END IF. ELSE sum <= c + d. input:IN std_logic.b. respectivamente) • Si una función se requiere a la vez en forma combinatoria y registrada la celda se aprovecha al máximo (recordar para el ejemplo de computo paralelo de CRC-16) Guillermo Jaquenod.d. Los operadores aritméticos de suma y resta (+) y (-) permiten un alto nivel de abstracción en funciones aritméticas.std_logic_arith. Definida por el diseñador Guillermo Jaquenod.std_logic_1164. a_in2 <= d.b. 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. LUT PRN sum input ARCHITECTURE behavior OF add_ex1 IS SIGNAL a_in1.

VHDL: Lenguaje de descripción de hardware
El “modo de operación” ARITMÉTICO en
FLEX/ACEX/APEX
Carry In
Data1
Data2

AnBn

Cascade In
3 inp.
LUT

A1B1

El “modo de operación” U/D Counter en
FLEX/ACEX/APEX

A0B0 Cin
Carry In
Enable

PRN
D

Q

Din

ENA
CLRN

3 inp.
LUT

Carry Out

Cout

Cascade Out

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

S0

U/D
Load

Cascade In
3 inp.
LUT

PRN
D

Q

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 sólo se emplea si las cadenas de Carry están 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 sincrónico, ENABLE y Up/Down.

• El resultado de la operación (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 automáticamente este modo de operación

• En un sumador de ‘n’ bits con Carry de entrada y de salida se hace necesario un LE
adicional en modo aritmético 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 operación” CLEARABLE
COUNTER en FLEX/ACEX/APEX
Carry In
Enable

3 inp.
LUT

PRN
D

Din
Clear
Load

Q

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 sincrónico, y ENABLE.
• Si las prioridades se respetan y el uso de Carry-Chains está habilitado, el MAX+plusII
emplea automáticamente este modo de operación
• El uso de la cadena de Carry impone restricciones de fitting
• CLEAR siempre tiene prioridad sobre LOAD, en tanto que ENABLE puede tener la
máxima o la míinima prioridad. Si la especificación 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 cómo se hace), pero a su vez tienen prioridad sobre
Up/Down. Si la especificación 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, más 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 sólo 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

D

Q

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 descripción 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

Q

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

D

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

q

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

Q

Fuente: ALTERA MAX+plus II HELP

d

q

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;

q

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 descripción de hardware
Ejemplo: contador con SCLR, ENA y UpDown

Funciones de conversión 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

Extensión de cero (ieee.std_logic_arith EXT)

Extensión 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 aritméticos, y para unificar los métodos de manejo aritmético 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 conversión 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
conversión:

Diseño de
máquinas 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 descripción de hardware
Diseño de máquinas de estado con VHDL

Las máquinas de estado finito (FSM) son herramientas FUNDAMENTALES
de cualquier diseño digital moderno.
Para su diseño conviene seguir ciertas reglas generales:
– Definir los estados usando un nuevo tipo, creado por enumeración:
TYPE tipo_de_estado IS (idle, tap1, tap2, tap3, tap4 );
– Definir dos objetos que almacenan los estado actual y futuro como
señales de ese tipo predefinido:
SIGNAL filter : tipo_de_estado;
– Crear la tabla de transición 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 función de las entradas
– Para definir el comportamiento de las salidas:
• Usar asignaciones Conditional y/o Selected
• O un segundo CASE (P.Ej: para máquinas de MOORE)

Guillermo Jaquenod, 2001

Diseño de máquinas de estado con VHDL
usando señales
ENTITY semaforo IS PORT(clk,fotocelda:IN BIT; rojo,amarillo,verde:OUT BIT);
END ENTITY semaforo;
defino un nuevo tipo de variable,
por enumeración!
ARCHITECTURE a OF semaforo IS
TYPE modo_semaforo IS (stop, prepare, pase, alerta, nocturno);
SIGNAL estado : modo_semaforo;
defino la tabla de
BEGIN
transición 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
ATENCIÓN:
ATENCIÓN:
IF clk'EVENT AND clk = '1' THEN
ENUM_ENCODING
ENUM_ENCODING
CASE estado IS WHEN stop
=> estado <= prepare;
es un atributo sólo
es un atributo sólo
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 síntesis!!
proceso de síntesis!!
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
don’t
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 descripción como el
estilo de descripción como el
IF clk'EVENT AND clk = '1' THEN
de una máquina de estados
de una máquina 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
Sólo 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

ent{}) E(k)=EA En el caso del uso de One-Hot es usual que sólo el flip-flop activo esté en ‘1’. sin embargo. el flanco se “engancha” acá Caso: recuperador de reloj: • Usando codificacion binaria se requieren Si se emplean CEIL(log2(n)) elementos de memoria.EA) SAL{} = g(E(k)) Entradas Salidas MEALY Cómputo del estado siguiente Registros de estado Fuente: ALTERA Guillermo Jaquenod. Si se emplean ‘n’ elementos de memoria (uno por estado). para ello. aunque no es necesario que así sea (incluso es conveniente que el estado de RESET sea codificado mediante un ‘0’). 8k y 10k). 2001 Guillermo Jaquenod. Este uso de En la codificacion One-HOT la lógica combinatoria que precede a cada flipflop es sólo función de los flipflops asociados a los estados anteriores e3 e7 estaados se asignan manualmente • En codificación One-Hot se requieren 9 En la codificación binaria el número de flipflops es minimo. en MAX+PLUS II puede definirse un “atributo” llamado “enum_encoding” al definir los estados. puede ser más eficiente cuando se usan dispositivos FLEX10K. 2001 Cómputo del estado siguiente memoria reloj MOORE Guillermo Jaquenod. Esta asignacion por default puede ser cambiada. 2001 Evitando los glitches en las salidas de maquinas tipo Moore Registros de estado Entradas Registros de estado Diseño de máquinas de estado con VHDL: Maquinas tipo Mealy y tipo Moore Cómputo de las salidas E(k+1)=EF=f(ent{}. Bloque combinatorio Cómputo del estado siguiente Cómputo de las salidas Salidas Entradas MOORE Las salidas son función combinatoria sólo del estado actual (pueden presentar glitches debido al skew del registro de estados o a caminos de propagación) –Es facil de codificar en VHDL –Las ecuaciones de las salidas son de menor fanin y más fáciles de rutear –Suelen requerir más estados que una máquina MEALY equivalente Guillermo Jaquenod. y por ello de gran fan-in y con muchos términos e2 codificar el estado actual. por lo que pueden presentar glitches • Cómo hago para evitarlos? Las salidas son función combinatoria del estado y las entradas actuales –Es facil de codificar en VHDL (usando un simple CASE) –Las salidas pueden presentar más glitches que en una máquina de MOORE y sus ecuaciones son de mayor fanin –Algo más difíciles de rutear Guillermo Jaquenod. 2001 41 . se dice que su codificacion es “One-HOT”. e2 y una entrada 8rxck Guillermo Jaquenod. y una más para e6 e4 elementos lógicos. tres de ellas para Una solución que emplee más flipflops. para asignar un dado valor binario a cada uno de los posibles estados (este atributo sólo es interpretado por el MAX+plus II) MEALY ent{} Cómputo de las salidas Salidas • Las salidas son resultado de una función combinatoria. 2001 Guillermo Jaquenod. se dice que su codificacion es “binaria”. PORQUÉ???? e1 macroceldas puede bajar a sólo 3 si los e8 calcular la salida rxck. e5 y una entrada • pero e2 (ver líneas azules) es función de rxd edge detect rxck recuperador de reloj cuatro variables: e8. pero la lógica combinatoria que excita cada flipflop es una funcion compleja de TODOS los flipflops usados en la máquina. 2001 Descripción de maquinas de estado “One-HOT” y Binarias en VHDL Diseño de máquinas de estado con VHDL: Maquinas tipo Mealy y tipo Moore Cuando MAX+PLUS II detecta que un circuito representa una máquina de estados. 4 macroceldas. usa por “default” la codificación binaria si la familia elegida es MAX (7K o 9k) y la codificacion One-HOT cuando se usa FLEX (6k. 8 para codificar los 9 e5 estados y uno más para la salida rxck • el estado e7 es función de tres variables: rxd e6.VHDL: Lenguaje de descripción de hardware Maquinas de estado: “One-HOT” y Binarias Máquinas de estado One-HOT” y Binarias Para la codificación de una máquina de ‘n’ estados se requieren al menos CEIL(log2(n)) elementos de memoria. e1. 2001 SAL{} = g(E(k).

Sin latencia.. y se mueven de lugar a lugar siguiendo las transiciones que se “disparan”.. 2001 Una arquitectura de jerarquía plana (flat) Nivel superior (Estructural) . los estados internos de una FSM pueden ser agrupados en clases de equivalencia. 2001 Guillermo Jaquenod. – Una transición suele tiene asociada una condición de disparo... • Counters • Adders • State Machines Fuente: ALTERA 42 . 2001 Componente n (Behavioral) . posibilitando el modelado de LSMs (Linked State Machines) Desde el punto de vista de su interacción. y que la condición se cumpla. Sin latencia. y requiere más lógica combinatoria de gran fanin Entradas Cómputo de las salidas Registros de estado Entradas Registros de estado • Cómputo del estado siguiente Registros de estado Solucion 1: Registra las salidas. introduce más retardos combinatorios (menor Fmax) Entradas Cómputo de las salidas Cómputo del estado siguiente Registros de salidas Registros de salidas Cómputo del estado siguiente Cómputo de las salidas • Salidas • • Si en una entidad se describe una máquina de estados. Aunque M máquinas de estado con N estados cada una pueden presentar NM posibles casos. Fuente: BAKER Guillermo Jaquenod. * – Son grafos dirigidos. 2001 Linked State Machines y Petri Nets • En cualquier diseño de mediana complejidad es previsible la necesidad de modelar múltiples máquinas de estado que operan concurrentemente. simplificado el modelado.VHDL: Lenguaje de descripción de hardware Evitando los glitches en las salidas de maquinas tipo Moore Solución 3: computa las salidas futuras en base al estado futuro. aquellos detalles “públicos” de esa máquina pueden ser “publicados” en forma de ports de un nuevo tipo. 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 Sincronización: ZONA PUBLICA!! Sincronización: ZONA PUBLICA!! • Ejemplo que muestra dos FSM sincronizadas entre sí. es la más rápida. y que interactúan entre si. pues permiten describir procesos que interactúan y se sincronizan. • A los fines “públicos” útiles para la sincronización. el PROCESO 2 puede modelizarse como si tuviera sólo dos estados (similar al PROCESO 1) • Se observan transiciones donde el número de tokens aumenta (C3). definido en un package apropiado.. 2001 PROCESO 2 C4 L1 L8 C3 L3 C1 C2 * L4 – En una PN “marcada” existen uno o más símbolos llamados “tokens” (cuya cantidad puede ser variable) que se estacionan en lugares. y otras donde ese número disminuye (C8)... Guillermo Jaquenod. Salidas Registros de salidas Solucion 2: computa las salidas futuras junto con el estado futuro en función del estado actual. en general una máquina no necesita operar conociendo los detalles internos completos de cada una de las otras máquinas. Componente 1 (Behavioral) Componente 2 (Behavioral) • Counters • Adders • State Machines • Counters • Adders • State Machines Guillermo Jaquenod.. al modo “data flow”. en los que los vértices son llamados “lugares” (y están asociados al estado de la red) y las aristas son llamadas “transiciones” (y están asociadas a los posible eventos en la red). 2001 Guillermo Jaquenod.. – El disparo de esta transición requiere que en todos los lugares de origen haya al menos un token. Salidas Guillermo Jaquenod. Requiere mínimo 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 descripción de Linked State Machines. 2001 Diseño Jerárquico FLAT • Bases de VHDL Herramientas para el diseño jerárquico Guillermo Jaquenod..

2001 Guillermo Jaquenod.VHDL: Lenguaje de descripción de hardware Diseño Jerárquico TOP-DOWN • Desventajas del Diseño FLAT Una jerarquía tipo árbol (diseño Top Down) es una mejor solución 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 . 2001 Fuente: ALTERA Beneficios del Diseño Jerárquico Si se trabaja en equipo. .vhd entity-architecture “bottom_a” bottom_b. y reusabilidad Ademas. de modo de no perder la “conexión” entre la STYLE=FAST STYLE=FAST descripción de VHDL y el hardware STYLE=WYSIWYG STYLE=WYSIWYG sintetizado.vhd entity-architecture “mid_a” component “bottom_a” Guillermo Jaquenod. y poder optimizar el diseño final STYLE=FAST STYLE=FAST ASSIGN “CLIQUE” ASSIGN “CLIQUE” Fuente: ALTERA Guillermo Jaquenod. 2001 Diseño jerárquico: formas de uso de archivos de diseño múltiples • Para poder hacer diseños jerárquicos. Guillermo Jaquenod. 2001 Fuente: ALTERA Esto implica: modularidad.vhd entity-architecture “bottom_b” Guillermo Jaquenod. o IP (Intellectual Property) Guillermo Jaquenod. portabilidad. esta segmentación del diseño hace más fácil probar soluciones alternativas para la optimización de bloques críticos por el uso de recursos o por su performance de velocidad Y posibilita el acceso a todo un mundo de diseños prevalidados. y realizar su depuración en forma individual Estos componentes pueden ser compartidos con los otros diseñadores y a la vez quedan disponibles para ser usados en diseños futuros mid_b. • La aislación de un sumador para su “sintonía” individual no es posible MÁS NIVELES DE JERARQUÍA => MÁS FLEXIBILIDAD Las ventajas del Diseño TOP-DOWN • Las desventajas de una jerarquía FLAT versus una TOP-DOWN pueden resumirse en las siguientes: – Las asignaciones (Logic Synthesis Options) son más complejas de realizar. al usar FLEX10K una buena regla Nivel 3 Nivel 3 Nivel 3 Nivel 3 Counter State Machine Adder LFSR de diseño es limitar la complejidad de cada STYLE=NORMAL STYLE=NORMAL bloque a no más de 80 a 130 macroceldas. si un módulo usa varios SUMADORES y uno de ellos requiere el uso de cadenas de Carry. a) Depende del diseño b) Depende del dispositivo a usar c) Depende del uso del dispositivo d) Tantos como sean necesarios Nivel 2 En general. encapsulamiento. 2001 Las ventajas del Diseño Jerárquico Pregunta: Cuántos niveles de jerarquía convienen en un diseño? GLOBAL_STYLE=NORMAL GLOBAL_STYLE=NORMAL ASSIGN “TIMING REQ” ASSIGN “TIMING REQ” FMAX=35MHz FMAX=35MHz Nivel 1 Nivel 2 • Por ejemplo. en VHDL se requiere la declaración y la instanciación de Componentes top. porque sólo pueden ser hechas a nivel de componente TOP. 2001 43 . 2001 Nivel 3 Fuente: ALTERA Las Opciones de síntesis pueden ser aplicadas individualmente – Las posibilidades para optimizar el ruteado y performance de un diseño son más reducidas. . cada diseñador puede crear funciones separadas (componentes) en archivos separadas. todos los demás también estarán forzados a usarlas.vhd entity-architecture “mid_b” component “bottom_a” component “bottom_b” mid_a.vhd entity-architecture “top” component “mid_a” component “mid_b” bottom_a. – En general: Guillermo Jaquenod. .

y sólo después puede hacerse referencia a él – La declaración dentro de una arquitectura permite referirse a él sólo dentro de la arquitectura – La declaración fuera de una arquitectura (en un package) permite su invocación en todas las arquitecturas que usen ese package • La sintaxis de declaración de un componente es: COMPONENT <nombre del componente> [IS] [GENERIC (lista genérica). 8237.] END COMPONENT [<nombre del componente> ]. decoder). Guillermo Jaquenod. ASET : in std_logic := '0'. Turbo Encoder y Decoder. 2001 Delineation (ATM sobre SONET o SDH) Microprocesadores: 49410.. Parallel y Serial VITERBI Decoder. Z80. 165550. 64bit 66MHz Master/Target. BIT. CNT_EN : in std_logic := '1'. 32bit/66MHz. Reed Solomon Decoder. • Un componente debe declararse dentro o fuera de una arquitectura. Image Processing Library. 8b10b Encoder/Decoder PCI: 32bit/33MHz... Discrete Cosine Transform.) PORT MAP(<port del componente> => <señal a la que se conecta>. LPM_HINT : string := UNUSED). ALOAD : in std_logic := '0'. USE lpm. PPP Packet Processor.. package LPM_COMPONENTS is component LPM_COUNTER generic (LPM_WIDTH : positive. o su nombre de configuración. Viterbi (Dual Constraint Length Decoder). Fuente: ALTERA Guillermo Jaquenod.. LPM_PVALUE : string := UNUSED. LPM_AVALUE : string := UNUSED. UPDOWN : in std_logic := '1'. IEEE1394. Target.8254. 6402. T3 Framer y Mapper. port (DATA: in std_logic_vector(LPM_WIDTH-1 downto 0):= (OTHERS => '0'). Multi-Standard ADPCM. POSPHY Level 2 y 3 (PHY y LINK side). SONET Interface.) también pueden declararse instancias de otras entidades • En estas declaraciones se da un nombre local a esa instancia..instanciación del componente GENERIC MAP (LPM_WIDTH => prescaler_size) PORT MAP (clock => clk.8251.29116.. … invocación invocación BEGIN prescaler : LPM_COUNTER -.declaraciones de componentes mediante el uso de un package LIBRARY lpm. 2001 44 . component LPM_CONSTANT. 6850 Guillermo Jaquenod. Guillermo Jaquenod. Laplacian Edge detector. Adaptive Equalizer. Reed Solomon Encoder y Decoder.). Secure Hash Algorithm.. ambos. 8255.] [PORT (descripción de las puertas).lpm_components.all. 16450. Floating Point Operator Library. 6402. . 2001 Diseño jerárquico en VHDL: declaración de componentes en un package library IEEE. Arbiter Procesadores: 8259. • tonos (DTMF. 2910.. UTOPIA Level_2. 6850. I2C.…. LPM_DIRECTION : string := UNUSED.ALL. Digital Modulator. Binary Pattern Correlator Communications: HDLC Controller (byte & bit oriented). Digital IF receiver. 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). LPM_TYPE: string := "LPM_COUNTER". Q : out std_logic_vector(LPM_WIDTH-1 downto 0)). Convolutional (encoder. PowerPC Otros: CAN. LPM_SVALUE : string := UNUSED. call progress.. 6502. Color Sopace Convertor. E3 Mapper. Constellation Mapper/Demapper. 2001 Diseño jerárquico en VHDL: Instanciación de Componentes • Así como en una aquitectura pueden declararse variables simples (SIGNAL. interleaver). 2001 Diseño jerárquico en VHDL: declaración de Componentes • Para describir la estructura de un sistema es necesario saber qué “componentes” (como llama VHDL) lo forman. Complex Multiplier/Mixer. component LPM_ABS . con los objetos de la arquitectura en definición (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. UTOPIA level 2 y 3. 8251.. y sus interconexiones. EQ : out std_logic_vector(15 downto 0). Packet HammerCores: Data Encryption. NCO Compiler. end component. CRC Checker. 32bit 66MHz Target only.) PORT ( clk: IN STD_LOGIC. Filter Library (FIR & IIR). 64bit 66MHz Master. ATM Cell Processor. Symbol Interleaver/Deinterleaver. CLK_EN : in std_logic := '1'. FFT/IFFT. Reed Solomon (encoder. Rijndael encryption/Decryption. 8259. QPSK Equalizer. ACLR : in std_logic := '0'. es: <nombre de la instancia> : <nombre del componente> GENERIC MAP(<generic del componente> => <valor>. RAW8051. USB Guillermo Jaquenod. DMA. así como la forma de asociación entre las puertas de la entidad a la que se referencia. FFT/IFFT..VHDL: Lenguaje de descripción de hardware Diseño Jerárquico: ejemplos de IP ALTERA MEGACOREs: PCI: 32bit 66MHz Master/Target.. variable (N. SCLR : in std_logic := '0'. DVB FEC Codec. declaración usando declaración usando un Package un Package ENTITY practica IS GENERIC (prescaler_size: INTEGER := 23..). 6850. q => conta). la dupla nombre de entidad+nombre de arquitectura. etc. 16450. no es necesario declarar al END ENTITY practica. 8237. 64bit 66MHz Target only Signal Processing: FIR e IIR Compiler. 8051.……. end package .std_logic_1164. 10/100 Ethernet MAC.K) encoder. Generador de Telecom: SONET Framers. Hadamard Transform Processor. NCO. 8052. CLOCK : in std_logic .. Early/Late Gate Symbol Synchronizer. 2001 Guillermo Jaquenod... SSET : in std_logic := '0'. Data encoder/decoder.<port del componente> => <señal a la que se conecta>). 2001 Diseño jerárquico en VHDL: ejemplo de Invocación de Componentes -. Guillermo Jaquenod. IEEE1284. 8255. Rank Order Filter. DAI (Digital Audio Interface). LPM_MODULUS: string := UNUSED. Diseño Jerárquico: ejemplos de IP Signal Processing & Telecom: cascadable adaptive FIR. Bridge. SDRAM. 2901. ATM Receive Processor. SLOAD : in std_logic := '0'. use IEEE. Cell La sintaxis. LFSRs. en el primer caso. Message Digest Algorithm over SONET (POS) Controller.

b... tsout. END GENERATE. 2001 Ejemplo: 4bit adder instanciando componentes ENTITY add4gen IS PORT( c0: IN BIT. c4 <= c(4).b_comp(i). + sum ARCHITECTURE ecuaciones OF full_add IS cout BEGIN sum <= a XOR b XOR cin. Se instancia y se BEGIN conecta al componente c(0) <= c0.. Posicional Posicional END COMPONENT. cout <= (a AND b) OR (a AND cin) OR (b AND cin). Guillermo Jaquenod.c(i). SI la asociación es posicional será necesario usar OPEN..sum : OUT BIT). Asociación Asociación state_in:IN STATE_TYPE). END COMPONENT. Guillermo Jaquenod..). END adder. END add4gen. ya sea en modo nominativo o posicional: PORT MAP(a.sum : OUT BIT).).)..c(i-1)..b... c4 <= c(4). BEGIN u1 : tollv PORT MAP ( tclk. – En VHDL’87 no es posible asignar directamente ‘0’ o ‘1’. la única solución es asignarle un valor estático (‘0’ o ‘1’) en el PORT MAP al instanciar el componente. full_add debe ser descripto en la arquitectura. uso que BEGIN A-B = A + /B + 1 c(0) <= sub. cross. Para ello las alternativas son: – Si al diseñar ese componente esa entrada tenía un valor de “default”. y debe crearse una señal local a la que se asigna ‘0’ o ‘1’.b: IN BIT_VECTOR(4 downto 1)..). • Si el PORT MAP se realiza mediante asociación posicional la única alternativa es colocar OPEN en el lugar respectivo de la lista de puertas: PORT MAP(a. 2001 Guillermo Jaquenod.dime.b(i).. cout. PORT MAP(. END ecuaciones. END subadd4. tdime. sum: OUT BIT_VECTOR(4 DOWNTO 1)).’0’. tgreen..OPEN.<port del componente> =>’0’. y si el PORT MAP se realiza mediante asociación nominativa existen dos alternativas: directamente no mencionar el port no usado.c(i). c_out.. 2001 Guillermo Jaquenod. SIGNAL c : BIT_VECTOR (4 DOWNTO 0)..c_in: IN BIT... tstate)..sum :OUT BIT). Invocación del Invocación 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. Como no está hecho publico mediante un PACKAGE. tcross. adder: full_add PORT MAP (a(i). al usar un sumador puede que no se desee utilizar el carry de entrada a la primer etapa).sum(i)).c.<port del componente> => OPEN. cin a b PORT MAP(. a... 2001 Componentes con entradas sin conectar • Al usar un componente pre-existente puede no interesar el uso de ciertas entradas (por ejemplo. 2001 Fuente: DUECK 45 ..red:OUT STD_LOGIC.VHDL: Lenguaje de descripción de hardware Invocación de Componentes: mapeo de la instancia por asociación posicional Componentes con salidas sin conectar • Declaración del Declaración del ARCHITECTURE tolleab_arch OF tolleab IS Componente Componente COMPONENT tollv PORT( clk : IN STD_LOGIC. SIGNAL b_comp: BIT_VECTOR (4 downto 1). adders: FOR i IN 1 to 4 GENERATE b_comp(i) <= b(i) xor sub... END adder..sum(i))..c. – Si en el diseño del componente esa entrada no tenía valor de default.b.. o asociarlo a la palabra reservada OPEN.c(i-1). y usar esta señal en el PORT MAP Guillermo Jaquenod. green.. tnickel. tred.. tquarter.. • Si el PORT MAP se realiza mediante asociación nominativa existen dos alternativas: – No mencionar el port no usado – Asociar ese port a la palabra reservada OPEN PORT MAP(.<port del componente> => OPEN. 2001 Fuente: DUECK Ejemplos: sumador/restador ENTITY subadd4 IS PORT( sub: IN BIT.b.. c4: OUT BIT.).nickel. c_out. a. Nombre del Componente Nombre del Componente Fuente: ALTERA Guillermo Jaquenod.b..cin : IN BIT. SIGNAL c: BIT_VECTOR (4 downto 0). antes del BEGIN ARCHITECTURE adder OF add4gen IS COMPONENT full_add PORT(a.b: IN BIT_VECTOR (4 DOWNTO 1). quarter:IN STD_LOGIC. ARCHITECTURE adder OF subadd4 IS COMPONENT full_add PORT(a. sum: OUT BIT_VECTOR(4 downto 1)). END full_add. sout:OUT STATE_TYPE. END GENERATE. END COMPONENT. 2001 Ejemplos: un Full-Adder estilo RTL ENTITY full_add IS PORT( a.c_in: IN BIT. c4: OUT BIT. como cualquier otro adders: FOR i IN 1 to 4 GENERATE adder: full_add PORT MAP (a(i). Guillermo Jaquenod.

y. y conectar las puertas de la función con las señales o puertas de la entidad bajo diseño.ALL. 2001 Uso recursivo de componentes: ejemplo • Barrel Shifters.std_logic_1164. b. se hace necesario definir un “árbol” de N=4 niveles de buffers. rama_1: arbol GENERIC MAP (N => N-1) PORT MAP (entra => buf1. END ENTITY buf. clrn => nrst. permite optimizar la implementación física dentro de la PLD manteniendo la portabilidad del diseño Guillermo Jaquenod. END ENTITY arbol. también un componente puede definirse en forma recursiva a partir de sí mismo. USE ieee. d. Asociación posicional Asociación posicional Guillermo Jaquenod. g. prn => nset). árbol rama_0: arbol GENERIC MAP (N => N-1) PORT MAP (entra => buf0. sali => sali(2**(N-1) TO 2**N-1)).USE ieee. 2001 Uso recursivo de componentes: ejemplo LIBRARY ieee. 1 etapa: FANOUT=2 sali(2N-1. 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 : declaración como Componentes de todas las primitivas y las megafunciones de acceso libre propias de ALTERA – megacore : declaración de Componentes de megafunciones de acceso pago de ALTERA: los Megacores – LIBRARY LPM • Contiene el package lpm_components. END COMPONENT buf. que puede ser definido por una función: FUNCTION factorial (N: IN integer) RETURN integer IS VARIABLE temp : INTEGER := 1. Guillermo Jaquenod. ENTITY buf IS PORT ( a: IN std_logic. END ARCHITECTURE basic. Gran parte de las herramientas de Bases de VHDL Uso de primitivas y LPMs de ALTERA síntesis no soportan recursión!! Guillermo Jaquenod. con la declaración de Componentes de las LPMs resueltas por ALTERA • El hecho que estas libraries describan diseños optimizados por ALTERA para sus distintos PLDs. Asociación nominal ARCHITECTURE a OF compinst IS BEGIN dff1 : DFF PORT MAP (d =>ent. donde una instancia de un objeto es definido en función de instancias más simples del mismo objeto. 2001 Guillermo Jaquenod. árboles de buffers.GENERATE) una instancia de X con algún valor (usualmente un GENERIC) de menor valor. sali: OUT std_logic_vector(0 to 2**N-1)).. LIBRARY altera. a. y=> buf1).ALL. 2001 Fuente: ALTERA 46 . instancias de ibuf1: buf PORT MAP(a=>entra. BEGIN caso límite tope: IF N=0 GENERATE BEGIN sali(0) <= entra.maxplus2. hasta llegar a un tope mínimo • Un ejemplo clásico es el cómputo del Factorial de un número. END a. así como otros circuitos pueden ser descriptos en forma recursiva • Por ejemplo. para definir procedimientos recursivos en un PACKAGE • Para ello una entidad X debe declarar en su arquitectura al componente X.d:IN STD_LOGIC_VECTOR(7 DOWNTO 0). package MAXPLUS2).0) Declaración recursiva de componentes entra ARCHITECTURE basic OF buf IS BEGIN y <= a. 2001 Guillermo Jaquenod. END ARCHITECTURE recursiva. y=> buf0).g : IN STD_LOGIC. como la figura LIBRARY ieee. Asociación nominal END compinst. w: OUT STD_LOGIC). BEGIN IF (N > 1) THEN temp := N * factorial (N-1).b. USE ieee. y: OUT std_logic). RETURN temp. LIBRARY ieee. END FUNCTION factorial. q => sal.std_logic_1164.reloj. mux: a_74151b PORT MAP (c. PORT (entra: IN std_logic. division: IF N>0 GENERATE recursión: SIGNAL buf0. nrst. ENTITY arbol IS GENERIC (N: natural). suponiendo que un buffer pudiera tener sólo un fanout de ‘2’ y que se deseara un fanout de 2N=16.ALL. clk => reloj. y lo mismo vale. ARCHITECTURE recursiva OF arbol IS COMPONENT buf IS PORT (a:IN std_logic. END GENERATE. sal: OUT STD_LOGIC. a. • Así como sucede en la función. que es quitado por el MAX+PLUS II durante la compilacion. y debe agregarse un underscore (_). y crear condicionalmente (usando IF. nset: IN STD_LOGIC.c. 2001 Fuente: ALTERA • Para instanciar Primitivas o Macrofunciones (library ALTERA.. la arquitectura BEGIN de árbol usa ibuf0: buf PORT MAP(a=>entra. END GENERATE. ENTITY compinst IS PORT ( ent. y:OUT std_logic). w) . por ejemplo. 2 etapas: FANOUT=4 3 etapas: FANOUT=8 4 etapas: FANOUT=16 Guillermo Jaquenod. y. USE altera.std_logic_1164. sali => sali(0 TO 2**(N-1)-1)). buf1:std_logic.ALL.VHDL: Lenguaje de descripción de hardware • Muchas aplicaciones pueden ser definidas en forma recursiva. • Cuando se usan Macrofunciones TTL debe tenerse en cuenta que no es válido comenzar nombres de funciones con un número. se puede instanciar un Componente.

asegurando un importante grado de portabilidad. LIBRARY lpm.ALL. que son parametrizados a través del uso de sus PORTs y de valores asignados a sus GENERICs. LPM_SIZE: POSITIVE. enable: IN STD_LOGIC := '1'.std_logic_1164. a los parámetros Nombre de la LPM Nombre de la LPM ARCHITECTURE behavior OF tst_mux IS BEGIN u1: lpm_mux GENERIC MAP(lpm_width => 16.all. aclr.std_logic_1164.all. ENTITY tst_mux IS PORT (a:in std_logic_2d (3 downto 0. PORT (data: IN STD_LOGIC_2D(LPM_SIZE-1 DOWNTO 0. USE lpm. END COMPONENT. definidas en c:\maxplus2\vhdlXX\altera\maxplus2. dando valor a sus parámetros ARCHITECTURE a OF ltch4lpm IS BEGIN latch4: lpm_latch GENERIC MAP (LPM_WIDTH => 4) PORT MAP (data => d_in. LPM_PIPELINE: INTEGER:= 0. USE ieee. q => q_out). aclr. a los ports o a las señales COMPONENT lpm_mux Para usar LPMs la Para usar LPMs la GENERIC (LPM_WIDTH: POSITIVE. PORT (data: IN STD_LOGIC_2D(LPM_SIZE-1 DOWNTO 0. LPM_HINT: STRING := UNUSED).ALL. LPM_HINT: STRING := "UNUSED"). Fuente: ALTERA Guillermo Jaquenod. 2001 COMPONENT lpm_decode IrIr al HELP al HELP del del MAX+plus II! MAX+plus II! GENERIC (LPM_WIDTH: POSITIVE. 2001 Ejemplo de LPMs: instanciación de lpm_mux Declaración del Declaración del Componente Componente Guillermo Jaquenod. Asignación de valores y:out std_logic_vector (15 downto 0)).all. LPM_TYPE: STRING := "LPM_MUX". result: OUT STD_LOGIC_VECTOR(LPM_WIDTH-1 DOWNTO 0)). 2001 result[] sel[] Fuente: ALTERA MAX+plus II HELP Ejemplos de LPMs: LPM_DECODE Declaración de LPM_MUX en lpm_components Declaración de LPM_MUX en lpm_components COMPONENT lpm_mux COMPONENT lpm_mux GENERIC (LPM_WIDTH: POSITIVE. LIBRARY altera. sel: IN STD_LOGIC_VECTOR(LPM_WIDTHS-1 DOWNTO 0).all. enable : IN STD_LOGIC. lpm_components! lpm_components! LPM_HINT: STRING := "UNUSED"). eq: OUT STD_LOGIC_VECTOR(LPM_DECODES-1 DOWNTO 0)). PORT (data: IN STD_LOGIC_VECTOR(LPM_WIDTH-1 DOWNTO 0).all. en el package lpm_components. result => y). ENTITY ltch4lpm IS PORT( d_in : IN STD_LOGIC_VECTOR(3 downto 0). Ejemplo de uso de LPMs Ejemplos de LPMs: LPM_MUX LIBRARY ieee. ARCHITECTURE a OF lch_prim IS BEGIN latch_primitive: latch PORT MAP (d => d_in. 2001 Guillermo Jaquenod.std_logic_1164. LPM_HINT: STRING := UNUSED).ALL. clken. sel: IN STD_LOGIC_VECTOR(LPM_WIDTHS-1 DOWNTO 0). library+package a usar library+package a usar LPM_WIDTHS: POSITIVE. END COMPONENT. sel: IN STD_LOGIC_VECTOR(LPM_WIDTHS-1 DOWNTO 0). result: OUT STD_LOGIC_VECTOR(LPM_WIDTH-1 DOWNTO 0)). END ARCHITECTURE behavior. LIBRARY ieee.std_logic_arith. 15 downto 0). LPM_WIDTHS: POSITIVE. LPM_WIDTH-1 DOWNTO 0). Asignación de valores a los parámetros END ENTITY tst_mux. q_out : OUT STD_LOGIC). USE ieee. lpm_size => 4. Han sido definidas como estándar por la Electronics Industry Association (EIA).all. USE ieee. LPM_PIPELINE: INTEGER := 0. aclr: IN STD_LOGIC := '0'. clock: IN STD_LOGIC := '0'. 2001 LPM significa Library • • LIBRARY ieee. LPM_MUX permite multiplexar buses (notar que data es 2D) ya sea en forma combinatoria (acción por Default) o agregando registros de pipeline clk data[][] aclr clken de la arquitectura Fuente: ALTERA MAX+plus II HELP Guillermo Jaquenod. LPM_PIPELINE: INTEGER := 0.lpm_components.std_logic_signed. END a. Mapeo de las puertas Mapeo de las puertas Nombre de la Instancia Nombre de la Instancia Fuente: ALTERA Guillermo Jaquenod. END COMPONENT. clock: IN STD_LOGIC := '0'. LIBRARY lpm. q_out : OUT STD_LOGIC_VECTOR(3 downto 0)). END COMPONENT. • • Cuando se usa el MAX+plus II el uso de primitivas de ALTERA. LPM_PIPELINE: INTEGER:= 0.ALL. LPM_WIDTHS: POSITIVE. aclr: IN STD_LOGIC := '0'. son lpm y son lpm y LPM_SIZE: POSITIVE. USE ieee.lpm_components. END ltch4lpm.maxplus2. LPM_WIDTH-1 DOWNTO 0). En VHDL su uso requiere la línea: 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. ena => enable. lpm_widths => 2) PORT MAP (data => a. PORT (data: IN STD_LOGIC_2D(LPM_SIZE-1 DOWNTO 0. LPM_DECODE permite decodificar números de entrada a valores lógicos individuales de salida ya sea en forma combinatoria (acción por Default) o agregando registros de pipeline Guillermo Jaquenod. END lch_prim.gate => enable. LPM_TYPE: STRING := "LPM_DECODE".VHDL: Lenguaje de descripción de hardware Ejemplos: uso de primitivas de MAX+plus II Uso de LPMs en VHDL of Parameterized Modules Las LPMs describen bloques funcionales importantes. sel:in std_logic_vector(1 downto 0). sel => sel. Estas primitivas no son portables. 1993 • Su uso aumenta la productividad de diseño (menor TTM:time-to-market) y provee consistentes resultados de síntesis • Cada fabricante resuelve internamente cada LPM de modo de sacar máximo provecho de las habilidades de sus componentes Las LPMs de Altera están declaradas en la LIBRARY lpm. LPM_WIDTH-1 DOWNTO 0). enable : IN STD_LOGIC. clock: IN STD_LOGIC := '0'. LPM_DECODES: POSITIVE. USE altera. USE lpm. LIBRARY lpm. EIA/IS-103. q => q_out). result: OUT STD_LOGIC_VECTOR(LPM_WIDTH-1 DOWNTO 0)). ``Library of Parametrized Modules''. USE ieee. 2001 data[] aclr enable clk clken eq[] Fuente: ALTERA MAX+plus II HELP 47 . Nombre de la LPM Y se conectan sus puertas END a. clock: IN STD_LOGIC := '0'.lpm_components. 2001 Se indica el uso de la Library LPM y del package LPM_COMPONENTS Se instancia el componente. LPM_SIZE: POSITIVE. Su formato ha sido consensuado por múltiples fabricantes de dispositivos y de software de diseño.vhd permite un control más fino sobre la arquitectura. GENERIC (LPM_WIDTH: POSITIVE. USE lpm. clken: IN STD_LOGIC := '1'. Fuente: ALTERA MAX+plus II HELP Guillermo Jaquenod.

LPM_AVALUE: STRING:="UNUSED". clock: IN STD_LOGIC:= '0'. porque aprovecha al máximo las características de arquitectura de los dispositivos de ALTERA.VHDL: Lenguaje de descripción de hardware Ejemplos de LPMs: LPM_ADD_SUB COMPONENT lpm_add_sub GENERIC (LPM_WIDTH: POSITIVE. aclr: IN STD_LOGIC := '0'. aclr. aleb: a less or equal than b. result: OUT STD_LOGIC_VECTOR(LPM_WIDTH-1 DOWNTO 0). LPM_HINT: STRING := "UNUSED"). clken: IN STD_LOGIC:= '1'. load: IN STD_LOGIC := '0'. sclr: IN STD_LOGIC := '0'. LPM_HINT: STRING := "UNUSED". obteniendo el menor uso de recursos y la máxima velocidad Guillermo Jaquenod. cin: IN STD_LOGIC := '0'. El uso de LPM_MULT es recomendable porque aprovecha al máximo las características de arquitectura de los dispositivos de ALTERA. enable: IN STD_LOGIC := '1'. agb: a greater than b. sset: IN STD_LOGIC := '0'. LPM_AVALUE: STRING := "UNUSED". Guillermo Jaquenod. aneb. direction: IN STD_LOGIC := '0'. Guillermo Jaquenod. q: OUT STD_LOGIC_VECTOR(LPM_WIDTH-1 DOWNTO 0)). LPM_HINT: STRING:= "UNUSED"). LPM_HINT: STRING := "UNUSED"). clock. ageb: a greater or equal than b. LPM_PIPELINE: INTEGER := 0. datab: IN STD_LOGIC_VECTOR(LPM_WIDTH-1 DOWNTO 0). alb. LPM_DIRECTION: STRING := "UNUSED". clock: IN STD_LOGIC. result: OUT STD_LOGIC_VECTOR(LPM_WIDTHP-1 DOWNTO 0)). PORT (data: IN STD_LOGIC_VECTOR(LPM_WIDTH-1 DOWNTO 0). aclr. IrIral HELP updown: IN STD_LOGIC := '1'. sclr: IN STD_LOGIC := '0'. LPM_PVALUE: STRING:="UNUSED". ageb. 2001 Guillermo Jaquenod. LPM_MODULUS: NATURAL:='0'. datab: IN STD_LOGIC_VECTOR(LPM_WIDTH-1 DOWNTO 0). LPM_TYPE: STRING := "LPM_ADD_SUB"). LPM_SVALUE: STRING:="UNUSED". LPM_TYPE: STRING:= "LPM_SHIFTREG". LPM_SHIFTTYPE: STRING := "LOGICAL". Los multiplicadores paralelos poseen una estructura compleja. END COMPONENT. result: OUT STD_LOGIC_VECTOR(LPM_WIDTH-1 DOWNTO 0). aset: IN STD_LOGIC := '0'. LPM_WIDTHP: POSITIVE. clk_en: IN STD_LOGIC := '1'. aset: IN STD_LOGIC := '0'. LPM_PIPELINE: INTEGER := 0. 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. 2001 Ejemplos de LPMs: LPM_COUNTER COMPONENT lpm_counter GENERIC ( LPM_WIDTH: POSITIVE. shiftout: OUT STD_LOGIC). clken: IN STD_LOGIC := '1'. LPM_TYPE: STRING:="LPM_COUNTER". PORT ( data: IN STD_LOGIC_VECTOR(LPM_WIDTH-1 DOWNTO 0). LPM_REPRESENTATION: STRING := "SIGNED". END COMPONENT. al HELP del del sset: IN STD_LOGIC := '0'. El uso de LPM_COUNTER es ideal cuando se desean sintetizar contadores de todo tipo. MAX+plus II! II! LPM_REPRESENTATION: STRING := "UNSIGNED". LPM_PVALUE: STRING := "UNUSED". q: OUT STD_LOGIC_VECTOR(LPM_WIDTH-1 DOWNTO 0). Ir al HELP Ir al HELP del del MAX+plus MAX+plus II! II! LPM_ADD_SUB facilita el diseño de circuitos de suma y resta binaria que aprovechan las características de arquitectura de los dispositivos de ALTERA. aeb: a equal b. clock: IN STD_LOGIC. aleb: OUT STD_LOGIC). datab: IN STD_LOGIC_VECTOR(LPM_WIDTHB-1 DOWNTO 0). aeb. END COMPONENT. aclr: IN STD_LOGIC := '0'. underflow. PORT ( dataa. PORT ( dataa. LPM_WIDTHB: POSITIVE. cout: OUT STD_LOGIC := '0'. END COMPONENT. overflow: OUT STD_LOGIC). overflow: OUT STD_LOGIC). aneb: a not equal b. sum: IN STD_LOGIC_VECTOR(LPM_WIDTHS-1 DOWNTO 0):=(OTHERS=>'0'). cin: IN STD_LOGIC := '0'. agb. alb: a less than b. 2001 COMPONENT lpm_compare GENERIC (LPM_WIDTH: POSITIVE. aclr. LPM_TYPE: STRING := "LPM_COMPARE". sload: IN STD_LOGIC := '0'. LPM_TYPE: STRING := "LPM_MULT". cout. 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. LPM_HINT: STRING := "UNUSED"). 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. distance: IN STD_LOGIC_VECTOR(LPM_WIDTHDIST-1 DOWNTO 0). 2001 Fuente: ALTERA MAX+plus II HELP 48 . obteniendo el menor uso de recursos y la máxima velocidad Fuente: ALTERA MAX+plus II HELP Guillermo Jaquenod. LPM_HINT: STRING:="UNUSED"). LPM_REPRESENTATION: STRING := "UNSIGNED". del del MAX+plus LPM_WIDTHS: NATURAL := 0. LPM_DIRECTION: STRING:="UNUSED". cnt_en: IN STD_LOGIC := '1'. PORT ( dataa: IN STD_LOGIC_VECTOR(LPM_WIDTHA-1 DOWNTO 0). clock: IN STD_LOGIC := '0'. y puede operar en forma combinatoria (acción 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_DIRECTION: STRING:= "UNUSED". clken: IN STD_LOGIC := '1'. y puede operar en forma combinatoria (acción por Default) o agregando registros de pipeline Fuente: ALTERA MAX+plus II HELP Guillermo Jaquenod. END COMPONENT. add_sub: IN STD_LOGIC := '1'. PORT ( data:IN STD_LOGIC_VECTOR(LPM_WIDTH-1 DOWNTO 0):= (OTHERS => '0'). 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_SVALUE: STRING := "UNUSED"). LPM_WIDTHDIST: POSITIVE. LPM_PIPELINE: INTEGER := 0. MAX+plus II! MAX+plus II! aload: IN STD_LOGIC := '0'. LPM_TYPE: STRING := "LPM_CLSHIFT". shiftin: IN STD_LOGIC := '1'. END COMPONENT. cuya estrategia de optimizacion depende fuertemente de la arquitectura usada.

2001 Fuente: ALTERA MAX+plus II HELP MAX+plus II/VHDL: diseño de megafunciones • Para diseñar una megafunción se usa el campo de GENERICs en la descripción de la entidad para listar todos los parámetros de la entidad. 2001 49 .relojsal: IN STD_LOGIC. LPM_TYPE: STRING := "LPM_RAM_DQ". Guillermo Jaquenod. ACEX y FLEX10K. FLEX 10KA. 4 u 8 data in EAB Local Interconnect in clock RAM / ROM address in clock D 2048 bits 256 x 8 512 x 4 1. q: OUT STD_LOGIC_VECTOR(LPM_WIDTH-1 DOWNTO 0)). 2001 Instanciación del Instanciación del componente LPM componente LPM escribir. Guillermo Jaquenod. ACEX1K y APEX hace conveniente contar con componentes predefinidos de VHDL que faciliten la construcción de funciones basadas en memoria. Para el caso de FLEX10KE. END COMPONENT. otros recursos (contadores de otros recursos (contadores de lectura y escritura) cuya realización LPM_TYPE: STRING := "LPM_FIFO".ALL. Altera no recomienda crear funciones propias para el manejo de memoria. • Para usar esa megafunción 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 macrofunción o primitiva es que al crear esa instancia. y FLEX 10KB. Fuente: ALTERA COMPONENT LPM_FIFO GENERIC (LPM_WIDTH: POSITIVE. Guillermo Jaquenod. y FLEX 10KB. END ram256x8. lpm_ram_dp: memoria sincrónica o asincrónica de doble puerta. address: IN STD_LOGIC_VECTOR(LPM_WIDTHAD-1 DOWNTO 0). rdreq.. sino usar las LPMs provistas para la creación de RAMs y ROMs. LPM_RAM_DQ es el modelo VHDL LPM_WIDTHAD: POSITIVE. LPM_HINT: STRING:= "UNUSED"). clock. usedw: OUT STD_LOGIC_VECTOR(LPM_WIDTHU-1 DOWNTO 0) q: OUT STD_LOGIC_VECTOR(LPM_WIDTH-1 DOWNTO 0)). PORT ( data: IN STD_LOGIC_VECTOR(LPM_WIDTH-1 DOWNTO 0). escribir. ACEX1K y APEX.q END usoLPM. – – – – data out D D 11 a 8 Qué es un EAB? LPMs para instanciación 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. END COMPONENT. LPM_INDATA: STRING := "REGISTERED". donde se definen los valores específicos de los parámetros de ese componente para esa instancia. USE lpm. lectura y escritura) cuya realización queda oculta al diseñador. full. sclr: IN STD_LOGIC := '0'. Para el caso de FLEX10K. aclr. LPM_RAM_DQ es el modelo VHDL más proximo a un EAB real más proximo a un EAB real LPM_NUMWORDS: NATURAL : = 0. el GENERIC MAP se basa en las primitivas PARAM definidas en ese gráfico Guillermo Jaquenod. el GENERIC MAP coincide con la descripción dada en la sección WITH(. LPM_SHOWAHEAD: STRING := "OFF" LPM_HINT: STRING := "UNUSED"). LIBRARY lpm. – Si el componente había sido diseñado en VHDL.gdf). outclock: IN STD_LOGIC := '0'.048 x 1 write enable D in clock Write Pulse Circuit • La disponibilidad de bloques de memoria (EABs) en los FLEX10K.relojent. además del PORT MAP debe hacerse un GENERIC MAP.outclock => relojsal. Guillermo Jaquenod. FLEX 10KA.) del prototipo – Si el componente había sido diseñado en modo gráfico (*. wrreq: IN STD_LOGIC. lpm_fifo: memoria (FIFO) sincrónica o asincrónica de doble puerta real lpm_fifo_dc: memoria (FIFO) sincrónica o asincrónica de reloj dual. LPM_NUMWORDS: POSITIVE. insertos en las arquitecturas APEX. 2001 Guillermo Jaquenod. y opcionalmente sus valores de default. ACEX y FLEX10K. 8 1. Package de LPMs Package de LPMs ENTITY ram256x8 IS PORT( datos: IN STD_LOGIC_VECTOR (7 DOWNTO 0).address => direcciones.we => inclock => relojent.024 x 2 2. => salidas). LPM_OUTDATA: STRING:= "REGISTERED".lpm_width => 8) PORT MAP(data => datos. 2. empty: OUT STD_LOGIC. PORT (data: IN STD_LOGIC_VECTOR(LPM_WIDTH-1 DOWNTO 0).ALL. el GENERIC MAP coincide con la descripción de GENERICs del componente – Si el componente había sido diseñado en AHDL. salidas: OUT STD_LOGIC_VECTOR (7 DOWNTO 0)). inclock: IN STD_LOGIC := '0'. 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. USE ieee. 2001 Ejemplos de LPMs y EABs: LPM_RAM_DQ – – – lpm_ram_dq: memoria sincrónica o asincrónica con entrada y salida separada lpm_ram_io: memoria sincrónica o asincrónica con entrada y salida común lpm_rom: memoria ROM sincrónica o asincrónica csdpram: memoria sincrónica o asincrónica de doble puerta en ciclos alternados. queda oculta al diseñador. LPM_ADDRESS_CONTROL: STRING := "REGISTERED". 2. we: IN STD_LOGIC.lpm_components. csfifo: memoria (FIFO) sincrónica o asincrónica en ciclos alternados. Un LPM_FIFO emplea un EAB más Un LPM_FIFO emplea un EAB más LPM_WIDTHU: POSITIVE : = 1. insertos en las arquitecturas APEX. direcciones: IN STD_LOGIC_VECTOR (7 DOWNTO 0). 4. 2001 Fuente: ALTERA MAX+plus II HELP Instanciación de RAM y ROM usando LPMs Ejemplo de uso de LPMs: memoria de entrada y salida separadas de 256 bytes: LIBRARY ieee. Para el caso de FLEX10K. ARCHITECTURE usoLPM OF ram256x8 IS BEGIN inst_1: lpm_ram_dq GENERIC MAP (lpm_widthad => 8. LPM_FILE: STRING := "UNUSED".std_logic_1164.VHDL: Lenguaje de descripción de hardware LPMs para usar los EAB con VHDL Entradas y clock dedicados 1.

PORT(d:IN STD_LOGIC_VECTOR(ANCHO. END reg12.q => q(23 DOWNTO 12)). q:OUT STD_LOGIC_VECTOR(23 DOWNTO 0)). clk => clk. 2001 Guillermo Jaquenod.1 DOWNTO 0).all. clk => clk.clk:IN STD_LOGIC. USE <library del usuario>. 2001 Fuente: ALTERA 50 . 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). Dos instancias del Dos instancias del componente componente (cada una ocupa (cada una ocupa una región de una región de silicio). ARCHITECTURE a OF reg24 IS BEGIN reg12a : reg12 PORT MAP(d=>d(11 DOWNTO 0). END reg24_package. Cree la macrofunción deseada • 2.VHDL: Lenguaje de descripción de hardware MAX+plus II/VHDL: diseño de megafunciones Parámetro ENTITY regvar IS Parámetro GENERIC(ANCHO : INTEGER).q=>q(11 DOWNTO 0)). 2001 Guillermo Jaquenod. q: OUT STD_LOGIC_VECTOR(11 DOWNTO 0)). PORT(d:IN STD_LOGIC_VECTOR(ANCHO.1 DOWNTO 0).1 DOWNTO 0)). reg12b : reg12 PORT MAP(d=>d(23 DOWNTO 12). END COMPONENT. definir la library En Directory Name:.ALL. LIBRARY work. q => q(11 DOWNTO 0)). Compile ese package – Para usar una macro/megafunción propia: • 4. END PROCESS. clk:IN STD_LOGIC.reg24_package. ANCHO= regvar D D d() Q Q D ARCHITECTURE a OF regvar IS BEGIN PROCESS BEGIN WAIT UNTIL clk = '1'. END reg24. 2001 Fuente: ALTERA Fuente: ALTERA Guillermo Jaquenod.all. • Creación del package: PACKAGE reg24_package IS COMPONENT reg12 PORT( d: IN STD_LOGIC_VECTOR(11 DOWNTO 0). END a. ENTITY reg24 IS PORT( d:IN STD_LOGIC_VECTOR(23 DOWNTO 0). • En otro directorio. dando valor a los valor a los parámetros parámetros Guillermo Jaquenod.clk=>clk. Instancie los componentes en el bloque de arquitectura • Alternativamente. 2001 MAX+plus II: cómo definir un package Packages definidos por el usuario • Ejemplo: creación de la función: Con la ventana del compilador abierta Ir al menu Interfaces Elegir VHDL Netlist Reader’s Settings En Library Name:. (ANCHO=> 12) 12). definir el directorio donde buscar los subdiseños de menor jerarquía ENTITY reg24 IS PORT( d:IN STD_LOGIC_VECTOR(23 DOWNTO 0).1 DOWNTO 0)). 2001 Fuente: ALTERA MAX+plus II: cómo definir un package • La creación y uso de funciones propias es sumamente fácil en el ambiente del MAX+plus II – Para definir una macro/megafunción propia: • 1. END a. Declaración del Declaración del componente ARCHITECTURE a OF reg24 IS componente COMPONENT regvar GENERIC(ANCHO: INTEGER).<nombre del package>. Libraries definidas por el usuario Q q() Ir al menu Options Elegir User Libraries clk En el campo Directory Name:. END PROCESS. q:OUT STD_LOGIC_VECTOR(ANCHO.VHD. END a. clk:IN STD_LOGIC. clk: IN STD_LOGIC. END COMPONENT. en una USER LIBRARY LIBRARY <library del usuario>. GENERIC MAP d(11 DOWNTO GENERIC MAP d(23 DOWNTO (ANCHO=> 12) 0). q:OUT STD_LOGIC_VECTOR(ANCHO. clk:IN STD_LOGIC. Guillermo Jaquenod. en cuyo caso se referencian así: LIBRARY WORK.clk=>clk. al igual que cualquier módulo que defina entidades Los packages definidos por el usuario deben ser compilados antes de compilar diseños que usen componentes descriptos en esos packages Los packages definidos por el usuario pueden estar en el subdirectorio de trabajo. los pasos 2 y 3 pueden ser incluídos en el diseño final (nivel TOP de la jerarquía) O “pegados” dentro del propio archivo de diseño donde son usados Guillermo Jaquenod. BEGIN reg12a : regvar PORT MAP (d => reg12b : regvar PORT MAP (d => END a. 2001 Fuente: ALTERA Packages definidos por el usuario • • • Los packages tienen una extensión . q: OUT STD_LOGIC_VECTOR(23 DOWNTO 0)). --opcional USE WORK.<nombre del package>. END reg24. Cree un package que contenga una declaración de PACKAGE con una declaración de ese componente • 3. q <= d. ARCHITECTURE a OF reg12 IS BEGIN PROCESS BEGIN WAIT UNTIL clk = '1'.clk:IN STD_LOGIC. • Agregarlo (ADD y luego OK) Guillermo Jaquenod. dando silicio). END regvar. q <= d. q:OUT STD_LOGIC_VECTOR(11 DOWNTO 0)). USE work. Declare la library y el package • 5.q=>q(23 DOWNTO 12)).

definidos en VHDL’93) sentencias DISCONNECT o EXIT operadores de shift (definidos en VHDL’93) record aggregates retardos AFTER o TRANSPORT identificadores extendidos sentencias RETURN dentro de PROCEDUREs o LOOPs Guillermo Jaquenod. 2001 Flujo de diseño usando sólo MAX+plus II Ciertas otras construcciones NO son soportadas en MAX+plus II: – – – – – – – – – – – – funciones de resolución declaración de señales globales en packages bloques de configuración señales físicas. –Los genéricos sólo son usados para transportar parámetros. 2001 Primer escenario: sólo MAX+plus II Sólo MAX+plus II EDA => MAX+plus II => EDA MAX+plus II => EDA Guillermo Jaquenod. 2001 Fuente: ALTERA Ingreso del diseño Functional SNF Extractor Timing SNF Extractor Compilación 1 Funcional Simulación No Temporal Simulación OK? Si OK? Si 1 Recomendado: Primero compilar y simular en modo funcional. –Arrays de Señales y variables: sólo se aceptan arrays con elementos que sean arrays unidimensionales o bits simples –Multiplicación y división solo cuando el operador de la derecha es potencia de dos ES EL CASO DE DISEÑOS SIMPLES Guillermo Jaquenod. scf (estimulos para simulación) –Es posible definir varias arquitecturas para una entidad. 2001 Límitaciones de diseño en VHDL/MAX+plus II MAX+plus II VHDL sólo soporta construcciones orientadas a la síntesis. pero sólo la última es usada –Sólo pueden definirse GENERICS en una entidad si se define una entidad por archivo. enumeradas. pof/sof (código de programación). STD_LOGIC_VECTOR o STRING. snf (netlist para simulación). ports tipo LINKAGE objetos tipo access. 2001 Guillermo Jaquenod. acf (asignaciones). y recién luego en modo temporal Prueba física Guillermo Jaquenod.VHDL: Lenguaje de descripción de hardware Cómo mantener los nombres de nodos internos? Bases de VHDL Posibles escenarios de diseño para Síntesis + Place&Route + Simulación: •• Escoger Show All Node Name Synonyms Escoger Show All Node Name Synonyms en la ventana de diálogo Enter Nodes from SNF en la ventana de diálogo 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. y no es posible pasarse información de parámetros entre entidades descriptas en el mismo archivo. objetos tipo file o de punto flotante. y ciertas construcciones son aceptadas sólo 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 jerarquía 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 diseño se realiza dentro del ambiente MAX+plus II Sólo es posible la simulación usando formas de onda Y no es posible simular el diseño 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 diseño son de extensión vhd (código fuente en VHDL). 2001 –El uso de GENERATE debe tener límites estáticos locales Fuente: ALTERA Límites de diseños en VHDL con MAX+plus II Fuente: ALTERA Guillermo Jaquenod. 2001 Probar otra arquitectura No Habilitar Design Doctor Probar otras Logic Options Análisis Temporal Sí Velo.? No Fuente: ALTERA 51 . y alocación o dealocación de objetos declaración de grupos (objetos con el mismo atributo. –Constantes: sólo pueden ser de tipo INTEGER.

si es usado sobre objetos de tipo Boolean. en el lugar donde se desea insertar el Template – Desplegar el menu Templates – Seleccionar VHDL Template – Elegir en la ventana la construcción a insertar – Apretar OK.) – MAX+plus II realiza el Place and route – La simulación es realizada usando otra herramienta EDA (ModelSIM. Synplify.sdo . etc.end component NombreC. así como strings binarios de 0's y 1's Antes (VHDL’87) Fuente: ALTERA Guillermo Jaquenod.sdo – EDA: Electronic Design Automation – La síntesis es realizada mediante otra herramienta EDA (Leonardo. que comienzan con dos underscores (_ _).vhd • File -> Project -> Set Project To Current File Fuente: ALTERA Guillermo Jaquenod. sólo es necesario reemplazar las variables “generalizadas” del Template. –architecture NombreA of NombreE is.end architecture NombreA. 2001 Compiladores VHDL’87 y ‘93 en MAX+plus II Mantener abierta la ventana del Compiler En el menú Interfaces elegir VHDL Netlist Reader’s Settings Y dentro de esa ventana. 2001 Fuente: ALTERA 52 . esta facilidad está activa sólo mientras se está editando un archivo. Std_logic. arquitecturas. 2001 D(7 DOWNTO 0)<= to_stdlogicvector(x"FC"). componentes. En general las herramientas EDA interactúan entre sí usando archivos EDIF 2 0 0 o EDIF 3 0 0. pero con formato VHDL – SDO: es un archivo VHDL con formato SDF (Standard Delay Format). ahora es consistente –entity NombreE is. procesos. Son usadas por el compilador para saber cómo reemplazar celdas EDIF no estándar por funciones lógicas propias del MAX+PLUS II. etc. sra.. –component NombreC is. con los nombres de las variables propias Fuente: ALTERA Guillermo Jaquenod. 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.edo . FPGA Express.. 2001 .) – LMF: Library Mapping File.. – EDIF: Electronic Data Interchange Format.end entity NombreE.lmf edif MAX+plus II . MAX+plus II elige VHDL 1987 – Posicionar el cursor. 2001 Fuente: ALTERA Guillermo Jaquenod. – EDO: archivo creado por el EDIF Netlist Writer para ser usado por un simulador estándar – VHO: idem EDO.edo .VHDL: Lenguaje de descripción 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 sintáctica de cualquier construcción VHDL. sll. en el archivo en edición. Segundo escenario 3rd party EDA edif Segundo escenario: archivos en juego . • La sintaxis de VHDL’87 es aceptada por VHDL 93 • Sobre los nuevos operadores definidos en VHDL’93: –xnor: aceptado por MAX+PLUS II.lmf MAX+plus II Fuente: ALTERA Guillermo Jaquenod. Ahora (VHDL’93) D <= x"FC". Este archivo tiene información de los retardos del dispositivo usada para simulación en VHDL con bibliotecas de simulacion compatibles con VITAL (VHDL Initiative Toward ASIC Libraries) CASO TIPICO: DISEÑOS MUY COMPLEJOS Guillermo Jaquenod.. Una vez insertado. elegir VHDL 1987 o VHDL 1993 Por defecto. •• Sintaxis coloreada Sintaxis coloreada • • • File -> New -> Text Editor File -> Save As File name = nombre de la entidad con extensión . rol..vho 3rd party EDA . srl. Formato estándar para describir circuitos.vho 3rd party EDA 3rd party EDA . Bit_vector. Std_logic_vector –sla. en la zona VHDL Version.. Bit. 2001 Guillermo Jaquenod.. 2001 MAX+plus II: modificaciones en VHDL 93 • La sintaxis de apertura y cierre de entidades.

en una única descripción. Synplify.LMF) Para procesar un archivo EDIF generado por un producto EDA externo.CLK."C". que contienen conjunto de cells. EDIF tiene cierto número de posibles niveles de complejidad: – Level_0: nivel básico.. y son especificados mediante una opción del MAX+plus II definida en el menú EDIF Netlist Reader Settings."I2") RETURNS ("OUT") FUNCTION "AND3" ("I0". y es un estándar ANSI/EIA.1. El netlist de un circuito es una representación en forma de listado de cada net y de su conectividad eléctrica. por su parte tiene una porción de interface que describe sus puertas.. Un netlist puede ser: No Si MAX+plus II Guillermo Jaquenod. ... el MAX+plus II utiliza ciertos archivos de mapeado para convertir cells definidas en EDIF a primitivas propias del MAX+plus II Descripción EDIF luego de la etapa de síntesis de una función AND de 3 entradas usando FLEX10K Fuente: ALTERA Guillermo Jaquenod..LMF son archivos ASCII de texto. 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 . Estas views."I1"."RN". aunque no es demasiado práctica para el análisis.OE) RETURNS (OUT) FUNCTION "TRI1" ("I0"..2... etc. Guillermo Jaquenod. FPGA Express. y una porción de contents."C".. 2001 Fuente: ALTERA 53 .. . BEGIN BEGIN FUNCTION dff (D. así como efectos físicos tales como retardos o acoplamientos.. BEGIN BEGIN FUNCTION tri (IN."I1"."RN". 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 VHDL’87 o VHDL’93 Elegir las salidas deseadas: .. Guillermo Jaquenod.IN2. 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 ...IN2. 2001 sal Salidas del MAX+plus II a herramientas EDA Library Mapping Files (*. 2001 LIBRARY synplify LIBRARY synplify BEGIN BEGIN Guillermo Jaquenod.CLK..."I2") RETURNS ("OUT") END END . . que toma el mismo valor en todos los puntos. con constantes simple – Level_1: soporta variables y expresiones – Level_2: agrega loops y ejecución condicional • Los archivos EDIF consisten de un conjunto de libraries..sdo ver. (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)(author“xx")(program “xx" (version “xx")))) (status (written(timeStamp 2001 16 10 56)(author“xx")(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. . 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 . . 2001 Los archivos *."SN") RETURNS ("Q0") FUNCTION "DFFNRS1" ("D0".OE) RETURNS (OUT) FUNCTION tri (IN. Área? • Timing OK? No Velocidad? No Si No Si pof Prueba física No sof Si jam/jbc OK? Un net es un camino eléctrico en un circuito. en algo que copia la estructura jeráquica del diseño – Plano (FLAT): cuando todas las interconexiones de TODO el diseño se llevan al mínimo nivel.vho .. Es un tipo de descripción “verborrágica” sumamente extensa.. .. Un archivo EDIF es un archivo de texto ASCII..CLRN. donde cada componente es una “caja negra” con determinadas puertas.IN3) RETURNS (OUT) FUNCTION "AND3" ("I0". END END Guillermo Jaquenod.. Un componente complejo puede ser visto como una suma de componentes y sus conexiones.CLRN. con estructura sintáctica similar a la del lenguaje LISP (List Processing) y muestra una enorme cantidad de paréntesis que limitan datos.."E") RETURNS ("OUT0") FUNCTION "TRI1" ("I0".lmf Extracto de Synplify."SN") RETURNS ("Q0") END END .IN3) RETURNS (OUT) FUNCTION and3 (IN1. Esta descripción es útil para procesos de simulación o Place&Route. pensada para facilitar su parsing mediante un programa de computación.lmf FUNCTION and3 (IN1. 2001 Netlists y EDIF • • Netlists y EDIF EDIF significa Electronic Data Interchange Format.VHDL: Lenguaje de descripción de hardware Flujo de diseño EDA => MAX+Plus II => EDA Netlists y EDIF • Ingreso del diseño Constraints Síntesis OK? Si ModelSIM edif No • lmf acf vho Si Simulación sdo Velocidad? Place&Route Lógica OK? edo No Análisis temporal No Área? OK? Si No Si Si Leonardo.1 (VITAL) . y por ello ignora elementos pasivos tal como conectores o terminales que no afectan la propagación de una señal en un net..PRN) RETURNS (Q) FUNCTION dff (D..PRN) RETURNS (Q) FUNCTION "DFFNRS1" ("D0". 2001 – Jerárquico: describe interconexiones entre jerarquías de bloques.0 Aceptar (Click OK) Si se desea salidas EDIF Ir al menú Interfaces Elegir EDIF Netlist Writer Settings Aceptar (Click OK) •• Extracto de Synplify."E") RETURNS ("OUT0") END END . cada una de las cuales contiene una o más views.sdo ver.

los modos de operación y las prestaciones especiales de la familia a usar! Place&Route No Análisis temporal OK? Si No Área? No Velocidad? Si • Pensar “sincrónico”! – Las modernas arquitecturas de lógica programable son “register-intensive”. – Evitar los gated-clocks. Si SINTESIS PLACE & ROUTE Guillermo Jaquenod. incluyendo el test de distintas arquitecturas –La edición y modificación de “constraints”. 2001 Guillermo Jaquenod. depuración sintáctica. 2001 Técnicas de diseño eficaz usando HDLs Técnicas de diseño eficaz usando HDLs • Definir las estructuras y reservar recursos pensando en los posibles cambios posteriores. ni que sea eficiente.VHDL: Lenguaje de descripción de hardware Tercer escenario La edición.edo . con poca interacción con el proceso de PLACE&ROUTE – Existen dos acciones claramente distintas: –La edición y modificación del código fuente. el uso de módulos de IP y el reuso de diseños propios – Permite el trabajo en equipo. en la simplicidad de la simulación y en el proceso de TEST físico en producción! • Particionar el diseño. su prototipo luego debe funcionar en el hardware real. externa al MAX+plus II (ModelSIM.) Es una solución usual cuando se desea realizar un testbench que emplea el modelo de diseño de FPL pero también otros dispositivos Editor de texto VHDL MAX+plus II Bases de VHDL Compilador . la complejidad aumenta exponencialmente al aumentar el tamaño de un bloque circuital – Permite optimizar separadamente bloques de área crítica. donde debe poder ser testeado – En producción debe ser posible detectar la correcta operación del sistema antes de salir a la venta – En reworking debe ser posible detectar las causas de las fallas Guillermo Jaquenod. qué se desea hacer y cómo cada arquitectura se acomoda a ciertas soluciones Constraints – Que un diseño haya sido escrito en un HDL no quiere decir que esté bien hecho.. ni de costo óptimo Síntesis edif No OK? Guillermo Jaquenod. que puede ser realizada tanto dentro del código VHDL (en algunos casos) como mediante asignaciones externas • Realizar un análisis profundo de los objetivos. síntesis y Place & Route es realizada por el MAX+plus II La simulación se realiza de igual modo que en el primer escenario.sdo . mediante una herramienta estándar. tratando de usar pocos relojes globales (idealmente sólo uno) y aprovechar el ENABLE de los flipflops – Una parte importantísima del proceso de diseño se ocupa en la validación del mismo a través de la simulación Cuidado con el OverConstraint! – El uso de bloques jerarquicos permite verificar separadamente los subdiseños !! – La existencia de simulación funcional y temporal permite separar la validación de la lógica (comportamiento behavioral) de los fenómenos que dependen de los procesos de propagación dentro del componente Un diseño recién termina cuando el equipo de serie está funcionando OK en lo del usuario final!! No antes!!! !! – Aunque el diseño funcione en simulación. 2001 Iteración del proceso de diseño – El control del proceso de síntesis es realizado casi exclusivamente dentro del proceso de síntesis. así como bloques de velocidad crítica. sino sólo usa recursos que de todos modos están disponibles. 2001 Guillermo Jaquenod. asignando “constraints” distintos en base a la funcionalidad requerida para cada bloque. manteniendo una estructura jerárquica con bloques de dimensión acotada – Un diseño dividido en bloques reducidos facilita la escritura y modificación de cada bloque. 2001 Técnicas de diseño eficaz usando HDLs Ingreso del diseño Si Reglas generales de diseño para optimizar la performance • Diseñar pensando en el posterior proceso de síntesis! lmf acf – Una especificación puede ser toda behavioral. disminuyendo el Time-To-Market – Permite probar alternativas de arquitectura sin tener que realizar enormes modificaciones del código – Facilita el proceso de simulación y la detección temprana de errores de diseño. pero en un diseño a ser sintetizado hay que pensar en qué resultará en el silicio Si Velocidad? – Pensar el diseño de modo de aprovechar al máximo los límites de fan-in. por lo cual el uso intenso de flipflops no agrega hardware. No Si Área? No – Un diseño sincrónico es más controlable y no depende de efectos “analógicos” como tiempos de propagación. 2001 54 .vho design simulation 3rd party EDA Fuente: ALTERA Guillermo Jaquenod... 2001 Guillermo Jaquenod.

más rápidos. Guillermo Jaquenod. 2001 55 . 2001 Guillermo Jaquenod. todas las señales de entrada deben estar presentes en la lista de sensibilidad Guillermo Jaquenod. conviene hacerlo inmediatamente antes de comenzar un CASE. todas las señales deben tener un valor asignado en cada rama de esa asignación condicional – tratar de realizar asignaciones a variables en lugar de a señales Tratar de usar procesos con las señales de control en la lista de sensibilidad más sentencias tipo IF para la especificación de flipflops. • En un proceso de síntesis FLAT la optimización sólo se detiene en los registros. !! – si se usan valores de default. la optimización del diseño se detiene en dos fronteras: las puertas de los bloques jerárquicos y los registros. – si a las señales se les asigna valores mediante asignaciones condicionales. en lugar de hacerlo mediante sentencias WAIT UNTIL.THEN. analizar si los mismos registros que sirven como memoria de estado no pueden a su vez ser la salida sincrónica de la FSM. LOGICA DE NUEVO ESTADO MOORE de salida decodificada Lógica combinatoria D Q Ck CL • En un proceso de síntesis que respete la estructura jerárquica. 2001 Guillermo Jaquenod.. evitando estados desconocidos u operaciones “presumidas”. 2001 Técnicas de diseño eficaz usando HDLs Técnicas de diseño eficaz usando HDLs FF2 FF1 Lógica combinatoria Lógica combinatoria D Q Ck CL – Por eso conviene ubicar los registros en las fronteras de los bloques jerárquicos (a la entrada o a la salida) LOGICA DE NUEVO ESTADO DECOD D Q Ck CL D Q Ck CL T0 Lógica combinatoria D Q Ck CL Lógica combinatoria T1~T0 Lógica combinatoria D Q Ck CL T2~T0 Lógica combinatoria D Q Ck CL T0 • Balancear la complejidad combinatoria entre registros D Q Ck CL FF3 Lógica combinatoria T1~2xT0 D Q Ck CL T2~T0 • Si se usan flipflops con Enable y se sabe que (por ejemplo) FF1 y FF2 sólo se habiltan en los ciclos pares de la señal de reloj. Para el caso de CASE: – usar CASE en vez de IF. En general conviene el uso de package std_logic_1164 y el package numérico numeric_std (IEEE 1076. 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 la operación combinatoria es descripta dentro de un proceso. Eso produce circuitos más simples. 2001 Guillermo Jaquenod. MOORE de salida registrada Guillermo Jaquenod. el tiempo T1 puede ser el doble de lento que T0 o T2 – Cómo? Analizando la lista de worst paths!! • Para sincerar las evaluación de Clock Performance debe notificarse este hecho al compilador usando “constraints” de MultiCycle path D Q Ck CL Lógica combinatoria T0 D Q Ck CL Lógica combinatoria T1~T0/2 Lógica combinatoria T2~T0/2 D Q Ck CL Lógica combinatoria D Q Ck CL T3~T0 •Y cuando las fronteras de los bloques jerárquicos dividan lógica combinatoria repartir los retardos imponiendo “constraints” de Output Required Time (T1) y de Input Arrival Time (T2). evita la generación de codificadores de prioridad • Tratar de unificar el diseño y no mezclar BITs con STD_LOGIC. para minimizar el uso de recursos Para el caso de FOR: • En el caso de lógica combinatoria. y con menos glitches.3).ELSIF siempre que sea posible.VHDL: Lenguaje de descripción de hardware Técnicas de diseño eficaz usando HDLs Técnicas de diseño eficaz usando HDLs • Especificar completamente los módulos a sintetizar antes de inicar el proceso de síntesis. 2001 Pin • Lo mismo en relación a los “False Path” que suelen aparecer cuando se usan puertas bidireccionales: FFx D Q Ck CL True Path True Path Lógica combinatoria Lógica combinatoria FFy D Q Ck CL False Path Guillermo Jaquenod.. !! – no olvidar el uso de OTHERS • Agregar la cláusula de RANGE a las variables INTEGER. evitando la inferencia de elementos de memoria. 2001 Técnicas de diseño eficaz usando HDLs Técnicas de diseño eficaz usando HDLs fronteras del proceso de optimización • Evaluar post-síntesis las posibles inferencias indeseadas de memoria – Evaluar cuantos flipflops se han especificado como señales a las que se asigna valores en procesos sensibles a una señal de reloj – Ver en los archivos de reporte cuántos flipflops ha colocado el compilador Lógica combinatoria – Analizar de dónde surgen esos nuevos registros • Asignación de estilos y valores a FSMs – En vez de definir estados por enumeración a los que el compilador asigne un valor cualquiera.

. por enumeración. Guillermo Jaquenod. justified: IN SIDE:=RIGHT.std_logic. WHEN ‘X’=> RETURN ‘X’. ENDFILE() • y operan con objetos de los tipos definidos en STANDARD/STD: – BIT. que representa el tiempo actual en microsegundos – Una variable de nombre puntero.. de tipo LINE. 2001 Guillermo Jaquenod. l: INOUT LINE).. puntero: LINE. justificado a derecha dos espacios de separación un carácter que indique el valor de A reloj dos espacios de separación A y un carácter que indique el valor de B . Notar que WRITE escribe en un objeto LINE. 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". WHEN ‘L’=> RETURN ‘L’. A y B con el siguiente formato: – – – – – 5 caracteres para el valor de “ahora” en microsegundos. FUNCTION endline ( l : IN LINE ) RETURN BOOLEAN . PROCEDURE write (l: INOUT LINE. value: OUT <tipo> [.. WHEN OTHERS=> RETURN ‘-’. escribo: PROCESS IS FUNCTION std_to_char (sl : std_logic) RETURN character IS BEGIN CASE sl IS WHEN ‘U’=> RETURN ‘U’. FILE wrfile: TEXT IS OUT “salida.vct” una línea que describe “ahora. WHEN ‘Z’=> RETURN ‘Z’. READLINE(). cada vez que haya un flanco positivo de reloj. WHEN ‘W’=> RETURN ‘W’. ancho de los campos de datos de salida. WRITELINE (wrfile. LEFT).puntero).’ ’). 2001 Guillermo Jaquenod. métodos para leer y escribir. WHEN ‘H’=> RETURN ‘H’. 2001 Ejemplo de escritura Ejemplo de escritura Se cuenta con una variable llamada “ahora”.BOOLEAN. ahora_i = now/1us. WRITE (puntero. para operar sobre objetos de clase FILE. USE std. ahora_i: INTEGER. 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". Guillermo Jaquenod. 2001 wrfile LIBRARY ieee. END PROCESS escribo. WRITE (puntero. . define la forma de justificar los datos de salida en los campos de salida. field:IN WIDTH:=0). así como para detectar el final de un archivo.BIT_VECTOR. un TEXT es un archivo formado por una sucesión de strings ASCII PROCEDURE writeline (file F: TEXT. PROCEDURE read (l: INOUT LINE.’ ’). y es usada en el procedure WRITE () subtype WIDTH is NATURAL. VHDL cuenta con el package TEXTIO (no sintetizable).B B ahora Proceso “escribo” Los elementos en juego serán: – Un objeto de nombre “wrfile”.REAL.INTEGER. END FUNCTION. WHEN ‘1’=> RETURN ‘1’. definido como: – Un integer llamado ahora_i.ALL. WRITE (puntero.VHDL: Lenguaje de descripción de hardware Manejo de archivos en VHDL • leer constantes almacenadas en un archivo separado es el método más conveniente para generar estímulos (vectores de test) complejos – estos vectores pueden haber sido generados automáticamente. y se desea.std_to_char(A)). 2001 PROCEDURE readline (FILE f: TEXT. de tipo TIME y tres señales std_logic llamadas A. . WRITE (puntero.A. WRITELINE(). READ(). usado en el procedure WRITE () Guillermo Jaquenod. • Los cinco subprogramas a utilizar son: – WRITE().CHARACTER.FIELD=> 5). Guillermo Jaquenod.tt. END CASE. B y reloj.ahora_i. WRITE (puntero.vct”.std_to_char(B)).. escribir en un archivo llamado “salida.good: OUT BOOLEAN]). FUNCTION endfile ( f : IN TEXT ) RETURN BOOLEAN .ALL. de clase FILE y tipo TEXT. type SIDE is (RIGHT. type TEXT is file of STRING.. WRITE (puntero. almacenar las salidas del diseño bajo test en un archivo permite su uso posterior para comparar respuestas de arquitecturas alternativas Bases de VHDL • Para el manejo de archivos. o estar definidos mediante algún estándar • a su vez. USE ieee. BEGIN WAIT UNTIL reloj = ‘1’. WRITE (puntero. Manejo de archivos en VHDL • Al crearse un objeto FILE se define el modo de acceso (IN o OUT) y el nombre del archivo. 2001 56 . donde preparar los datos a escribir – Una función 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.textio. value: IN <tipo>. l: INOUT LINE). y esta acción tiene como resultado implícito el OPEN del archivo.TIME.vct”. WHEN ‘0’=> RETURN ‘0’.. haber sido parte de la especificación a cumplir en el proceso de aceptación de un producto.’ ’). type LINE is access STRING.’ ’). y es sólo WRITELINE quien escribe en el FILE Guillermo Jaquenod.STRING. FILE output: TEXT OPEN write_mode IS "std_output".

convierte un Boolean en los strings constantes TRUE o FALSE FUNCTION str(int: integer. -.VHDL: Lenguaje de descripción de hardware Manejo de archivos y textos: txt_util. y simulación.‘Z’. char: in character). y otras funciones útiles para el ingreso de vectores de test y salida de resultados Guillermo Jaquenod. Si es inválido lo convierte a ‘X’ Modelado del tiempo en VHDL function to_std_logic_vector(s:string) return std_logic_vector. y muchos usuarios han desarrollado packages para facilitar esa tarea.Conversión de Bases de VHDL upper case a lower case function to_upper(s:string) return string.-convierte un entero en un string de caracteres de una dada base FUNCTION str(int: integer) RETURN string. cuando TODAS las asignaciones han sido resueltas. text: string).convierte un entero de valor 0.Traslada un STRING completo a lower case function to_std_logic(c:character) return std_logic. en http://www.com/~stefan/vcourse/html se encuentra un package llamado txt_util. 2001 Conversión de tipos en txt_util. luego de un retardo definido por AFTER. res_string: out string).vhd • Para conversión entre otros tipos y los tipos STRING o character: function to_upper(c:character) return character. Este tipo de sentencias incluye el modelado del tiempo. es util para debug • Para lectura o escritura desde archivos: procedure str_read(file in_file: TEXT.vhd • VHDL es pobre en procedimientos para el manejo de archivos. es “filtrado” y no aparece en la salida. todos los eventos que se interrelacionan con el mundo real deben sincronizarse con EVENTOS FÍSICOS (señales que cambian de estado) y con la variable TIEMPO – Un evento físico: importante en la sección de hardware y en el monitor de salidas – Un evento temporal: fundamental para crear los estímulos.sacar un mensaje a consola (STD_OUTPUT).vhd. • [REJECT] : define el pulso minimo a propagar y sólo puede ser usado para refinar el modelo de una señal INERTIAL. 2001 Recién en VHDL’93! Recién en VHDL’93! [label:] <nombre de señal> <= [REJECT <expresión temporal>] [TRANSPORT] <expresión> [AFTER <expresión temporal>].Conversión de lower case a upper case function to_lower(c:character) return character. que ofrece distintos procedimientos.‘9’ y ‘A’. -. 2001 VHDL: el mundo real Además de las aplicaciones que operan procesando sentencias simultáneas El tiempo en la asignación simple a señales Las sentencias de asignación a señales son de la forma (concurrentes) a la máxima velocidad posible. -. -.para leer un string de largo variable desde el archivo de entrada procedure print(file out_file: TEXT. así como para modelizar los retardos propios del hardware Además del subconjunto de estructuras sintetizables.convierte un entero en un string hexadecimal (supone base=16) Guillermo Jaquenod. De no ponerse TRANSPORT se asume el modo INERTIAL donde un pulso de retardo menor al tiempo de propagación es ignorado. -. FUNCTION str(sl: std_logic) RETURN string.saca un mensaje por consola sólo si active vale TRUE. para salida a consola: procedure print (text: string). Guillermo Jaquenod..Dado un caracter lo convierte en std_logic. -.convierte un std_logic en un STRING de tamaño 1 (RANGO 1 TO 1) FUNCTION str(slv: std_logic_vector) RETURN string. • Por ejemplo. Los demás son convertidos en ‘?’. donde los caracteres inválidos del STRING son reemplazados por ‘X’ Guillermo Jaquenod. -. -. new_string: in string).convierte un entero en un string suponiendo base=10 FUNCTION hstr(slv: std_logic_vector) RETURN string.vhd • Para conversión entre otros tipos y los tipos STRING o character: FUNCTION chr(sl: std_logic) RETURN character. 2001 Guillermo Jaquenod. -. • Por ejemplo..para escribir un string en un FILE y pasar a una nueva línea procedure print(file out_file: TEXT.para imprimir un caracter en un FILE y pasar a una nueva línea Guillermo Jaquenod. -. -. -. Si un pulso de menor duración al dado por REJECT atraviesa un objeto. combina un WRITE () con un WRITELINE () procedure print (active: boolean. -. Estas asignaciones se efectivizan al final de cada ciclo de simulación. 2001 57 . -. base: integer) RETURN string.35 en los caracteres ‘0’. pero que sirven para la simulación y especificación: • [AFTER] :define el tiempo de propagación de una señal. -.i2. 2001 Conversión de tipos en txt_util. y estos valores futuros pueden ser condicionados mediante ciertos campos que no son sintetizables. -.. y los procesos o bloques donde se resuelven sentencias secuenciales.i-2000.Convierte un STRING de caracteres en un STD-LOGIC_VECTOR. 2001 Guillermo Jaquenod.Traslada un STRING completo a upper case function to_lower(s:string) return string.convierte un std_logic_vector en un STRING de unos y ceros FUNCTION str(b: boolean) RETURN string. VHDL ofrece sentencias que pueden ser usadas para las tareas de especificación.convierte un std_logic en un carácter FUNCTION chr(int: integer) RETURN character. modelado. • [TRANSPORT] : indica que la señal es propagada con idéntica forma. -. -.

tiempo valor X 20ns ‘1’ A2 <= TRANSPORT C AFTER 10 ns. 20 ns. s <= ‘1’ after 20ns. un reloj de 10 MHz (T =100ns) y de relacion de trabajo al 50% puede ser declarado mediante: La asignación de retardos a señales puede hacerse tanto dentro como fuera de Procesos. A1 <= INERTIAL C AFTER 10 ns. SINO CÓMO VERIFICARLO!!! • Guillermo Jaquenod. end process. sin modificaciones – El modelo inertial filtra cambios de duración inferior a un mínimo process begin s <= transport ‘0’ after 10ns. 10ns ‘0’ process begin s <= ‘1’ after 20ns. – Retardo Inercial (Default): donde un pulso de duración menor al retardo es enmascarado (caso típico de una compuerta) – Retardo de Transporte: este enmascaramiento no existe. ya sea al fin del actual o de un futuro ciclo de simulación. ‘0’ after 5 ns . wait. habiendo dos tipos de retardos: reloj <= NOT reloj after 50 ns. process begin s <= transport ‘1’ after 20ns. recien a los 50ns del reloj de simulacion sera reevaluada. 12 ns. Guillermo Jaquenod. process begin s <= ‘0’ after 10ns. cambiando y preparando un nuevo evento para 50 ns. 2001 Resolución de asignaciones demoradas Los nuevos valores para las señales se planean cuando se analizan la sentencias pero se realizan en un tiempo posterior. la pregunta clave es: “Funciona de acuerdo a lo deseado?” Es justamente este tema algo que la actual industria de herramientas EDA aún no ha resuelto satisfactoriamente. tiempo valor tiempo valor 10ns ‘0’ X 10ns ‘0’ La posibilidad de asignar varios valores futuros a señales en distintos momentos del tiempo futuro obliga a ciertos metodos de resolución Ejemplos de INERTIAL y TRANSPORT C 20ns ‘1’ C<= ‘0’.’1’ after 10 ns. 0 5 10 15 20 25 Fuente: SJOHOLM Guillermo Jaquenod. 57. s <= transport ‘0’ after 10ns. 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. y que puede llevar la mayor parte del tiempo de diseño: Es acá donde la comprensión del proceso de simulación y los métodos de escritura de Test-Bench se hace imprescindible Guillermo Jaquenod. ‘0’ after 25 ns. ‘1’ AFTER ’0’ AFTER ‘1’ AFTER ‘0’ AFTER ‘1’ AFTER ‘0’ AFTER 20ns ‘1’ Ai 10 ns. Guillermo Jaquenod. wait. s <= transport ‘1’ after 20ns. end process. …. Cada vez que cambia reloj. 2001 Guillermo Jaquenod. end process. siendo el caso de una línea de retardo Es posible realizar asignaciones múltiples demoradas a la misma señal. 2001 Los procesos de Síntesis y de Place & Route. 2001 0 10 20 30 40 50 60 70 Fuente: SJOHOLM Funciona de acuerdo a lo deseado? • • Bases de VHDL • Verificación funcional de modelos VHDL “EL PROBLEMA” NO ES CÓMO DISEÑAR Y SINTETIZAR UN DISPOSITIVO DE VARIOS MILLONES DE COMPUERTAS CORRIENDO A CIENTOS DE MEGAHERTZ. end process. 2001 Guillermo Jaquenod. 40 ns. 2001 58 . y de que satisfaga los tiempos de operación necesarios. 25 ns. en la cola de eventos se prepara un nuevo cambio al valor negado para 50ns despues. 2001 A3 <= REJECT 4 ns INERTIAL C AFTER 10 ns. VHDL permite elegir dos modelos de retardo llamados inercial (por defecto) y transporte – El modelo transport propaga la expresión a la señal. para definir ciertas formas específicas: • C<= ‘1’. son sólo una parte menor de la tarea de diseño Más allá de que un diseño quepa dentro de un dispositivo. wait. wait. y como esta asignacion es realizada solo cuando hay eventos en reloj. s <= ‘0’ after 10ns.VHDL: Lenguaje de descripción de hardware Uso de after para asignaciones demoradas Resolución de asignaciones demoradas • Todo dispositivo real presenta retardos de propagación.

2001 Se actualiza el valor de las señales Se avanza el reloj de simulación hacia el momento de ocurrencia del evento mas cercano Fin de la simulación? Guillermo Jaquenod. actualizando de inmediato las variables locales en el orden indicado) • En base al valor actual de las señales se calcula la cola con sus valores futuros • Se genera/actualiza la lista temporal ordenada de eventos futuros – 2: Una vez analizadas todas las señales del sistema se sabe cuál es el instante próximo en que deberá producirse un cambio. el VHDL es usado de distintas maneras: – Para la generación de estímulos se diseña un bloque de tipo behavior. 2001 Qué es el “test bench”? TEST BENCH Generador de estímulos Otros módulos ya operativos Módulo del diseño de nivel tope o DUT (Design Under Test) Monitor de salidas • Se llama así cuando al módulo de mayor nivel del diseño (DUT) se agrega: – un generador de estímulos. donde es el diseñador quien define. tanto en forma inmediata o con un determinado retardo hacia el futuro (por ejemplo. por lo que el analisis del sistema solo tiene sentido cuando los hay. 2001 Guillermo Jaquenod. 2001 59 . mediante retardos. llamado “test bench”. se actualizan las colas de todas las señales y se vuelve al paso 1. 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. el monitor de salidas también es definido en tipo behavior. por el tiempo de propagacion de una compuerta) HARDWARE Modelo VHDL de tipo Behavioral La necesidad de poder simular Guillermo Jaquenod. en lo que se llama “embedded test”. sin puertas de entrada o salida. conectado a las entradas del DUT – un monitor de salidas. 2001 Simulación con HDLs Simulación de eventos discretos • Dado el carácter concurrente de los sistemas simulados. – De igual modo. 2001 • En tanto no haya eventos el sistema no cambia. la temporización y secuenciación de los estímulos. por ello el eje “tiempo” (reloj de simulacion) es avanzado en forma discontinua Guillermo Jaquenod. la resolución de la simulación debe hacerse en dos pasos: Se inicializan señales y variables – 1: En función del valor actual de las señales se administra para cada una de ellas una lista ordenada (cola) de los próximos valores futuros. se realiza el/los cambios. Guillermo Jaquenod. 2001 El test bench en VHDL • no Para el proceso de diseño y debug de Hardware. conectado a las salidas del DUT – otros posibles modulos predisenados • Se crea un módulo de aún mayor nivel. el diseño suele llegar al nivel estructural. y opera en base a tiempos definidos por el diseñador más eventos que provienen de la unidad bajo test (UUT) – Para el sistema bajo test. 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. y los tiempos de retardo provienen del resultado de la compilación del diseño (o de los asociados a los modelos de bloques funcionales pre-existentes auxiliares) Guillermo Jaquenod. inmediatos y/o demorados. de uso fundamental en la simulación • Nota: A veces también se insertan dentro del DUT funciones no sintetizables de verificación. el reloj de simulación es avanzado hacia él (en caso del delta delay el reloj permanece sin cambios). Guillermo Jaquenod.VHDL: Lenguaje de descripción de hardware Verificación funcional en distintas etapas de un diseño Modelo VHDL de tipo RTL Simulador VHDL Información de estímulos y repuestas Modelo VHDL postsíntesis y P&R Simulador VHDL Información de estímulos y repuestas Dispositivo Equipamiento de test automático Boundary Scan Testing Información de estímulos y repuestas • La simulacion es actualmente la unica herramienta de uso efectivo para el debug y verificación de sistemas de alta complejidad Información de estímulos y repuestas SOFTWARE Simulador VHDL • Un simulador de eventos discretos modeliza la relacion entre entradas y salidas a lo largo del tiempo.

VHDL: Lenguaje de descripción de hardware Cómo se usa un HDL en el “test bench”? HDL behavioral.0 VHDL Simulator Guillermo Jaquenod. WAIT FOR 15 ns.d1. WAIT FOR 15 ns. 2001 60 . Guillermo Jaquenod. enable<='0'. reloj <= '0'. WAIT FOR 30 ns.q0. reloj<='0'.frecuencia en MHz SIGNAL intclk1.intclk3 : BIT.reloj.frecuencia en MHz CONSTANT periodf2 : TIME := 15ns.intclk2. ARCHITECTURE algo OF relojes IS CONSTANT valf1 : INTEGER := 500.reloj.d1. WAIT FOR 15 ns. BEGIN intclk1 <= NOT intclk1 AFTER (500/valf1)*1ns. Guillermo Jaquenod. COMPONENT registro2 is port ( d0. clk1 <= intclk1. Guillermo Jaquenod. WAIT FOR 20 ns. respectivamente) – leyendo constantes almacenadas en un archivo separado • es el método más conveniente para vectores complejos. END ARCHITECTURE testr2.q1 : BIT. WAIT FOR 15 ns. WAIT FOR 15 ns. clk3 :OUT BIT). -. 2001 Generación de vectores de Test • La generación de estímulos (vectores de test) puede ser hecha de tres grandes maneras: – mediante un algoritmo: • mediante una secuencia de asignaciones simples • mediante procesos explícitos que produzcan la repetición de señales. END ARCHITECTURE algo. reloj <= '1'. clk2. d1<='0'. entrada salida por consola. Tsetup enable <= '1'. reloj<='0'. 2001 • S Guillermo Jaquenod.enable. WAIT FOR 30 ns. END ENTITY relojes. WAIT FOR 5 ns.enable. enable <='1'. 2001 Asignaciones simples y WAIT FOR ENTITY testbench IS END ENTITY testbench. clk2 <= intclk2. intclk3 <= NOT intclk3 AFTER (500/valf3)*1ns. -. 2001 Fuente de los gráficos: VERIBEST 99. reloj <= '1'. END PROCESS ciclo_de_test. intclk2 <= NOT intclk2 AFTER (periodf2/2).q1). con el modelo de comportamiento temporal del dispositivo real Event-Driven Simulation El testbench no tiene entradas ni salidas! TEST BENCH Otros módulos ya operativos TEST BENCH Módulo del diseño de nivel tope (DUT) Generador de estímulos Generador de estímulos Monitor de salidas Otros módulos ya operativos Módulo del diseño de nivel tope o DUT (Design Under Test) Monitor de salidas HDL sintetizable. enable<='0'. d1<='1'.q0. BEGIN device_under_test: registro2 PORT MAP (d0. y genera una señal periódica simétrica d0<='1'. ciclo_de_test: PROCESS IS BEGIN d0<='1'.q1: OUT BIT). reloj <= '0'. a veces con funciones de “embedded test” HDL no sintetizable. q0. es una forma más compacta de generación de vectores pues las tareas de asignación y los valores a asignar están en estructuras separadas (un procedimiento y un array. que a su vez pueden también ser generados automáticamente. enable<='0'. allocación dinámica de memoria. reloj <= '1'. 2001 Guillermo Jaquenod. 2001 Asignaciones simples y WAIT FOR (simulación) Fuente: ASHENDEN Vectores repetitivos y simétricos • Generación de relojes simétricos con una secuencia de asignaciones simples ENTITY relojes IS PORT (clk1. y referencias temporales Guillermo Jaquenod. WAIT FOR 15 ns. con el diseño a testear. enable <= '1'. d1<='0'. y la consiguiente (generación de señales periódicas • mediante patrones complejos generados algorítmicamente – leyendo tablas de constantes almacenadas en forma de tablas (arrays) • equivalente a una secuencia de asignaciones simples. WAIT FOR 20 ns.d1. El esquema general es: clk3 <= intclk3.periodo en nanosegundos CONSTANT valf3 : INTEGER := 50. con manejo de archivos. WAIT FOR 5 ns. -. El testbench no tiene entradas ni salidas! ARCHITECTURE testr2 OF testbench IS Instanciación del componente a testear SIGNAL d0.enable. reloj <= NOT reloj AFTER semiperiodo. o definidos mediante un estándar en el caso de que el test forme parte del proceso de aceptación de un producto. reloj <= '1'. END COMPONENT.reloj : IN BIT. Thold d0<='0'.

BEGIN asym1: PROCESS BEGIN reloj1 <= '1'. taps <= fftaps. Dos modos de generar la misma señal: ENTITY reloj_asimetrico IS PORT (reloj1. ARCHITECTURE xx OF testbench IS COMPONENT graygen IS PORT (gray : OUT unsigned (8 DOWNTO 1)).std_logic_1164. BEGIN WAIT FOR periodo. END LOOP.'0' AFTER ton. Guillermo Jaquenod. 2001 Guillermo Jaquenod. WAIT FOR (ton). END PROCESS asym2.conversión de binario a GRAY gray (7 DOWNTO 1) <= bin(7 DOWNTO 1) XOR bin(8 DOWNTO 2). asym2: PROCESS BEGIN asym2: PROCESS BEGIN reloj2 <= '1'. SIGNAL gray : unsigned (8 DOWNTO 1). CONSTANT toff:TIME := 19ns. Guillermo Jaquenod. Vectores repetitivos y asimétricos • Generación de relojes asimétricos con procesos explícitos y asignaciones simples. Guillermo Jaquenod. USE ieee.contador binario gray (8) <= bin (8).reloj2). Guillermo Jaquenod. ENTITY graygen IS PORT (gray : OUT unsigned (8 DOWNTO 1)).0 VHDL Simulator Guillermo Jaquenod. reloj1 <= '1'. END. bin := bin + 1. 2001 Vectores complejos usando algoritmos • Es posible generar patrones de test más complejos que una señal de reloj (por ejemplo. -. WAIT FOR (ton+toff).ALL. END COMPONENT. reloj2 <= '0'.VHDL: Lenguaje de descripción de hardware Vectores repetitivos y simétricos (simulación) ENTITY testbench IS END. asym2: PROCESS BEGIN reloj2 <= '1'.ALL. 2001 Fuente de los gráficos: VERIBEST 99. END COMPONENT. WAIT FOR (ton). clk3 : BIT. ésto solo es usado para BEGIN TEST y no para síntesis. FOR i IN 7 DOWNTO 1 LOOP fftaps(i) := fftaps (i-1).'0' AFTER ton. clk2. END. END PROCESS gg. 2001 Vectores complejos usando algoritmos • Es posible generar patrones de test más complejos que una señal de reloj (por ejemplo. secuencias GRAY) a través del uso de algoritmos: LIBRARY ieee. clk3 :OUT BIT). reloj2 <= '0'. clk2. 2001 Fuente de los gráficos: VERIBEST 99.0 VHDL Simulator Vectores complejos usando algoritmos (simulación) LIBRARY ieee. USE ieee. END IF. END a.numeric_std. VARIABLE tmp : BIT.reloj2:BIT. WAIT FOR (toff). fftaps (0) := NOT (tmp). END ARCHITECTURE usoproc. ARCHITECTURE xx OF testbench IS COMPONENT relojes IS PORT (clk1. WAIT FOR (ton+toff). tmp := '0'. END LOOP. ARCHITECTURE xx OF testbench IS COMPONENT reloj_asimetrico IS PORT (reloj1. END PROCESS asym1. Acá no importa hacer un contador binario y luego ARCHITECTURE a OF graygen IS decodificarlo porque CONSTANT periodo:TIME := 35ns. FOR i IN 0 TO 7 LOOP IF (msk(i)='1') THEN tmp:= tmp XOR fftaps(i). END.reloj2:OUT BIT). BEGIN p0: PROCESS IS VARIABLE fftaps: BIT_VECTOR (7 DOWNTO 0):= X"00". ARCHITECTURE a OF psrnd IS CONSTANT msk: BIT_VECTOR (7 DOWNTO 0):= X"B8". Ambas soluciones son equivalentes END PROCESS asym2.numeric_std. 2001 Fuente de los gráficos: VERIBEST 99. BEGIN WAIT FOR periodo. END ENTITY reloj_asimetrico.std_logic_1164. WAIT FOR (ton). END psrnd.reloj2:OUT BIT).ALL. 2001 61 . END a. END PROCESS asym1.0 VHDL Simulator Vectores repetitivos y asimétricos (simulación) ENTITY testbench IS END. BEGIN dut: graygen PORT MAP (gray). WAIT FOR (ton+toff). WAIT FOR (toff).ALL. END COMPONENT. END PROCESS p0. reloj2 <= '0'. BEGIN dut:reloj_asimetrico PORT MAP (reloj1. gg: PROCESS IS VARIABLE bin: unsigned(8 DOWNTO 1) := X"00". SIGNAL reloj1. SIGNAL clk1. END ENTITY graygen. END PROCESS asym2. secuencias pseudo-random) a través del uso de algoritmos similares a los usados para el diseño de LFSRs: ENTITY psrnd IS PORT (taps : OUT BIT_VECTOR (7 DOWNTO 0)). reloj2 <= '1'. ENTITY testbench IS END. Guillermo Jaquenod. BEGIN DUT: relojes PORT MAP (clk1. ARCHITECTURE usoproc OF reloj_asimetrico IS CONSTANT ton:TIME := 15ns. USE ieee. clk2. clk3). WAIT FOR (toff).'0' AFTER ton. END PROCESS asym1. -. CONSTANT periodo:TIME := 35ns. USE ieee. PROCESS BEGIN PROCESS BEGIN reloj1 <= '1'.

00. BEGIN BEGIN dut: usoarray PORT MAP (out_tab). SIGNAL out_tab: UNSIGNED (7 DOWNTO 0). READ(punte.ALL. 2001 Guillermo Jaquenod.. USE ieee. nRD. READ(punte. dbus: OUT BIT_VECTOR (7 DOWNTO 0). BEGIN WHILE NOT (endfile(vecfile)) LOOP READLINE (vecfile.8). 2001 2 3 4 5 6 7 0 1 2 3 4 Se simula el bus de un microprocesador. ENTITY testbench IS END. 2001 Vectores complejos usando algoritmos (simulación) Leyendo estímulos desde un archivo LIBRARY ieee.USE ieee. END LOOP. Fuente de los gráficos: VERIBEST 99. END PROCESS leo_file. Fuente de los gráficos: VERIBEST 99. proceso cíclico proceso cíclico WAIT FOR periodo. USE ieee. y que con WRITE y WRITELINE se generaron líneas de forma bit_vector(7 DOWNTO 0). dut: usoarray PORT MAP (out_tab).ALL.nWR). time. USE std.0 VHDL Simulator ARCHITECTURE xx OF testfile IS BEGIN leo_file: PROCESS VARIABLE dly:time.ALL.14.READ(punte. LIBRARY ieee. ENTITY testbench IS END.254. USE ieee. bit_vector(15 DOWNTO 0). END COMPONENT. LIBRARY ieee.vec”. chk_thold:PROCESS (relojd) BEGIN IF relojd’EVENT AND relojd=‘1’ THEN ASSERT (dato’STABLE(t_hold)) REPORT “violacion de tiempo de hold” SEVERITY ERROR.128).82.dbus). ARCHITECTURE xx OF testbench IS ARCHITECTURE xx OF testbench IS COMPONENT usoarray IS PORT (tabular_bus: OUT UNSIGNED (7 DOWNTO 0))..255. ENTITY usoarray IS PORT (bus: OUT UNSIGNED (7 DOWNTO 0)). COMPONENT usoarray IS PORT (tabular_bus: OUT UNSIGNED (7 DOWNTO 0)). 2001 Guillermo Jaquenod. END. SIGNAL random : BIT_VECTOR (7 DOWNTO 0).ALL. END ARCHITECTURE a.ALL. READ(punte.ALL.dly).USE ieee. END. BEGIN p0: PROCESS IS BEGIN FOR i IN 0 TO 7 LOOP bus <= to_unsigned (stimu_table(i).0 VHDL Simulator Guillermo Jaquenod.textio. END.ALL. compuesto por datos. END COMPONENT. CONSTANT periodo:TIME := 35ns. ENTITY testfile IS PORT (nWR : OUT BIT. nRD: OUT BIT.27. 2001 Modelos de otros módulos anexos Ejemplo: test de salidas usando ASSERT Otros módulos ya operativos chk_tsu:PROCESS (reloj) BEGIN IF reloj’EVENT AND reloj=‘1’ THEN ASSERT (dato’STABLE(t_setup)) REPORT “violacion de tiempo de setup” SEVERITY ERROR. de asignación de asignación END LOOP. END ENTITY usoarray . nWR. READ(punte. ARCHITECTURE xx OF testbench IS COMPONENT psrnd IS PORT (taps : OUT BIT_VECTOR (7 DOWNTO 0)). Guillermo Jaquenod. END PROCESS p0.punte).std_logic_1164.VHDL: Lenguaje de descripción de hardware Vectores complejos usando algoritmos (simulación) Generación de vectores mediante arrays • el uso de vectores de test almacenados en forma de arrays permite separar los procesos de asignación de los valores a asignar ENTITY testbench IS END. 2001 Guillermo Jaquenod. END PROCESS chk_thold. FILE vecfile:TEXT IS IN “vect. SIGNAL out_tab: UNSIGNED (7 DOWNTO 0). la generación de estímulos basados en ese archivo podría ser de la forma: LIBRARY standard. END. abus: OUT BIT_VECTOR (15 DOWNTO 0)). bit.numeric_std.USE ieee.nRD). END IF. WAIT FOR dly.numeric_std. direcciones.. relojd <= reloj’DELAYED(t_hold). 5. END PROCESS chk_tsu. BEGIN dut: psrnd PORT MAP (random). 0 1 Guillermo Jaquenod.std_logic_1164. Generador de estímulos Módulo del diseño de nivel tope (DUT) TEST BENCH Monitor de salidas Otros módulos ya operativos acá se activa chk_thold datos reloj tsetup Generador de estímulos thold Módulo del diseño 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. END. END IF. 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.numeric_std. 2001 62 . END COMPONENT. bit.abus). y duración de esas muestras. VARIABLE punte:line.std_logic_1164.

2001 Fuente: ASHENDEN Ejemplos: voto por mayoria con 3 votantes LIBRARY ieee. gray : OUT BIT_VECTOR (ancho DOWNTO 1)). FOR i IN votantes'RANGE LOOP IF (votantes(i) = '1') THEN conta := conta+1. END IF. 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).. al pasar de un código a otro puede cambiar más de un bit (por ejemplo. ARCHITECTURE looping OF mayoria_var IS BEGIN PROCESS (votantes) IS VARIABLE conta : INTEGER.ALL. 000.vot_c : IN STD_LOGIC. 100. • 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 código binario Guillermo Jaquenod.vot_b. USE ieee. 000. 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 códigos GRAY son muy usados cuando en base a un código desea hacerse una decodificación ausente de “glitches”. trx INERTIAL ‘X’ AFTER tpx. Tipos físicos. tr0 INERTIAL ‘0’ AFTER tp0. Guillermo Jaquenod. END a. GRAY 0000=0 ENTITY bin2gray IS GENERIC (ancho : INTEGER := 8).5 ns. retardos: PROCESS (valor) IS BEGIN IF valor=‘1’ THEN y <= REJECT ELSIF valor=‘0’ THEN y <= REJECT ELSE y <= REJECT END IF. END ARCHITECTURE looping. 001.std_logic_1164.ALL.. END PROCESS retardos. 001. Trascodificador Binario a GRAY Binario Guillermo Jaquenod. IF (conta > num_vot / 2) THEN y <= '1'. END ENTITY mayoria . 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)..b) IS BEGIN valor <= a AND b. BEGIN compuerta: PROCESS (a. una secuencia con codificación binaria es aquella donde códigos sucesivos corresponden a valores numéricos sucesivos (000. 101.VHDL: Lenguaje de descripción de hardware Ejemplo: modelo de una AND2 “con todo” LIBRARY ieee.). 2001 Fuente: DUECK Ejemplos: Trascodificador Binario a GRAY • Dados códigos de N bits. o desde 111 a 000 cambian todos). 110. Cuando a o b son X o Z Uso REJECT --> VHDL’93 Guillermo Jaquenod. 110. BEGIN SI conta := 0. END ENTITY mayoria_var . definidos en ENTITY and2 IS STANDARD GENERIC ( tr1:TIME := 400 ps. ENTITY mayoria_var IS GENERIC (num_vot : INTEGER := 10).std_logic_1164. END PROCESS compuerta. 1000=8 Guillermo Jaquenod. 2001 Ejemplos: voto por mayoria parametrizado LIBRARY ieee. PORT( bin : IN BIT_VECTOR (ancho DOWNTO 1). y : OUT STD_LOGIC). al pasar desde 011 a 100.b:IN std_ulogic. END LOOP. 011. Otros módulos ya operativos END ENTITY and2. 010. • En una secuencia con codificación GRAY estos 2N códigos están ordenados de otro modo. tr0:TIME := 350 ps. PORT (a. END ARCHITECTURE completa . 011. trx:TIME := 300 ps. 111. 2001 GRAY Generador de estímulos BINARIO ARCHITECTURE completa OF and2 IS SIGNAL valor : std_ulogic. END ENTITY bin2gray.. Módulo del diseño 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.3 ns. y: OUT std_ulogic). de modo que al pasar de un código la siguiente sólo cambie un bit (000. rtl . 100. USE ieee. END IF. tp0:TIME := 1. gray (ancho-1 DOWNTO 1) <= bin(ancho-1 DOWNTO 1) XOR bin(ancho DOWNTO 2). En este caso. ELSE y <= '0'. ENTITY mayoria IS PORT( vot_a.. 010. END PROCESS. 2001 NO Guillermo Jaquenod. y : OUT STD_LOGIC). 111. tpx:TIME := 600 ps). PORT(votantes: IN STD_LOGIC_VECTOR (num_vot-1 DOWNTO 0).).std_logic_1164.ALL. Guillermo Jaquenod. 101.. 2001 63 . tp1:TIME := 1. USE ieee.

donde el desplazamiento puede ser unsigned (siempre en un sentido) o signed (en ambos sentidos) • A la vez. 2001 Guillermo Jaquenod. EXIT. 2001 64 . END ecuaciones. END PROCESS. • En base a una palabra de control. 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. END PROCESS proclac. donde los desplazamientos son de a un bit por ciclo de clock. USE ieee. vale 1 si alguna entrada vale 1 El Carry de entrada a una etapa puede ser calculado en base a las señales 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) p ARCHITECTURE ecuaciones OF adder_LAC IS BEGIN s <= a XOR b XOR cin. END IF.p : OUT BIT).cent(i).ptemp : bit_vector (N-1 DOWNTO 0). s: OUT bit_vector (N-1 DOWNTO 0). amaybi.aigualbo. Función PROPAGATE.aigualbi.g. amaybo. END magnitud. 2001 Sumador CarryLookAhead p=a OR b. 2001 a b p(n) etcetera. Barrel Shifter • El barrel shifter es un circuito muy usado en operaciones numéricas. extensión de signo o rotación) • A diferencia de un shift-register.cin : IN BIT. EXIT.b. p <= a OR b. PORT (a.g.b(i). END a.gtemp(i). END GENERATE slicegen. ENTITY magnitud IS GENERIC (N: INTEGER := 4).p:OUT BIT). amaybo.ALL.amaybi. amaybo <= salis(2). END CASE. a y b y el carry de entrada g=a AND b.b. cout <= cent(N). vale 1 si ambas entradas valen 1 cin(0) dato de entrada El método evita el proceso de propagación de Carry. END adder_LAC .ptemp) IS BEGIN cent(0) <= cin. amenbo <= compare(0).amaybi. END IF.std_logic_1164.cin:IN BIT. a b Guillermo Jaquenod. 7485 a > = < ARCHITECTURE a OF magnitud IS BEGIN PROCESS (a. END IF. ARCHITECTURE a OF mi7485 IS BEGIN PROCESS (a. g <= a AND b. ENTITY NadderLAC IS GENERIC (N: INTEGER := 4). 2001 Sumador CarryLookAhead completo Porqué en un caso usa FOR GENERATE y en otro FOR LOOP? ARCHITECTURE a OF NadderLAC IS SIGNAL gtemp. END PROCESS. Guillermo Jaquenod.amenbi:IN STD_LOGIC. FOR i IN 0 TO N-1 LOOP cent (i+1) <= gtemp(i) OR (cent(i) AND ptemp(i)). END ARCHITECTURE a. BEGIN compare := “000”.VHDL: Lenguaje de descripción de hardware Ejemplo: comparador de magnitud de N bits Ejemplos: comparador de 4 bits tipo 7485 LIBRARY ieee. proclac: PROCESS (cin. acá también podría ser NULL END LOOP.b. > = < IF amaybi=‘1’ THEN compare(2):= ‘1’. END mi7485 .s. SIGNAL cent : bit_vector (N DOWNTO 0). 2001 s g co(0) Guillermo Jaquenod. > = < BEGIN salis := amaybi & aigualbi & amenbi. END ENTITY NadderLAC . Guillermo Jaquenod. aigualbo <= salis(1). amaybo <= compare(2)..aigualbi. END IF. Para ello cada sumador (bloques celestes) genera 3 funciones de 3 variables: Sumador CarryLookAhead cantidad de desplazamientos Guillermo Jaquenod. CASE dibit IS WHEN "10" => salis := "100". Función GENERATE. BEGIN slicegen: FOR i IN 0 TO N-1 GENERATE adder_slice : adder_LAC PORT MAP(a(i).b:IN INTEGER RANGE 0 TO 15. cin: IN bit.b:IN std_logic_vector (N-1 DOWNTO 0).amenbi) VARIABLE salis: STD_LOGIC_VECTOR(2 downto 0). WHEN OTHERS => NEXT.ALL. WHEN "01" => salis := "001". 2001 b Guillermo Jaquenod.amenbi:IN STD_LOGIC.ptemp(i)). IF a<b THEN compare(0):= ‘1’. ENTITY mi7485 IS PORT( a.s(i).amenbi) > = < VARIABLE compare : STD_LOGIC_VECTOR(2 downto 0).amenbo:OUT STD_LOGIC).. al ser desplazados los datos en un sentido existen varias alternativas respecto a qué bits ingresar por el otro extremo (cero.aigualbi. END IF. USE ieee. END LOOP. IF amenbi=‘1’ THEN compare(0):= ‘1’. cin p(1) cin(2) a(2) a cin b(2) b ENTITY adder_LAC IS PORT( a. LIBRARY ieee. IF a>b THEN compare(2):= ‘1’. s.. VARIABLE dibit: STD_LOGIC_VECTOR(1 downto 0). FOR i IN a'RANGE LOOP dibit := a(i) & b(i). amaybi. en este caso la operación es combinatoria. De todos modos. END IF.aigualbi.amenbo:OUT STD_LOGIC).b: IN bit_vector (N-1 DOWNTO 0).b. END COMPONENT adder_LAC. amenbo <= salis(0).gtemp. END a. PORT (a. un dato de entrada de N bits es desplazado una cierta cantidad de bits (hasta N-1). END IF. COMPONENT adder_LAC IS PORT(a.std_logic_1164.aigualbo. IF a=b THEN IF aigualbi=‘1’ THEN compare(1):= ‘1’. aigualbo <= compare(1).. cout: OUT bit).

USE ieee. result=>dout ). ENTITY bsderlpm IS PORT (din: IN std_logic_vector (15 DOWNTO 0). dout <= shf4 WHEN sel(3)='0' ELSE B"00000000" & shf4 (15 DOWNTO 8). USE lpm. En vez de 16 Mux hago los shifts por etapas: 1. 2001 Guillermo Jaquenod. cuenta es ELSIF cuenta < 0 THEN RETURN mi_SRL (dato. END IF.shf4: bit_vector (15 DOWNTO 0). 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. (15 DOWNTO 0).shf2.ALL.4ns de retardo usando una END ENTITY bsderlpm . shf2 <= shf1 WHEN sel(1)='0' sel(0) sel(1) ELSE B"00" & shf1 (15 DOWNTO 2). constante? ELSIF dato'LENGTH = 1 THEN RETURN B"0". llama a SRL VARIABLE izq.. ELSE -. dout: OUT bit_vector (15 DOWNTO 0)). END ENTITY brder . . ELSIF izq > der THEN -. 2001 65 . bit_vector (15 DOWNTO 0)). 2 4 y 8 shifts! ARCHITECTURE a OF bsder IS SIGNAL shf1.shf2.VHDL: Lenguaje de descripción 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). aunque puede definirse una función que realice esa tarea LIBRARY ieee. LIBRARY lpm. SLL RETURN tempo. 2001 Barrel Shifter usando LPM_CLSHIFT Los 6 operandos de shift definidos en VHDL’93 no son reconocidos por el MAX+plus II. tempo(der):= '0'. ‘0’ ‘ASCENDING? Guillermo Jaquenod.LPM_WIDTHDIST => 3. sel(3) Guillermo Jaquenod.rango de dato es xx DOWNTO yy. 2001 Guillermo Jaquenod. shf4 <= shf2 WHEN sel(2)='0' ELSE B"0000" & shf2 (15 DOWNTO 4). END LOOP. shf2 <= shf1 WHEN sel(1)='0' ELSE B"00" & shf1(23 DOWNTO 2). din(0) shf1(1 shf2(3 shf4(7 & din (15 DOWNTO 0) DOWNTO 0) DOWNTO 0) DOWNTO 1). dout:OUT std_logic_vector(15 DOWNTO 0)). 89 LEs y 26. dout <= shf2(15 DOWNTO 0) WHEN sel(2)='0' ELSE shf2(19 DOWNTO 4).. Podría haber usado END FUNCTION mi_SLL. distance=>sel(2 DOWNTO 0).ALL. 2001 Recreando instrucciones de SHIFT: SLL Fuente: ALTERA MAX+plus II HELP FUNCTION mi_SLL (dato: IN std_logic_vector. con xx < yy FOR i IN 1 TO cuenta LOOP tempo (izq TO der-1) := tempo (izq+1 TO der).0)=1101=-3 despl (3)=-8 0101 ARCHITECTURE a OF brder IS SIGNAL shf1. bit_vector (3 DOWNTO 0).shf2. dout:OUT bit_vector(15 DOWNTO 0)).2ns de ARCHITECTURE a OF bsder IS retardo usando una SIGNAL shf1.lpm_components. 2001 Operación de un Barrel Shifter Signed despl (2)=4 ENTITY brder IS PORT (din:IN bit_vector (15 DOWNTO 0). direction=>sel(3). izq := dato'LEFT. END ARCHITECTURE a. sel: IN bit_vector (3 DOWNTO 0).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) Operación de un Barrel Shifter Signed ENTITY bsder IS PORT (din: IN bit_vector (15 DOWNTO 0). sel:IN bit_vector(3 DOWNTO 0). END LOOP. Guillermo Jaquenod. & shf1(15 DOWNTO 2). 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. & shf4(15 DOWNTO 8). sel:IN std_logic_vector(3 DOWNTO 0). END ARCHITECTURE a. 2001 despl (3. 62 LEs y 23. Guillermo Jaquenod. & shf2(15 DOWNTO 4).rango de dato es xx TO yy.der: INTEGER.-cuenta). BEGIN Cuantos LEs tempo := dato. los shifts no dependen del signo del selector de desplazamiento! Guillermo Jaquenod. END ARCHITECTURE a. cuenta: IN INTEGER) RETURN std_logic_vector IS SLL con shift negativo VARIABLE tempo: std_logic_vector (dato'RANGE). LPM_SHIFTTYPE => "ARITHMETIC") PORT MAP (data=>din. BEGIN shf1 <= din WHEN sel(0)='0' ELSE '0' & din (15 DOWNTO 1). con xx > yy FOR i IN 1 TO cuenta LOOP tempo (izq DOWNTO der+1):= tempo (izq-1 DOWNTO der). tempo (der) := '0'. der := dato'RIGHT. EPF10K10LC84-3 BEGIN shf8 <= X"00" & din WHEN sel(3)='0' ELSE din & X"00".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.std_logic_1164. necesitaré si IF cuenta = 0 THEN RETURN tempo. shf1 <= shf8 WHEN sel(0)='0' ELSE '0' & shf8(23 DOWNTO 1). sel(2) Ejemplos (Shift +.shf8: bit_vector (23 DOWNTO 0). END ENTITY bsder . EPF10K10LC84-3 ARCHITECTURE a OF bsderlpm IS BEGIN mishift: lpm_clshift GENERIC MAP (LPM_WIDTH => 16.

cuenta: IN INTEGER) RETURN std_logic_vector IS Cuantos LEs VARIABLE tempo: std_logic_vector (dato'RANGE).rango de dato es xx TO yy. der := dato'RIGHT. cuenta: IN INTEGER) RETURN std_logic_vector IS VARIABLE tempo: std_logic_vector (dato'RANGE). aunque puede definirse una función que realice esa tarea FUNCTION mi_SLA (dato: IN std_logic_vector. SRA RETURN tempo. aunque puede definirse una función que realice esa tarea FUNCTION mi_SLL (dato: IN std_logic_vector. ELSE -. con xx > yy FOR i IN 1 TO cuenta LOOP rond:=temp(de).rango de dato es xx TO yy. SRL con shift negativo VARIABLE izq. ELSIF izq > der THEN -. tempo (der) := '0'. con xx > yy FOR i IN 1 TO cuenta LOOP tempo (izq DOWNTO der+1):= tempo (izq-1 DOWNTO der). SLL Son sólo cables necesitaré? VARIABLE izq. ELSIF cuenta < 0 THEN RETURN mi_SLL (dato. END LOOP. llama a SRA BEGIN tempo := dato. ELSIF dato'LENGTH = 1 THEN RETURN B"0". END IF.-cuenta). aunque puede definirse una función que realice esa tarea Los 6 operandos de shift definidos en VHDL’93 no son reconocidos por el MAX+plus II. END IF. SLA RETURN tempo.de: INTEGER. ELSIF cuenta < 0 THEN RETURN mi_SRA (dato. ROR RETURN temp. ELSIF izq > der THEN -.-cuenta). ELSIF iz > de THEN -.rango de dato es xx TO yy.rango de dato es xx DOWNTO yy. SLA con shift negativo VARIABLE izq. Guillermo Jaquenod.rango de dato es xx TO yy. ELSIF cuenta < 0 THEN RETURN mi_SRL (dato. ELSIF dato'LENGTH = 1 THEN RETURN temp. temp(iz-1 DOWNTO de):=temp(iz DOWNTO de+1). temp(de):=rond. temp(iz):=rond. END LOOP. cuenta: IN INTEGER) RETURN std_logic_vector IS VARIABLE tempo: std_logic_vector (dato'RANGE). END FUNCTION mi_SRL. ELSIF dato'LENGTH = 1 THEN RETURN tempo. de:=dato'RIGHT. 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). der := dato'RIGHT. cuenta: IN INTEGER) RETURN std_logic_vector IS VARIABLE temp: std_logic_vector (dato'RANGE). negativo llama a SLA BEGIN tempo := dato. FUNCTION mi_SRL (dato: IN std_logic_vector. 2001 Recreando instrucciones de SHIFT: SLA Recreando instrucciones de SHIFT: SRA Los 6 operandos de shift definidos en VHDL’93 no son reconocidos por el MAX+plus II.rango de dato es xx DOWNTO yy. izq := dato'LEFT. cuenta: IN INTEGER) RETURN std_logic_vector IS VARIABLE tempo: std_logic_vector (dato'RANGE). END LOOP.rango de dato es xx DOWNTO yy. aunque puede definirse una función que realice esa tarea Los 6 operandos de shift definidos en VHDL’93 no son reconocidos por el MAX+plus II. ELSE -. END LOOP. der := dato'RIGHT. ELSE -. der := dato'RIGHT.rango de dato es xx DOWNTO yy. END IF. aunque puede definirse una función que realice esa tarea FUNCTION mi_ROL (dato: IN std_logic_vector. de:=dato'RIGHT.rango de dato es xx DOWNTO yy. con xx < yy FOR i IN 1 TO cuenta LOOP tempo (izq+1 TO der) := tempo (izq TO der-1). ELSE -. con xx < yy FOR i IN 1 TO cuenta LOOP tempo (izq TO der-1) := tempo (izq+1 TO der).de: INTEGER. ROL RETURN temp. SRL RETURN tempo.der: INTEGER. ROR con shift negativo BEGIN llama a ROL temp:=dato. con xx > yy FOR i IN 1 TO cuenta LOOP tempo (izq-1 DOWNTO der):= tempo (izq DOWNTO der+1). temp(iz):=rond. Guillermo Jaquenod. temp(iz DOWNTO de+1):=temp(iz-1 DOWNTO de). ELSIF cuenta < 0 THEN RETURN mi_ROR (dato. END FUNCTION mi_SLL. END LOOP. con xx > yy FOR i IN 1 TO cuenta LOOP tempo (izq-1 DOWNTO der):= tempo (izq DOWNTO der+1). ELSIF dato'LENGTH = 1 THEN RETURN temp. izq := dato'LEFT.der: INTEGER. ELSIF izq > der THEN -. END LOOP. ROL con shift negativo BEGIN llama a ROR temp:=dato. izq := dato'LEFT. ‘0’ NINGUNA! Guillermo Jaquenod.rango de dato es xx TO yy. iz:=dato'LEFT. IF cuenta = 0 THEN RETURN tempo.VHDL: Lenguaje de descripción de hardware Uso de recursos de mi_SLL Recreando instrucciones de SHIFT: SRL Cuántos recursos requiere la implementación de una operación de shift una cantidad CONSTANTE de veces? Los 6 operandos de shift definidos en VHDL’93 no son reconocidos por el MAX+plus II. temp(iz+1 TO de):=temp(iz TO de-1). llama a SLL BEGIN tempo := dato. ELSIF iz > de THEN -. END LOOP. END FUNCTION mi_ROL. VARIABLE iz. END LOOP. IF cuenta=0 THEN RETURN temp. que se cruzan! BEGIN ‘0’ tempo := dato. tempo (der) := '0'. FUNCTION mi_ROR (dato: IN std_logic_vector. temp(iz TO de-1):=temp(iz+1 TO de).der: INTEGER. 2001 Guillermo Jaquenod. izq := dato'LEFT. FUNCTION mi_SRA (dato: IN std_logic_vector. VARIABLE rond: std_logic. END FUNCTION mi_SRA. RETURN tempo.der: INTEGER. ELSIF cuenta < 0 THEN RETURN mi_ROL (dato. 2001 66 . END IF. SRA con shift VARIABLE izq. END LOOP. ELSIF dato'LENGTH = 1 THEN RETURN B"0". ELSIF cuenta < 0 THEN RETURN mi_SLA (dato. IF cuenta = 0 THEN RETURN tempo. con xx > yy FOR i IN 1 TO cuenta LOOP rond:=temp(iz). con xx > yy FOR i IN 1 TO cuenta LOOP tempo (izq DOWNTO der+1):= tempo (izq-1 DOWNTO der). IF cuenta = 0 THEN RETURN tempo. END LOOP. ELSE -. con xx < yy FOR i IN 1 TO cuenta LOOP rond:=temp(de). VARIABLE iz. END LOOP. END LOOP. 2001 Guillermo Jaquenod. ELSIF dato'LENGTH = 1 THEN RETURN tempo. IF cuenta=0 THEN RETURN temp. con xx < yy FOR i IN 1 TO cuenta LOOP rond:=temp(iz). con xx < yy ‘0’ FOR i IN 1 TO cuenta LOOP tempo (izq TO der-1) := tempo (izq+1 TO der). IF cuenta = 0 THEN RETURN tempo.-cuenta). tempo(der):= '0'. tempo(der):= '0'. END IF. END IF. temp(de):=rond. END FUNCTION mi_SLA. cuenta: IN INTEGER) RETURN std_logic_vector IS VARIABLE temp: std_logic_vector (dato'RANGE). 2001 Recreando instrucciones de SHIFT: ROL Guillermo Jaquenod. iz:=dato'LEFT.-cuenta).-cuenta).-cuenta).rango de dato es xx DOWNTO yy. VARIABLE rond: std_logic. ELSIF izq > der THEN -. END FUNCTION mi_ROR. 2001 Guillermo Jaquenod. 2001 Recreando instrucciones de SHIFT: ROR Los 6 operandos de shift definidos en VHDL’93 no son reconocidos por el MAX+plus II.

END a. IF (z='1') OR cont=360 THEN cont:=0. pos <= cont.ALL. END IF. END a. END shaft0. DN-1 TQ clk dloop: FOR i IN 1 TO NBITS-1 GENERATE d(i) <= NOT(qt(i-1)) AND d(i-1). END IF. Bases de VHDL Ejemplos con MAX+plus II VHDL Intentar optimizar el diseño A B Giro Horario A B Giro Antihorario • Es un dispositivo muy usado en aplicaciones industriales para el sensado de ángulos. 2001 Interfase a Shaft Encoder usando LPMs Shaft Encoder: aumento 4x de la resolución A B LIBRARY ieee. ELSIF reloj'EVENT AND reloj='1' THEN Di Evaluar los posibles usos de los “modos de operacion” PORT (reloj. qt(0) <= NOT(qt(0)). END PROCESS sync.. END shaftlpm. WHEN OTHERS=> sent := 0. END IF. q => pos).reloj:IN BIT. END shaft1. ARCHITECTURE a OF shaft1 IS BEGIN PROCESS (reloj) VARIABLE cont :INTEGER RANGE -1 TO 360. B Giro Antihorario • El uso de LPMs simplifica el diseño y casi siempre da resultados de síntesis mucho más eficientes • En este caso el uso de recursos baja de 26 LEs a sólo 16 LEs! Guillermo Jaquenod. VARIABLE stat: BIT_VECTOR (1 DOWNTO 0):= B"00". de duración menor a 1/360. BEGIN pack := stat & a & b. ELSE sent:=-1. ‘1’ TQ clk TQ clk TQ clk TQ clk D0 D1 D2 d(0) <= '1'. qt(NBITS) <= qt(NBITS) XOR ( (qt(NBITS-1) OR qt(NBITS)) AND d(NBITS-1)). • Un algoritmo más eficiente una sólo N+1 macroceldas. 2001 67 . a razón de una por vuelta. WHEN B"0111"|B"1110"|B"1000"|B"0001"=> sent:=-1. END IF. IF cont=-1 THEN cont:=359. IF reloj='1' THEN CASE pack IS WHEN B"0010"|B"1011"|B"1101"|B"0100"=> sent:= 1. stat:= a & b. pos:OUT std_logic_vector(8 DOWNTO 0)). USE lpm.lpm_components. updown =>b. SIGNAL qt: BIT_VECTOR (NBITS downto 0). • La interfase más 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. VARIABLE pack: BIT_VECTOR (3 DOWNTO 0). IF cont=-1 THEN cont:=359. 2001 Contadores Código GRAY Contador Código GRAY genérico • Si bien un contador GRAY de N bits puede hacerse usando un contador binario y un trascodificador. a razón de 360 pulsos por vuelta – una señal Z. 2001 A0 B0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 Giro Horario A0 1 1 0 0 1 1 0 0 1 1 0 B1 1 0 0 1 1 0 0 1 1 0 0 Giro Antihorario Una alternativa que aumenta la resolución y permite un diseño sincronico con un reloj interno es observar que: –en sentido horario la secuencia AB es 00/10/11/01/00. Giro Horario A ENTITY shaftlpm IS PORT ( a. ARCHITECTURE a OF shaftlpm IS BEGIN shaftcnt: lpm_counter GENERIC MAP ( LPM_WIDTH => 9.clr_n: IN BIT.b. END IF. END GENERATE. las demás etapas tienen una arquitectura como sigue Ei ENTITY graycont IS GENERIC (NBITS : INTEGER := 4). pos <= cont. END IF. Guillermo Jaquenod. q <= qt (NBITS downto 1).z:IN std_logic. 2001 Guillermo Jaquenod. USE ieee. • En base a este “módulo” un contador GRAY de N bits se configura END IF. END CASE.z:IN BIT.std_logic_1164.clr_n) • Excepto la primer etapa (generación de D-1) y la última etapa. 2001 Guillermo Jaquenod. END PROCESS.. sclr => z. END ENTITY graycont. BEGIN IF a='1' THEN IF b=‘0' THEN sent:= 1.b. LIBRARY lpm. sync: PROCESS (reloj. –en sentido antihorario la secuencia AB es 00/01/11/10/00. Q0 Q1 Q2 Guillermo Jaquenod. ENTITY shaft1 IS PORT (a. LPM_MODULUS =>360) PORT MAP (clock => a. que en base al bit actual “Gi”.ALL.z. al previo Gi-1 y a una función Di-1 que viene desde la etapa previa calcula el siguiente Gi y la función Di ARCHITECTURE a OF graycont IS SIGNAL d: BIT_VECTOR (NBITS-1 downto 0). BEGIN BEGIN IF clr_n='0' THEN qt <= T Q Gi clk (others =>'0'). ARCHITECTURE a OF shaft0 IS BEGIN PROCESS (a) VARIABLE cont :INTEGER RANGE -1 TO 360. END PROCESS. q: OUT BIT_VECTOR (NBITS downto 1)). Ci FOR i IN 1 TO NBITS-1 LOOP qt(i) <= qt(i) XOR (qt(i-1) AND d(i-1)). y genera tres señales: – dos señales A y B desfasadas entre sí 1/4 de período. IF (z='1') OR cont=360 THEN cont:=0. VARIABLE sent:INTEGER. END ARCHITECTURE a.b. 2001 QN-1 QN Guillermo Jaquenod. END LOOP. pos:OUT INTEGER RANGE 0 TO 359). cont := cont+sent. pos:OUT INTEGER RANGE 0 TO 359). con esa solución se pierden todas las ventajas de ausencias de “glitches” y se usan 2N macroceldas. END IF. VARIABLE sent:INTEGER.. END a. cont := cont+sent.VHDL: Lenguaje de descripción de hardware Interfase a Shaft Encoder Incremental ENTITY shaft0 IS PORT (a.

ELSIF reloj'EVENT AND reloj = '1' THEN FOR i IN 2 TO LFSRTAPS LOOP fftaps(i) <= fftaps (i-1).. • Se basa en un shift register de N etapas. END IF.. END IF. De este modo. Guillermo Jaquenod. END ENTITY lfsrn. DQ BEGIN temp := '0'. END LOOP.cantidad de etapas. el código resultante (el resto) debe ser todos ceros Guillermo Jaquenod. bastan N elementos realimentaciones. SIGNAL fftaps : BIT_VECTOR (LFSRTAPS DOWNTO 1). bastan N elementos lógicos para un LFSR de N bits lógicos para un LFSR de N bits Guillermo Jaquenod. 2001 Contador Linear Feedback Shift Register • Un Linear Feedback Shift Register (LFSR) es un caso de máquina sincrónica de enorme simplicidad circuital LFSR genérico. la secuencia generada se repite luego de 2N-1 ciclos de reloj. pero agregando como variable adicional un canal de datos que ingresan en forma serial.n_init) BEGIN IF n_init = '0' THEN fftaps <= (others=>'0').init) BEGIN IF init=‘1' THEN q <=(others =>'0'). p1: PROCESS (fftaps) DQ DQ LUT DQ LUT LUT LUT VARIABLE temp : BIT. CRC-16 y CRC-CCITT para caracteres de 8 bits. dada su alta simplicidad circuital y la rápida velocidad de operación • Estos beneficios ya no son tales al usar lógica programable. y luego de ellos el CRC – Al finalizar este ingreso. -. END ARCHITECTURE a. q: BUFFER BIT_VECTOR (n DOWNTO 1)).X"0500". ARCHITECTURE a OF johnson IS BEGIN sync: PROCESS (reloj. 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"0030".X"000C". din dout reloj init Tx/Rx xpass x0 D Control. 2001 END PROCESS p1. lo que aproxima su eficiencia de uso de flipflops al de un contador binario puro (2N estados) fftaps (1) <= xorout. X"0240".fairchildsemi.X"100D".1’) – Se ingresan los datos en forma serial. taps : OUT BIT_VECTOR (LFSRTAPS DOWNTO 1)). 2001 Guillermo Jaquenod. y CRC-32 en canales de comunicación sincrónicos (por ejemplo la norma IEEE-802 especifica el uso de CRC-32).X"D008").init: IN BIT. VARIABLE mask : BIT_VECTOR (16 DOWNTO 1).X"0060". BEGIN p0: PROCESS (reloj.com • donde CRC-12 es usada con datos de 6 bits. ARCHITECTURE a OF lfsrn IS SUBTYPE mascara IS BIT_VECTOR (16 DOWNTO 1). contador de rango N+16) y detector de cero rdy CRC_OK • Un generador/testeador de CRC-16 para transmisión y recepcion de mensajes de N bits podría tener una arquitectura como la que se indica en el gráfico Guillermo Jaquenod. FOR i IN 1 TO LFSRTAPS LOOP if (mask (i)='1') THEN temp := temp XOR fftaps(i).X"0110".X"0014". END PROCESS p0. • Si las realimentaciones son bien elegidas.X"2015". de 3 a 16 etapas ENTITY lfsrn IS GENERIC (LFSRTAPS : INTEGER RANGE 3 TO 16 :=3). Al ser función de 2 o 4 Al ser función de 2 o 4 realimentaciones. el proceso de generación de CRC es como sigue: – El registro se inicializa con todos sus bits en un valor predefinido (usualmente ‘1. taps <= fftaps. entre 3 y 16 Realimentacion desde 2 etapas PORT (n_init. ELSIF reloj'EVENT AND reloj='1' THEN q(n DOWNTO 2) <= q (n-1 DOWNTO 1). por lo que es más veloz y más fácil de rutear xorout <= NOT (temp). 2001 68 .X"00B8". PORT (reloj.1’) – Se ingresan los datos en forma serial – Al finalizar este ingreso. por cuanto la cantidad de estados distintos es sólo el doble de los registros usados • En diseños de microelectrónica de RF suelen ser usados como prescalers en las primeras etapas. 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.X"0829". END PROCESS sync. END IF. donde tienen igual performance que un contador LFSR 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 • Además 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. END LOOP. • Pero los recursos de cableado que usa son mucho menores.reloj : IN BIT. SIGNAL xorout : BIT. q(1) <= NOT (q(n)). CONSTANT tablaxor : tabla := (X"0006". 2001 Q D CL Q D CL Q D CL Q CL D Q CL ENTITY johnson IS GENERIC (n:INTEGER:= 8). el código resultante en el registro es el CRC • De igual modo. END ARCHITECTURE a. el proceso de verificaciónde CRC es el siguiente – El registro se inicializa con todos sus bits en el mismo valor predefinido (‘1.VHDL: Lenguaje de descripción de hardware Contadores Código GRAY Ciclo Código GRAY Dummy qt0 Ciclo Código GRAY Dummy qt0 0 0000=0 1 8 1100=C 1 1 0001=1 0 9 1101=D 0 2 0011=3 1 A 1111=F 1 3 0010=2 0 B 1110=E 0 4 0110=6 1 C 1010=A 1 5 0111=7 0 D 1011=B 0 6 0101=5 1 E 1001=9 1 7 • Resultados de la simulación funcional usando MAX+plus II 0100=4 0 F 1000=8 Contadores Johnson 0 • Los contadores Johnson son ineficientes en el uso de registros.X"6000". Guillermo Jaquenod. TYPE tabla IS ARRAY (3 TO 16) OF mascara. END ENTITY johnson. mask := tablaxor (LFSRTAPS).

init.reloj: IN std_logic).crc_ok: OUT std_logic). nrdy <= ena. X1 por R7. June.ALL.inp : std_logic_vector (15 DOWNTO 0). • 1 para MUX dout • 4 para zero ARCHITECTURE a OF crcshft IS CONSTANT mask: std_logic_vector (15 DOWNTO 0):= X"8005". solucionables con un único LE." IEEE Micro.std_logic_1164. inp (4) <= q(12).xpass. y llamando Xi a Di XOR Qi. •• 9 para el contador 9 para el contador ENTITY crc16 IS PORT ( •• 3 para ena 3 para ena init. END a. 40-50 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. 1983.ALL. cntval <= '1' WHEN (conta < NMSG) ELSE '0'. d : IN std_logic_vector (8 downto 1). y llamando Xf = ( X87 xor X65 xor X43 xor X21 ). 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. 1983.reloj=>reloj).din: IN std_logic. END ENTITY crc16byte.ALL.1] • Sólo necesito los 16 registros de CRC más 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 cálculo de R1." IEEE Micro. SIGNAL xpass. END ARCHITECTURE a. 2001 Cómputo paralelo de CRC-16 Q16 Q15 Q14 Q13 Q12 Q11 Q10 Q9 Q8 Q7 Q6 Q5 Q4 Q3 Q2 Cómputo paralelo de CRC-16 • Siguiendo el análisis hasta T=8. inp(16) <= x(8) xor x(6) xor x(4) xor x(2). •• 22 para crcshift 22 para crcshift LIBRARY lpm. USE ieee. inp (3) <= q(11).reloj: IN std_logic). SIGNAL conta: std_logic_vector (8 DOWNTO 0). USE ieee. BEGIN shift: crcshift PORT MAP (dout=>dout. inp(15) <= x(7) xor x(5) xor x(3) xor x(1). • 16 para shift ENTITY crcshft IS PORT (dout.X21 X76. X65. A. dout <= shf(15) WHEN xpass='0' ELSE din.).init. 1983. El LE adicional genera una funcion interna necesaria porque la entrada a cada LE es funcion de 5 variables: init. END PROCESS. y ser tan eficiente como la solución serie Guillermo Jaquenod. inp (7) <= q(15) xor x(1). USE ieee. din. PROCESS (reloj) BEGIN IF reloj = '1' THEN IF init='1' THEN shf <= (others =>'1'). inp (12) <= x(6). SIGNAL feedback: std_logic. ELSIF reloj'EVENT AND reloj = '1' THEN q <= inp. •• 3 para xpass 3 para xpass dout. 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 lógico tiene 4 entradas.. din.. Xf y R1 en un clique • Usando “register packing” los recursos usados son menores (Xf es generado por R16. y que cada Xi requiere dos variables. din. BEGIN feedback <= (din XOR shf(15)) AND xpass. X21. "Byte-wise CRC Calculations. inp (9) <= x(3). 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.zero: OUT std_logic. inp(1) <= x(8) xor x(6) xor x(4) xor x(2) xor q(9).D8). inp (5) <= q(13). SIGNAL inp: std_logic_vector(16 downto 1).din=>din. inp (13) <= x(7).Q1.reloj : IN std_logic). inp (10) <= x(4).1] usados en un CRC-16 y su valor inicial Q16. -. ARCHITECTURE a OF crc16 IS CONSTANT NMSG : INTEGER :=30. ninit. 2001 Porqué usa 3 LIBRARY ieee. cnt_en => ena.. SIGNAL crcx: std_logic_vector (15 DOWNTO 0). inp (6) <= q(14). xpass <= '1' WHEN txrx='0' ELSE cntval. END a. END GENERATE l0.ALL. SIGNAL shf. shaftcnt: lpm_counter GENERIC MAP (LPM_WIDTH => 9) PORT MAP (clock => reloj.VHDL: Lenguaje de descripción de hardware Generador/testeador de CRC-16 Generador/testeador de CRC-16 Uso 22 LEs: LIBRARY ieee. PROCESS (ninit. Guillermo Jaquenod. queda: R16 T=8 R15 X87 X65 X43 X21 X76 X54 X32 X1 R14 X87 Guillermo Jaquenod. A.zero: OUT std_logic.txrx. inp (14) <= x(8). ELSE shf <= inp.. 40-50 Guillermo Jaquenod. inp (0) <= feedback. l0: FOR i IN 1 TO 15 GENERATE inp(i) <= (feedback AND mask(i)) XOR shf(i-1). inp (8) <= q(16) xor x(2).reloj) IS BEGIN IF (ninit = '0') THEN q <= (OTHERS => '1').X1 X87 X76 X65 X54 X43 X32 Q16 X21 Q15 X1 Q14 Q13 Q12 Q11 Q10 Q9 Xf D[8. ENTITY crc16byte IS PORT (q : BUFFER std_logic_vector (16 downto 1).init=>init. que requiere atravesar dos LE combinatorios • Conviene poner X87. inp (2) <= q(10). June.std_logic_1164. puede bajar a 17 LEs. USE ieee. y conocidos 8 datos sucesivos de entrada Di (D1. A. se puede llegar a: Q1 R16 di reloj init dout • Dados los 16 registros R[16.reloj. END IF.cntval: std_logic.ALL. June.X65 X43. ena <= '1' WHEN (conta < NMSG+15) ELSE '0'. END IF. Uso 38 LEs: Uso 38 LEs: LEs para ena? LIBRARY ieee. END crcshft.1] Perez.xpass. "Byte-wise CRC Calculations.. xpass y shf(i-1) Guillermo Jaquenod." IEEE Micro. END crc16. end generate. xg: for i in 2 to 8 generate x(i) <= d(i) xor q(i) xor d(i-1) xor q(i-1). inp (11) <= x(5).. 40-50 Cómputo 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. Guillermo Jaquenod.X54 X32.nrdy. END PROCESS. USE lpm. sclr =>init.std_logic_1164. END COMPONENT. 2001 Cómputo paralelo de CRC-16 R16 R15 R14 R13 R12 R11 R10 R9 R8 R7 R6 R5 R4 R3 R2 R1 X87. "Byte-wise CRC Calculations. shf(15).ena. END IF.xpass=>xpass.largo del mensaje COMPONENT crcshift PORT (dout. pueden definirse términos Xij = ( Xi xor Xj )..std_logic_unsigned. X43. zero <= '1' WHEN shf = X"0000" ELSE '0'. 2001 69 . BEGIN x(1) <= q(1) xor d(1). ARCHITECTURE a OF crc16byte IS SIGNAL X: std_logic_vector(8 downto 1).zero=>crc_ok.lpm_components.q => conta).

BEGIN edge <= rxdly XOR rxd. USE ieee. END a. Guillermo Jaquenod. IF cnt = 0 THEN eoc <= '1'. 2001 ENTITY recupclk IS PORT (rxd. IF.modo shift regs(largo-1 DOWNTO 1) := (largo-2 DOWNTO 0).detector de transicion e(1) <= NOT((e(8) AND NOT(edge)) OR (e(7) AND edge)).ALL. ELSE WHEN X"08" => IF edge='1' THEN e <= X"08". ELSE WHEN X"40" => IF edge='1' THEN e <= X"01". END ENTITY recupclka. IF. D/A VARIABLE rasreg: STD_LOGIC_VECTOR (7 DOWNTO 0).nreset) IS BEGIN IF nreset='0' THEN e <= X"00". END ARCHITECTURE a. END ENTITY recupclk. regs (0) := d. ELSE WHEN X"04" => IF edge='1' THEN e <= X"04". PORT (reloj. 2001 Guillermo Jaquenod. to_da <= rasreg. END IF. -. e(2) <= NOT(e(1)) OR ((e(8) OR e(2)) AND edge). ENTITY shift_store IS GENERIC (largo: INTEGER := 8). IF. rasreg(cnt):='1'. compilado con MAX+Plus II. ELSIF rising_edge (reloj) THEN IF eoc='0' THEN rasreg (cnt):=comp. -. Guillermo Jaquenod.rxd demorado un ciclo edge <= rxdly XOR rxd. -. ELSE WHEN X"10" => IF edge='1' THEN e <= X"40". END END END END END END END e4 IF. p5-105. END IF. IF. eoc <= '0'. LIBRARY ieee. X"01". END IF.d. y puede calcularse en sólo 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. END a.din.carga paralela END IF. e(8) <= (e(7) AND NOT(edge)) OR (e(6) AND edge).sc_n) VARIABLE cnt : INTEGER RANGE 0 TO 7. rxck <= e(4).VHDL: Lenguaje de descripción de hardware Shift Register Parallel Input. data: OUT STD_LOGIC_VECTOR (largo-1 DOWNTO 0)). data sal: OUT STD_LOGIC). con MAX+Plus II. BEGIN IF reloj=‘1’ THEN IF sl = '1' THEN -. X"40". PROCESS (store) BEGIN IF store=‘1’ THEN data <= regshf. ENTITY sr_PISO IS GENERIC (largo: INTEGER := 8). “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). END PROCESS. Guillermo Jaquenod. END CASE. e(4) <= (e(3) AND NOT(edge)) OR (e(4) AND edge). sl d ARCHITECTURE a OF sr_PISO IS BEGIN reloj PROCESS (reloj) VARIABLE regs:STD_LOGIC_VECTOR (largo-1 DOWNTO 0). IF. regshf (0)<=din. END PROCESS. END a. SIGNAL e: bit_vector (8 DOWNTO 1). e1 e8 e2 e3 e7 e6 e4 e5 Pensando en la síntesis obtengo los siguientes beneficios: • Bajo de 32 LEs a sólo 10 LEs • Anda mucho más rápido • Evito metaestabilidades • Fuerzo el uso de ONE-HOT!! Registro de aproximaciones sucesivas + ARCHITECTURE a OF ras IS BEGIN PROCESS (reloj. ELSE WHEN OTHERS => e <= X"02".edge : bit.rxck_8x. END ENTITY ras. sal <= regs (largo-1). 2001 e1 ARCHITECTURE a OF recupclk IS SIGNAL rxdly.std_logic_1164. END PROCESS. ELSIF rxck_8x'EVENT and rxck_8x='1' THEN rxdly <= rxd. requiere 32 LEs requiere 32 LEs Guillermo Jaquenod. IF. END IF. END IF. Buscar una solución más eficiente! RAS Guillermo Jaquenod. e(5) <= (e(4) AND NOT(edge)). cnt:= 7. data:IN STD_LOGIC_VECTOR (largo-1 DOWNTO 0). USE ieee. e(6) <= (e(5) AND NOT(edge)). END ARCHITECTURE a. luego de 16 shifts el CRC-32 queda como sigue.ALL. Serial Output Cómputo paralelo de CRC-32 • Con idéntico análisis. END PROCESS. eoc: BUFFER STD_LOGIC). ELSE cnt:=cnt-1. ENTITY ras IS PORT (reloj.detector de transicion PROCESS (rxck_8x) IS BEGIN IF rxck_8x='1' THEN rxdly <= rxd. END IF. dout:OUT STD_LOGIC.std_logic_1164. rxck: OUT bit).rxd demorado un ciclo CASE e IS WHEN X"02" => IF edge='1' THEN e <= X"02". END PROCESS. END PROCESS. BEGIN PROCESS (rxck_8x. -. END sr_PISO . e(7) <= (e(6) AND NOT(edge)) OR (e(5) AND edge). ELSE WHEN X"20" => IF edge='1' THEN e <= X"80". END LOOP. X"08". BEGIN IF sc_n='0' THEN rasreg (7):='1'. dout dout <= regshf (largo-1).sc_n.nreset: IN bit. FOR i IN 6 DOWNTO 0 LOOP rasreg(i) := '0'. END shift_store. to_da:OUT STD_LOGIC_VECTOR (7 DOWNTO 0). • En CRC-32 el número inicial del registro CRC es C704DD7B Guillermo Jaquenod. ELSE regs := data. 2001 sal Recuperador de reloj “behavioral” LIBRARY ieee. 2001 Recuperador de reloj pensando en la síntesis ENTITY recupclka IS PORT (rxd.edge : bit. e5 el flanco se “engancha” acá Este diseño. e(3) <= (e(2) AND NOT(edge)) OR (e(3) AND edge).ALL. store BEGIN PROCESS (reloj) BEGIN reloj IF reloj=‘1’ THEN regshf (largo-1 DOWNTO 1)<=regshf (largo-2 DOWNTO 0). ELSE WHEN X"80" => IF edge='1' THEN e <= X"02". USE ieee. 2001 70 . PORT (reloj. compilado Este diseño. e8 e2 e3 e7 e6 e<= e<= e<= e<= e<= e<= e<= X"04".comp:IN STD_LOGIC.rxck_8x: IN bit. X"20".sl:IN STD_LOGIC. END IF. ARCHITECTURE a OF recupclka IS SIGNAL rxdly.std_logic_1164. 2001 LIBRARY ieee.store:IN STD_LOGIC.1994. X"80". rxck: OUT bit). rxck <= e(5). -. X"10". SIGNAL e: bit_vector (8 DOWNTO 1). END IF.

SIGNAL estado: sttxb. cnt <= 0. END IF. control de flujo.thrf:IN bit. thr: OUT bit_vector (7 downto 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. END ARCHITECTURE a. TxD 0 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? Simulación de la etapa TX de la UART • Se muestra la simulación funcional usando MAX+plus II. END IF. thrf: OUT bit. END IF. TxC=0 Ctl Ack Ena Clk Guillermo Jaquenod. END ENTITY uart_txB. thr<=din. din:IN bit_vector (7 downto 0). 2001 Mejora de UART_TX. END uart_tx. ack<='1'. TxC THRF We Clk Ctl Ack Ctl ARCHITECTURE a OF uart_tx IS COMPONENT uart_txA PORT (reset. WHEN B"10" => IF we='0‘ THEN estado <= B"11". thrf <= estado(1). etapa TX. estado<=s2.ack:IN bit.txd: OUT bit. END ARCHITECTURE txa. END CASE.thrf. END IF. Ena=0 WHEN s1=> thrf <= '0'. txd: OUT bit. SIGNAL cnt:INTEGER RANGE 0 to 11.thro).txck.din.txck:IN bit. ELSE thr <= din. thrf: OUT bit. Cnt++ END ARCHITECTURE txB. WHEN s2=> shf(7 downto 0)<=shf(8 downto 1). THRF=1 END PROCESS a. S/L Ena TxCk 1 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.txd.ack. ack <= '0'.we.clk. THRF We TxHoldRegister 1 ENTITY uart_txA IS PORT ( reset. END CASE. WHEN B"11" => IF ack='1' THEN estado <= B"00".shf(8)<='1'. cada una de 4 estados: – Una máquina activada por Clk. END COMPONENT uart_txA.s2. SIGNAL estado: sttxa. din:IN bit_vector (7 downto 0). BEGIN a: PROCESS (clk. ARCHITECTURE txa OF uart_txA IS SIGNAL estado: bit_vector (1 downto 0).ack:IN bit. txc: BUFFER bit. thr: OUT bit_vector (7 downto 0)).s3). cnt <= 0. shf(8) <= '1'. 2001 Guillermo Jaquenod. ELSIF (clk'EVENT AND clk = '1') THEN CASE estado IS WHEN s0=> THRF=0 thrf <='0'. lado usuario D_In (7 downto 0) Ejemplos: una UART. END ENTITY uart_txA.reset) BEGIN IF reset='0' THEN estado<=s0.s1. thr<=(others=>'0'). lado canal ENTITY uart_txB IS PORT (txc: BUFFER bit. IF thrf='0' THEN ack<='0'. WHEN s3=> Cnt /=11? shf(7 downto 0)<=shf(8 downto 1). estado<= s3. Dos estados tienen THRF en 1 y dos en 0.VHDL: Lenguaje de descripción de hardware TxCk 0 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 máquinas sincronicas. END IF.reset) BEGIN IF reset='0' THEN estado<=B"00".thrf <='0'. END PROCESS a. 2001 71 . cnt <= 0. END IF.thro). 2001 Guillermo Jaquenod. thr: OUT bit_vector (7 downto 0)). Ena=0 We=0? END CASE. WHEN s1=> shf(8 downto 1)<=thro(7 downto 0). BEGIN a: PROCESS (txck. 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 1 TxCk TxReg (PISO) ARCHITECTURE txB OF uart_txB IS TYPE sttxb IS (s0. ELSE estado <= s0. END IF.thrf:IN bit. END IF.ack. etc. ELSIF (clk'EVENT AND clk = '1') THEN CASE estado IS WHEN B"00" => IF ack='0' THEN estado <= B"01".we.clk.txd: OUT bit. ack<='0'. IF thrf='1' THEN estado <= s1.clk. lado usuario ENTITY uart_txA IS PORT ( reset. END ENTITY uart_txA. etapa TX 0 TxD Armo el Armo el conjuntoII! conjuntoII! Guillermo Jaquenod. 2001 Guillermo Jaquenod. thro:IN bit_vector (7 downto 0)). el mismo archivo compilado con Synplify sólo usa 31 LEs! S/L=0 Ack=0 Cnt=0 TxC=0 ENTITY uart_tx IS PORT( reset.txck. • Y vale notar un punto importante: mientras la compilación con MAX+plus II consume 54 LEs.thrf.reset) BEGIN IF reset='0' THEN estado<=s0. END IF. S/L=1 END PROCESS a. etapa TX. SIGNAL thro:BIT_VECTOR (7 DOWNTO 0). IF ack='0' THEN estado <= s1. END COMPONENT uart_txB. din:IN bit_vector (7 downto 0). reset. SIGNAL ack:BIT. Ack=0 txd <= shf (0). txc <= '1' WHEN cnt=11 ELSE '0'. BEGIN a: PROCESS (clk.reset.we. thr<=(others=>'0'). END IF.. shf(0)<='0'. thrf: OUT bit. thr<=din.s2. Ena=1 END ARCHITECTURE txa. END IF.s1. END IF. ack. IF ack='1' THEN estado <= s0. responsable de la interfase al bus del usuario – Otra máquina activada por TxCk responsable del proceso de transmisión Ambas máquinas se sincronizan mediante Handshake usando THRF (TxReg Full) y Ack. 2001 ARCHITECTURE txa OF uart_txA IS TYPE sttxa IS (s0. Guillermo Jaquenod. COMPONENT uart_txB PORT (reset.clk. ELSIF txck'EVENT AND txck='1' THEN CASE estado IS WHEN s0=> shf(7 downto 0)<=shf(8 downto 1). 2001 Ejemplos: una UART.thrf: BUFFER bit). WHEN s3=> THRF=1 thrf <='1'.s3). thro:IN bit_vector (7 downto 0)). Ack=1? WHEN s2=> Ack=0? thrf <='1'. BEGIN ladousu: uart_txA PORT MAP(reset. ELSE thr<=din.clk. Shift y Contador de bits) y pueden complicarse mediante el agregado de generador de paridad. END IF. WHEN B"01" => IF we='1' THEN estado <=B"10". txc. SIGNAL shf:bit_vector(8 downto 0). ladotx: uart_txB PORT MAP(txc. IF we='0' THEN estado <= s3. shf <= (others =>'1'). ack.ack:IN bit. din:IN bit_vector (7 downto 0).we. IF txc='0' THEN cnt <= cnt+1.we.shf(8)<='1'.txck. END IF. Ambas máquinas poseen además registros operativos (Holding. IF we='1' THEN estado<=s2. IF txc='0' THEN cnt <= cnt+1. ack <= '0'. END IF.

ENTITY cysel64 IS ENTITY cysel64 IS PORT (a. s: OUT std_logic_vector(64 DOWNTO 1).reloj: IN std_logic.b:IN std_logic_vector(64 DOWNTO 1). moshf := moshf (15 DOWNTO 1) & '0'. BEGIN BEGIN PROCESS (reloj. reset.reloj. 2001 Ejemplos: Sumador/restador Serial ARCHITECTURE a OF seraddsub IS ARCHITECTURE a OF seraddsub IS SIGNAL c: BIT.thrf:IN bit. c<=‘0’.s. IF txc='0' THEN cnt <= cnt+1. shi1 <= '0'& a(64 DOWNTO 33) shi1 <= '0'& a(64 DOWNTO 33) + b(64 DOWNTO 33) + '1'. END IF. LIBRARY ieee. s:OUT BIT). s:OUT BIT). END IF. ELSIF reloj’EVENT AND reloj=‘1’ THEN ELSIF reloj’EVENT AND reloj=‘1’ THEN s <= a XOR b XOR c. -. flg <= a OR flg. IF sr=‘1’ IF sr=‘1’ THEN -. IF thrf='1' THEN estado <= s1.shi0. S/L=0 Ack=0 Cnt=0 TxC=0 S/L=1 Ack=1 Cnt++ TxC=0 THRF=0? Guillermo Jaquenod. LIBRARY ieee.carry/borrow SIGNAL c: BIT. 72 . cout:OUT std_logic). PORT (a.init:IN BIT. BL 0 N/2 Adder CONTROL Ejemplos: Sumador serial “Carry Save Adder” BH 1 SUMADOR Guillermo Jaquenod.b. USE ieee.s1. 2001 Guillermo Jaquenod. LIBRARY ieee. 2001 Fuente: R. END CASE. -.mo:IN std_logic_vector (8 DOWNTO 1).std_logic_unsigned. END cysel64. END PROCESS. END ENTITY iteramult .carry/borrow BEGIN BEGIN PROCESS (reloj. LIBRARY ieee. txc <= '1' WHEN cnt=11 ELSE '0'. cnt <= 0. ampliar el sumador serial a sumador/restador serial se hace sin consumir más recursos. ELSIF cnt < 8 THEN ELSIF cnt < 8 THEN IF mrshf(1) = '1' THEN res <= moshf+res.init:IN BIT. END a.reloj. N/2 Adder 0 Cout ACUMULADOR ENTITY seradd IS PORT ( ENTITY seradd IS PORT ( a. s(32 DOWNTO 1) <= slo(32 DOWNTO 1).ALL.Andraka. es posible usar un circuito simple.txd: OUT bit. END IF. estado<= s3. END PROCESS. init. s <= a XOR b XOR c.s2. res <= X"0000".b:IN std_logic_vector(64 DOWNTO 1).init:IN BIT. empezando por el LSB hasta el MSB. flg <= a OR flg. OR (s AND c). s <= a XOR b XOR c. ELSIF txck'EVENT AND txck='1' THEN CASE estado IS WHEN s0=> shf(7 downto 0)<=shf(8 downto 1). END IF. END IF.sr. s(32 DOWNTO 1) <= slo(32 DOWNTO 1).ALL.Andraka. std_logic_vector(33 DOWNTO 1). END IF. flg <=‘0’. USE ieee. rdy:OUT std_logic.USE ieee. BEGIN BEGIN PROCESS (reloj. END IF.sr=1 indica suma c <= (m AND s) c <= (m AND s) OR (m AND c) OR (m AND c) OR (s AND c). Cnt=11? WHEN s3=> shf(7 downto 0)<=shf(8 downto 1). ELSE rdy<='1'. END IF. s:OUT BIT). a b • La idea de Carry-select es simple: • Usa 3 sumadores (slo. Fuente: R. mrshf := mr. + b(32 DOWNTO 1) + cin.std_logic_1164. y shi1) de N/2 bits: –uno para la mitad inferior de los sumandos –dos para la parte superior. END ENTITY iteramult . VARIABLE cnt : INTEGER RANGE 0 TO 8. END a. Guillermo Jaquenod. END seradd . cin:IN std_logic. ack. la entrada es copiada en forma textual en la salida • A partir de allí los bits restantes se invierten Guillermo Jaquenod.reloj. cin:IN std_logic.reloj. IF mrshf(1) = '1' THEN res <= moshf+res. BEGIN BEGIN IF reloj='1' THEN IF reloj='1' THEN IF init = '1' THEN moshf:= X"00" & mo. IF init = '1' THEN moshf:= X"00" & mo.shi0. END IF. END a. if cnt/=7 THEN rdy<='0'.std_logic_unsigned.VHDL: Lenguaje de descripción de hardware Mejora de UART_TXB: bajo de 20 a 17 LEs ENTITY uart_txB IS PORT (txc: BUFFER bit. END IF. END PROCESS. Fuente: R. END ENTITY uart_txB.reset) BEGIN IF reset='0' THEN estado<=s0. 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).b. shi0. res <= X"0000".s3). • En función 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).shi1: std_logic_vector(33 DOWNTO 1).rdy <= '0'. 2001 m s s/r reloj init A B x Ci S A B C s D Q Ck CL S c0 reloj D Q Ck CL init CSA • En el caso de dos operandos a y b que ingresen simultáneamente. ack <= '0'. ack<='0'. END a. OR (s AND c). ELSE estado <= s0. VARIABLE moshf:std_logic_vector(16 DOWNTO 1). ELSE shi1 (32 DOWNTO 1). cnt <= 0. pero también casi duplica la velocidad ENTITY seraddsub IS PORT ( ENTITY seraddsub IS PORT ( m. s: OUT std_logic_vector(64 DOWNTO 1). que sólo requiere 2 LEs.init:IN BIT. flg <=‘0’.init:IN BIT. y su latencia es de 1 ciclo de reloj. ELSIF reloj’EVENT AND reloj=‘1’ THEN ELSIF reloj’EVENT AND reloj=‘1’ THEN s <= a XOR flg. cout <= shi0 (33) WHEN slo(33)='0' cout <= shi0 (33) WHEN slo(33)='0' ELSE shi1 (33). END com2dos.USE ieee. WHEN s1=> shf(8 downto 1)<=thro(7 downto 0). mrshf := '0' & mrshf(8 DOWNTO 2). y cuya latencia es de sólo 1 ciclo de reloj.Andraka. Ejemplos: Complementador serial D Q Ck CL s cO D Q Ck CL • Dado que cada LE tiene una tabla LUT de 4 entradas. mr.reloj: IN std_logic. VARIABLE mrshf:std_logic_vector(8 DOWNTO 1). AL Co 1 Ci Co SH SL Guillermo Jaquenod. a D Q Ck CL reloj init s D Q Ck CL • El complementador serial implementa el algoritmo tradicional para calcular el complementar a dos de un número: • Desde el LSB hacia adelante. THRF=1? IF thrf='0' THEN ack<='0'.sr. ELSE rdy<='1'.sr=0 indica resta ELSE -. IF (init=‘1’) THEN s<=‘0’. pues también sólo requiere 2 LEs. if cnt/=7 THEN rdy<='0'.std_logic_1164. IF txc='0' THEN cnt <= cnt+1. ack<='1'.reloj.ALL. END PROCESS. END ARCHITECTURE a. END IF. END IF. END ARCHITECTURE a.init) BEGIN PROCESS (reloj. VARIABLE moshf:std_logic_vector(16 DOWNTO 1). END IF. s<=‘0’. cnt:=0. ack <= '0'. END IF.std_logic_unsigned. + b(64 DOWNTO 33). txd <= shf (0). s <= a XOR flg. END IF. moshf := moshf (15 DOWNTO 1) & '0'.init) BEGIN PROCESS (reloj. ELSE shi1 (33). c<=‘0’. END a. donde en uno de éstos se supone que el carry de entrada será ‘0’ (shi0) y en el otro que será ‘1’(shi1). como bit de estado!! SIGNAL shf:bit_vector(8 downto 0).ALL. c <= (a AND b) OR (a AND c) OR (b AND c). s:OUT BIT).std_logic_1164.sr=1 indica suma THEN -. END PROCESS.std_logic_1164.reloj. MULTIPLICADOR 0 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. cout:OUT std_logic). shi0 <= '0'& a(64 DOWNTO 33) shi0 <= '0'& a(64 DOWNTO 33) + b(64 DOWNTO 33). rdy:OUT std_logic.shi1: SIGNAL slo. mrshf := '0' & mrshf(8 DOWNTO 2).ALL. a.shf(8)<='1'.shf(8)<='1'. END IF. Dos estados tienen Ack en 1 y dos en 0. END a.init) BEGIN IF (init=‘1’) THEN s<=‘0’. SIGNAL c: BIT. • En este circuito un LE calcula la suma de los datos de entrada más el acarreo generado en la etapa previa (salida s). c<=‘0’.ALL. 2001 Guillermo Jaquenod. END PROCESS.init) BEGIN IF (init=‘1’) THEN s<=‘0’. c <= (a AND b) OR (a AND c) OR (b AND c). BEGIN a: PROCESS (txck. s:OUT BIT).ALL. END IF. hasta encontrar el primer ‘1’ (inclusive). Ejemplos: multiplicador iterativo por shift/suma LIBRARY ieee. IF (init=‘1’) THEN s<=‘0’. cnt:=0. Puedo usar Ack ARCHITECTURE txB OF uart_txB IS TYPE sttxb IS (s0.init:IN BIT. USE ieee. shf <= (others =>'1').rdy <= '0'. shf(8) <= '1'. END PROCESS a. USE ieee. ELSIF reloj’EVENT AND reloj=‘1’ THEN ELSIF reloj’EVENT AND reloj=‘1’ THEN s <= a XOR b XOR c. LIBRARY ieee. 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. ARCHITECTURE a OF com2dos IS ARCHITECTURE a OF com2dos IS SIGNAL flg: BIT. c<=‘0’. END ARCHITECTURE txB. S/L=1 THRF=0? estado<=s2. mrshf := mr.ALL. END IF. Cnt /=11? S/L=1 Ack=0 Cnt++ TxC=0 MULTIPLICANDO ENTITY iteramult IS PORT ( ENTITY iteramult IS PORT ( mr. cnt := cnt+1. SIGNAL flg: BIT. + b(64 DOWNTO 33) + '1'. END seraddsub. ELSE -. END IF.init) BEGIN IF (init=‘1’) THEN IF (init=‘1’) THEN s<=‘0’.USE ieee. SIGNAL estado: sttxb.std_logic_unsigned. Ack=0 Cnt=0 WHEN s2=> TxC=1 shf(7 downto 0)<=shf(8 downto 1).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). a. END seraddsub.USE ieee. END com2dos. res: BUFFER std_logic_vector (16 DOWNTO 1)). BEGIN BEGIN slo <= '0'& a(32 DOWNTO 1) slo <= '0'& a(32 DOWNTO 1) + b(32 DOWNTO 1) + cin. Hacerlo genérico! ARCHITECTURE a OF seradd IS ARCHITECTURE a OF seradd IS SIGNAL c: BIT. m. thro:IN bit_vector (7 downto 0)).mo:IN std_logic_vector (8 DOWNTO 1). shf(0)<='0'. 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. END IF. END IF. ENTITY com2dos IS PORT ( ENTITY com2dos IS PORT ( a. LIBRARY ieee.s. END a. END PROCESS. s:OUT BIT). END PROCESS. END a. END cysel64. SIGNAL cnt:INTEGER RANGE 0 to 11. init. 2001 THRF=1? LIBRARY ieee. cnt := cnt+1.txck.init) BEGIN PROCESS (reloj. END seradd . res: BUFFER std_logic_vector (16 DOWNTO 1)). VARIABLE mrshf:std_logic_vector(8 DOWNTO 1). cnt <= 0.

agnt <= sa.reloj=>rel.b.init. END GENERATE.b. END IF. ENTITY arb0 IS PORT ( areq_n.init.m0:IN BIT.chain: BIT_VECTOR (N DOWNTO 1). m(0) mo res D Q Ca2 a b s a b CSA s a b CSA s CSA rel init • El multiplicador serial con signo es casi idéntico al sin signo. END GENERATE.init:IN BIT.b1. ardy_n. END GENERATE.reloj=>rel.init:IN BIT. Guillermo Jaquenod. s:OUT BIT). res:OUT BIT). brdy_n <= sb OR breq_n AFTER 2 ns. s:OUT BIT). PORT (rel. END COMPONENT. res:OUT BIT). el multiplicador mr es conocido en forma paralela.s=>chain(N)).s=>chain(N)). ENTITY umulser IS GENERIC (N:INTEGER:= 16). al resultado acumulado hasta ese entonces y desplazado a la derecha.bgnt: OUT std_logic).b=>chain(i+1).reloj. s:OUT BIT)..ALL.sb: std_logic. res <= chain(1). ELSIF rel’EVENT AND rel=‘1’ THEN chain(N) <= prod(N). IF (init=‘1’) THEN chain(N)<=‘0’.agnt. END COMPONENT. en tanto el multiplicando mo ingresa en forma serial –El producto de cada bit de mr por mo es realizado usando N funciones AND. s:OUT BIT).reloj=>rel. mr:IN BIT_VECTOR(N DOWNTO 1). END umulser. CSA rel init • El multiplicador serial es útil cuando.b. ENTITY smulser IS GENERIC (N:INTEGER:= 16). PORT (rel.chain: BIT_VECTOR (N DOWNTO 1). La primer etapa no recibe acarreo de anteriores. –Es necesario generar 2xN-1 ciclos de reloj. sb <= NOT (b2 AND sa) AFTER 2 ns. END smulser. 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).reloj.init=>init.reloj.reloj=>rel.chain: BIT_VECTOR (N DOWNTO 1). para realizar una multiplicación.b3. s=>chain(i)). s:OUT BIT). 2001 El árbitro asincrónico 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 válido 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.qué pasa si A y B piden el bus simultáneamente? Guillermo Jaquenod. s=>chain(i)). s:OUT BIT).init) BEGIN PROCESS (rel.brdy_n. b=>chain(i+1). init=>init. por cuanto no cumple con la simetría de retardos propia de uno realizado en base a dos compuertas NAND retardos propia de uno realizado en base a dos compuertas NAND •• La realimentación de la salida de la LUT (datos de RAM) a la entrada La realimentación 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! •• Además.init=>init.reloj. SIGNAL prod. first: com2dos PORT MAP (a=>prod(i). END GENERATE.reloj=>rel. res <= chain(1). END GENERATE. ELSIF rel’EVENT AND rel=‘1’ THEN chain(N) <= prod(N). chaincsa: seradd PORT MAP(a=>prod(i).VHDL: Lenguaje de descripción 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).init:IN BIT.m0:IN BIT. PORT (rel. gencsa: FOR i IN N-1 DOWNTO 1 gencsa: FOR i IN N-1 DOWNTO 1 GENERATE chaincsa: seradd PORT MAP(a=>prod(i).b2. Guillermo Jaquenod.Andraka. ardy_n <= sa OR areq_n AFTER 2 ns. END COMPONENT. COMPONENT com2dos PORT (a.reloj=>rel. USE ieee. init=>init. s=>chain(i)). mr:IN BIT_VECTOR(N DOWNTO 1).sa. END PROCESS. END GENERATE. Guillermo Jaquenod.b.init. 2001 a1 a2 b2 Breq_n b1 a3 ARCHITECTURE a OF smulser IS ARCHITECTURE a OF smulser IS COMPONENT seradd PORT (a. first: com2dos PORT MAP (a=>prod(i). b1 <= NOT (breq_n AND b2) AFTER 2 ns. b2 <= NOT (areq_n AND b1) AFTER 2 ns. END smulser. SIGNAL prod. sa <= NOT (a2 AND sb) AFTER 2 ns.Andraka. SIGNAL prod. a2 <= NOT (breq_n AND a1) AFTER 2 ns. END a. PORT (rel. BEGIN a1 <= NOT (areq_n AND a2) AFTER 2 ns. GENERATE prod(i) <= mr(i) AND m0. 2001 Guillermo Jaquenod. GENERATE chaincsa: seradd PORT MAP(a=>prod(i). –La salida del sumador serial menos significativo (res) corresponde al producto. en vez de un simple flipflop D. por cuanto no cumple con la simetría de sumamente riesgoso. GENERATE prod(i) <= mr(i) AND m0.chain: BIT_VECTOR (N DOWNTO 1). END COMPONENT. END ENTITY arb0 . sólo que en la primer etapa. para “vaciar” las etapas “carry save” Fuente: R. mo D Q a b DFF s a b CSA s a b CSA res s ARCHITECTURE a OF umulser IS ARCHITECTURE a OF umulser IS COMPONENT seradd PORT (a. –El resultado de cada producto parcial es sumado.reloj. END umulser. SIGNAL prod. END PROCESS.m0:IN BIT. mr:IN BIT_VECTOR(N DOWNTO 1). COMPONENT seradd PORT (a.qué pasa si A y B piden el bus simultáneamente? Además. END ARCHITECTURE async .reloj. Guillermo Jaquenod.init:IN BIT. END a. COMPONENT com2dos PORT (a. debe colocarse un circuito de complemento a 2 Fuente: R. Breq_n Brdy_n Bgnt Areq_n Ardy_n Agnt Areq_n ARCHITECTURE async OF arb0 IS SIGNAL a1. res:OUT BIT)..init:IN BIT.m0:IN BIT. res:OUT BIT). s=>chain(i)). END COMPONENT. init=>init. mediante una cadena de sumadores seriales. END GENERATE. 2001 73 .a3. COMPONENT seradd PORT (a. bgnt <= sb. BEGIN BEGIN genprod: FOR i IN N DOWNTO 1 genprod: FOR i IN N DOWNTO 1 GENERATE prod(i) <= mr(i) AND m0.init:IN BIT.std_logic_1164. END COMPONENT. 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). PROCESS (rel. END GENERATE... END a.a2. b=>chain(i+1). 2001 Modelado temporal de un árbitro asincrónico LIBRARY ieee.init) BEGIN IF (init=‘1’) THEN chain(N)<=‘0’. END a. 2001 BEGIN BEGIN genprod: FOR i IN N DOWNTO 1 genprod: FOR i IN N DOWNTO 1 GENERATE prod(i) <= mr(i) AND m0. por lo que basta un FFD. durante los N primeros ingresar el multiplicando mo (LSB primero) y durante los restantes ingresar ‘0’.breq_n: IN std_logic.init. init=>init. res <= chain(1). mr:IN BIT_VECTOR(N DOWNTO 1). res <= chain(1). END IF.b=>chain(i+1).

seguido por req2 y sólo máxima prioridad. END IF. concat <= actual&req. actual: IN std_logic_vector(3 DOWNTO 0). END COMPONENT. := X“8". LIBRARY ieee. END IF. END rrobtab. END PROCESS. ELSIF req(1)='1' THEN vnuevo := X“2". "0010" WHEN "0001XX1X"|"001000X0"|"01000X10"|"1000XX10". req1 tendrá la por ejemplo. := X"1".std_logic_1164. END CASE. la prioridad será ahora de req2 seguida por req3 y luego por será ahora de req2 seguida por req3 y luego por req0.init) IS CLK BEGIN IF init='1' THEN actv <= '0'. •• por ejemplo. END PROCESS. END a. rini <= '1'.ALL.reloj. donde en función del estado de prioridad variable. ELSE rini <= '0'.ALL. BEGIN BEGIN decis: rrobtab PORT MAP (req => req.ALL. 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. dout <= din. ELSE vnuevo := actual. actual : IN std_logic_vector (3 DOWNTO 0). SIGNAL tstop. ENA ENA ENA ENA Guillermo Jaquenod.3 se define la actual (gnt0. ELSIF lib='1' THEN act <= nov. := X"1".3) y las entradas req0. END IF. "1000" WHEN "0001100X"|"001010XX"|"01001XXX"|"1000X000". END a. SIGNAL act. X“2". LIBRARY lpm. SIGNAL concat: std_logic_vector (7 DOWNTO 0).lib: std_logic. actual: IN std_logic_vector(3 DOWNTO 0).3) y las entradas req0. por lo que si para el master actual se agotó. := X“4".cout=>tout). la prioridad después por req3. USE ieee. END COMPONENT. prioridad de atención a esas entradas.std_logic_1164. END IF. USE ieee. LIBRARY ieee. timer: lpm_counter GENERIC MAP (LPM_WIDTH => 3) timer: lpm_counter GENERIC MAP (LPM_WIDTH => 3) PORT MAP (clock=>reloj.VHDL: Lenguaje de descripción de hardware Un árbitro sincrónico Round Robin gnt0 gnt3 gnt1 gnt2 reloj req0 req1 req2 req3 gnt0 gnt1 gnt2 gnt3 cycle start Árbitro Round Robin: tabla de decisión •• Un arbitro ROUND ROBIN implementa un circuito Un arbitro ROUND ROBIN implementa un circuito de prioridad variable. •• Como señales auxiliares: Como señales 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ó. END PROCESS.cout=>tout). X"4"..lpm_components.actual=>act. Todas las etapas intermedias de este FIFO son similares y en su versión más simple siguen el siguiente comportamiento: IF ENTITY rrobtab IS PORT ( ENTITY rrobtab IS PORT ( req: IN std_logic_vector (3 DOWNTO 0). LIBRARY ieee. ELSE vnuevo := actual. END ENTITY FIFO_slice. X"1". USE ieee. END CASE. ELSE rini <= '0'.. END rrobtab. nuevo <= vnuevo. rini <= '1'. END IF.ALL.ALL. ELSE vnuevo := actual. END PROCESS. Guillermo Jaquenod.lib: std_logic. END IF. al activarse gnt1. LIBRARY ieee. X"1". ELSIF req(2)='1' THEN vnuevo := X“4". rini <= '1'. nuevo <= "0001" WHEN "0001000X"|"001000X1"|"01000XX1"|"1000XXX1".nuevo=>nov). req0 req1 req2 req3 actual nuevo 0). dout:OUT STD_LOGIC_VECTOR (datw-1 DOWNTO 0)). tstop <= NOT(tout). END rndrob. Guillermo Jaquenod.std_logic_1164. actual : IN std_logic_vector (3 DOWNTO 0). X“8". 2001 Árbitro Round Robin: tabla de decisión ARCHITECTURE a OF rrobtab IS ARCHITECTURE a OF rrobtab IS BEGIN BEGIN PROCESS (actual. := X“2".nov:std_logic_vector(3 DOWNTO 0)..ini : IN std_logic. LIBRARY lpm. PROCESS (reloj) BEGIN PROCESS (reloj) BEGIN IF reloj='1' THEN IF reloj='1' THEN IF IF ini='1' THEN act <= X"1". PORT MAP (clock=>reloj.rini. COMPONENT rrobtab PORT (req: IN std_logic_vector(3 DOWNTO 0). USE ieee. END IF. WHEN X"0" => vnuevo := X"1". END rndrob. END IF. actual : IN std_logic_vector (3 DOWNTO 0). ELSE vnuevo := actual. DIN la etapa actual está vacante WR FULL ENTITY FIFO_slice IS GENERIC (datw: INTEGER := 8). X"4". := X“4". rini <= '1'. grant:OUT std_logic_vector (3 DOWNTO 0)). := X“8".ini : IN std_logic.std_logic_1164. 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))). aclr=>rini.tout. actv: BUFFER STD_LOGIC. := X“2". si gnt0 está activa. END PROCESS. ELSIF reloj'EVENT AND reloj='1' THEN IF (actv='1') AND (nextv='0') THEN actv <= '0'. END IF.init:IN STD_LOGIC.ALL.cnt_en => tstop.rini. SIGNAL tstop. nuevo:OUT std_logic_vector (3 DOWNTO 0)). 0). grant <= act WHEN (tout='0') OR (nov=act) ELSE "0000". END IF. X“8". ELSIF req(3)='1' THEN vnuevo := X"8". END rrobtab . 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. END IF. "1000" WHEN "0001100X"|"001010XX"|"01001XXX"|"1000X000". 2001 74 . Guillermo Jaquenod. ELSE vnuevo := actual. SIGNAL act. din:IN STD_LOGIC_VECTOR (datw-1 DOWNTO 0).3 se define la prioridad de atención a esas entradas. CLK AND la etapa anterior tiene datos válidos 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. 2001 RD EMPT ARCHITECTURE a OF FIFO_slice IS CLK SIGNAL reg: STD_LOGIC_VECTOR (datw-1 DOWNTO 0).nov:std_logic_vector(3 DOWNTO 0). decis: rrobtab PORT MAP (req => req. BEGIN CLK PROCESS (reloj. END a. ELSE vnuevo := actual. USE lpm. WITH concat SELECT WITH concat SELECT nuevo <= "0001" WHEN "0001000X"|"001000X1"|"01000XX1"|"1000XXX1". END a. ENTITY rrobtab IS PORT (req: IN std_logic_vector (3 DOWNTO 0). PORT (prevv. DOUT Esta solución puede hacerse mucho más efectiva “propagando” la posibilidad de shift desde la etapa de Podrá aprovecharse salida hacia la entrada algún modo de operación de los LEs? Guillermo Jaquenod. nuevo <= vnuevo. "XXXX" WHEN OTHERS.std_logic_1164.req) IS PROCESS (actual. actual : IN std_logic_vector (3 DOWNTO 0). al activarse gnt1. si gnt0 está activa. END IF.cnt_en => tstop.lpm_components.nuevo=>nov). USE ieee. END IF. req: IN std_logic_vector (3 DOWNTO 0). WHEN OTHERS => vnuevo := actual. nuevo:OUT std_logic_vector (3 DOWNTO 0)). req0. END a. donde en función del estado actual (gnt0. seguido por req2 y sólo después por req3. ELSIF req(0)='1' THEN vnuevo := X"1". tstop <= NOT(tout). END IF. req: IN std_logic_vector (3 DOWNTO 0).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".. ini='1' THEN act <= X"1". ARCHITECTURE a OF rndrob IS ARCHITECTURE a OF rndrob IS COMPONENT rrobtab PORT (req: IN std_logic_vector(3 DOWNTO 0). grant <= act WHEN (tout='0') OR (nov=act) ELSE "0000". req1 tendrá la máxima prioridad. "0010" WHEN "0001XX1X"|"001000X0"|"01000X10"|"1000XX10". nuevo:OUT std_logic_vector (3 DOWNTO 0)). 2001 ENTITY rndrob IS PORT (reloj. 2001 req0 req1 req2 req3 actual nuevo Este diseño ARCHITECTURE a OF rrobtab IS ARCHITECTURE a OF rrobtab IS no funciona. ENTITY rrobtab IS PORT (req: IN std_logic_vector (3 DOWNTO 0).ALL.ALL. LIBRARY ieee. ELSIF lib='1' THEN act <= nov. req: IN std_logic_vector (3 DOWNTO 0). USE ieee. ELSE vnuevo := actual. LIBRARY ieee. de prioridades equitativa. "XXXX" WHEN OTHERS. "0100" WHEN "0001X10X"|"0010X1XX"|"01000X00"|"1000X100".actual=>act. END a. SIGNAL concat: std_logic_vector (7 DOWNTO 0). grant:OUT std_logic_vector (3 DOWNTO 0)). END rrobtab . ELSIF req(0)='1' THEN vnuevo := X"1". OR (not(req(2)) AND act(2) AND not(nov(2))) OR (not(req(3)) AND act(3) AND not(nov(3))).std_logic_1164.nextv. Porqué? BEGIN BEGIN concat <= actual&req. USE ieee. ENTITY rndrob IS PORT (reloj. X“2". 2001 Guillermo Jaquenod. ELSIF req(1)='1' THEN vnuevo := X“2". END ARCHITECTURE a. •• de este modo se trata de asegurar una asignación de este modo se trata de asegurar una asignación de prioridades equitativa.std_logic_1164. Árbitro Round Robin: tope de jerarquía LIBRARY ieee. dout <= (others => '0').ALL. aclr=>rini. ELSE vnuevo := actual. USE lpm. 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 X“2" => IF req(2)='1' THEN vnuevo := WHEN X“2" => IF req(2)='1' THEN vnuevo := ELSIF req(0)='1' THEN vnuevo ELSIF req(0)='1' THEN vnuevo WHEN X“4" => IF req(3)='1' THEN vnuevo := WHEN X“4" => IF req(3)='1' THEN vnuevo := ELSIF req(1)='1' THEN vnuevo ELSIF req(1)='1' THEN vnuevo WHEN X“8" => IF req(0)='1' THEN vnuevo := WHEN X“8" => IF req(0)='1' THEN vnuevo := ELSIF req(2)='1' THEN vnuevo ELSIF req(2)='1' THEN vnuevo WHEN OTHERS => vnuevo := actual. "0100" WHEN "0001X10X"|"0010X1XX"|"01000X00"|"1000X100". ELSIF req(3)='1' THEN vnuevo := X"8".tout. nuevo:OUT std_logic_vector (3 DOWNTO 0)). nuevo:OUT std_logic_vector (3 DOWNTO 0)). ELSIF (actv='0') AND (prevv='1') THEN actv <= '1'. ELSIF req(2)='1' THEN vnuevo := X“4". nuevo:OUT std_logic_vector (3 DOWNTO 0)).

ELSIF (status(0)='1') AND (status(1)='0') THEN status(0) <= '0'. Tal es el caso del ATM (Asynchronous Transfer Mode).std_logic_1164. 2001 red Banyan 16:16 S1 Sel • Una red Banyan N:N provee un único camino entre cualquier entrada y cualquier salida. 2001 • La idea del algoritmo CORDIC es muy ingeniosa: • Dado un punto con coordenadas (x.6073 a medida que la cantidad de iteraciones (i) crece. 2001 Fuente: R.primera y ultima etapa IF init='1' THEN status (0)<= '0'. Se vacía el ultimo registro. Uso de CORDIC en vez de Pitágoras • Dado un triángulo con catetos de dimensión x e y. memoria(7) <= (others => '0').x’) y el “registro de decisiones” corresponde al ángulo A Guillermo Jaquenod. 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.6466. dout <= memoria (largo-1). full <= status(0). consume bastantes recursos (160 LEs en un switch 16:16 y 64 líneas de control). y si y’ es negativo una rotación antihoraria de valor Ai= artan(+2-i).nextv. cómo los dos datos llegan a las dos últimas etapas.init:IN STD_LOGIC. END GENERATE. din:IN STD_LOGIC_VECTOR (datw-1 DOWNTO 0). Los dos datos están en el ultimo y anteúltimo registro Guillermo Jaquenod.tanA) y’=cosA. init) IS BEGIN -.senA S0 B • ATM es un sistema basado en el establecimiento de una conexión temporaria punto a punto.empty: OUT STD_LOGIC. requerirá 8x8x2=128 LEs y 64 líneas de control CORDIC: COordinate Rotation DIgital Computer x’=cosA.cosA . al no haber nuevo dato el FIFO queda vacío de forma permanente PROCESS (clk. 2001 Ejemplos: Switch Fabric con Multiplexores • La difusión de redes de datos de alta velocidad en canales de baja tasa de error ha dado origen a nuevas normas de transmisión. dout:OUT STD_LOGIC_VECTOR (datw-1 DOWNTO 0)).y) que es rotado un ángulo A respecto al origen. se tiene que tanAi=(+/-)2-i.datw: INTEGER := 8). ELSIF (status(largo-1)='0') AND (status(largo-2)='1') THEN status(largo-1) <= '1'. status (7)<= '0'. END ARCHITECTURE a.Andraka. empty <= NOT(status(largo-1)). END PROCESS.init=>init. La segunda lectura borra el ultimo registro.nextv=>status(i+1).(y + x.y’) • Sacando cosA como factor común tengo Guillermo Jaquenod. con lo que se vacía el anteúltimo y vuelve a ocuparse el último BEGIN midslices: FOR i IN 1 TO largo-2 GENERATE -.senA + y. las nuevas coordenadas del punto serán: algoritmo CORDIC puede ser usado para calcular la hipotenusa y el ángulo A. que usa 2 LEs. que transporta a alta velocidad celdas de información entre interlocutores.y. routers. dout:OUT STD_LOGIC_VECTOR (datw-1 DOWNTO 0)). y solo permite un camino entre una dada entrada y una dada salida Switch Fabric MIN (Multipath Interconnect Net) x’=cosA. A Reloj red Banyan invertida entradas Guillermo Jaquenod. • La simulación muestra la propagación de cada dato a medida que es escrito. memoria(0) <= (others => '0'). repetidores. que requiere mínimo procesamiento en nodos. 2001 x’=x. y un elemento clave en la creación de este camino son los sistemas de ruteado. que proveen N posibles caminos desde cualquier entrada a cualquier salida • El elemento básico de un MIN es un multiplexor 2:2. din:IN STD_LOGIC_VECTOR (datw-1 DOWNTO 0). “A survey of CORDIC algorithms for FPGA based computers” 75 . 2001 (x.tanA) • Si el ángulo A es aproximado mediante la suma o resta de sucesivos Ai=artan(2-i). • luego de N iteraciones el valor de x’= 0.(x .tanA) • en cada paso “i”. h (o dicho de otro modo h=1.init:IN STD_LOGIC. para i desde 0 hasta un máximo. Fuente: R.0). que tiende a 0. END IF.tanA) 16 salidas 16 entradas salidas Guillermo Jaquenod. PORT (wr. PORT (prevv. END ENTITY ripple_FIFO.0) A.din=>memoria(i-1). 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. formado entre x y h y’= x.6073.dout=>memoria(i)).y) y • La idea es rotar el punto (x. memoria(largo-1) <= memoria(largo-2).y) hacia el eje X.(x . ELSIF clk'EVENT AND clk='1' THEN IF (wr='1') THEN status(0) <= '1'. 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). IF (rd='1') THEN status(largo-1) <= '0'.y) convertirlo en un nuevo punto (x’.clk. actv: BUFFER STD_LOGIC.reloj. END IF.Andraka. Esta solución es rápida (menos de 3 LE de retardo).reloj=>clk. SIGNAL memoria: membank . memoria(0) <= din.cosA (x. y el producto de x o y por tanAi se transforma en un simple shift. actv=>status(i). y los procesos de lectura ENTITY ripple_FIFO IS GENERIC (largo: INTEGER := 8. USE ieee. END COMPONENT FIFO_slice. • Un switch fabric puede ser homologado a un conjunto de tantos multiplexores como canales de salida. END IF. COMPONENT FIFO_slice GENERIC (datw: INTEGER := 8). donde cada multiplexor tiene tantas entradas como canales de entrada haya. brigdes. si y’ es positivo se aplica una rotación horaria de Ai= artan(-2-i).VHDL: Lenguaje de descripción de hardware Un FIFO basado en registros Un FIFO 8x8 basado en registros LIBRARY ieee.y.(y + x.etapas intermedias instslice: FIFO_slice GENERIC MAP (datw=>datw) PORT MAP (prevv=>status(i-1). 2001 Guillermo Jaquenod. el (x’.ALL. Estas decisiones son almacenadas en un “registro de decisiones”. y dentro de ellos las matrices de ruteado (switch fabrics). full. con lo que x’ será el h A x (x’. los datos del anteúltimo pasan al último.y.rd. SIGNAL status: STD_LOGIC_VECTOR (largo-1 DOWNTO 0). para valor el de la hpotenusa y el ángulo rotado coincidirá con y’=cosA. “A survey of CORDIC algorithms for FPGA based computers” Guillermo Jaquenod. Analizando las ecuaciones vistas: Parece el método de aproximaciones sucesivas! Que condiciones se deberán cumplir? • Como cos(A)=cos(-A) los efectos de los sucesivos productos por cos (Ai) se transforman en un único coeficiente final.

esta decisión es usada también para controlar los sumadores / restadores que generan los nuevos x e y. tomando decisiones en base a comparar x’ con Xc se puede calcular arcos (Xc).VHDL: Lenguaje de descripción de hardware Otros usos de CORDIC Hardware iterativo para CORDIC en paralelo x • Analizando las ecuaciones. En este caso la representación de dicho ángulo como suma de arcotangentes (2-i) puede ser calculada de antemano y guardado en tabla. 2001 yi+1 = yi + xi. tablas de lookup y una máquina de estados obviando el circuito de iteración de ángulos. en función de bit de signo de RA este registro es incrementado o decrementado (controlado por -di) en un valor obtenido de tabla. 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 B + rdy s1. con (R*1. 0) al girar xi+1 = xi . multiplexores y bloques de extensión de signo. • Cálculo de ARCOSEN(YS) y ARCOS(Xc): si se parte de x=1.2-i 10 LEs 2 LEs CSAS b • Es posible resolver CORDIC en forma serie. y 2 LEs para el circuito Carry Save. como sumadores/restadores.Ej: valores para ajuste decimal). Guillermo Jaquenod. el registro RA es inicialmente borrado y las decisiones se toman en función del bit de signo del registro Ry • Rotaciones fijas: en algunos casos es necesario rotar un vector un ángulo x Rx – Si se desea aplicar una rotación. de igual modo. x’ i SRA – Si se desea calcula la hipotenusa/angulo. 1. • Cálculo de la función ARCOTANGENTE (T): si se parte de x=1.di.yi. sumadores/restadores CarrySave. De igual modo.y) se obtiene sen(A) y cos(A). que corresponde a Ai= artan(-2-i). barrel shifters.6466 .Andraka. la simplicidad del conexionado permite que esta penalidad sea menor Analizar y discutir la arquitectura de los distintos bloques!!! Guillermo Jaquenod. y se rota el vector en base a decisiones tomadas comparando y’ con Ys. de la I/O o ciertas constantes tales como 0. 2001 76 . 2001 +/- Ry EVALUAR LA COMPLEJIDAD CIRCUITAL APROXIMADA Fuente: R. prefijado. y=0 y A=0. se obtendra en A el arsen (Ys).s0 i x’ i 2 LEs y’ init i y’ -di s0 i y s0 10 LEs i CSAS +/- 16 LEs b i di Rx A’ x -di s0 -di x’ Hardware iterativo para CORDIC en serie Rx A i Fuente: R. 2001 • El análisis de la arquitectura muestra que el registro X necesita 16 LEs para el shift register (incluído el MUX de entrada). “A survey of CORDIC algorithms for FPGA based computers” -di SRA • Esta solución emplea bloques constructivos estándar. “A survey of CORDIC algorithms for FPGA based computers” Guillermo Jaquenod. 2 LEs para el circuito de extensión de signo y otros 2 LEs para el sumador Carry Save.0) y se gira un ángulo A.y) de coordenadas polares a cartesianas s0 Ai+1 = Ai .s0 RA i ROM -di +/- A’ -di y’ i 16 LEs i sgex A’ b di s0 sgex A CSAS y A %16 di.di.di. usando registros de desplazamiento.Andraka. 10 LEs para un multiplexor 16:1. • El registro A necesita 16 LEs para el shift register. la iteración queda descripta por: • Calculo de SENO y COSENO: si se parte de (1.A)=>(x. 2001 • El bloque de procesamiento cuenta con dos unidades separadas. totalizando otros 44 LEs Guillermo Jaquenod.2-i un ángulo A se convierte (R. y por lo mismo otros 30 LEs para el registro Y. y se rota el vector hacia el eje X el valor resultante A’ es Atan(y/x). una para las funciones lógicas y otra para las funciones aritméticas • Ejercicios complejos conVHDL Una unidad artimético-lógica 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). y=T=tan(A) y Guillermo Jaquenod.artan(2-i) A=0. totalizando 30 LEs para X. 2001 ALU serial ACUMULADOR memoria I/O 0 1 memoria constantes Bases de VHDL aritmetica ADD SUB lógica AND OR XOR out Z Cyout Cyin V N • Guillermo Jaquenod. Si bien este circuito sería N veces más lento. 10 LEs para un mux 16:1.s1. • Otros: una estructura CORDIC modificada puede ser empleada también para la realización de multiplicaciones. en (x.6466. 2001 Guillermo Jaquenod. u otras (P. 16 LEs para la tabla de ángulos. y para el cálculo de funciones hiperbólicas.

de escritura y de refresco – operar en modo cuasi-asincrónico (AS/ACK + reloj) – permitir el control de acceso a nivel de byte (BE[3.. Guillermo Jaquenod. 2001 77 .p65-Rev2/99 Ejercicio: DRAM controller. recibir los bits de datos. • 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. 2001 • En este caso el módulo 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. 2001 Ejercicio: DRAM controller. se baja /CAS para capturarla 5.. /OE y /WE CAS# ROW COLUMN WE# DQ DATA OE# 1 2 3 select arbitro RAS/CAS BE[] control /RAS[3. RAS# CAS# ADDR ROW COLUMN WE# DATA DQ OE# 1 2 3 45 6 7 8 9 10 11 T2-11 110 T5-6 0 T1-2 0 T6-7 10 T2-4 10 T6-8 10 T2-6 20 T6-9 10 T3-6 0 T6-10 15 T4-6 0 T10-11 40 Guillermo Jaquenod.] quedan en Tri-State 10. se baja /CAS para capturarlos 7. las que permiten el control de lectura y escritura a nivel de byte • Tienen múltiples modos de operación. este ciclo refresca todas las columnas de esta fila. se pone una parte (filas) de la dirección a leer 2.. se baja /OE para sacar las líneas DQ de alta impedancia 6.p65-Rev2/99 A0.VHDL: Lenguaje de descripción de hardware Shifter Mux Suma Ajuste Control AND Sumador Acumulador Shifter Fuente: POLLARD Guillermo Jaquenod... Ciclo de lectura • El ciclo de lectura se compone de varios pasos: Guillermo Jaquenod.. se baja /RAS para capturarla 3.0] ACK reloj direcciones A[11. se desactiva /WE 8. Ciclo de escritura • El ciclo de escritura (early write) se compone de varios pasos: RAS# ADDR RW AS BE[3.0] Contador de refresco Fuente: MICRON 4.0] /CAS[3. se baja /RAS para capturarla 3. y avisar cuando hay un nuevo dato disponible – Otra máquina activada por Clk. Noise. 2001 • Cada dispositivo tiene una línea /RAS dedicada pero dos líneas /CAS.0] A0~A11 /WE DQ0/CASL DQ15 /CASH /RAS 4M x 16 /OE /RAS1 A0. se ponen los datos a escribir 6. se pone la otra parte (columnas) de la dirección a leer 5.0]) – multiplexar el bus de direcciones – aislar el bus de datos – generar las señales de control /RAS[]. “early Write” y “CBR refresh”. se termina el ciclo subiendo /RAS y /CAS 8... • Tener una interfase resuelta facilita su uso en sistemas de cómputo pero también en tareas de instrumentación (ej: data-logging).. 2001 1.se debe esperar un tiempo de precarga hasta empezar otro ciclo • En simultáneo con la lectura. se pone la otra parte (columnas) de la dirección a leer 4.A11 4 5 6 7 8 9 10 T1-10 110 T5-6 15 T1-2 0 T2-6 60 T2-3 15 T2-4 20 T3-4 0 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. responsable de la interfase al bus del usuario Al igual que en el transmisor el circuito puede complicarse.A11 A0-A11 16 A0~A11 /WE DQ0/CASL DQ15 /CASH /RAS 4M x 16 /OE /WE /CAS2 /CAS3 /RAS2 A0. se termina el ciclo subiendo /RAS y /CAS 10. responsable de sincronizarse con los datos entrantes.. 2001 Ejercicio: una UART. se sube /OE para pasar DQ[. /CAS[].8MEG x 32 DRAM DIMMs DM85.2] Ejercicio: DRAM controller datos Ejercicio: multiplicador de punto flotante 1. los datos DQ[. para detectar Overrun. etc. se pueden sacar los datos 9.A11 16 A0~A11 /WE DQ0/CASL DQ15 /CASH /RAS 4M x 16 /OE /RAS3 16 Fuente: MICRON 4. este ciclo refresca todas las columnas de esta fila.8MEG x 32 DRAM DIMMs DM85.. de los que sólo se desea implementar “single read”.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 módulos de alta densidad y bajo tiempo de acceso..0] /OE /WE DQ[31. se activa /WE en cero 4.A11 16 DQ[31. Guillermo Jaquenod.] a Tri-State 9. los datos quedan disponibles para su uso 7.. Break. Guillermo Jaquenod.. se pone una parte (filas) de la dirección a leer 2. 2001 Guillermo Jaquenod.se espera un tiempo de precarga hasta empezar otro ciclo • En simultáneo con la escritura. 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 máquinas sincronicas: – Una máquina activada por Rck16x..

1. • S.H.625 microsegundos). 2nd. 2001 Bibliografía: manuales y notas de aplicación • Cypress Semiconductor. ISBN:0-7923-9032-6 lineas Horizontal (unidad: pixels @ 25. 800 vper hsw 95 vsw 2 hsi 657 vsi 491 • M. 0 RAS# CAS# ADDR WE# DQ OE# RAS# 10 CAS# ADDR WE# DQ OE# RAS# T2-3 X T4-6 15 T2-4 10 T4-7 60 CAS# ADDR WE# DQ OE# Guillermo Jaquenod.Pollard. 4. Applications and VHDL. 6. 25. ISBN 0-471-57464-3 vsyn hsw hval • J. June. ISBN 0-7695-0023-4 lineas hsyn column 0.Perez. Addison Wesley 1997. A VHDL Primer.479 • K. ISBN 0-201-50022-1 hcnt 640 vcnt 480 • L.Leung & M. Application Specific Integrated Circuits.Bhasker. Prentice Hall 1995. ISBN 1-55860-520-7 pixel hsyn pixel • L. 2001 Guillermo Jaquenod.AA. ISBN 0-13-200304-X. Digital Design with CPLD.175MHz) hper Vertical (unidad: líneas) • F.175MHz hsi Bibliografía: libros sobre VHDL • P.. 40-50. Prentice Hall 1995.Boluda. Digital Systems Design With VHDL and Synthesis. An inteegrated Approach. AlfaOmega 2000.Bhasker. Dueck. Morgan Kaufmann Publishers Inc. • QuickLogic Corp. VHDL for Designers. 1983. 2001 Guillermo Jaquenod. • Actel Corp. Prentice Hall 1990. 2001 Ejercicio: generación de video SVGA 640x480 hper hsyn • Suponiendo un reloj de 66MHz (15ns de período) pueden definirse los ciclos de lectura. Inc. ISBN 0-13-181447- val vper • J. 3. VHDL Lenguaje Estándar de Diseño Electrónico.Terés et al. "Byte-wise CRC Calculations.639 • R.VHDL: Lenguaje de descripción de hardware Ejercicio: DRAM controller. 5. 2001 78 .. IEEE Computer Society 1999.Baker. VHDL Lenguaje para síntesis y modelado de circuitos. John Wiley and Sons. “A survey of CORDIC algorithms for FPGA based computers”. 1995 • R. The Design Book. MAX+PLUS II VHDL.Sjoholm & L.S. Applications Handbook. Thomson Learning. La interfase JTAG Conceptos básicos y detalles de operación de una moderna metodología de test Guillermo Jaquenod. Revised Edition. VHDL Programming With Advanced Topics. escritura y CBR en múltiplos de ellos READ RAS# WRITE 1. Guillermo Jaquenod. • 0 Un ciclo CBR (Cas_Before_Ras) es usado para el regenerar los datos (refresco) de la memoria dinámica: REFRESH • Ejercicio: DRAM controller hcnt • ALTERA Corp. ISBN 84-481-1196-6 522 Guillermo Jaquenod. 2001 • L. ISBN 0-76681160-3 vsw hval val • S.Pardo & J.Smith.S. ISBN: 0-13-324351-6. April 1994.Edition. usando ciertos flipflops activados por el flanco positivo y otros activados por el flanco negativo de la señal de reloj 1 2 3 4 5 6 7 .Lindh. The Student’s Guide to VHDL.Shanblatt. 2. Kluwer Academic Publishers. FPGA Data Book and Design Guide.Andraka. 2001 Guillermo Jaquenod.C. Cada ciclo CBR refresca todas las columnas de una fila 10 T3-4 5 T1-4 10 T4-5 • Incluso puede pensarse en un reloj de sólo 33MHz.J. Prentice Hall 1997. A Guide to VHDL Syntax. 1998. ISBN 0-13-473414-9. Version 7. 1989..Chang. ASIC System Design with VHDL: A Paradigm. 1993. 1996/97 Quick Logic Data Book. ACM 0-89791-978-5/98/01 • A. McGraw Hill 1998. DELMAR.Ashenden. lineas vsi vcnt row 0. ISBN 970-150443-7. December 1996." IEEE Micro.. 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=don’t care WE# DATA = don’t care DQ OE# 1 23 4 5 6 7 T1-3 El refresco de toda la memoria requiere de al menos 4096 ciclos de refresco CBR cada 64 milisegundos (uno cada 15.

o también a nodos internos • Dada la forma serial de lectura/escritura. interconexión interna. dispositivo.. 2001 Sensor Excitador Guillermo Jaquenod. soldadura. PTH. 2001 79 .VHDL: Lenguaje de descripción de hardware Boundary Scan Testing • A medida que los circuitos impresos se hacen más complejos.. 2001 Guillermo Jaquenod. Test Access Port and Boundary Scan Architecture” Guillermo Jaquenod. o los hace enormemente caros. 2001 Limitaciones propias del uso de “cama de clavos” Boundary Scan Testing dispositivos a testear líneas JTAG/BST • Limitaciones de acceso en componentes de montaje superficial.1. tales como las “camas de clavos”.. pista de PCB. clavo (sensor) En 1990 el IEEE presentó el estándar ”IEEE 1149. de modo de evitar colisiones • entre las señales del sistema de test y las generadas dentro de la plaqueta • • Guillermo Jaquenod. TDI TMS TCK nTRST TDO La cadena BST se intercala entre el núcleo y las patas de cada chip. • Métodos clásicos: detección de fallas usando “cama de clavos” La necesidad de métodos económicos y de rápida implementación para el test de circuitos complejos determinó la necesidad de definir un estándar. la necesidad de un test más completo se hace imprescindible • El encapsulado de componentes en envases de altísima densidad (Ej: BGA de más de 600 patas) invalida métodos tradicionales. pata del chip. plaquetas con componentes en ambas caras. Núcleo interno TAP CONTROLLER Guillermo Jaquenod.. dispositivo. la principal limitación del método es que sólo permite realizar test cuasi estáticos Usando BST para el test interno del chip (INTEST) la cadena de elementos testeada es: – celda BST.. PTH. interconexión interna. 2001 Uso de BST para verificar el chip internamente ... 2001 Guillermo Jaquenod. soldadura. • Problemas de confiabilidad de los contactos • Necesidad de disponer de un modo protegido (“guarded”) en los líneas a testear componentes del sistema en test. .. y puede forzar valores lógicos en las patas de salida y capturar el estado de las patas de entrada (test estático del PCB) En ciertos casos esta cadena puede excitar a los núcleos con valores de entrada programables y capturar sus respuestas (test estático del chip) Todo el esquema funciona como un gigantesco “shift-register” • Este acceso puede ser sólo a nodos asociados a patas de I/O. celda BST Este modo es útil para verificar la funcionalidad de los chips Guillermo Jaquenod.. que con la incorporacíon de USA llevó a la creación del Joint Test Action Group (JTAG) • Mediante el uso de camas de clavos es posible testear la cadena: – clavo (excitador).... o circuitos Test Access Port Test Access Port Test Access Port Núcleo lógico Núcleo lógico Núcleo lógico multilayer • Costo: tanto del bed test como del equipamiento de generación y captura de señales. 2001 Uso de BST para verificar el chip internamente • Usando BST es posible medir y/o excitar nodos internos de un chip . y a mediados de los 80 se creó el Joint European Test Action Group (JETAG). pata del chip. pista de PCB.

2001 Monitoreo en operación Uso de BST para verificar el PCB Usando BST para el test del conexionado (EXTEST). pata del chip. PTHs. C1 B Uso de BST para verificar el PCB C Dispositivo sin BST La interfase BST permite: • el chequeo pleno de conexiones entre dispositivos BST (flecha A) • y el chequeo parcial (mediante estímulos y respuestas) cuando algún dispositivo no tiene BST (flecha B) • si hay caminos no medibles (entre dispositivos sin BST. 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. la cadena posible de testear es: – celda BST.VHDL: Lenguaje de descripción de hardware Uso de BST para verificar el PCB JTAG Dispositivo con BST Dispositivo con BST A Dispositivo con BST C2 Dispositivo sin BST La verificación 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 Instrucción EXTEST. 2001 Scan Una celda básica BST ofrece Output ShiftDR 4 modos de operación: 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. pista de PCB. – En la fase “UPDATE” las lineas de control son reemplazadas por los valores de este shift register. sin afectar su funcionamiento • Las celdas BST toman una muestra “snapshot” en forma independiente de la operación Guillermo Jaquenod. 2001 La celda básica BST La celda básica BST SO PI SI SO núcleo lógico PO Las tareas básicas 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. – En la siguiente fase “SHIFT” los datos capturados son leídos en forma serial a la salida del registro BST. 2001 80 . caso C) conviene rehacerlos a través de dispositivos con BST (C1 y C2) Guillermo Jaquenod. pata del chip. celda BST Este modo es útil para detectar problemas de manufactura Guillermo Jaquenod. 2001 – En la fase “CAPTURE” los valores presentes en las entradas son almacenados. a la vez se carga el shift register BST. interconexión interna. 2001 Guillermo Jaquenod. soldadura. interconexión interna. soldadura. Guillermo Jaquenod.

. Ck o todo codigo de instrucción desconocido (default).. aunque opcional) para 3 1 activar un Auto-Test del chip. En modo Capture_IR los dos bits LSB deben copiar el patrón “01”. provee el camino más corto entre TDI y 28 27 versión de TDI TDO. registros para la 4 2 4 2 salida Guillermo Jaquenod... 3:ShiftDR. y para que el usuario pueda programar informacion 1 propia.. 2001 Registros asociados a BST • 01 de TDI TDO Registros asociados a BST bits 31 ShiftDR Registro de ByPass: este registro.... Es habilitado cuando se “0” 0 1 D decodifica la instrucción ByPass a TDO Q 1 0 fabricante 1 Shift Register de 32 bits PISO a TDO • Registro de identificación (IDCODE): este registro opcional de 32 bits permite identificar mediante la cadena BST al fabricante.. .. 2001 programación en circuito (ISP) bidireccional Guillermo Jaquenod.... de sólo un bit. 2001 81 . UPDATEIR CLOCKIR SHIFTIR TAP CONTROLLER TMS TCK a TDO Capture clock Shift Register DECODIFICACION Decodificación datos REGISTRO DE BST CLOCKDR UPDATEDR SHIFTDR TAP Controller instrucciones REGISTRO DE BYPASS Update . 4:ClockDR La arquitectura IEEE 1149. y los que no. o usar la 1 3 4 2 salida tristate instrucción RunBist (definida en la norma. Ello permite. ingresarse una instrucción (Shift_IR) en modo serial. 2001 Registro de Instrucción: este registro.1 permite a cada fabricante definir instrucciones y registros propios – Ello permite ampliar la cadena BST para realizar el test de no sólo elementos perifericos sino también internos (InScan).... En él puede “capturarse” un valor cableado dentro del chip (Capture_IR). y capturar el resultado en un registro dedicado entrada 2 4 3 3 – Los chips de ALTERA ofrecen un registro Registro del usuario 1 (UESCODE).. saber si un chip tiene IDCODE (si viene un ‘1’ los siguientes 31 bits son esa identificación) o no. REGISTRO DE INSTRUCCION TDI . Guillermo Jaquenod. nTRST . tipo de dispositivo y versión de cada chip... Guillermo Jaquenod. 2001 Registro de test periférico: tipos de celda BST Otros registros en BST Según el tipo de pin... mediante la acción ShiftDR.VHDL: Lenguaje de descripción de hardware Registros asociados a BST Registros asociados a BST ….. Nótese que en todos los casos se usan 4 líneas de control: • 1:Mode. las celdas BSTagregan 1 a 3 flipflops a la cadena de Test. Guillermo Jaquenod.. • REGISTRO UESCODE ... ClockDR ejecutarse sobre él la acción ShiftDR de TDI 12 11 número de parte Capture_DR (ShiftDR=1) debe capturar un “0”.. Al • Al salir de Power Up se especifica que aquellos dispositivos que tengan IDCODE lo deben intercalar en la cadena DR..... y en las líneas MAX7000s y MAX9000. caso en que va por default a ByPass y captura un ‘0’. y decodificar dicha instrucción cuando está lista (Update_IR).…valor a definir……. 2001 Guillermo Jaquenod. de largo variable (aunque como mínimo de 2 bits) puede ser intercalado entre TDI y TDO.. deben intercalar el registro de ByPass. 2001 Guillermo Jaquenod. Mantenimiento REGISTRO IDCODE . REGISTROS ISP/ICR .. 2:UpdateDR.

2001 Guillermo Jaquenod. • En el encendido el TAP Controller queda en el estado TEST_LOGIC/RESET. 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): señal de control de las transiciones de la máquina de estado del TAP CONTROLLER. donde toda la lógica de BST está deshabilitada. con 16 estados distintos. • El JTAG TAP Controller está descripto en base a una máquina sincrónica de estados. y está disponible sólo en ciertos dispositivos de ALTERA Guillermo Jaquenod. 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 código con todos los bits en ‘1’. asi como datos de test y programación. 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). 2001 82 . 2001 Guillermo Jaquenod. y permanece allí mientras TMS=1 (MAX) o nTRST=0 (FLEX) • • Desde cualquier estado. Su valor no está más 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.1 la define como señal opcional. 2001 Máquina de estados BST: ejemplo TEST_LOGIC /RESET CAPTURE_DR TMS=0 TMS=0 • Los cuatro estados básicos 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. va a Tri-state cuando no se está sacando datos del dispositivo • • Toda la operación del TAP controller está definida por las líneas de control TMS y el reloj TCK. donde las transiciones entre estados son función exclusiva del valor de TMS. Su valor está TMS=1 EXIT2_IR TMS=1 un dado patrón precargado en las patas de salida. actualizados en el flanco de bajada de TCK. Los datos son capturados en el flanco creciente de TCK • TDO (TEST DATA OUTPUT): salida serie de instrucciones. La norma IEEE1149. 2001 Máquina de estados BST nTRST=0 Máquina 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. su valor es capturado en el flanco creciente de TCK • TCK (TEST CLOCK): entrada de reloj para el control de BST • TRST (TEST RESET): señal asincrónica activa baja para reinicializar los circuitos de test. asi como para datos de test y programación. 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.VHDL: Lenguaje de descripción de hardware Máquina de estados BST Líneas de control del TAP Controller TDI (TEST DATA INPUT): entrada serie para instrucciones. – SAMPLE/PRELOAD: captura una muestra del estado de las señales de entrada. 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. 2001 EXIT1_IR Guillermo Jaquenod.

Puede ir desde un simple PASA/NO_PASA al uso de estímulos alternativos para identificar con más precisión la falla – Diagnosticos sobre dispositivos que no pasan el test: esta acción es muy parecida a la del proceso de diseño. para poner ciertas patas en estado de alta impedancia Guillermo Jaquenod. 2001 Guillermo Jaquenod. – Idcode: permite leer el registro IDCODE (Identification Code) que indica marca y modelo del chip número de veces que el chip fue reprogramado. Se compone de dos grandes etapas – Test del tester – Verificación de conexiones (cortos.VHDL: Lenguaje de descripción 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. – Highz: similar a Clamp. 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 programación. sólo que acá se sabe que la falla es de tipo estructural o funcional. 2001 Guillermo Jaquenod. pero que el diseño es conceptualmente correcto. ALTERA ha – Clamp: parecida a EXTEST permite forzar valores lógicos 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 programación. 2001 Momentos de uso de BST Momentos de uso de BST Tests durante el proceso de manufactura Tests durante el proceso de manufactura – Definición y ejecución del programa de test: esto significa no – Creación de vectores •Para la validación estructural del sistema: detección de problemas físicos ocasionados por el proceso de manufactura (Extest). u otra información clave – programación ISP: para la programación en circuito. 2001 83 . operación correcta de los dispositivos (Intest) Guillermo Jaquenod. tambien puede sufrir los mismos problemas de – Para la validación estructural del sistema manufactura que un equipo en producción – Para la validación funcional del sistema • Definición del programa de test – Las herramientas de test en esta instancia deben proveer la • Ejecución del programa de test capacidad de generar vectores para: • Diagnosticos sobre dispositivos que no pasan el test – Test y reparación a posteriori • test de interconexiones • test de memoria • identificación de zonas no cubiertas por herramientas BST Guillermo Jaquenod. circuitos abiertos. 2001 Guillermo Jaquenod. sino en qué orden y qué acciones tomar si se detecta una falla. 2001 Momentos de uso de BST Momentos de uso de BST Debugging del diseño: Instancias de aplicacion – Un adecuado diseño no sólo incluye el diseño en el aspecto – Debugging del diseño funcional sino también para el test – Tests durante el proceso de manufactura – Y así como un prototipo puede tener problemas de • Creación de vectores concepción. Facilita disponer informaciones tales como version o modelo del producto. 2001 Guillermo Jaquenod. lineas pegadas a ‘0’ o a ‘1’) •Para la validación funcional del sistema: detección de la sólo definir qué vectores de test se han de aplicar.

su control de tri-state y la entrada • A diferencia de la familia MAX7000S es posible intercalarse (además de capturar su valor) sobre la línea de entrada Guillermo Jaquenod. Por ejemplo: – La EPM7128S.0] CLR [1. más que en plaquetas o módulos Uso de BST en ALTERA – la tarea de test no es hecha en fabrica ni por el fabricante. por lo que las herramientas y métodos deben ser lo suficientemente simples y bien documentadas para poder ser utilizadas donde el usuario final – es deseable la mayor automatización posible del proceso de test.... llevando la cantidad de pines medibles a 203. 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 máximo (en el encapsulado de 240 patas) a las cuales se pueden sumar 14 lineas dedicadas a las tareas de configuracion. pese a tener 128 macroceldas. e incluso el poder realizarlo en modo remoto. 2001 Q • Al igual que en la familia MAX7000S se actúa sobre la salida. 2001 Guillermo Jaquenod. sino en el campo y quizas por un tercero. posee además 5 celdas para uso interno. FLEX10K y FLEX8K puntos de intercalación CÓDIGO DE INSTRUCCIÓN OE[7. sino solo aquellas que pueden llegar a estar asociadas a un pin de entrada/salida. 2001 Guillermo Jaquenod. 2001 Instrucciones de BST en ALTERA Bloque básico de I/O en MAX9000.0] 10H’059 Nótese que no existe la instrucción INTEST Guillermo Jaquenod. sólo que acá: – se puede llegar a tener que ubicar inicialmente fallas en sistemas.? - --------10H’059 -------- ENA[5..0] Modo FLEX10K FLEX 8K FLEX 6K MAX9000 MAX7000S 10 bits 3 bits 3 bits 10 bits 10 bits SAMPLE/ 10H’055 3B’101 3B’101 10H’055 10H’055 EXTEST 10H’000 3B’000 3B’000 10H’000 10H’000 BYPASS 10H’3FF 3B’111 3B’111 10H’3FF 10H’3FF PRELOAD D CLK[3. 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 Uso de BST en ALTERA Largo de la cadena BST • Permite el test del núcleo y el PCB a través de la periferia (intercalándose 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.0] ENA CLRN UESCODE 10H’007 ------- --------- IDCODE 10H’006 ------- . 2001 84 . 2001 Guillermo Jaquenod. Guillermo Jaquenod. sólo puede tener 96 patas de I/O como máximo.VHDL: Lenguaje de descripción de hardware Momentos de uso de BST Test y reparación a posteriori : esta acción es muy parecida a la del proceso de diseño o al diagnóstico durante la manufactura.

(ATPG: Automatic Test Pattern Generator) como por equipamiento de test automático (ATE). 2001 El lenguaje estandar de test Otros lenguajes de Test usando la interfase JTAG BSDL Boundary Scan Description Languaje Guillermo Jaquenod. FLEX10K y FLEX8K Patas de entrada dedicadas en FLEX SDO 0 1 OE[7. definido en la norma IEEE1149.VHDL: Lenguaje de descripción de hardware Bloque de I/O con BST en MAX9000. que permite describir • Generic parameters: parámetro que pueden venir desde fuera de una entidad. 2001 Guillermo Jaquenod.. 2001 Boundary Register description: identificación de cada celda de test.. junto con la descripción Logical port description: asigna nombres a las patas de entrada/salida.0] 0 1 CK CLR [1. e indica su tipo: Use: referencias a definiciones dadas por packages predefinidos Pin mapping(s): asociación entre nombres lógicos y número de pata circuital (netlist) de cómo los distintos dispositivos están Scan port identification: niveles activos de las líneas JTAG.. etc.0] D Q D Q CK CK D Q D Q CK CK D Q D Q SDO pin dedicado a la lógica interna 0 1 0 1 D Q CLK[3. y también intercalarse en dicha línea (la cadena de UPDATE tiene un flipflop) • Para mantener compatibilidad con los pines no dedicados. tal como el tipo de encapsulado en forma estándar las características de un dispositivo capaz de ser testeado mediante BST • Esta definición de cada dispositivo. VHDL. Output Enable y Clear • Es posible capturar el valor lógico de la entrada.. Guillermo Jaquenod. 2001 85 .1b. 2001 CLOCK SDI UPDATE MODE • Asociado a las patas globales de reloj.0] SDI SHIFT CLOCK 0 1 GND CK UPDATE 0 1 D Q CK MODE SHIFT OPERACION NORMAL Guillermo Jaquenod. puede ser usada tanto por Instruction Register description: valor y longitud de cada instrucción programas de generación automática de vectores de test Register access description: qué registro es ubicado entre TDI y TDO para cada diferente instrucción. de los cuales dos tienen valores fijos Guillermo Jaquenod.0] 0 1 D Q CK 0 1 D Q CK 0 1 VCC 0 1 D Q CK ENA CLRN ENA[5. la cadena de CAPTURE tiene tres flipflops. y fmax de TCK interconectados en una plaqueta. 2001 Guillermo Jaquenod. o tener un valor por defecto. a que pata está asociada. y su modo de control Guillermo Jaquenod. 2001 Componentes de un archivo de descripción BSDL BSDL: Boundary Scan Description Language BSDL es un lenguaje de descripción de hardware subset de Entitys: define cosas tales como el nombre del chip.

all. IO15 .Dedicated Input Pins -----------------------------"IN1 : 1 .. IO50. IO28 .IO74. IO49. “& " . 53 . IO8 . 2001 attribute TAP_SCAN_OUT of TDO : signal is true. 66 .IO81: inout bit. 78 ). IO39. "&--JTAG ports "VCC : (3 . IO33 .BOTH). y define cosas tales como el nombre del chip. IO65. --Ground Pins Guillermo Jaquenod. 47 . IN84 : in bit. 2001 Esta sentencia permite asociar los nombres lógicos definidos al número de pata que corresponde a cada encapsulado Su sintaxis es: attribute PIN_MAP of XYZ : entity is PHYSICAL_PIN_MAP. "&--Power Pins "GND : (7 . IO77 : 77 .VHDL: Lenguaje de descripción de hardware BSDL: Entidades. IO63. IO57. 42 . IO79 : 79 . IO10:10 . constant PLCC84 : PIN_MAP_STRING := ------------------------------------------------I/O Pins-----------------------------------"IO4:4 . donde PIN_MAP_STRING es un subtipo string definido en el package STD_1149_1_1994 Guillermo Jaquenod. TDO : out bit. IO9 . "& De este modo se definen los niveles activos. 2001 BSDL: Mapeo de las señales lógicas en el encapsulado BSDL: Líneas JTAG En la descripción BSDL de la EMP7128SLC84: attribute PIN_MAP of EPM7128SL84:entity is PHYSICAL_PIN_MAP. IO69. TMS .00e6. IO29. La sentencia USE hace referencia a definiciones dadas por packages predefinidos port ( <NOMBRE SIMBÓLICO : modo tipo >.. IN83 : 83 . IO24. IO8:8 . attribute TAP_SCAN_MODE of TMS : signal is true. 38 . IO51 .. 2001 BSDL: Mapeo de las señales lógicas en el encapsulado BSDL: definición de las puertas de la entidad En la descripción BSDL de la EM7128SLC84: port (------------------------------. VCC:9. parámetros genéricos. IO44. 19 . <NOMBRE SIMBÓLICO : modo tipo >). Guillermo Jaquenod. IO68 .IO70.IO31.IO58. IN2 : 2 . . IO11 .IO79. IO6:6 . Y:(2. Guillermo Jaquenod.I/O Pins ----------------------------------------IO4 ..6. IO64. "& "TCK : 62 . La descripción BSDL de la EPM7128SLC84 dice: entity EPM7128SL84 is generic (PHYSICAL_PIN_MAP : string := "PLCC84"). 26 . TCK:13. IO55. IO25 . constant <encapsulado>:PIN_MAP_STRING:= "OE:1. TDI : in bit. tal como el tipo de encapsulado.. IO61. IO81 : 81 . IO45. IO35. --JTAG Ports VCC : linkage bit_vector (1 to 8). IO36. TMS : 23 . IO48. 72 . TDI:11. IN84 : 84 . 59 . La sintaxis es: generic (PHYSICAL_PIN_MAP : string := ”<encapsulado>”). TDO : 71 .. así como la frecuencia de clock máxima posible en la línea TCK para el manejo del TAP Controller.. IO22. IO46.IO75.4). Guillermo Jaquenod. IO40. NC:14". ------------------------------------. IO34 . 32 .IO73. IO67. IO56. bidireccionales. Como ejemplo.IO41. o tener un valor por defecto. . Su forma es: BSDL: definición de las puertas de la entidad Esta descripción da nombres a las patas de entrada/salida (normales y de manejo del TAP Controller) e indica su tipo: entrada. --Power Pins GND : linkage bit_vector (1 to 8) --Ground Pins ). 2001 <NOMBRE SIMBÓLICO : modo tipo >.. IO77. GND:8. attribute TAP_SCAN_CLOCK of TCK : signal is (10. IO6 . IO16 .IO76.7). IO18 . en el archivo BSDL de la 7128SLC84 se define una frecuencia máxima para TCK de 10 MHz: attribute TAP_SCAN_IN of TDI : signal is true. --Dedicated Input Pins TCK . TMS:12. 43 . salida. IO5:5 . IO80 : 80 .IO21 . IO27.. IO20. IN83 . IO10 . IO5 . IO9:9 . 2001 86 . end XYZ Un parámetro genérico puede venir desde fuera de una entidad. IN2 .3. TDI : 14 . etc. end EPM7128SL84. 13 . IO11:11 . IO12:12 .IO30. 2001 Guillermo Jaquenod. Guillermo Jaquenod. IN1 .IO80. "& "TDO:10. use STD_1149_1_1994. Su sintaxis es: entity XYZ is {sentencias de descripción de la entidad}. y sentencias USE La descripción de entidades es tipo VHDL.IO37 . 82 )". IO52 . IO54 . A:(5. IO12 . IO60. IO17 .

• HSDL cubre tres area no incluidas en BSDL • Descripción de las redes de interconexión a testear. input.0)." & --BSC group 2 for I/O pin 81 "6 (BC_4. o UUT). y verificación • BSDL y HSDL pueden ser usados conjuntamente para generar una descripcion completa del dispositivo en test (“unit under test”.input. attribute INSTRUCTION_LENGTH of EPM7128SL84 : entity is 10. attribute BOUNDARY_REGISTER of EPM7128SL84 : entity is --BSC group 0 for dedicated input pin 84 "0 (BC_4. y su modo de control.7. attribute INSTRUCTION_CAPTURE of EPM7128SL84 : entity is "0101010101". para ello agrega dos nuevos “packages” • Las entidades en HSDL permiten describir tanto modulos como dispositivos. *.*. X) D Q CK SHIFT – – – – D Q CK 0 1 6 D Q 7 (BC_1. Guillermo Jaquenod. este campo indica valor y longitud de cada instrucción. input.7 (BC_1.X. 2001 BSDL: descripción del registro de TEST periférico Descripcion de una pata bidireccional 6 (BC_4.0. 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.<instruccion>). "<registro>(<instruccion>[.IN84. 2001 Guillermo Jaquenod. X). *. 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". attribute REGISTER_ACCESS of XYZ : entity is ”<registro>(<instruccion>[. internal."& . 0) 1 de la macrocelda – Celda tipo BC_1 – Opera en tareas de control – Valor inicial cero 1 7 8(BC_1. X).*. X).. la pone en TriState Guillermo Jaquenod.control.287 (BC_4. debug.<instruccion>) ".VHDL: Lenguaje de descripción de hardware BSDL: códigos de las instrucciones BSDL: relación entre registros e instrucciones Como estos códigos no están definidos en la norma.. 2001 attribute REGISTER_ACCESS of EPM7128SL84 : entity is "DEVICE_ID (IDCODE)".*.output3. en ‘0’. Guillermo Jaquenod. internal. a que pata está asociada. *.Z) 0 0 D Q 1 al PIA D Q 1 8 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.internal. 2001 1 Control de OE SDO 285 (BC_4. Guillermo Jaquenod. 2001 a la lógica 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. input. 2001 – – – – Celdas tipo BC_4 No asociadas a ningun port De uso interno Valor inicial desconocido HSDL: superset de BSDL • Creado por Texas Instruments. internal. IDCODE (0001011001)". X).internal. 8 (BC_1. X). En la EPM7128SLC84: attribute BOUNDARY_LENGTH of EPM7128SL84 : entity is 288.7.-.1 (BC_4.control.*. usando las mismas sentencias de VHDL • HSDL permite salir del dispositivo y generar atributos adicionales de la norma IEEE 1149 indicando cómo los dispositivos IEEE 1149 están conectados a nivel de plaqueta y de sistema.X. a nivel de plaqueta o de módulo • Descripción de plaquetas con arquitecturas dinámicas y/o reconfigurables • Facilidad de uso y mejoras en el proceso de diseño interactivo.. "& .2 (BC_4. contiene una identificación de cada celda de test. 2001 87 .IO81.IO81. internal.output3. X)." & "SAMPLE (0001010101)..286 (BC_4.. En la EPM7128SLC84: La descripción del modo de acceso a cada registro indica qué registro es ubicado entre TDI y TDO para cada diferente instrucción. X) La descripción del registro de test.0. el Hierarchical Scan Description Language (HSDL) complementa al BSDL.IO81. attribute INSTRUCTION_OPCODE of EPM7128SL84 : entity is "BYPASS (1111111111).asi sigue hasta completar las 96 celdas triples de la 7128 --BSC group 95 for dedicated input pin 1 "285 (BC_4. IN1. EXTEST (0000000000). *.. X) 287 (BC_4. --Mandatory LSB Guillermo Jaquenod. X)" . input. IN1.IO81. finalmente.Z).

: Boundary Scan Description Files: http://www. Optimizing Fault Detection for Boundary Scan Testing. ‘0’ after 7 ns.wr.VHDL: Lenguaje de descripción de hardware Bibliografía Uso de Arrays: modelo de una RAM 64x8 TEXAS INSTRUMENTS: IEEE 1149. END ENTITY miram.com/tutorial/tutorial. ‘1’ after 10 ns.asset-intertech.htm ASSET-INTERTECH Inc. 2001 TYPE direcciones IS INTEGER RANGE 0 TO 63. 8 RAM 64 x 8 cs oe wr 8 Fuente: ASHENDEN Preguntas Preguntas Dibuje la cola de eventos de la señal ‘z’ antes de la ejecución de cada sentencia WAIT y muestre la secuencia de valores en el tiempo que toma la señal ‘z’ Escriba el valor de las siguientes expresiones: boolean’HIGH boolean’LEFT boolean’VAL(1) positive’LOW natural’LOW natural’RANGE bit’RIGHT bit’RANGE bit’LOW character’POS(‘C’) character’VAL(79) character’PRED(‘C’) character’SUCC(‘C’) character’PRED(character’SUCC(‘C’)) Guillermo Jaquenod. transport for 2 ns. ‘0’ after 3 ns. September 1998 ALTERA Corp.altera. END IF. 2001 Guillermo Jaquenod.3. END LOOP. 2001 transport for 5 ns.: USING THE JAM LANGUAGE FOR ISP & ICR VIA AN EMBEDDED PROCESSOR.oe.htm Guillermo Jaquenod.d_ent. 2001 6 ARCHITECTURE ejemplo OF miram IS BEGIN memoria: PROCESS IS VARIABLE esta_ram : ramblock. dir: IN direcciones. d_sal: OUT octeto). BOUNDARY SCAN TUTORIAL: http://www. transport for 1 ns. END IF. TYPE octeto IS INTEGER RANGE 255 DOWNTO 0. October 1988. LOOP WAIT ON cs. Application Note 88. IF (cs AND oe)='1' THEN d_sal <= esta_ram(dir).: DIGITAL LIBRAY. Guillermo Jaquenod. TYPE ramblock IS ARRAY (direcciones) OF octeto. Loop eterno END PROCESS memoria.ti. ALTERA Corp. ‘1’ after 10 ns. d_ent: IN octeto. IF (cs AND wr)='1' THEN esta_ram(dir) := d_ent.oe.dir.0. Fuente: TERÉS 88 .: JAM Programming & Test Language Specification.htm ALTERA Corp.wr: IN BIT. Loop eterno END ARCHITECTURE ejemplo .com/sc/docs/jtag/scbdopt.1/ JTAG/ BOUNDARY SCAN. END LOOP. Inicializacion Inicializacion BEGIN FOR i IN direcciones LOOP esta_ram(i) := 0. http://www.com/html/atlas/bsdl/bsdl. ENTITY miram IS PORT ( cs. version 1. October 1997 ALTERA Corp. transport for 8 ns. 2001 En algún package En algún 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: TERÉS Guillermo Jaquenod. ver.1.