Professional Documents
Culture Documents
VHDL
IMPORTANTE!
Nota sobre Copyright: muchas lminas de este curso han sido influenciadas, en mayor o menor medida, por
los libros que se mencionan en la bibliografa, de los cuales se han tomado a veces ejemplos textuales, o en
otros casos ideas para la elaboracin de ejemplos propios. Esta mltiple influencia hace casi imposible
referenciar la fuente en cada caso, aunque se ha tratado de hacerlo para honrar a los respectivos autores.
Guillermo Jaquenod, 2001
Qu es un HDL?
Caractersticas de un HDL
(CONCURRENCIA)
esquema textual
(comportamiento)
Qu HDLs existen?
Resultado
Documentacin
Anlisis
Especificacin
Descripcin de qu
debe hacerse
Diseo
Cdigo VHDL
Netlists
Simulacin
Validacin
simulada
Detalle del
funcionamiento
PARTICIN HARDWARE/SOFTWARE
Test-Bench y vectores
Prototipo
ESPECIFICACIN
Prototipado
Elaboracin de cmo
llegar a los resultados
SINTESIS!!
ESPECIFICACIN
DE HARDWARE
ESPECIFICACIN
DE SOFTWARE
ASIC
FPGA
PLD
SINTESIS!!
Partes
Estndar
PLAQUETAS
Y
SISTEMAS
SOFTWARE
DISEO
Fuente: ALTERA
Estructura jerrquica
output1
subdiseo 2
subdiseo 1
subdiseo 4
Componente1
de menor nivel
Componente1
de menor nivel
Fuente: ALTERA
Instancias y Jerarquas
Como elementos constructivos de su
comportamiento, un mdulo puede incluir
dentro de s bloques de menor nivel (otros
mdulos) definidos separadamente, los que
sern usados a travs de sus puertas,
excitando sus entradas y utilizando los
valores que aparezcan en sus salidas
.....
.....
.....
.....
outputn
inputn
subdiseo 3
Diseo jerrquico
modulo A
instancia del
mdulo B
full_adder
half
adder
half
adder
instancia del
mdulo C
otra instancia
del mdulo B
OR
mdulo full_adder
...
instancia de half_adder
...
instancia de half_adder
....
mdulo half_adder
.....
mdulo B
mdulo C
Encapsulamiento de mdulos
El comportamiento interno de un
mdulo puede ser definido mediante
diferentes estilos, y slo puede ser
observado desde el exterior del
mdulo por los efectos que provoca
en la interfase
INTERFASE
Bases de VHDL
PUERTAS
Generalidades
Identificadores
Tipos y objetos
Atributos
Operadores
COMPORTAMIENTO
INTERNO
Es un texto que representa un valor numrico, expresado en la forma de entero (sin punto
decimal), o real (con punto decimal):
enteros (INTEGER): son nmeros positivos y negativos
29 0 -5 999
punto flotante (REAL): deben incluir un punto decimal, y al menos un dgito antes y
uno despus de l.
0.68
Los reales pueden usar notacin exponencial, donde el nmero es seguido por la
letra E (o e) y el exponente (siempre usando base 10)
2.7E-6
myemail@net
2k_efecto
VHDL1993
cod1997_
schematics!
X__FPGAs
digital_design
FLEX_10k
99.99E9
Enteros y reales pueden ser expresados usando una base distinta a 10, entre 2 y 16.
Para ello se indica la base en decimal, un #, el nmero expresado en esa base y otro
#. En los reales el exponente debe ser siempre expresado en decimal
2#0.1#
8#0.4#
12#0.6#
hello_world
3.1415927
Slo pueden contener letras del alfabeto (A hasta Z, a hasta z), los nmeros
decimales (0 a 9) y el caracter underscore o underline (_).
Deben comenzar con una letra del alfabeto.
No pueden terminar con un underscore
No pueden tener dos o ms undescore sucesivos
3.141_592_7
FF,CR,SO,SI,DLE,DC1,DC2,DC3,DC4,NAK,SYN,ETB,CAN,EM,SUB,
ESC,FSP,GSP,RSP,USP,' ','!','"','#','$','%','&',''','(',')','*','+',',','-','.','/',
'0','1','2','3','4','5','6','7','8','9',':',';','<','=','>','?','@','A','B','C','D','E','F',
'G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','[','\',
']','^','_','`','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t',
'u','v','w','x','y','z','{','|','}','~',DEL,
Doble Comilla
B0110_1101
O537 XF5AA
Preguntas
mi-nombre
mi nombre
mi_nombre
mi__nombre
_mi_nombre_
#mi_nombre#
8#21#
2#10.01#
2#1#E3
16#F0_0F#
8#31#
O176
X5F
X0002
1024
1
256.0
0.5
33
un caso muy usual en una matriz o vector (is array ... of)
aunque tambin existe el agrupamiento (is record ...end record;)
de acceso: punteros
Ejemplos de subtipos:
subtype nibble is byte (3 downto 0);
donde los elementos usados para definir los posibles valores del tipo pueden
ser identificadores o caracteres.
A su vez, dado un tipo enumerado pueden definirse subtipos de l como un
rango limitado de las opciones enumeradas
TYPE dia_semana IS (lu,ma,mie,jue,vie,sa,do);
SUBTYPE no_laboral IS dia_semana RANGE sa TO do;
Array de 4 bits
Array de 4 bits
Un array puede tener varias dimensiones, y por ejemplo una memoria RAM de
64 palabras de 7 bits puede definirse como:
TYPE mem64x8 IS ARRAY (
0 TO 7 , 0 TO 63
Filas
Filas
) OF BIT;
Columnas
Columnas
Preguntas
Preguntas y ejercicios
Definir un tipo escalar entero llamado dia_mes que
comprenda los nmeros 1 a 31
Definir un tipo escalar por enumeracion llamado mes, con
los nombres de los 12 meses del ao
Definir un tipo compuesto RECORD capaz de almacenar
fechas
Definir un tipo compuesto RECORD capaz de almacenar
fechas y strings de caracteres
Definir un tipo compuesto tipo ARRAY capaz de ser usado
para definir hasta 10 fechas+nombres
Definir un tipo compuesto RECORD de nombre
complejo compuesto por un elemento real y otro
imaginario (ambos de punto flotante)
Guillermo Jaquenod, 2001
Fuente: ASHENDEN
En VHDL existen cuatro clases de objetos: constant, variable, signal y file, cuya
declaracin se hace en conjunto con una especificacin de tipo
Declaracin de atributos
Un atributo es una caracterstica posible de asociar a un objeto, y
debe tener un tipo especificado en su declaracin. Ejemplo:
-- defino el tipo coordenada
TYPE coord IS RECORD X,Y:INTEGER; END RECORD;
El uso de atributos puede ser til para asignar a una dada seal
ciertas caractersticas requeridas para su posterior sntesis. Por
ejemplo, definir la codificacin a usar para un tipo enumerado
Recordarlos!
Son MUY
usados!
se tiene:
coloresSUCC (amarillo) devuelve azul
coloresPRED (amarillo) devuelve rojo
coloresPOS (amarillo) devuelve 2
Slo para tipos fsicos y discretos
Slo para tipos fsicos y discretos
coloresVAL (4) devuelve verde
coloresLOW devuelve rojo
coloresHIGH devuelve rosa
coloresLENGTH devuelve 7
oscuroLEFT vale azul
oscuroRANGE vale azul TO negro
BASE slo se usa junto con otro atributo!
BASE slo se usa junto con otro atributo!
oscuroBASELEFT vale rojo
oscuroBASERANGE vale rojo TO rosa
Guillermo Jaquenod, 2001
index_rangeLEFT = 21;
index_rangeLOW = 11;
index_rangeASCENDING = FALSE;
index_rangeVALUE (20) = 20;
resistenciaLEFT = 0 ohm;
resistenciaRIGHT = 1E9 ohm;
resistenciaLOW = 0 ohm;
resistenciaHIGH = 1E9 ohm;
resistenciaASCENDING = TRUE;
resistenciaIMAGE (2 kohm) = 2000 ohm;
resistenciaVALUE (5 Mohm) = 5_000_000 ohm;
loglevLEFT = unknown;
loglevLOW = unknown;
loglevASCENDING = TRUE;
loglevVALUE (low) = low;
loglevVAL(1) = low;
Fuente: ASHENDEN
Fuente: ASHENDEN
El usuario puede definir nuevos atributos que pueden ser asociados a cualquier
elemento del lenguaje. Para ello son necesarios dos pasos:
Se define el atributo:
S1 := L1 * L2;
Fuente: ASHENDEN
Y luego preguntar:
Preguntas
Dados los siguientes tipos definir cules son los valores de
los atributos LEFT, RIGHT, LOW, HIGH, RANGE,
LENGTH y ASCENDING de cada uno de ellos
type muestra IS bit_vector (15 DOWNTO 0)
type numeros IS
(0,1,2,3,4,5,6,7,8,9);
VHDL: Operadores
loglevRIGHT = high;
loglevHIGH = high;
loglevIMAGE (undriven) = undriven;
loglevIMAGE (undriven) = 2;
loglevSUCC (unknown) = low;
Y las variables
index_rangeRIGHT = 11;
index_rangeHIGH = 21;
index_rangeIMAGE (14) = 14;
No es vlido hacer:
== XF3;
SRL 3;
XOR B;
+ B;
/= B10010
* D
/ D
Preguntas
vale
vale
vale
vale
vale
vale
vale
Dado el type
numerosSUCC (3)?
numerosRIGHTOF(3)?
numerosLOW?
numerosHIGH?
numerosPOS(3)?
numerosVAL(2)?
numerosASCENDING?
vale
vale
vale
vale
vale
vale
vale
numdwnSUCC (3)?
numdwnLOW?
numdwnHIGH?
numdwnPOS(3)?
numdwnVAL(2)?
numdwnASCENDING?
numdwnSUCC (numdwnHIGH)?
Fuente: Ters
Estructuras de VHDL
Un diseo en VHDL emplea cuatro grandes bloques constructivos:
Entity
Bases de VHDL
Construcciones bsicas:
Entidad
Arquitectura
Package
Configuracin
Un ejemplo en VHDL
DESIGN FILE
a
b
LIBRARY..USE...
LIBRARY..USE...
ENTITY..IS
...
END...;
ARCHITECTURE..OF..IS..
...
BEGIN
...
design unit
END..;
END..;
END..;
END..;
design unit
c
d
ejemplo_1
design unit
design unit
AND
Se define separadamente el
comportamiento desde el
punto de vista externo
(ENTITY) a la realizacin
interna (ARCHITECTURE)
Es posible definir distintas
arquitecturas de un mismo
bloque funcional
Entidades en VHDL
Una entidad (entity) corresponde a la definicin de un diseo a
manera de caja negra, o smbolo, donde slo se declara su interfase:
las conexiones de esa caja (puertas) capaces de transportar
informacin variable entre entidades
valores genricos, capaces de transportar parametros o informacin
esttica (constante) entre entidades
Agregado
Agregado
en VHDL93
en VHDL93
[GENERIC(...);] [PORT(...);]
END [ENTITY] [<identificador>] ;
identificador
identificador
modo
modo
tipo
tipo
Agregado
Agregado
en VHDL93
en VHDL93
Fuente: ALTERA
10
PACKAGE <package_name> IS
Declaracin de Constantes
Declaracin de tipos
Declaracin de seales
Declaracin de subprogramas
Declaracin de Componentes
--y otras Declaraciones
END PACKAGE <package_name> ;
Tipos
Tipos
Escalares
Escalares
De acceso
De acceso
Discretos
Discretos
Boolean
Boolean
FALSE, TRUE
FALSE, TRUE
package STANDARD is
....
type BOOLEAN is (FALSE,TRUE);
type BIT is (0,1);
subtype NATURAL is INTEGER
range 0 to INTEGERHIGH;
subtype POSITIVE is INTEGER
range 1 to INTEGERHIGH;
type BIT_VECTOR is array (NATURAL range <>)
of BIT;
subtype DELAY_LENGTH is TIME
range 0 fs to TIMEHIGH;
type TIME is range <....> units fs; ps = 1000 fs;
ns = 1000 ps; us = 1000 ns; ms = 1000 us;
sec = 1000 ms; min = 60 sec; hr = 60 min;
end units;
....
end package STANDARD;
Natural
Natural
Positive
Positive
Agregados
Agregados
en VHDL-93
en VHDL-93
Enteros
Enteros
Fsicos
Fsicos
Enumerados
Enumerados
Carcter
Carcter
Bit
Bit
0,1
0,1
Archivos
Archivos
Punto
Punto
flotante
flotante
Compuestos
Compuestos
Records
Records
Arrays
Arrays
Reales
Reales
Strings
Strings
Bit-Vector
Bit-Vector
Severity Level
Severity Level
Tiempo
Tiempo
fs,ps,ns,us,ms,sec,min,hr
fs,ps,ns,us,ms,sec,min,hr
Fuente: ASHENDEN
PACKAGE filt_cmp IS
TYPE state_type IS (idle, tap1, tap2, tap3, tap4);
COMPONENT acc
port(xh : in std_logic_vector(10 downto 0);
clk, first: in std_logic;
yn : out std_logic_vector(11 downto 4));
END COMPONENT;
FUNCTION compare (variable a , b : integer)
RETURN boolean;
END PACKAGE filt_cmp;
PACKAGE BODY filt_cmp IS
FUNCTION compare (variable a,b: integer) IS
VARIABLE temp : boolean;
Begin
If a < b then temp := true ;
else
temp := false ;
end if;
RETURN temp ;
END compare ;
END PACKAGE BODY filt_cmp ;
Guillermo Jaquenod, 2001
Declaracin
Declaracin
del Package
del Package
Cuerpo del
Cuerpo del
Package
Package
Fuente: ALTERA
11
La Library IEEE
std_logic_1164:
tipos STD_LOGIC, STD_LOGIC_VECTOR y overload de las
funciones relacionadas con estos tipos
std_logic_arith:
overload de funciones aritmticas, de conversin, y los tipos SIGNED
y UNSIGNED
std_logic_signed:
funciones aritmticas para STD_LOGIC_VECTOR con signo
std_logic_unsigned:
funciones aritmticas para STD_LOGIC_VECTOR sin signo
Pero adems existe la llamada Working Library, indicada por WORK, que
es aquel directorio donde el diseo actual est siendo procesado
C:\MAXPLUS2\VHDL93
buscar en C:\MAXPLUS2\VHDL93\IEEE\
Guillermo Jaquenod, 2001
Interpretacin de X y de Z
El package IEEE.Std_logic_1164
Entidad E1
Entidad E2
Arq1
Arq2
Arq3
Arq1
Entidad E3
Arq2
Arq1
Arq2
Arq3
12
Concurrencia y Secuencialidad
Seales y Variables
Sentencias de asignacin
Secuenciales
Declaracin de variables
Asignacin a variables
Sentencia IF..THEN..ELSE
Sentencia CASE
Sentencia LOOP
Sentencia RETURN
Sentencia NULL
Sentencia WAIT
temp
process
process
signals
Asignacin a seales
Declaracin de tipos y
constantes
Declaracion de atributos de
seales
Invocacin a funciones y
procedimientos
Sentencia ASSERT
Retardos (AFTER)
signals
Concurrentes y
secuenciales
Concurrentes
Declaracin de seales
Sentencia WHEN..ELSE
Sentencia WITH..SELECT
Sentencia PROCESS
Sentencias BLOCK
Bases de VHDL
signals
Asignaciones concurrentes
BEGIN
qa <= r or t;
qb <= (qa and not(g xor h));
r
OR
qa
qb
XOR
Fuente: ALTERA
13
qa <= r or t ;
qb <= (qa and not(g xor h));
r
OR
qa
procesos
implcitos
t
AND
qb
XOR
a WHEN sela = 1
ELSE b WHEN selb = 1
ELSE c;
proceso implcito
b
selb
sela
Porqu?
cada salida es
funcin combinatoria
de 3 entradas
requiere ocho
macroceldas, una
por cada salida
Fuente: DUECK
ENTITY prioriencod IS
PORT (
max,med,min : IN BIT;
priori : OUT INTEGER
RANGE 0 TO 3);
END ENTITY prioriencod;
0
1
y3
-- codificador de prioridad
y2
y1
sel1
y0
sel0
ARCHITECTURE usowhen
OF prioriencod IS
BEGIN
priori <= 3 WHEN max = '1'
ELSE 2 WHEN med = '1'
ELSE 1 WHEN min = '1'
ELSE 0;
END ARCHITECTURE usowhen;
q(2)
q(1)
q(0)
14
a
b
c
d
sel
00
01
10
?
y(0)
codbcd
y(1)
y(2)
y(3)
X"1",
X3",
X5",
X7",
X9",
a
b
c
d
e
f
g
Quines
son los
OTHERS?
seg(3);
1,
3,
5,
7,
9,
WHEN
WHEN
WHEN
WHEN
WHEN
d(0)
d(1)
d(2)
d(3)
d(4)
d(5)
d(6)
d(7)
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
y
sel(2)
sel(1)
sel(0)
0));
ENTITY mux2a1_sig IS
PORT ( a,b,sel:IN STD_LOGIC;
z : OUT STD_LOGIC;
END ENTITY mux2a1;
ARCHITECTURE logic OF mux2a1 IS
BEGIN
-- selected signal assignment
WITH sel SELECT
z <= a WHEN '0',
b WHEN '1',
'0' WHEN OTHERS;
END ARCHITECTURE logic;
15
RIGHT
1
Bases de VHDL
enttest: BIT_VECTOR (0 TO 2)
bit(0)
bit(1)
bit(2)
bit(2)
bit(1)
bit(0)
sale_UP: BIT_VECTOR (0 TO 2)
bit(0)
bit(1)
bit(2)
bit(2)
bit(1)
bit(0)
pasando de la concurrencia a la
secuencialidad:
los procesos
las variables
las asignaciones secuenciales
[label:] PROCESS
BEGIN
[(nombre de seal/es)]
[IS]
16
equivale a
PROCESS (a,b,c,x,y) IS BEGIN
IF x=1 THEN q<=a; ELSIF y=1 THEN q<=b; ELSE q<=c; END IF;
END PROCESS;
Ejemplos de WAIT
a,b,c,d: eventos para WAIT ON
a,b,c,d: eventos para WAIT ON
a,c: eventos para WAIT UNTIL
a,c: eventos para WAIT UNTIL
e,f,g,h: eventos para WAIT FOR
e,f,g,h: eventos para WAIT FOR
X
a b
X2
PROCESS BEGIN
WAIT ON X; X3 <= NOT(X);
END PROCESS;
X3
PROCESS BEGIN
WAIT UNTIL X=1; X4 <= NOT(X);
END PROCESS;
X4
PROCESS BEGIN
X5 <= NOT(X);
WAIT UNTIL X=1 FOR 10 ns;
END PROCESS;
X5
No sintetizable!!!
No sintetizable!!!
Guillermo Jaquenod, 2001
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY wdff IS PORT (
d,reloj : IN std_logic;
q : OUT std_logic );
END ENTITY wdff;
ARCHITECTURE usowait OF wdff IS
BEGIN
PROCESS
BEGIN
WAIT UNTIL reloj='1';
q <= d;
END PROCESS;
END ARCHITECTURE usowait;
10 20 30 40
MAX+plusII slo
soporta una instruccin
wait until para una seal
simple
Otras variedades de wait
(ej: wait on) o seales
complejas no son
toleradas para la sntesis
...no hay lista de sensibilidad!
X1
PROCESS BEGIN
X2 <= NOT(X); WAIT ON X;
END PROCESS;
50 60 70
Fuente: SJOHOLM
17
PROCESS
VARIABLE v1,v2: INTEGER := 0; -- valor inicial
BEGIN
v1 := v1 + 1; -- luego de esta sentencia v1 vale 1
v2 := v1 + 1; -- luego de esta sentencia v2 vale 2
...
END PROCESS;
PROCESS
SIGNAL s1, s2,
BEGIN
s1 <= s3;
s1 <= s2;
WAIT FOR 1 ns;
s2 <= s3;
s2 <= s1;
WAIT FOR 1 ns;
END PROCESS;
s3;
--
IF
<expressin> THEN <sentencia>;..; <sentencia>;
ELSIF <expressin> THEN <sentencia>;..; <sentencia>;
ELSE
<sentencia>; ..; <sentencia>;
END IF;
Por ejemplo:
SIGNAL data_alu:INTEGER;
PROCESS BEGIN
IF
nclr=0 THEN data_alu <= 0;..;..;..;
ELSIF pass=1 THEN data_alu <= data_A;..;..;..;
ELSE ..;..;..;
END PROCESS;
IF - THEN: Ejemplo
PROCESS(a,b,r,s,t)
BEGIN
IF a = 1 THEN
q <= r;
ELSIF b = 1 THEN q <= s;
ELSE
q <= t;
END IF;
END PROCESS;
Proceso implcito
q <= (a and r)
or ((not a) and b and s)
or ((not a) and (not b) and t)
cada salida es
funcin combinatoria
de 3 entradas
requiere ocho
macroceldas, una
por cada salida
18
triout
PROCESS(current_state,x,y,z)
BEGIN
IF current_state = (s1 | s3 | s4)
THEN output1 <= x;
ELSE output1 <= 0;
END IF;
IF current_state = (s0 | s2 | s5)
THEN output2 <= y;
ELSE output2 <= 0;
END IF;
IF current_state = (s6 | s7 | s8)
THEN output3 <= z;
ELSE output3 <= 0;
END IF;
output3 = z and
END PROCESS;
PROCESS(current_state,x,y,z)
Tmese el ejemplo
BEGIN
siguiente, donde se sabe
output1 <= 0;
que las salidas output(i)
output2 <= 0;
son mutuamente
output3 <= 0;
excluyentes
IF current_state = (s1 | s3 | s4)
Para calcular output3 se
THEN output1 <= x;
chequea que s6..s8 sean
ELSIF current_state = (s0 | s2 | s5)
verdaderas pero tambin
THEN output2 <= y;
que s1..s5 sean falsas
ELSIF current_state = (s6 | s7 | s8)
THEN output3 <= z;
ELSIF causa el uso de lgica innecesaria!
END IF;
...
END PROCESS;
Fuente: ALTERA
Cmo corregir el
ejemplo previo?
Usando para cada
salida sentencias
IF..THEN separadas ,
para evitar la sntesis de
codificadores de
prioridad
sto reduce la logica, el
cableado, y aumenta la
performance
(s6 or s7 or s8)
Fuente: ALTERA
ASIGNACIONES
MULTIPLES: Si a una
misma seal se le asignan
dos valores dentro de un
mismo bloque secuencial
en un proceso, vale la
ltima asignacin!
No hay colisin y no es
necesaria ninguna
resolucin
Y el cdigo puede
ser ms simple
PROCESS(current_state,x,y,z)
BEGIN
output1 <= 0;
output2 <= 0;
output3 <= 0;
IF current_state = (s1 | s3 | s4)
THEN output1 <= x;
END IF;
IF current_state = (s0 | s2 | s5)
THEN output2 <= y;
END IF;
IF current_state = (s6 | s7 | s8)
THEN output3 <= z;
END IF;
END PROCESS;
c, d)
01
10
11
sel
2
<=
<=
<=
<=
a;
b;
c;
d;
a
b
sel0
sel1
c
d
00
b
c
d
requiere slo 2
macroceldas
operando en
Cascade Chain
19
ENTITY case_rango IS
PORT (a: IN INTEGER RANGE 0 TO 30;
b: OUT INTEGER RANGE 0 TO 3);
END ENTITY case_rango;
s2
s1
s0
y7
y6
y5
y4
y3
y2
y1
y0
msb sal7
sal6
..
sal5
lsb
sal4
sal3
sal2
sal1
ena sal0
Quines
son los
OTHERS?
a
b
c
d
sel
No induce prioridades
[label:] LOOP
<sentencia>;...;<sentencia>;
END LOOP label;
00
01
10
11
PROCESS(sel, a, b, c, d)
BEGIN
CASE sel IS
WHEN 00 => q <= a;
WHEN 01 => q <= b;
WHEN 10 => q <= c;
WHEN OTHERS => q <= d;
END CASE;
END PROCESS;
Proceso Explcito
Fuente: ALTERA
20
Structural?
Fuente: ALTERA
ENTITY and_parametrizada IS
GENERIC (retardo: TIME := 10 ns;
fanin: POSITIVE := 4);
PORT (entradas : IN BIT_VECTOR (fanin-1 DOWNTO 0);
salida: OUT BIT);
entradas(n-1)
END ENTITY and_parametrizada;
entradas(n-2)
entradas(n-3)
------------ARCHITECTURE ejemplo OF and_parametrizada IS
------------BEGIN
entradas(1)
proceso: PROCESS (entradas)
entradas(0)
VARIABLE tempo: BIT := 1;
BEGIN
FOR i IN entradasLENGTH-1 DOWNTO 0 LOOP
IF entradas(i) = 0 THEN tempo := 0; END IF;
END LOOP;
salida <= tempo AFTER retardo;
END PROCESS proceso;
END;
salida
Behavioral o
Adems, dentro del LOOP esta variable local deshabilita cualquier otra
posible variable de igual nombre
k := 7; m := 4;
ex2: FOR k IN 1 TO 15 LOOP
m := k;
END LOOP ex2;
-- ac k sigue valiendo 7 y m vale 15
21
Bases de VHDL
Inferencia de
elementos de memoria
(voluntaria e involuntaria)
GATE
ARCHITECTURE concu OF latchconcu IS
BEGIN
Qu pasa si a=0?
c <= b when a='1';
el valor previo se conserva --> se crea un latch
END ARCHITECTURE concu;
i0
i1
Cul es el riesgo de
usar LATCHES al
usar FLEX10K?
data
enable
Cascade In
Carry In
Data1
Data2
Data3
Data4
PRN
4 inp.
LUT
ENA
CLRN
Cascade Out
Fuente: ALTERA MAX+plus II HELP
Ejemplos: latches
deseo este
circuito... pero
funciona
como se
desea????
Si val es una
seal...cuando se
actualiza?
R: al fin del proceso
Como logro que la
actualizacin sea
inmediata?
R: usando una
VARIABLE
Fuente: ALTERA
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY cmb_var IS
PORT(i0, i1, a : IN BIT;
q : OUT BIT);
END ENTITY cmb_var;
ARCHITECTURE logic OF cmb_var IS
BEGIN
PROCESS(i0, i1, a)
VARIABLE val : INTEGER RANGE 0 TO 1;
BEGIN
IF (a = '0') THEN val := val;
ELSE val := val + 1;
END IF;
CASE val IS
WHEN 0 => q <= i0;
WHEN 1 => q <= i1;
END CASE;
END PROCESS;
END ARCHITECTURE logic;
i0
i1
deseo este
circuito... pero
funciona
como se
desea????
ahora se ha logrado
que val se actualice
en el momento en
que es le asignado
un valor,
pero.....funciona???'
0'
Fuente: ALTERA
22
val
i0
i1
0
a
la forma de uso de
val fuerza que se
cree un fedback
combinatorio!!!!
PROCESS BEGIN
WAIT UNTIL rising_edge (reloj);
q <= d;
END PROCESS;
Muy usada
Muy usada
Necesita IEEE_1164
Necesita IEEE_1164
yyseales STD_LOGIC
seales STD_LOGIC
PROCESS BEGIN
WAIT UNTIL reloj=1;
q <= d;
Slo si no se necesita RESET/SET
Slo si no se necesita RESET/SET
END PROCESS;
asincrnicos
asincrnicos
Fuente: ALTERA
clk
Cascade In
PRN
4 inp.
LUT
ENA
CLRN
Cascade Out
Fuente: SJOHOLM
i1
i0
Fuente: CHANG
Fuente: CHANG
23
d
ARCHITECTURE maxpld OF reginf IS
BEGIN
PROCESS
BEGIN
WAIT UNTIL clk = '0';
q <= d;
END PROCESS;
END maxpld;
clk
q
clk
clr
Quin tiene
prioridad?
clk o clr?
Fuente: ALTERA
pre
d
clk
q
cl
RETURN BOOLEAN;
definida en IEEE.std_logic_1164 junto a falling_edge()!!
Fuente: ALTERA
Chip
wide
RESET
PRN
D Q
CLRN
LABCTL1
(asyn load)
DATA3
(data)
LABCTL2 (clear)
Chip wide RESET
LABCTL1
LABCTL2
PRN
D Q
CLRN
d
enable
clk
PRN
D Q
ENA
CLRN
d
enable
PRN
D Q
CLRN
clk
Fuente: ALTERA
24
sel(0)
sel(1)
d
1
gate
sel(2)
clrn
sel(3)
Fuente: ALTERA
ENA
CLRN
clr
ENA
CLRN
clr
ENA
CLRN
clk
a
a, b y q se
actualizan al
mismo tiempo,
en el flanco de
subida de clk
clk
D
D QQ
clk
clk
Fuente: ALTERA
Fuente: ALTERA
D
D QQ
D
D QQ
clk
Fuente: ALTERA
clrn
ENTITY reg1 IS
PORT (d,clk: in BIT;
q
: out BIT);
END ENTITY reg1;
q
Q
clk
ena
Fuente: ALTERA
clk
Fuente: ALTERA
25
D Q
d se copia en a, y a en b, en forma
secuencial, y slo b es copiado en
q recin al fin del PROCESS
Fuente: ALTERA
D
D QQ
b q
clk
clk
La copia de d en a y de a
en b se hace recin al final
del proceso.
En cambio la copia de b en
q es concurrente.
Fuente: ALTERA
D Q
ENTITY regx IS
(reloj:IN STD_LOGIC; s:OUT STD_LOGIC);
END ENTITY regx;
c(0)
clk
D Q
clk
D
D QQ
c(1)
clk
D Q
reloj
Fuente: ALTERA
clk
ENTITY reg1 IS
PORT (d,clk:IN BIT;
q:OUT BIT);
END ENTITY reg1;
a q
b
clk
ENTITY reg1 IS
PORT (d,clk:IN BIT;
q:OUT BIT);
END ENTITY reg1;
clk
Porqu, si la comparacin
es con 11, la compuerta
en rojo detecta 10?
Fuente: ALTERA
Fuente: ALTERA
Porqu defino el
rango de cnt, en
vez de slo poner
INTEGER?
26
STD_LOGIC;
clk
ld
Para qu se
define
sentido?
up_dn
ARCHITECTURE a OF counter IS BEGIN
clk
PROCESS (clk)
ld
VARIABLE cnt : INTEGER RANGE 0 TO 255;
VARIABLE sentido : INTEGER;
BEGIN
IF (up_dn='1') THEN sentido :=1; ELSE sentido :=-1; END IF;
IF (clk = '1') THEN
IF ld='0' THEN cnt:= d; ELSE cnt:= cnt + sentido ; END IF;
END IF;
q <= cnt;
END PROCESS;
END a;
Guillermo Jaquenod, 2001
clear
clk
PROCESS (clk)
VARIABLE cnt : INTEGER RANGE 0 TO 255;
VARIABLE sentido : INTEGER;
BEGIN
IF (up_dn='1') THEN sentido:= 1;
ELSE sentido:= -1;
END IF;
IF (clk='1') THEN cnt:=cnt + sentido;
END IF;
q <= cnt;
END PROCESS;
PROCESS (clk)
VARIABLE cnt : INTEGER RANGE 0 TO 255;
BEGIN
IF (clk='1') THEN
IF (up_dn='1') THEN cnt := cnt+1;
ELSE cnt := cnt-1;
END IF;
END IF;
q <= cnt;
END PROCESS;
Usando sentido
q
up_dn
1
clk
-1
+1
+
+
up_dn
clk
STD_LOGIC;
27
Seales
locales
mux_out
a
ARCHITECTURE logic OF clk_per IS
SIGNAL mux_out : STD_LOGIC;
SIGNAL reg : STD_LOGIC;
BEGIN
b
sel
reg
ENA
CLR
N
clr
clr
ENA
CLR
N
VARIABLES ( := )
SEALES ( <= )
clk
clk
q
D
Dada una seal, en VHDL se crea un driver que excita esa seal en diferentes
ocasiones:
al ejecutar una sentencia de asignacin, dentro o fuera de un proceso, o en un procedure
sentencia
utilidad
SCOPE
BEHAVIOR
destino := fuente;
Actualizada
inmediatamente
al instanciar un componente
Donde cada driver est asociado a una lista con el valor corriente y los valores
futuros a asignar a esa seal (cola de transacciones)
Por ejemplo, si se ejecutan los siguiente procesos:
Fuente: ALTERA
tipo_no_resuelto;
tipo_no_resuelto;
ENA1
SALIDA
s2
Esto crea un conflicto(colisin) donde 2 drivers excitan la misma seal, que debe
ser resuelto mediante una funcin de resolucin, que toma a s1,s2 como vector
de entrada y decide el valor de a.
s1
ENA2
B
L!!
MA
ENTITY SIRES IS
PORT (A,ENA1,B,ENA2: IN STD_LOGIC;
SALIDA: OUT STD_LOGIC);
END;
ARCHITECTURE X OF SIRES IS BEGIN
SALIDA <= A WHEN ENA1=1 ELSE Z;
SALIDA <= B WHEN ENA2=1 ELSE Z;
END X;
ENA1
A
SALIDA
!!
ok
ENA2
B
Fuente: BAKER
28
Overload de Operadores
Bases de VHDL
Otras estructuras y sentencias:
Overload de Operadores
Arrays
Subprogramas
Generate
Assert y Report
NULL
Buffers y buses TriState
Guillermo Jaquenod, 2001
ENTITY overload IS
PORT ( a
: IN STD_LOGIC_VECTOR (3 DOWNTO 0);
b
: IN STD_LOGIC_VECTOR (3 DOWNTO 0);
sum : OUT STD_LOGIC_VECTOR (3 DOWNTO 0));
END ENTITY overload;
ARCHITECTURE ejemplo OF overload IS
BEGIN
sumador: PROCESS (a, b)
BEGIN
sum <= a + b;
END PROCESS sumador;
END ARCHITECTURE ejemplo;
Se incluye el
package donde
se describen los
nuevos
operadores
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.ALL;
Asignaciones a arreglos
Las asignaciones a un vector unidimensional (vector_a:std_logic_vector) pueden
realizarse a travs de la indicacin de todo sus elementos como un string:
vector_a <= 10011;
En VHDL93 existen strings de bit predefinidos que pueden ser usados para
asignar valores a objetos tipo bit_vector:
a <= B11010; -- Binario
c <= X1F2D; -- Hexadecimal
b <= O765;
d <= 381;
-- Octal
-- Decimal
En VHDL87, si se desea usar strings de bit para inicializar objetos que no son
BIT_VECTOR (ej: STD_LOGIC) deben invocarse funciones de conversin:
incluir std_logic_unsigned
incluir std_logic_unsigned
y std_logic_1164)
y std_logic_1164)
29
4 Columnas
4 Columnas
De igual modo, luego de haber definido el valor de ciertos elementos de un vector, puede
usarse others para completar los restantes:
3 Filas
3 Filas
);
AGGREGATE
AGGREGATE
Asi como a elementos de un array pueden serle asignados elementos de otro array, los
valores de todo un array pueden ser asignados a otro array de igual dimensin en una
nica asignacin:
TYPE nibble IS ARRAY (0 TO 3) OF BIT;
.....
El valor de todo el array b es
El valor de todo el array b es
VARIABLE a,b : nibble;
copiado en todo el array a
copiado en todo el array a
....
a := b;
Dos arrays, o un array y un elemento aislado del mismo tipo que los elementos
del array pueden ser concatenados usando el operador & (en cuyo caso el
objeto al que se asigna el resultado debe tener el largo correcto!).
Es posible agregar un carcter a un objeto tipo STRING o unir dos STRINGs
De igual modo, es posible concatenar:
La suma
La suma
SubArray
SubArray
Fuente: BAKER
30
Condicional
label: IF <expresin booleana> GENERATE
[declaraciones...; BEGIN]
sentencia; ..; sentencia;
END GENERATE;
Atencin: IF
Atencin: IF
GENERATE no tiene
GENERATE no tiene
ELSE GENERATE
ELSE GENERATE
como el AHDL!
como el AHDL!
Fuente: DUECK
ASSERT y REPORT
Las sentencias ASSERT/REPORT son de utilidad para el
chequeo de errores y el debug. Su sintaxis es:
[ASSERT <condicin booleana>] REPORT <mensaje>
SEVERITY <nivel de gravedad>;
ac se activa chk_thold
datos
reloj
tsetup
thold
La sentencia NULL
En VHDL existe la
sentencia NULL para
indicar que no se hace
nada, y sirve para
realizar una
especificacin ms
completa.
Por ejemplo, para indicar
que una de las
aternativas de un CASE
no debe hacerse nada.
violacion
de tsetup
relojd
violacion
de thold
Es como la sentencia
vaca (;) del C
ac se activa chk_thold
31
VHDL93 define 6 operandos de shift, llamados SLL, SRL, SLA, SRA, ROL, ROR, donde
el operando izquierdo debe ser un array de BIT o BOOLEAN, y el derecho un INTEGER
que indica la cantidad de desplazamientos a realizar. Notese que los desplazamientos se
refieren a izquierda o derecha y no al valor del ndce de rango, por lo que no importa si el
elemento a desplazar es de rango (xx TO yy) o (xx DOWNTO yy)
xLEFT
SLL
xRIGHT
SLA
FALSE
0
SRL
FALSE
0
Shifts lgicos
Shifts aritmticos
ROL
SRA
SLL
FALSE
0
B10011010 SLL 3 = B11010000
B10011010 SLL 3 = B11010000
B00001000 SLL -1 = B00000100
B00001000 SLL -1 = B00000100
SRL
FALSE
0
B10011010 SRL 3 = B00010011
B10011010 SRL 3 = B00010011
B00001000 SRL -1 = B00010000
B00001000 SRL -1 = B00010000
ROR
SLL -3 es lo mismo
que SRL 3!!
Rotaciones
Guillermo Jaquenod, 2001
SLA
SRA
En el SHIFT ARITMTICO se
conserva el valor del sitio que queda
vacante (LEFT en SRA y RIGHT en
SLA)
ROR
SLA -3 es lo mismo
que SRA 3!!
ROL -3 es lo mismo
que ROR 3!!
ENTITY tri_state_buffs IS
PORT (a,oe : IN std_logic;
b1,b2: OUT std_logic);
END ENTITY tri_state_buffs;
ARCHITECTURE x
OF tri_state_buffs IS
BEGIN
b1 <= 'Z' WHEN oe = '0
ELSE a ;
WHEN oe = '1
ELSE 'Z' ;
END ARCHITECTURE x;
b1
oe
a
oe
b2
Fuente: ALTERA
salida
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
datos
b2 <= a
ROL
clk
oe
ARCHITECTURE bts OF mi74374 IS
SIGNAL a:std_logic_vector (7 DOWNTO 0); --FlipFlop internos
BEGIN
registros: PROCESS (clk)
BEGIN
Forma rpida de
Forma rpida de
asignar el mismo valor
IF clk=1' THEN a <= datos; end if;
asignar el mismo valor
a todo el vector
END PROCESS registros;
a todo el vector
tri: PROCESS (oe,a)
BEGIN
IF oe = '0' THEN salida <= (others => 'Z');
ELSE
salida <= a;
END IF;
END PROCESS tri;
END ARCHITECTURE bts;
32
PROCEDURE
PARAMETERS
ARCHITECTURE
begin
...
end
Su formato es:
FUNCTION <nombre de funcin> (<parmetros de entrada>)
RETURN <tipo de datos> IS
{declaraciones locales: tipos,constantes,variables,..}
BEGIN
{functionalidad}
PARAMETERS
RETURN VALUE
Fuente: ALTERA
Una funcion se dice pura (pure) si al ser llamada con identicos parametros
devuelve igual valor de retorno; sino (P.Ej: NOW) se dice impure.
33
Prototipos
Prototipos
(3
(3
(6
(6
DOWNTO
DOWNTO
DOWNTO
DOWNTO
0);
0);
0);
0));
Bases de VHDL
Descripcin de la
Descripcin de la
FUNCTION dentro de
FUNCTION dentro de
una arquitectura
una arquitectura
Qu incluye logic_arith.vhd?
Fuente: ALTERA
Definicin de los nuevos tipos UNSIGNED y SIGNED como array (NATURAL range <>)
of STD_LOGIC
Funciones de Conversin CONV_INTEGER, CONV_UNSIGNED, CONV_SIGNED y
CONV_STD_LOGIC_VECTOR (4 funciones en cada caso) para operandos INTEGER,
STD_ULOGIC, UNSIGNED y SIGNED, con retorno INTEGER, UNSIGNED, SIGNED y
STD_LOGIC_VECTOR respectivamente
Funciones ZERO_EXTEND y SIGN_EXTEND para operandos STD_LOGIC_VECTOR,
con retorno STD_LOGIC_VECTOR
Funciones de Overload:
de + y - (24 en cada caso) para operandos UNSIGNED, SIGNED, INTEGER, STD_ULOGIC y
retorno UNSIGNED, SIGNED, y STD_LOGIC_VECTOR
de + unario (4 funciones) para operandos UNSIGNED y SIGNED, con retorno UNSIGNED,
SIGNED, y STD_LOGIC_VECTOR
de - unario y de ABS (2 funciones en cada caso) para operandos SIGNED, con retorno SIGNED, y
STD_LOGIC_VECTOR
de *, <, >, <=, >=, =, y /= (8 funciones en cada caso), para operandos UNSIGNED y SIGNED, con
retorno UNSIGNED, SIGNED, y STD_LOGIC_VECTOR
de SHL y de SHR (2 funciones en cada caso) para operandos UNSIGNED y SIGNED, con retorno
de identico tipo
Fuente: ALTERA
34
Fuente: ALTERA
SIGNED'("0110") representa +6
Por ejemplo:
largo=5 bits
largo=5 bits
largo=6 bits
largo=6 bits
Fuente: SJOHOLM
35
Los operadores aritmticos de suma y resta (+) y (-) permiten un alto nivel de
abstraccin en funciones aritmticas, pues el diseador slo describe qu es
lo que desea (behavior) y el compilador resuelve cmo hacerlo (estructura)
b
sum <= a + b;
COMPILADOR
sum
a
c
ENTITY add_ex1 IS
ENTITY add_ex1 IS
PORT(a,b:IN std_logic_vector(15 DOWNTO 0);
PORT(a,b:IN std_logic_vector(15 DOWNTO 0);
c,d:IN std_logic_vector(15 DOWNTO 0);
c,d:IN std_logic_vector(15 DOWNTO 0);
input:IN std_logic;
input:IN std_logic;
sum:OUT std_logic_vector(15 DOWNTO 0));
sum:OUT std_logic_vector(15 DOWNTO 0));
END ENTITY add_ex1;
END ENTITY add_ex1;
b
d
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
3 inp.
LUT
Fuente: ALTERA
Cascade In
Carry In
Data1
Data2
ENA
CLRN
PRN
D
1 sumador
1 sumador
+
+
2 multiplexer:
2 multiplexer:
ARITMETICO
3 inp.
LUT
PRN
sum
input
2 sumadores
2 sumadores
+
+
1 multiplexer:
1 multiplexer:
b
d
input
a
c
ENTITY add_ex1 IS
PORT(a,b,c,d:IN std_logic_vector(15 DOWNTO 0);
input:IN std_logic;
sum:OUT std_logic_vector(15 DOWNTO 0));
END ENTITY add_ex1;
ENA
CLRN
Data3
Data4
4 inp.
LUT
PRN
D
ENA
CLRN
Cascade Out
3 inp.
LUT
3 inp.
LUT
PRN
D
ENA
CLRN
U/D
COUNTER
3 inp.
LUT
3 inp.
LUT
PRN
D
ENA
CLRN
COUNTER C/CLEAR
Los modos de operacin de los elementos lgicos, en las familias FLEX, ACEX
y APEX, redefinen las conexiones de los recursos internos de cada macrocelda,
de modo de hacer ms eficiente la realizacin de ciertas aplicaciones tpicas.
Fuente: ALTERA
Al disponer una entrada alternativa a Data 3 desde la cadena de Carry (seal Carry_In)
sirve para terminar una suma cuando es necesario tener acceso a la seal Cout de la
etapa ms significativa para su uso por otros circuitos
Permite uso pleno de las cadenas de Cascada y de funciones adicionales como registerpacking.
El uso de register packing, o de flipflops con enable se hace a costa de perder fan-in (Data
4 o Data 1, respectivamente)
Si una funcin se requiere a la vez en forma combinatoria y registrada la celda se
aprovecha al mximo (recordar para el ejemplo de computo paralelo de CRC-16)
Guillermo Jaquenod, 2001
Fuente: ALTERA
36
AnBn
Cascade In
3 inp.
LUT
A1B1
A0B0 Cin
Carry In
Enable
PRN
D
Din
ENA
CLRN
3 inp.
LUT
Carry Out
Cout
Cascade Out
Sn ........... S1
S0
U/D
Load
Cascade In
3 inp.
LUT
PRN
D
ENA
CLRN
3 inp.
LUT
Carry Out
Cascade
Out
Este modo slo se emplea si las cadenas de Carry estn habilitadas. En l cada LE puede
resolver dos funciones simultaneas de Fan-In 3, donde una de las entradas debe venir de
la cadena de Carry, y una de las funciones de salida debe salir hacia la cadena de Carry.
En este modo cada LE puede resolver una etapa de bit de un contador con controles de
LOAD sincrnico, ENABLE y Up/Down.
Fuente: ALTERA
3 inp.
LUT
PRN
D
Din
Clear
Load
ENA
CLRN
3 inp.
LUT
Carry Out
Cascade
Out
En este modo cada LE puede resolver una etapa de bit de un contador con controles
de LOAD y CLEAR sincrnico, y ENABLE.
Si las prioridades se respetan y el uso de Carry-Chains est habilitado, el MAX+plusII
emplea automticamente este modo de operacin
El uso de la cadena de Carry impone restricciones de fitting
CLEAR siempre tiene prioridad sobre LOAD, en tanto que ENABLE puede tener la
mxima o la minima prioridad. Si la especificacin de VHDL no respeta esta prioridad
pueden llegar a ser necesarios dos LEs por etapa
Es importante notar que las prioridades entre ENABLE y LOAD pueden ser conmutadas
(analizar el circuito para ver cmo se hace), pero a su vez tienen prioridad sobre
Up/Down. Si la especificacin de VHDL no respeta esta prioridad pueden llegar a ser
necesarios dos LEs por etapa
Fuente: ALTERA
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 ;
Fuente: ALTERA
LUT
PRN
ENA
CLRN
3 inp.
PROCESS (clk, clrn) BEGIN
UP/DOWN
LUT
IF clrn = '0' THEN count_signal <= 0;
LOAD
ELSIF rising_edge (clk) THEN
IF ena = '1' THEN
LE en modo counter
IF nld = '0 THEN count_signal <= data;
ELSE count_signal <= count_signal + 1;
END IF;
END IF;
ac se modela un circuito donde
END IF;
ena tiene prioridad sobre nld, que
END PROCESS;
coincide con el circuito interno de
count_output <= count_signal;
un LE en modo counter
Guillermo Jaquenod, 2001
37
STD_LOGIC;
d
ARCHITECTURE a OF counter IS BEGIN
PROCESS (clk)
VARIABLE cnt : INTEGER RANGE 0 TO 255;
BEGIN
IF (clk = '1') THEN
IF ld ='0' THEN cnt:= d;
ELSIF enable='1' THEN cnt:= cnt + 1;
END IF;
END IF;
Carry In
q<=
cnt;
Enable
END PROCESS;
END a;
Aprovecha
el modo
Counter?
ld
3 inp.
LUT
PRN
D
ENA
CLRN
3 inp.
LUT
Carry Out
up_dn
ARCHITECTURE a OF counter IS BEGIN
q
PROCESS (clk)
clk
VARIABLE cnt : INTEGER RANGE 0 TO 255;
VARIABLE sentido : INTEGER;
BEGIN
IF (up_dn='1') THEN sentido:= 1; ELSE sentido:= -1; END IF;
IF (clk = '1') THEN
IF enable = '1' THEN cnt := cnt + sentido ; END IF;
END IF;
Carry In
q <= cnt;
Cascade In
Enable
3 inp.
END PROCESS;
LUT
END a;
Din
Cascade
Out
U/D
Load
Guillermo Jaquenod, 2001
enable
clear
clk
Carry Out
Cascade Out
PRN
ENA
CLRN
3 inp.
LUT
Counter?
enable
Din
enable
clk
Clear
Load
STD_LOGIC;
Aprovecha
el modo
Counter?
38
Fuente: ALTERA
Fuente: ALTERA
Bases de VHDL
Diseo de
mquinas de estado
39
Ejemplos: FSMs
ENTITY state_machine IS PORT(clk, input, reset: IN STD_LOGIC;
output: OUT STD_LOGIC);
END state_machine;
ARCHITECTURE a OF state_machine IS
TYPE STATE_TYPE IS (s0,s1); SIGNAL state: STATE_TYPE;
BEGIN
PROCESS (clk,reset) BEGIN
IF reset = '1' THEN state <= s0;
s0/0
ELSIF (clk'EVENT AND clk = '1') THEN
CASE state IS
dont
WHEN s0=> state <= s1;
1
care
WHEN s1=> IF input='1' THEN state <= s0;
ELSE state <= s1; END IF;
END CASE;
s1/1
END IF;
END PROCESS;
output <= '1' WHEN state = s1 ELSE '0';
0
END a;
Fuente: ALTERA
40
el flanco se
engancha ac
e1
e8
e3
e7
e2
e6
e4
e5
rxd
rxd
edge
detect
rxck
recuperador
de reloj
Bloque
combinatorio
Cmputo
del
estado
siguiente
Cmputo
de las
salidas
Salidas
Entradas
MOORE
Las salidas son funcin combinatoria slo
del estado actual (pueden presentar
glitches debido al skew del registro de
estados o a caminos de propagacin)
Es facil de codificar en VHDL
Las ecuaciones de las salidas son de
menor fanin y ms fciles de rutear
Suelen requerir ms estados que una
mquina MEALY equivalente
Guillermo Jaquenod, 2001
Cmputo
del
estado
siguiente
memoria
reloj
MOORE
Guillermo Jaquenod, 2001
Registros
de estado
Entradas
Registros
de estado
Cmputo
de las
salidas
E(k+1)=EF=f(ent{},EA)
SAL{} = g(E(k))
Entradas
Salidas
MEALY
Cmputo
del
estado
siguiente
Registros
de estado
Fuente: ALTERA
SAL{} = g(E(k),ent{})
E(k)=EA
MEALY
ent{}
Cmputo
de las
salidas
Salidas
41
Entradas
Cmputo
de las
salidas
Cmputo
del estado
siguiente
Registros
de salidas
Registros
de salidas
Cmputo
del estado
siguiente
Cmputo
de las
salidas
Salidas
Salidas
Salidas
Registros
de salidas
Cmputo
de las
salidas
Registros
de estado
Entradas
Registros
de estado
Cmputo
del estado
siguiente
Registros
de estado
Las Redes de Petri (Petri Nets o PN) son un formalismo apto para la
descripcin de Linked State Machines, pues permiten describir
procesos que interactan y se sincronizan, al modo data flow.
Son grafos dirigidos, en los que los vrtices son llamados lugares (y
estn asociados al estado de la red) y las aristas son llamadas
transiciones (y estn asociadas a los posible eventos en la red).
PROCESO 2
C4
L1
L8
C3
L3
C1
C2
*
L4
L5
PROCESO 1
C5
L6
*
C6
Tokens
Tokens
C7
Condiciones
Condiciones
L2
Transiciones
Transiciones
C8
L7
Lugares
Lugares
Bases de VHDL
Herramientas para
el diseo jerrquico
Componente 2
(Behavioral)
Counters
Adders
State Machines
Counters
Adders
State Machines
Componente n
(Behavioral)
......
Counters
Adders
State Machines
Fuente: ALTERA
42
Una jerarqua tipo rbol (diseo Top Down) es una mejor solucin
Nivel TOP(Estructural)
Nivel 1
Nivel 1
Nivel 2
Nivel 3
Nivel 2
Nivel 3
Nivel 3
Nivel 2
Nivel 3
Nivel 3
Nivel 2
Nivel 3
Nivel 3
.
.
.
.
Nivel 3
Fuente: ALTERA
GLOBAL_STYLE=NORMAL
GLOBAL_STYLE=NORMAL
ASSIGN TIMING REQ
ASSIGN TIMING REQ
FMAX=35MHz
FMAX=35MHz
Nivel 1
Nivel 2
Nivel 2
Nivel 3
Nivel 3
Nivel 3
Counter
State
Machine
Adder
LFSR
STYLE=NORMAL
STYLE=NORMAL
STYLE=FAST
STYLE=FAST
STYLE=FAST
STYLE=FAST
ASSIGN CLIQUE
ASSIGN CLIQUE
Fuente: ALTERA
bottom_a.vhd
entity-architecture bottom_a
bottom_b.vhd
entity-architecture bottom_b
Fuente: ALTERA
mid_b.vhd
entity-architecture mid_b
component bottom_a
component bottom_b
mid_a.vhd
entity-architecture mid_a
component bottom_a
Fuente: ALTERA
43
over SONET (POS) Controller, SONET Interface, ATM Receive Processor, Generador de
PCI: 32bit/33MHz, 32bit/66MHz, 64bit 66MHz Master, Target, ambos, Bridge, Arbiter
Microprocesadores: 49410, 8051, RAW8051, 8052, 2901, 2910, 6502, Z80, 6402, 6850,
8237,8251,8254, 8255, 8259, 16450, 165550, 6850,29116, SDRAM, DMA, PowerPC
Otros: CAN, IEEE1394, IEEE1284, I2C, DAI (Digital Audio Interface), USB
Guillermo Jaquenod, 2001
tonos (DTMF, call progress, etc.), UTOPIA Level_2, 10/100 Ethernet MAC, Cell
USE lpm.lpm_components.ALL;
declaracin usando
declaracin usando
un Package
un Package
ENTITY practica IS
GENERIC (prescaler_size: INTEGER := 23;...)
PORT ( clk: IN STD_LOGIC;.);
no es necesario declarar al
END ENTITY practica;
no es necesario declarar al
componente en la arquitectura
componente en la arquitectura
ARCHITECTURE a OF practica IS
SIGNAL conta: STD_LOGIC_VECTOR (0 TO prescaler_size-1);
invocacin
invocacin
BEGIN
prescaler : LPM_COUNTER -- instanciacin del componente
GENERIC MAP (LPM_WIDTH => prescaler_size)
PORT MAP (clock => clk, q => conta);
Guillermo Jaquenod, 2001
44
Declaracin del
Declaracin del
ARCHITECTURE tolleab_arch OF tolleab IS
Componente
Componente
COMPONENT tollv
PORT( clk : IN STD_LOGIC;
cross,nickel,dime, quarter:IN STD_LOGIC;
green,red:OUT STD_LOGIC;
sout:OUT STATE_TYPE;
Asociacin
Asociacin
state_in:IN STATE_TYPE);
Posicional
Posicional
END COMPONENT;
BEGIN
u1 : tollv PORT MAP ( tclk, tcross, tnickel, tdime,
tquarter, tgreen, tred,
tsout, tstate);
Invocacin del
Invocacin del
Componente
Nombre de
Componente
Nombre de
la Instancia
la Instancia
Fuente: ALTERA
cin
a
b
sum
Fuente: DUECK
Ejemplos: sumador/restador
ENTITY subadd4 IS PORT(
sub: IN BIT; a,b: IN BIT_VECTOR(4 downto 1);
c4: OUT BIT; sum: OUT BIT_VECTOR(4 downto 1));
END subadd4;
ARCHITECTURE adder OF subadd4 IS
COMPONENT full_add PORT(a,b,c_in: IN BIT; c_out,sum : OUT BIT);
END COMPONENT;
SIGNAL c: BIT_VECTOR (4 downto 0);
SIGNAL b_comp: BIT_VECTOR (4 downto 1);
uso que
BEGIN
A-B = A + /B + 1
c(0) <= sub;
adders: FOR i IN 1 to 4 GENERATE
b_comp(i) <= b(i) xor sub;
adder: full_add PORT MAP (a(i),b_comp(i),c(i-1),c(i),sum(i));
END GENERATE;
c4 <= c(4);
END adder;
Fuente: DUECK
45
1 etapa: FANOUT=2
sali(2N-1..0)
entra
Bases de VHDL
Uso de primitivas y LPMs de ALTERA
El hecho que estas libraries describan diseos optimizados por ALTERA para
sus distintos PLDs, permite optimizar la implementacin fsica dentro de la
PLD manteniendo la portabilidad del diseo
Fuente: ALTERA
Fuente: ALTERA
46
Fuente: ALTERA
Se indica el uso de la
Library LPM y del
package
LPM_COMPONENTS
Se instancia el
componente, dando
COMPONENT lpm_mux
Para usar LPMs la
Para usar LPMs la
GENERIC (LPM_WIDTH: POSITIVE;
library+package a usar
library+package a usar
LPM_WIDTHS: POSITIVE; LPM_PIPELINE: INTEGER := 0;
son lpm y
son lpm y
LPM_SIZE: POSITIVE; LPM_TYPE: STRING := "LPM_MUX";
lpm_components!
lpm_components!
LPM_HINT: STRING := "UNUSED");
PORT (data: IN STD_LOGIC_2D(LPM_SIZE-1 DOWNTO 0,
LPM_WIDTH-1 DOWNTO 0);
aclr, clock: IN STD_LOGIC := '0';
clken: IN STD_LOGIC := '1';
sel: IN STD_LOGIC_VECTOR(LPM_WIDTHS-1 DOWNTO 0);
result: OUT STD_LOGIC_VECTOR(LPM_WIDTH-1 DOWNTO 0));
END COMPONENT;
clk
data[][]
aclr
clken
de la arquitectura
result[]
sel[]
COMPONENT lpm_mux
COMPONENT lpm_mux
GENERIC (LPM_WIDTH: POSITIVE;
GENERIC (LPM_WIDTH: POSITIVE;
LPM_WIDTHS: POSITIVE;
LPM_WIDTHS: POSITIVE;
LPM_PIPELINE: INTEGER:= 0;
LPM_PIPELINE: INTEGER:= 0;
LIBRARY ieee;
LPM_SIZE: POSITIVE;
LPM_SIZE: POSITIVE;
USE ieee.std_logic_1164.all;
LPM_HINT: STRING := UNUSED);
LPM_HINT: STRING := UNUSED);
USE ieee.std_logic_arith.all;
PORT (data: IN STD_LOGIC_2D(LPM_SIZE-1 DOWNTO 0,
PORT (data: IN STD_LOGIC_2D(LPM_SIZE-1 DOWNTO 0,
LPM_WIDTH-1 DOWNTO 0);
USE ieee.std_logic_signed.all;
LPM_WIDTH-1 DOWNTO 0);
aclr: IN STD_LOGIC := '0';
aclr: IN STD_LOGIC := '0';
clock: IN STD_LOGIC := '0';
clock: IN STD_LOGIC := '0';
LIBRARY lpm;
sel: IN STD_LOGIC_VECTOR(LPM_WIDTHS-1 DOWNTO 0);
sel: IN STD_LOGIC_VECTOR(LPM_WIDTHS-1 DOWNTO 0);
USE lpm.lpm_components.all;
result: OUT STD_LOGIC_VECTOR(LPM_WIDTH-1 DOWNTO 0));
result: OUT STD_LOGIC_VECTOR(LPM_WIDTH-1 DOWNTO 0));
END COMPONENT;
END COMPONENT;
ENTITY tst_mux IS
PORT (a:in std_logic_2d (3 downto 0, 15 downto 0);
sel:in std_logic_vector(1 downto 0);
Asignacin de valores
y:out std_logic_vector (15 downto 0));
Asignacin de valores
a los parmetros
END ENTITY tst_mux;
a los parmetros
Nombre de la LPM
Nombre de la LPM
ARCHITECTURE behavior OF tst_mux IS
BEGIN
u1: lpm_mux GENERIC MAP(lpm_width => 16, lpm_size => 4, lpm_widths => 2)
PORT MAP (data => a, sel => sel, result => y);
END ARCHITECTURE behavior;
Mapeo de las puertas
Mapeo de las puertas
Nombre de la Instancia
Nombre de la Instancia
Fuente: ALTERA
Guillermo Jaquenod, 2001
COMPONENT lpm_decode
IrIr al HELP
al HELP
del
del
MAX+plus II!
MAX+plus II!
data[]
aclr
enable
clk
clken
eq[]
47
Ir al HELP
Ir al HELP
del
del
MAX+plus
MAX+plus
II!
II!
LPM_ADD_SUB facilita el diseo de circuitos de suma y resta binaria que aprovechan las
caractersticas de arquitectura de los dispositivos de ALTERA, y puede operar en forma combinatoria
(accin por Default) o agregando registros de pipeline
Fuente: ALTERA MAX+plus II HELP
data
distance
Ir al HELP
Ir al HELP
del
del
MAX+plus
MAX+plus
II!
II!
result
overflow
underflow
direction
COMPONENT lpm_compare
GENERIC (LPM_WIDTH: POSITIVE;
LPM_REPRESENTATION: STRING := "UNSIGNED";
LPM_PIPELINE: INTEGER := 0;
LPM_TYPE: STRING := "LPM_COMPARE";
LPM_HINT: STRING := "UNUSED");
PORT (
dataa, datab: IN STD_LOGIC_VECTOR(LPM_WIDTH-1 DOWNTO 0);
aclr, clock: IN STD_LOGIC := '0';
clken: IN STD_LOGIC := '1';
agb, ageb, aeb, aneb, alb, aleb: OUT STD_LOGIC);
END COMPONENT;
agb: a greater than b;
ageb: a greater or equal than b;
aeb: a equal b;
aneb: a not equal b;
alb: a less than b;
aleb: a less or equal than b;
Guillermo Jaquenod, 2001
Ir al HELP
Ir al HELP
del
del
MAX+plus
MAX+plus
II!
II!
Ir al HELP del
Ir al HELP del
COMPONENT lpm_shiftreg
MAX+plus II!
MAX+plus II!
GENERIC (LPM_WIDTH: POSITIVE;
LPM_AVALUE: STRING := "UNUSED";
LPM_PVALUE: STRING := "UNUSED";
LPM_SVALUE: STRING := "UNUSED");
LPM_DIRECTION: STRING:= "UNUSED";
LPM_TYPE: STRING:= "LPM_SHIFTREG";
LPM_HINT: STRING:= "UNUSED");
PORT (
data: IN STD_LOGIC_VECTOR(LPM_WIDTH-1 DOWNTO 0);
clock: IN STD_LOGIC; enable: IN STD_LOGIC := '1';
shiftin: IN STD_LOGIC := '1'; load: IN STD_LOGIC := '0';
sclr: IN STD_LOGIC := '0';
sset: IN STD_LOGIC := '0';
aclr: IN STD_LOGIC := '0';
aset: IN STD_LOGIC := '0';
q: OUT STD_LOGIC_VECTOR(LPM_WIDTH-1 DOWNTO 0);
shiftout: OUT STD_LOGIC);
END COMPONENT;
Guillermo Jaquenod, 2001
48
1, 2, 4, 8
1, 2, 4 u 8
data in
EAB
Local
Interconnect
in clock
RAM / ROM
address
in clock
2048 bits
256 x 8
512 x 4
1,024 x 2
2,048 x 1
write
enable
D
in
clock
Write
Pulse
Circuit
data out
D
11 a 8
Qu es un
EAB?
out clock
Fuente: ALTERA
Package de LPMs
Package de LPMs
Instanciacin del
Instanciacin del
componente LPM
componente LPM
escribir,
=> salidas);
Fuente: ALTERA
COMPONENT LPM_FIFO
GENERIC (LPM_WIDTH: POSITIVE;
Un LPM_FIFO emplea un EAB ms
Un LPM_FIFO emplea un EAB ms
LPM_WIDTHU: POSITIVE : = 1;
otros recursos (contadores de
otros recursos (contadores de
lectura y escritura) cuya realizacin
LPM_TYPE: STRING := "LPM_FIFO";
lectura y escritura) cuya realizacin
queda oculta al diseador.
queda oculta al diseador.
LPM_NUMWORDS: POSITIVE;
LPM_SHOWAHEAD: STRING := "OFF"
LPM_HINT: STRING := "UNUSED");
PORT (data: IN STD_LOGIC_VECTOR(LPM_WIDTH-1 DOWNTO 0);
clock, rdreq, wrreq: IN STD_LOGIC;
aclr, sclr: IN STD_LOGIC := '0';
full, empty: OUT STD_LOGIC;
usedw: OUT STD_LOGIC_VECTOR(LPM_WIDTHU-1 DOWNTO 0)
q: OUT STD_LOGIC_VECTOR(LPM_WIDTH-1 DOWNTO 0));
END COMPONENT;
49
ANCHO=
regvar
D
D
d()
Q
Q
q()
Ir al menu Options
Elegir User Libraries
clk
En el campo Directory
Name:, definir el
directorio donde buscar
los subdiseos de
menor jerarqua
Declaracin del
Declaracin del
componente
ARCHITECTURE a OF reg24 IS
componente
COMPONENT regvar
GENERIC(ANCHO: INTEGER);
PORT(d:IN STD_LOGIC_VECTOR(ANCHO- 1 DOWNTO 0);clk:IN STD_LOGIC;
q:OUT STD_LOGIC_VECTOR(ANCHO- 1 DOWNTO 0));
END COMPONENT;
BEGIN
reg12a : regvar
PORT MAP (d =>
reg12b : regvar
PORT MAP (d =>
END a;
GENERIC MAP
d(11 DOWNTO
GENERIC MAP
d(23 DOWNTO
(ANCHO=> 12)
0), clk => clk, q => q(11 DOWNTO 0));
(ANCHO=> 12)
12), clk => clk,q => q(23 DOWNTO 12));
Fuente: ALTERA
Fuente: ALTERA
Fuente: ALTERA
Fuente: ALTERA
Fuente: ALTERA
50
Bases de VHDL
Posibles escenarios de diseo para
Sntesis + Place&Route + Simulacin:
Escoger Show All Node Name Synonyms
Escoger Show All Node Name Synonyms
en la ventana de dilogo Enter Nodes from SNF
en la ventana de dilogo Enter Nodes from SNF
Escoger Preserve all Node Name Synonyms
Escoger Preserve all Node Name Synonyms
en el men Processing antes de compilar
en el men Processing antes de compilar
Fuente: ALTERA
Slo MAX+plus II
EDA => MAX+plus II => EDA
MAX+plus II => EDA
Guillermo Jaquenod, 2001
MAX+plus II
Compilador y Simulador
Es posible definir varias arquitecturas para una entidad, pero slo la ltima es usada
Slo pueden definirse GENERICS en una entidad si se define una entidad por archivo.
Los genricos slo son usados para transportar parmetros, y no es posible pasarse
informacin de parmetros entre entidades descriptas en el mismo archivo.
Constantes: slo pueden ser de tipo INTEGER, enumeradas, STD_LOGIC_VECTOR o
STRING.
Arrays de Seales y variables: slo se aceptan arrays con elementos que sean arrays
unidimensionales o bits simples
Multiplicacin y divisin solo cuando el operador de la derecha es potencia de dos
Fuente: ALTERA
funciones de resolucin
declaracin de seales globales en packages
bloques de configuracin
seales fsicas, objetos tipo file o de punto flotante, ports tipo LINKAGE
objetos tipo access, y alocacin o dealocacin de objetos
declaracin de grupos (objetos con el mismo atributo, definidos en VHDL93)
sentencias DISCONNECT o EXIT
operadores de shift (definidos en VHDL93)
record aggregates
retardos AFTER o TRANSPORT
identificadores extendidos
sentencias RETURN dentro de PROCEDUREs o LOOPs
Fuente: ALTERA
Functional
SNF
Extractor
Timing
SNF
Extractor
Compilacin
1
Funcional
Simulacin
No
Temporal
Simulacin
OK?
Si
OK?
Si
Probar otra
arquitectura
No
Habilitar Design
Doctor
Probar otras
Logic Options
Anlisis Temporal
Velo.?
No
Fuente: ALTERA
51
Sintaxis coloreada
Sintaxis coloreada
Fuente: ALTERA
Ahora (VHDL93)
D <= x"FC";
Segundo escenario
3rd
party
EDA
edif
.edo
.lmf
MAX+plus II
Fuente: ALTERA
.vho
3rd
party
EDA
3rd
party
EDA
.edo
.lmf
edif
MAX+plus II
.vho
3rd
party
EDA
.sdo
.sdo
EDA: Electronic Design Automation
LMF: Library Mapping File. Son usadas por el compilador para saber cmo reemplazar
celdas EDIF no estndar por funciones lgicas propias del MAX+PLUS II.
EDIF: Electronic Data Interchange Format. Formato estndar para describir circuitos. En
general las herramientas EDA interactan entre s usando archivos EDIF 2 0 0 o EDIF 3 0 0.
EDO: archivo creado por el EDIF Netlist Writer para ser usado por un simulador estndar
VHO: idem EDO, pero con formato VHDL
SDO: es un archivo VHDL con formato SDF (Standard Delay Format). Este archivo tiene
informacin de los retardos del dispositivo usada para simulacin en VHDL con bibliotecas
de simulacion compatibles con VITAL (VHDL Initiative Toward ASIC Libraries)
Fuente: ALTERA
Fuente: ALTERA
52
Netlists y EDIF
Sntesis
OK?
Si
ModelSIM
edif
No
lmf
acf
vho
Si
Simulacin
sdo
Velocidad?
Place&Route
Lgica OK?
edo
No
Anlisis temporal
No
rea?
OK?
Si
No
Si
Si
Leonardo,
FPGA
Express,
Synplify, etc..
rea?
Timing OK?
No
Velocidad?
No
Si
No
Si
pof
Prueba fsica
No
sof
Si
jam/jbc
OK?
No
Si
MAX+plus II
Netlists y EDIF
Netlists y EDIF
miand3
LIBRARY synplify
LIBRARY synplify
BEGIN
BEGIN
Fuente: SYNPLIFY
Extracto de Synplify.lmf
Extracto de Synplify.lmf
sal
Fuente: ALTERA
Fuente: ALTERA
53
MAX+plus II
Bases de VHDL
Compilador
.edo
.sdo
.vho
design
simulation
3rd party
EDA
Fuente: ALTERA
Constraints
Que un diseo haya sido escrito en un HDL no quiere decir que est bien hecho, ni
que sea eficiente, ni de costo ptimo
Sntesis
edif
No
OK?
Si
lmf
acf
Una especificacin puede ser toda behavioral, pero en un diseo a ser sintetizado
hay que pensar en qu resultar en el silicio
Si
Velocidad?
Pensar el diseo de modo de aprovechar al mximo los lmites de fan-in, los modos
de operacin y las prestaciones especiales de la familia a usar!
Place&Route
No
Anlisis temporal
OK?
Si
No
rea?
No
Velocidad?
Si
Pensar sincrnico!
Las modernas arquitecturas de lgica programable son register-intensive, por lo
cual el uso intenso de flipflops no agrega hardware, sino slo usa recursos que de
todos modos estn disponibles.
No
Si
rea?
No
Si
SINTESIS
Evitar los gated-clocks, tratando de usar pocos relojes globales (idealmente slo uno)
y aprovechar el ENABLE de los flipflops
Cuidado con
el OverConstraint!
!!
Un diseo recin
termina cuando el
equipo de serie
est funcionando
OK en lo del
usuario final!!
No antes!!!
!!
54
!!
!!
LOGICA
DE NUEVO
ESTADO
Lgica
combinatoria
D Q
Ck
CL
FF1
Lgica
combinatoria
Lgica
combinatoria
D Q
Ck
CL
Por eso conviene ubicar los registros en las fronteras de los bloques
jerrquicos (a la entrada o a la salida)
LOGICA
DE NUEVO
ESTADO
DECOD
D Q
Ck
CL
D Q
Ck
CL
T0
Lgica
combinatoria
D Q
Ck
CL
Lgica
combinatoria
T1~T0
Lgica
combinatoria
D Q
Ck
CL
T2~T0
Lgica
combinatoria
D Q
Ck
CL
T0
D Q
Ck
CL
FF3
Lgica
combinatoria
T1~2xT0
D Q
Ck
CL
T2~T0
Si se usan flipflops con Enable y se sabe que (por ejemplo) FF1 y FF2 slo se habiltan en
los ciclos pares de la seal de reloj, el tiempo T1 puede ser el doble de lento que T0 o T2
Para sincerar las evaluacin de Clock Performance debe notificarse este hecho al
compilador usando constraints de MultiCycle path
D Q
Ck
CL
Lgica
combinatoria
T0
D Q
Ck
CL
Lgica
combinatoria
T1~T0/2
Lgica
combinatoria
T2~T0/2
D Q
Ck
CL
Lgica
combinatoria
D Q
Ck
CL
T3~T0
Pin
FFx
D Q
Ck
CL
True Path
True Path
Lgica
combinatoria
Lgica
combinatoria
FFy
D Q
Ck
CL
False Path
55
a su vez, almacenar las salidas del diseo bajo test en un archivo permite su
uso posterior para comparar respuestas de arquitecturas alternativas
Bases de VHDL
Ejemplo de escritura
Ejemplo de escritura
Se cuenta con una variable llamada ahora, de tipo TIME y tres seales std_logic
llamadas A, B y reloj, y se desea, cada vez que haya un flanco positivo de reloj, escribir
en un archivo llamado salida.vct una lnea que describe ahora, A y B con el siguiente
formato:
B
ahora
Proceso
escribo
Una variable de nombre puntero, de tipo LINE, donde preparar los datos a escribir
Una funcin que permita convertir los nueve posibles valores de una variable STD_LOGIC a los
nueve caracteres que los representan
wrfile
56
Bases de VHDL
Recin en VHDL93!
Recin en VHDL93!
57
Cada vez que cambia reloj, en la cola de eventos se prepara un nuevo cambio
al valor negado para 50ns despues; y como esta asignacion es realizada solo
cuando hay eventos en reloj, recien a los 50ns del reloj de simulacion sera
reevaluada, cambiando y preparando un nuevo evento para 50 ns, .
10
15
20
25
Fuente: SJOHOLM
process begin
s <= transport 0 after 10ns;
s <= transport 1 after 20ns;
wait;
end process;
process begin
s <= 0 after 10ns;
s <= 1 after 20ns;
wait;
end process;
process begin
s <= transport 1 after 20ns;
s <= transport 0 after 10ns;
wait;
end process;
tiempo
valor
tiempo
valor
10ns
0
10ns
0
20ns
1
C<= 0,
1 AFTER
0 AFTER
1 AFTER
0 AFTER
1 AFTER
0 AFTER
20ns
1
Ai
10 ns,
12 ns,
20 ns,
25 ns,
40 ns,
57;
A1 <= INERTIAL C
AFTER 10 ns;
tiempo
valor
20ns
1
A2 <= TRANSPORT C
AFTER 10 ns;
10ns
0
process begin
s <= 1 after 20ns;
s <= 0 after 10ns;
wait;
end process;
A3 <= REJECT 4 ns
INERTIAL C
AFTER 10 ns;
10
20
30
40
50
60
70
Fuente: SJOHOLM
Bases de VHDL
Verificacin funcional
de modelos VHDL
Los procesos de Sntesis y de Place & Route, son slo una parte menor de la
tarea de diseo
Ms all de que un diseo quepa dentro de un dispositivo, y de que satisfaga
los tiempos de operacin necesarios, la pregunta clave es: Funciona de
acuerdo a lo deseado?
Es justamente este tema algo que la actual industria de herramientas EDA
an no ha resuelto satisfactoriamente, y que puede llevar la mayor parte del
tiempo de diseo:
58
Simulador VHDL
Informacin de
estmulos y repuestas
Simulador VHDL
Informacin de
estmulos y repuestas
Dispositivo
Equipamiento de test
automtico
Boundary Scan Testing
Informacin de
estmulos y repuestas
Informacin de
estmulos y repuestas
SOFTWARE
Simulador VHDL
HARDWARE
2: Una vez analizadas todas las seales del sistema se sabe cul
es el instante prximo en que deber producirse un cambio; el
reloj de simulacin es avanzado hacia l (en caso del delta delay
el reloj permanece sin cambios), se realiza el/los cambios, se
actualizan las colas de todas las seales y se vuelve al paso 1;
Fin de la simulacin?
no
Qu es el test bench?
TEST BENCH
Generador de
estmulos
Otros mdulos ya
operativos
Monitor de
salidas
59
Event-Driven Simulation
El testbench no tiene
entradas ni salidas!
TEST BENCH
Otros mdulos ya
operativos
TEST BENCH
Generador de
estmulos
Generador de
estmulos
Monitor de
salidas
Otros mdulos ya
operativos
Mdulo del diseo
de nivel tope o DUT
(Design Under Test)
Monitor de
salidas
Fuente: ASHENDEN
60
BEGIN
WAIT FOR periodo;
tmp := '0';
FOR i IN 0 TO 7 LOOP IF (msk(i)='1') THEN tmp:= tmp XOR fftaps(i); END IF;
END LOOP;
FOR i IN 7 DOWNTO 1 LOOP fftaps(i) := fftaps (i-1); END LOOP;
fftaps (0) := NOT (tmp);
taps <= fftaps;
END PROCESS p0;
END a;
Guillermo Jaquenod, 2001
61
5....
ARCHITECTURE xx OF testfile IS
BEGIN
leo_file: PROCESS
VARIABLE dly:time; VARIABLE punte:line; FILE vecfile:TEXT IS IN vect.vec;
BEGIN
WHILE NOT (endfile(vecfile)) LOOP
READLINE (vecfile,punte);
READ(punte,dbus); READ(punte,abus); READ(punte,nWR);READ(punte,nRD);
READ(punte,dly);
WAIT FOR dly;
END LOOP;
END PROCESS leo_file;
END;
Guillermo Jaquenod, 2001
Generador de
estmulos
TEST BENCH
Monitor de
salidas
Otros mdulos ya
operativos
ac se activa chk_thold
datos
reloj
tsetup
Generador de
estmulos
thold
Monitor de
salidas
violacion
de tsetup
relojd
violacion
de thold
S
ac se activa chk_thold
62
Dos procesos:
uno para modelar el behavior
otro para modelar los retardos
Tiempos de
propagacion
distintos!
Fuente: ASHENDEN
Bases de VHDL
Monitor de
salidas
NO
OF mayoria IS
vot_b)
vot_c)
vot_c);
rtl ;
Fuente: DUECK
0000=0
0001=1
0001=1
0010=2
0011=3
0011=3
0010=2
0100=4
0110=6
0101=5
0111=7
0110=6
ARCHITECTURE a OF bin2gray IS
BEGIN
gray (ancho) <= bin (ancho);
gray (ancho-1 DOWNTO 1) <=
bin(ancho-1 DOWNTO 1)
XOR bin(ancho DOWNTO 2);
END a;
GRAY
0000=0
ENTITY bin2gray IS
GENERIC (ancho : INTEGER := 8);
PORT(
bin : IN BIT_VECTOR (ancho DOWNTO 1);
gray : OUT BIT_VECTOR (ancho DOWNTO 1));
END ENTITY bin2gray;
0101=5
0111=7
0100=4
1000=8
1100=C
1001=9
1101=D
1010=A
1111=F
1011=B
1110=E
1100=C
1010=A
1101=D
1011=B
1110=E
1001=9
1111=F
Los cdigos GRAY son muy usados cuando en base a un cdigo desea
hacerse una decodificacin ausente de glitches.
Guillermo Jaquenod, 2001
NO
GRAY
Generador de
estmulos
BINARIO
1000=8
63
7485
> = <
Sumador CarryLookAhead
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)
Porqu en un
caso usa FOR
GENERATE y en
otro FOR LOOP?
ARCHITECTURE a OF NadderLAC IS
SIGNAL gtemp,ptemp : bit_vector (N-1 DOWNTO 0);
SIGNAL cent : bit_vector (N DOWNTO 0);
COMPONENT adder_LAC IS PORT(a,b,cin:IN BIT;s,g,p:OUT BIT);
END COMPONENT adder_LAC;
BEGIN
slicegen: FOR i IN 0 TO N-1 GENERATE
adder_slice : adder_LAC
PORT MAP(a(i),b(i),cent(i),s(i),gtemp(i),ptemp(i));
END GENERATE slicegen;
proclac: PROCESS (cin,gtemp,ptemp) IS
BEGIN
cent(0) <= cin;
FOR i IN 0 TO N-1 LOOP
cent (i+1) <= gtemp(i) OR (cent(i) AND ptemp(i));
END LOOP;
cout <= cent(N);
END PROCESS proclac;
END ARCHITECTURE a;
s
g
co(0)
a
b
p(n)
etcetera.....
cin
p(1)
cin(2)
a(2) a cin
b(2) b
Barrel Shifter
El barrel shifter es un circuito muy usado en
operaciones numricas.
En base a una palabra de control, un dato de
entrada de N bits es desplazado una cierta
cantidad de bits (hasta N-1), donde el
desplazamiento puede ser unsigned (siempre en
un sentido) o signed (en ambos sentidos)
A la vez, al ser desplazados los datos en un
sentido existen varias alternativas respecto a qu
bits ingresar por el otro extremo (cero, extensin
de signo o rotacin)
A diferencia de un shift-register, donde los
desplazamientos son de a un bit por ciclo de
clock, en este caso la operacin es combinatoria,
siendo usual que el ancho de los datos de entrada
(N) sea potencia de dos
dato de salida
cin(0)
dato de entrada
Sumador CarryLookAhead
cantidad de
desplazamientos
64
En vez de 16 Mux
hago los shifts por
etapas: 1, 2 4 y 8
shifts!
ARCHITECTURE a OF bsder IS
SIGNAL shf1,shf2,shf4: bit_vector (15 DOWNTO 0);
BEGIN
shf1 <= din WHEN sel(0)='0'
ELSE '0' & din (15 DOWNTO 1);
shf2 <= shf1 WHEN sel(1)='0'
sel(0) sel(1)
ELSE B"00" & shf1 (15 DOWNTO 2);
shf4 <= shf2 WHEN sel(2)='0'
ELSE B"0000" & shf2 (15 DOWNTO 4);
dout <= shf4 WHEN sel(3)='0'
ELSE B"00000000" & shf4 (15 DOWNTO 8);
END ARCHITECTURE a;
sel(2)
0101
0 0 0 0 0 0 0 0 a b c d e f g h i j k l m n o p
0101
0 0 0 0 0 0 0 0 a b c d e f g h i j k l m n o p
despl (3)=0
despl (0)=1
0101
p 0 0 0 0 0 0 0 0 a b c d e f g h i j k l m n o
0101
p 0 0 0 0 0 0 0 0 a b c d e f g h i j k l m n o
despl (1)=0
0 0 0 0 0 a b c d e f g h i j k
SALIDA
despl (3..0)=1101=-3
despl (3)=-8
0101
ARCHITECTURE a OF brder IS
SIGNAL shf1,shf2,shf4: bit_vector
BEGIN
shf1 <= din WHEN sel(0)='0 ELSE
shf2 <= shf1 WHEN sel(1)='0 ELSE
shf4 <= shf2 WHEN sel(2)='0 ELSE
dout <= shf4 WHEN sel(3)='0 ELSE
END ARCHITECTURE a;
DOWNTO 1);
& shf1(15 DOWNTO 2);
& shf2(15 DOWNTO 4);
& shf4(15 DOWNTO 8);
despl (2)=4
sel(3)
despl (3..0)=0101=+5
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
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
65
NINGUNA!
66
Bases de VHDL
Ejemplos con MAX+plus II VHDL
A
B
Giro Horario
A
B
Giro Antihorario
A
B
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
LIBRARY lpm;
USE lpm.lpm_components.ALL;
Giro Horario
A
B
Giro Antihorario
El uso de LPMs
simplifica el diseo y
casi siempre da
resultados de sntesis
mucho ms eficientes
En este caso el uso
de recursos baja de
26 LEs a slo 16 LEs!
A0
B0
Giro Horario
A0
B1
Giro Antihorario
Una alternativa que aumenta la
resolucin y permite un diseo
sincronico con un reloj interno es
observar que:
en sentido horario la secuencia AB
es 00/10/11/01/00..
en sentido antihorario la secuencia
AB es 00/01/11/10/00...
ARCHITECTURE a OF graycont IS
SIGNAL d: BIT_VECTOR (NBITS-1 downto 0); SIGNAL qt: BIT_VECTOR (NBITS downto 0);
BEGIN
BEGIN
IF clr_n='0' THEN qt <=
T Q Gi
clk
(others =>'0');
Di
Excepto la primer etapa (generacin de D-1) y la ltima etapa, las dems etapas tienen
una arquitectura como sigue
Ei
Ci
FOR i IN 1 TO NBITS-1 LOOP qt(i) <= qt(i) XOR (qt(i-1) AND d(i-1)); END LOOP;
qt(NBITS) <= qt(NBITS) XOR ( (qt(NBITS-1) OR qt(NBITS)) AND d(NBITS-1));
END IF;
END PROCESS sync;
TQ
clk
TQ
clk
TQ
clk
TQ
clk
D0
D1
D2
DN-1
TQ
clk
Q0
Q1
Q2
QN-1
QN
Guillermo Jaquenod, 2001
67
Cdigo GRAY
Dummy qt0
Ciclo
Cdigo GRAY
Dummy qt0
0000=0
1100=C
0001=1
1101=D
0011=3
1111=F
0010=2
1110=E
0110=6
1010=A
0111=7
1011=B
0101=5
1001=9
Resultados
de la
simulacin
funcional
usando
MAX+plus II
0100=4
1000=8
Contadores Johnson
CL
CL
CL
Q
CL
Q
CL
Realimentacion desde
2 etapas
X"0240",X"0500",X"0829",X"100D",X"2015",X"6000",X"D008");
SIGNAL
xorout : BIT;
BEGIN
p0: PROCESS (reloj,n_init) BEGIN
IF n_init = '0' THEN fftaps <= (others=>'0');
ELSIF reloj'EVENT AND reloj = '1' THEN
FOR i IN 2 TO LFSRTAPS LOOP fftaps(i) <= fftaps (i-1); END LOOP;
DQ
LUT
DQ
LUT
LUT
LUT
BEGIN
temp := '0'; mask := tablaxor (LFSRTAPS);
FOR i IN 1 TO LFSRTAPS LOOP if (mask (i)='1') THEN temp := temp XOR fftaps(i); END IF; END LOOP;
Al ser funcin de 2 o 4
Al ser funcin de 2 o 4
realimentaciones, bastan N elementos
realimentaciones, bastan N elementos
lgicos para un LFSR de N bits
lgicos para un LFSR de N bits
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
x13
x14
x15
x16
din
dout
reloj
init
dout
reloj
init
Tx/Rx
xpass
x0
rdy
CRC_OK
68
Generador/testeador de CRC-16
Uso 22 LEs:
16 para shift
ENTITY crcshft IS PORT (dout,zero: OUT std_logic;
din,init,xpass,reloj: IN std_logic);
END crcshft;
ARCHITECTURE a OF crcshft IS
CONSTANT mask: std_logic_vector (15 DOWNTO 0):= X"8005";
SIGNAL feedback: std_logic;
SIGNAL shf,inp : std_logic_vector (15 DOWNTO 0);
BEGIN
feedback <= (din XOR shf(15)) AND xpass;
inp (0) <= feedback;
l0: FOR i IN 1 TO 15 GENERATE
inp(i) <= (feedback AND mask(i)) XOR shf(i-1);
END GENERATE l0;
PROCESS (reloj) BEGIN
IF reloj = '1' THEN
IF init='1' THEN shf <= (others =>'1'); ELSE shf <= inp;
END IF;
END IF;
END PROCESS;
zero <= '1' WHEN shf = X"0000" ELSE '0';
dout <= shf(15) WHEN xpass='0' ELSE din;
END a;
Porqu usa 3
LIBRARY ieee; USE ieee.std_logic_1164.ALL;
Uso 38 LEs:
Uso 38 LEs:
LEs para ena?
LIBRARY ieee; USE ieee.std_logic_unsigned.ALL;
22 para crcshift
22 para crcshift
LIBRARY lpm; USE lpm.lpm_components.ALL;
9 para el contador
9 para el contador
ENTITY crc16 IS PORT (
3 para ena
3 para ena
init,reloj,txrx,din: IN std_logic;
3 para xpass
3 para xpass
dout,nrdy,crc_ok: OUT std_logic);
END crc16;
ARCHITECTURE a OF crc16 IS
CONSTANT NMSG : INTEGER :=30; -- largo del mensaje
COMPONENT crcshift PORT (dout,zero: OUT std_logic;
din,init,xpass,reloj: IN std_logic); END COMPONENT;
SIGNAL xpass,ena,cntval: std_logic; SIGNAL conta: std_logic_vector (8 DOWNTO 0);
SIGNAL crcx: std_logic_vector (15 DOWNTO 0);
BEGIN
shift: crcshift PORT MAP
(dout=>dout,zero=>crc_ok,din=>din,init=>init,xpass=>xpass,reloj=>reloj);
shaftcnt: lpm_counter GENERIC MAP (LPM_WIDTH => 9)
PORT MAP (clock => reloj, sclr =>init, cnt_en => ena,q => conta);
cntval <= '1' WHEN (conta < NMSG) ELSE '0'; xpass <= '1' WHEN txrx='0' ELSE cntval;
ena
<= '1' WHEN (conta < NMSG+15) ELSE '0';
nrdy
<= ena;
END a;
Guillermo Jaquenod, 2001
Q1
R16
di
reloj
init
dout
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
R16
R15
R14
R13
R12
R11
R10
R9
R8
R7
R6
R5
R4
R3
R2
R1
X87,X65
X43,X21
X76,X54
X32,X1
X87
X76
X65
X54
X43
X32
Q16
X21
Q15
X1
Q14
Q13
Q12
Q11
Q10
Q9
Xf
D[8..1]
Slo necesito los 16 registros de
CRC ms otros 9 operando en
modo combinatorio para calcular
un nuevo byte de CRC en un nico
ciclo de reloj (modo NORMAL)
El peor caso para la velocidad es el
clculo de R1, que requiere
atravesar dos LE combinatorios
Conviene poner X87, X65, X43, X21,
Xf y R1 en un clique
Usando register packing los
recursos usados son menores (Xf
es generado por R16, X1 por R7,..),
puede bajar a 17 LEs, y ser tan
eficiente como la solucin serie
Guillermo Jaquenod, 2001
X76
X54
X32
X1
X87
X65
X43
X21
Xf
R16
R15
R14
R13
R12
R11
R10
R9
R8
R7
R6
R5
R4
R3
R2
R1
Q[16..1]
X7
X6
X5
X4
X3
X2
X1
R14
X8
X7
R13
X7
X6
R12
X6
X5
R11
X5
X4
R10
X4
X3
R9
X3
X2
R8
Q16
X2
X1
R7
Q15
X1
R6
Q14
R5
Q13
R4
Q12
R3
Q11
R2
R1
Q10
Q9
X8
X7
X6
X5
X4
X3
X2
X1
Viendo que un elemento lgico tiene 4 entradas, y que cada Xi requiere dos
variables, pueden definirse trminos Xij = ( Xi xor Xj ), solucionables con un
nico LE, y llamando Xf = ( X87 xor X65 xor X43 xor X21 ), queda:
R16
T=8
R15
X87
X65
X43
X21
X76
X54
X32
X1
R14
X87
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
T8
T=8
R15
X8
X7
X6
X5
X4
X3
X2
X1
69
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
data
din
ARCHITECTURE a OF shift_store IS
SIGNAL regshf : STD_LOGIC_VECTOR (largo-1 DOWNTO 0);
store
BEGIN
PROCESS (reloj) BEGIN
reloj
IF reloj=1 THEN
regshf (largo-1 DOWNTO 1)<=regshf (largo-2 DOWNTO 0);
regshf (0)<=din;
END IF;
END PROCESS;
PROCESS (store) BEGIN
IF store=1 THEN data <= regshf; END IF;
END PROCESS;
dout
dout <= regshf (largo-1);
END a;
e1
ARCHITECTURE a OF recupclk IS
SIGNAL rxdly,edge : bit;
SIGNAL e: bit_vector (8 DOWNTO 1);
BEGIN
edge <= rxdly XOR rxd; -- detector de transicion
PROCESS (rxck_8x) IS
BEGIN
IF rxck_8x='1' THEN
rxdly <= rxd; -- rxd demorado un ciclo
CASE e IS
WHEN X"02" => IF edge='1' THEN e <= X"02"; ELSE
WHEN X"04" => IF edge='1' THEN e <= X"04"; ELSE
WHEN X"08" => IF edge='1' THEN e <= X"08"; ELSE
WHEN X"10" => IF edge='1' THEN e <= X"40"; ELSE
WHEN X"20" => IF edge='1' THEN e <= X"80"; ELSE
WHEN X"40" => IF edge='1' THEN e <= X"01"; ELSE
WHEN X"80" => IF edge='1' THEN e <= X"02"; ELSE
WHEN OTHERS => e <= X"02";
END CASE;
END IF;
END PROCESS;
rxck <= e(5);
END ARCHITECTURE a;
e8
e2
e3
e7
e6
e<=
e<=
e<=
e<=
e<=
e<=
e<=
X"04";
X"08";
X"10";
X"20";
X"40";
X"80";
X"01";
END
END
END
END
END
END
END
e4
IF;
IF;
IF;
IF;
IF;
IF;
IF;
e5
el flanco se
engancha ac
sal
ARCHITECTURE a OF recupclka IS
SIGNAL rxdly,edge : bit;
SIGNAL e: bit_vector (8 DOWNTO 1);
BEGIN
PROCESS (rxck_8x,nreset) IS
BEGIN
IF nreset='0' THEN e <= X"00";
ELSIF rxck_8x'EVENT and rxck_8x='1' THEN
rxdly <= rxd; -- rxd demorado un ciclo
edge <= rxdly XOR rxd; -- detector de transicion
e(1) <= NOT((e(8) AND NOT(edge)) OR (e(7) AND edge));
e(2) <= NOT(e(1)) OR ((e(8) OR e(2)) AND edge);
e(3) <= (e(2) AND NOT(edge)) OR (e(3) AND edge);
e(4) <= (e(3) AND NOT(edge)) OR (e(4) AND edge);
e(5) <= (e(4) AND NOT(edge));
e(6) <= (e(5) AND NOT(edge));
e(7) <= (e(6) AND NOT(edge)) OR (e(5) AND edge);
e(8) <= (e(7) AND NOT(edge)) OR (e(6) AND edge);
END IF;
END PROCESS;
rxck <= e(4);
END ARCHITECTURE a;
e1
e8
e2
e3
e7
e6
e4
e5
Pensando en la sntesis
obtengo los siguientes
beneficios:
Bajo de 32 LEs a slo 10 LEs
Anda mucho ms rpido
Evito metaestabilidades
Fuerzo el uso de ONE-HOT!!
+
ARCHITECTURE a OF ras IS
BEGIN
PROCESS (reloj,sc_n)
VARIABLE cnt : INTEGER RANGE 0 TO 7;
D/A
VARIABLE rasreg: STD_LOGIC_VECTOR (7 DOWNTO 0);
BEGIN
IF sc_n='0' THEN rasreg (7):='1'; cnt:= 7; eoc <= '0';
FOR i IN 6 DOWNTO 0 LOOP rasreg(i) := '0'; END LOOP;
ELSIF rising_edge (reloj) THEN
IF eoc='0' THEN rasreg (cnt):=comp;
IF cnt = 0 THEN eoc <= '1';
ELSE cnt:=cnt-1; rasreg(cnt):='1';
END IF;
END IF;
END IF;
to_da <= rasreg;
END PROCESS;
END a;
Buscar una
solucin ms
eficiente!
RAS
70
TxCk
lado del
usuario
THRF=1?
Cnt=0?
Cnt /=0?
TxD
S/L=1
Ack=0
Cnt=run
TxC=0
S/L=1
Ack=1
Cnt=run
TxC=0
THRF=0?
lado del
canal
THRF=1?
La etapa transmisora de una UART puede verse como compuesta por dos mquinas
sincronicas, cada una de 4 estados:
Una mquina activada por Clk, responsable de la interfase al bus del usuario
Otra mquina activada por TxCk responsable del proceso de transmisin
Ambas mquinas se sincronizan mediante Handshake usando THRF (TxReg Full) y Ack.
Ambas mquinas poseen adems registros operativos (Holding, Shift y Contador de bits) y
pueden complicarse mediante el agregado de generador de paridad, control de flujo, etc..
Guillermo Jaquenod, 2001
Ack=1?
THRF=0
Ena=0
Ack=0?
We=0?
We=1?
We=1?
TxC
THRF
Ctl
Ack
S/L
TxCk
TxReg (PISO)
Ctl Ack
Ena
Clk
THRF
We
TxHoldRegister
TxD
S/L=1
Ack=0
Cnt=0
TxC=1
Cnt=11?
THRF=0?
THRF=1?
S/L=1
Ack=1
Cnt++
TxC=0
THRF=0?
THRF=1?
S/L=0
Ack=0
Cnt=0
TxC=0
TxC
THRF
We
Clk
ARCHITECTURE a OF uart_tx IS
COMPONENT uart_txA PORT (reset,clk,we,ack:IN bit;
din:IN bit_vector (7 downto 0);
thrf: OUT bit; thr: OUT bit_vector (7 downto 0));
END COMPONENT uart_txA;
COMPONENT uart_txB PORT (reset,txck,thrf:IN bit;
txc: BUFFER bit; ack,txd: OUT bit;
thro:IN bit_vector (7 downto 0));
END COMPONENT uart_txB;
SIGNAL ack:BIT; SIGNAL thro:BIT_VECTOR (7 DOWNTO 0);
BEGIN
ladousu: uart_txA
PORT MAP(reset,clk,we,ack,din,thrf,thro);
ladotx: uart_txB
PORT MAP(txc,ack,txd,reset,txck,thrf,thro);
END ARCHITECTURE a;
S/L
Ena
TxCk
TxReg (PISO)
We=1?
S/L
S/L=0
Ack=0
Cnt=11
TxC=0
TxHoldRegister
We=0?
THRF=1
Ena=1
Ena
THRF=0?
D_In (7 downto 0)
We=1?
S/L=1
Ack=0
Cnt=11
TxC=1
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
D_In (7 downto 0)
TxD
Armo el
Armo el
conjuntoII!
conjuntoII!
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?
71
S/L=0
Ack=0
Cnt=0
TxC=0
S/L=1
Ack=1
Cnt++
TxC=0
THRF=0?
BH
AH
N/2 Adder
Ci
Co
ARCHITECTURE a OF cysel64 IS
ARCHITECTURE a OF cysel64 IS
SIGNAL slo,shi0,shi1:
SIGNAL slo,shi0,shi1:
std_logic_vector(33 DOWNTO 1);
std_logic_vector(33 DOWNTO 1);
BEGIN
BEGIN
slo <= '0'& a(32 DOWNTO 1)
slo <= '0'& a(32 DOWNTO 1)
+ b(32 DOWNTO 1) + cin;
+ b(32 DOWNTO 1) + cin;
shi0 <= '0'& a(64 DOWNTO 33)
shi0 <= '0'& a(64 DOWNTO 33)
+ b(64 DOWNTO 33);
+ b(64 DOWNTO 33);
shi1 <= '0'& a(64 DOWNTO 33)
shi1 <= '0'& a(64 DOWNTO 33)
+ b(64 DOWNTO 33) + '1';
+ b(64 DOWNTO 33) + '1';
s(32 DOWNTO 1) <= slo(32 DOWNTO 1);
s(32 DOWNTO 1) <= slo(32 DOWNTO 1);
s(64 DOWNTO 33) <=
s(64 DOWNTO 33) <=
shi0 (32 DOWNTO 1) WHEN slo(33)='0'
shi0 (32 DOWNTO 1) WHEN slo(33)='0'
ELSE shi1 (32 DOWNTO 1);
ELSE shi1 (32 DOWNTO 1);
cout <= shi0 (33) WHEN slo(33)='0'
cout <= shi0 (33) WHEN slo(33)='0'
ELSE shi1 (33);
ELSE shi1 (33);
END a;
END a;
AL
Co
1
Ci
Co
SH
SL
m
s
s/r
reloj
init
A
B
x
Ci
A
B
C
D Q
Ck
CL
S
c0
reloj
D Q
Ck
CL
init
CSA
ARCHITECTURE a OF seraddsub IS
ARCHITECTURE a OF seraddsub IS
SIGNAL c: BIT; -- carry/borrow
SIGNAL c: BIT; -- carry/borrow
BEGIN
BEGIN
PROCESS (reloj,init) BEGIN
PROCESS (reloj,init) BEGIN
IF (init=1) THEN s<=0; c<=0;
IF (init=1) THEN s<=0; c<=0;
ELSIF relojEVENT AND reloj=1 THEN
ELSIF relojEVENT AND reloj=1 THEN
s <= a XOR b XOR c;
s <= a XOR b XOR c;
IF sr=1
IF sr=1
THEN -- sr=1 indica suma
THEN -- sr=1 indica suma
c <= (m AND s)
c <= (m AND s)
OR (m AND c)
OR (m AND c)
OR (s AND c);
OR (s AND c);
ELSE -- sr=0 indica resta
ELSE -- sr=0 indica resta
c <= (NOT(m) AND s)
c <= (NOT(m) AND s)
OR (NOT(m) AND c)
OR (NOT(m) AND c)
OR (s AND c);
OR (s AND c);
END IF;
END IF;
END IF;
END IF;
END PROCESS;
END PROCESS;
END a;
END a;
a
b
Hacerlo
genrico!
ARCHITECTURE a OF seradd IS
ARCHITECTURE a OF seradd IS
SIGNAL c: BIT;
SIGNAL c: BIT;
BEGIN
BEGIN
PROCESS (reloj,init) BEGIN
PROCESS (reloj,init) BEGIN
IF (init=1) THEN s<=0; c<=0;
IF (init=1) THEN s<=0; c<=0;
ELSIF relojEVENT AND reloj=1 THEN
ELSIF relojEVENT AND reloj=1 THEN
s <= a XOR b XOR c;
s <= a XOR b XOR c;
c <= (a AND b) OR (a AND c) OR (b AND c);
c <= (a AND b) OR (a AND c) OR (b AND c);
END IF;
END IF;
END PROCESS;
END PROCESS;
END a;
END a;
N/2 Adder
Cout
ACUMULADOR
BL
0
N/2 Adder
CONTROL
BH
SUMADOR
THRF=1?
MULTIPLICADOR
ARCHITECTURE a OF iteramult IS
ARCHITECTURE a OF iteramult IS
BEGIN
BEGIN
PROCESS (reloj) IS
PROCESS (reloj) IS
VARIABLE cnt : INTEGER RANGE 0 TO 8;
VARIABLE cnt : INTEGER RANGE 0 TO 8;
VARIABLE moshf:std_logic_vector(16 DOWNTO 1);
VARIABLE moshf:std_logic_vector(16 DOWNTO 1);
VARIABLE mrshf:std_logic_vector(8 DOWNTO 1);
VARIABLE mrshf:std_logic_vector(8 DOWNTO 1);
BEGIN
BEGIN
IF reloj='1' THEN
IF reloj='1' THEN
IF init = '1' THEN moshf:= X"00" & mo; cnt:=0;
IF init = '1' THEN moshf:= X"00" & mo; cnt:=0;
mrshf := mr; res <= X"0000";rdy <= '0';
mrshf := mr; res <= X"0000";rdy <= '0';
ELSIF cnt < 8 THEN
ELSIF cnt < 8 THEN
IF mrshf(1) = '1' THEN res <= moshf+res; END IF;
IF mrshf(1) = '1' THEN res <= moshf+res; END IF;
moshf := moshf (15 DOWNTO 1) & '0';
moshf := moshf (15 DOWNTO 1) & '0';
mrshf := '0' & mrshf(8 DOWNTO 2);
mrshf := '0' & mrshf(8 DOWNTO 2);
if cnt/=7 THEN rdy<='0'; ELSE rdy<='1'; END IF;
if cnt/=7 THEN rdy<='0'; ELSE rdy<='1'; END IF;
cnt := cnt+1;
cnt := cnt+1;
END IF;
END IF;
END IF;
END IF;
END PROCESS;
END PROCESS;
END ARCHITECTURE a;
END ARCHITECTURE a;
Cnt /=11?
S/L=1
Ack=0
Cnt++
TxC=0
MULTIPLICANDO
D Q
Ck
CL
cO
D Q
Ck
CL
a
D Q
Ck
CL
reloj
init
D Q
Ck
CL
Fuente: R.Andraka.
72
mr(N-2)
mr(1)
mr(0)
mo
a
b
DFF
a
b
CSA
a
b
CSA
res
ARCHITECTURE a OF umulser IS
ARCHITECTURE a OF umulser IS
COMPONENT seradd PORT (a,b,reloj,init:IN BIT; s:OUT BIT); END COMPONENT;
COMPONENT seradd PORT (a,b,reloj,init:IN BIT; s:OUT BIT); END COMPONENT;
SIGNAL prod,chain: BIT_VECTOR (N DOWNTO 1);
SIGNAL prod,chain: BIT_VECTOR (N DOWNTO 1);
CSA
rel
init
BEGIN
BEGIN
genprod: FOR i IN N DOWNTO 1
genprod: FOR i IN N DOWNTO 1
GENERATE prod(i) <= mr(i) AND m0;
GENERATE prod(i) <= mr(i) AND m0;
END GENERATE;
END GENERATE;
gencsa: FOR i IN N-1 DOWNTO 1
gencsa: FOR i IN N-1 DOWNTO 1
GENERATE chaincsa: seradd PORT MAP(a=>prod(i),b=>chain(i+1),reloj=>rel,
GENERATE chaincsa: seradd PORT MAP(a=>prod(i),b=>chain(i+1),reloj=>rel,
init=>init, s=>chain(i));
init=>init, s=>chain(i));
END GENERATE;
END GENERATE;
PROCESS (rel,init) BEGIN
PROCESS (rel,init) BEGIN
IF (init=1) THEN chain(N)<=0;
IF (init=1) THEN chain(N)<=0;
ELSIF relEVENT AND rel=1 THEN chain(N) <= prod(N);
ELSIF relEVENT AND rel=1 THEN chain(N) <= prod(N);
END IF;
END IF;
END PROCESS;
END PROCESS;
res <= chain(1);
res <= chain(1);
END a;
END a;
Guillermo Jaquenod, 2001
mr(N-2)
m(1)
m(0)
mo
res
D
Q
Ca2
a
b
a
b
CSA
a
b
CSA
s
CSA
rel
init
El multiplicador serial con signo es casi idntico al sin signo, slo que en
la primer etapa, en vez de un simple flipflop D, debe colocarse un
circuito de complemento a 2
Fuente: R.Andraka.
Breq_n
Brdy_n
Bgnt
Areq_n
Ardy_n
Agnt
Areq_n
a1
a2
b2
Breq_n
b1
a3
ARCHITECTURE a OF smulser IS
ARCHITECTURE a OF smulser IS
COMPONENT seradd PORT (a,b,reloj,init:IN BIT; s:OUT BIT); END COMPONENT;
COMPONENT seradd PORT (a,b,reloj,init:IN BIT; s:OUT BIT); END COMPONENT;
COMPONENT com2dos PORT (a,reloj,init:IN BIT; s:OUT BIT); END COMPONENT;
COMPONENT com2dos PORT (a,reloj,init:IN BIT; s:OUT BIT); END COMPONENT;
SIGNAL prod,chain: BIT_VECTOR (N DOWNTO 1);
SIGNAL prod,chain: BIT_VECTOR (N DOWNTO 1);
BEGIN
BEGIN
genprod: FOR i IN N DOWNTO 1
genprod: FOR i IN N DOWNTO 1
GENERATE prod(i) <= mr(i) AND m0;
GENERATE prod(i) <= mr(i) AND m0;
END GENERATE;
END GENERATE;
gencsa: FOR i IN N-1 DOWNTO 1
gencsa: FOR i IN N-1 DOWNTO 1
GENERATE
GENERATE
chaincsa: seradd PORT MAP(a=>prod(i), b=>chain(i+1),reloj=>rel,
chaincsa: seradd PORT MAP(a=>prod(i), b=>chain(i+1),reloj=>rel,
init=>init, s=>chain(i));
init=>init, s=>chain(i));
END GENERATE;
END GENERATE;
first: com2dos PORT MAP (a=>prod(i),reloj=>rel,init=>init,s=>chain(N));
first: com2dos PORT MAP (a=>prod(i),reloj=>rel,init=>init,s=>chain(N));
res <= chain(1);
res <= chain(1);
END a;
END a;
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
Brdy_n
73
gnt3
gnt1
gnt2
reloj
req0
req1
req2
req3
gnt0
gnt1
gnt2
gnt3
cycle
start
req0
req1
req2
req3
actual
nuevo
Este diseo
ARCHITECTURE a OF rrobtab IS
ARCHITECTURE a OF rrobtab IS
no funciona.
SIGNAL concat: std_logic_vector (7 DOWNTO 0);
SIGNAL concat: std_logic_vector (7 DOWNTO 0);
Porqu?
BEGIN
BEGIN
concat <= actual&req;
concat <= actual&req;
WITH concat SELECT
WITH concat SELECT
nuevo <= "0001" WHEN "0001000X"|"001000X1"|"01000XX1"|"1000XXX1",
nuevo <= "0001" WHEN "0001000X"|"001000X1"|"01000XX1"|"1000XXX1",
"0010" WHEN "0001XX1X"|"001000X0"|"01000X10"|"1000XX10",
"0010" WHEN "0001XX1X"|"001000X0"|"01000X10"|"1000XX10",
"0100" WHEN "0001X10X"|"0010X1XX"|"01000X00"|"1000X100",
"0100" WHEN "0001X10X"|"0010X1XX"|"01000X00"|"1000X100",
"1000" WHEN "0001100X"|"001010XX"|"01001XXX"|"1000X000",
"1000" WHEN "0001100X"|"001010XX"|"01001XXX"|"1000X000",
"XXXX" WHEN OTHERS;
"XXXX" WHEN OTHERS;
END a;
END a;
req0
req1
req2
req3
actual
nuevo
0);
0);
ARCHITECTURE a OF rrobtab IS
ARCHITECTURE a OF rrobtab IS
BEGIN
BEGIN
PROCESS (actual,req) IS
PROCESS (actual,req) IS
variable vnuevo: std_logic_vector (3 DOWNTO
variable vnuevo: std_logic_vector (3 DOWNTO
BEGIN
BEGIN
CASE actual IS
CASE actual IS
WHEN X"0" => vnuevo := X"1";
WHEN X"0" => vnuevo := X"1";
WHEN X"1" => IF req(1)='1' THEN vnuevo :=
WHEN X"1" => IF req(1)='1' THEN vnuevo :=
ELSIF req(3)='1' THEN vnuevo
ELSIF req(3)='1' THEN vnuevo
WHEN X2" => IF req(2)='1' THEN vnuevo :=
WHEN X2" => IF req(2)='1' THEN vnuevo :=
ELSIF req(0)='1' THEN vnuevo
ELSIF req(0)='1' THEN vnuevo
WHEN X4" => IF req(3)='1' THEN vnuevo :=
WHEN X4" => IF req(3)='1' THEN vnuevo :=
ELSIF req(1)='1' THEN vnuevo
ELSIF req(1)='1' THEN vnuevo
WHEN X8" => IF req(0)='1' THEN vnuevo :=
WHEN X8" => IF req(0)='1' THEN vnuevo :=
ELSIF req(2)='1' THEN vnuevo
ELSIF req(2)='1' THEN vnuevo
WHEN OTHERS => vnuevo := actual;
WHEN OTHERS => vnuevo := actual;
END CASE;
END CASE;
nuevo <= vnuevo;
nuevo <= vnuevo;
END PROCESS;
END PROCESS;
END a;
END a;
DIN
WR FULL
CLK
ENA
THEN:
CLK
ENA
CLK
ENA
CLK
ENA
DOUT
RD EMPT
ARCHITECTURE a OF FIFO_slice IS
CLK
SIGNAL reg: STD_LOGIC_VECTOR (datw-1 DOWNTO 0);
BEGIN
CLK
PROCESS (reloj,init) IS
CLK
BEGIN
IF init='1' THEN actv <= '0'; dout <= (others => '0');
ELSIF reloj'EVENT AND reloj='1' THEN
IF (actv='1') AND (nextv='0') THEN actv <= '0';
ELSIF (actv='0') AND (prevv='1') THEN actv <= '1'; dout <= din;
END IF;
END IF;
END PROCESS;
END ARCHITECTURE a;
ENA
ENA
ENA
ENA
74
ARCHITECTURE a OF ripple_FIFO IS
TYPE membank IS ARRAY (largo-1 DOWNTO 0) OF STD_LOGIC_VECTOR (datw-1 DOWNTO 0);
SIGNAL memoria: membank ; SIGNAL status: STD_LOGIC_VECTOR (largo-1 DOWNTO 0);
COMPONENT FIFO_slice GENERIC (datw: INTEGER := 8);
PORT (prevv,nextv,reloj,init:IN STD_LOGIC; din:IN STD_LOGIC_VECTOR (datw-1 DOWNTO 0);
actv: BUFFER STD_LOGIC; dout:OUT STD_LOGIC_VECTOR (datw-1 DOWNTO 0));
END COMPONENT FIFO_slice;
BEGIN
midslices: FOR i IN 1 TO largo-2 GENERATE -- etapas intermedias
instslice: FIFO_slice GENERIC MAP (datw=>datw) PORT MAP (prevv=>status(i-1),nextv=>status(i+1),
actv=>status(i),reloj=>clk,init=>init,din=>memoria(i-1),dout=>memoria(i));
END GENERATE;
La segunda lectura
borra el ultimo
registro; al no
haber nuevo dato
el FIFO queda
vaco de forma
permanente
Reloj
entradas
y= x.senA + y.cosA
(x,y)
h
A
x
(x,0)
(x,y)
y=cosA.(y + x.tanA)
(x,y)
S1
Sel
Una red Banyan N:N provee un nico camino entre cualquier entrada y cualquier salida,
pero a la vez bloquea otros caminos entre otras entradas y salidas
En un switch fabric MIN (Multipath Interconnect Network) se usan dos redes Banyan N:N,
que proveen N posibles caminos desde cualquier entrada a cualquier salida
El elemento bsico de un MIN es un multiplexor 2:2, que usa 2 LEs, y que puede operar
de modo combinatorio o usar registros (en el caso de desear una switch con pipelines)
Una MIN 16:16 tendr 8 LE de retardo, requerir 8x8x2=128 LEs y 64 lneas de control
x=cosA.(x - y.tanA)
16 salidas
16 entradas
salidas
x=x.cosA - y.senA
S0
x=cosA.(x - y.tanA)
y=cosA.(y + x.tanA)
75
xi+1 = xi - yi.di.2-i
s0
Ai+1 = Ai - di.artan(2-i)
16 LEs
sgex
Ry
di
sgex
FSM
%16
rdy
CSAS
s0
y
FSM
init
A
2 LEs
sgex
Ry
rdy
s1,s0
RA
i
ROM
-di
+/-
-di
i
16 LEs
i
sgex
b
di
s0
sgex
CSAS
%16
di,s1,s0
i
x
i
2 LEs
y
init
-di
s0
y
s0
10 LEs
i
CSAS
+/-
16 LEs
di
Rx
A
x
-di
s0
-di
Rx
A
+/-
Ry
-di
SRA
SRA
Rx
yi+1 = yi + xi.di.2-i
10 LEs
2 LEs
CSAS
Analizar y discutir
la arquitectura
de los distintos
bloques!!!
ALU serial
ACUMULADOR
memoria
I/O
0
1
memoria
constantes
Bases de VHDL
aritmetica
ADD
SUB
lgica
AND
OR
XOR
out
Z
Cyout
Cyin
V
N
Una unidad artimtico-lgica serial puede ser muy til para elaborar
microcontroladores empotrados de baja performance pero a la vez muy
limitado uso de recursos
76
Shifter
Mux
Suma
Ajuste
Control
AND
Sumador
Acumulador
Shifter
Fuente: POLLARD
Ack=0?
Ena
We=0?
RXD
THRF=1
Ena=1
We=1?
lado del
canal
RxRegister
R16ck
We=1?
Rx_Reg (SIPO)
We=0?
Ack=0?
THRF=1
Ena=0
Ctl
Re
RDRF
Clk
lado del
usuario
La etapa RX de una UART puede verse como compuesta por dos mquinas sincronicas:
Una mquina activada por Rck16x, responsable de sincronizarse con los datos
entrantes, recibir los bits de datos, y avisar cuando hay un nuevo dato disponible
Otra mquina activada por Clk, responsable de la interfase al bus del usuario
Al igual que en el transmisor el circuito puede complicarse, para detectar Overrun, Break,
Noise, etc..
RxF
Ctl Ack
Syn
Ack=1?
THRF=0
Ena=0
CAS#
ROW
COLUMN
WE#
DQ
DATA
OE#
1
select
arbitro
RAS/CAS
BE[]
control
/RAS[3..0]
/CAS[3..0]
/OE
/WE
DQ[31..0]
Contador de
refresco
A0..A11
5 6 7 8 9 10
T1-10
110
T5-6
15
T1-2
T2-6
60
T2-3
15
T2-4
20
T3-4
T8-9
15
T4-6
15
T7-9
15
T4-7
15
T7-10
40
A0~A11
/WE
DQ0/CASL
DQ15
/CASH
/RAS
4M x 16
/OE
/CAS0
/CAS0
/RAS0
/OE
A0..A11
A0-A11
16
A0~A11
/WE
DQ0/CASL
DQ15
/CASH
/RAS
4M x 16
/OE
/WE
/CAS2
/CAS3
/RAS2
A0..A11
16
DQ[31..0]
A0~A11
/WE
DQ0/CASL
DQ15
/CASH
/RAS
4M x 16
/OE
/RAS1
A0..A11
16
A0~A11
/WE
DQ0/CASL
DQ15
/CASH
/RAS
4M x 16
/OE
/RAS3
16
RAS#
ADDR
RW
AS
BE[3..0]
ACK
reloj
direcciones
A[11..0]
D_Out (7 downto 0)
Ack=1?
THRF=0
Ena=0
Multiplicando
latches
Multiplicador
mux a filas
y columnas
Pollard 87
direcciones A[24..2]
datos
RAS#
CAS#
ADDR
ROW
COLUMN
WE#
DATA
DQ
OE#
1
3 45 6
7 8 9 10 11
T2-11
110
T5-6
T1-2
T6-7
10
T2-4
10
T6-8
10
T2-6
20
T6-9
10
T3-6
T6-10
15
T4-6
T10-11
40
77
CAS#
ADDR
se asegura /WE en 1
se baja /CAS
se baja /RAS
se sube /CAS
se sube /RAS
se espera un tiempo de precarga
hasta empezar otro ciclo
ADDRESS=dont care
WE#
DATA = dont care
DQ
OE#
1
23 4
T1-3
10
T3-4
T1-4
10
T4-5
7 ... 0
RAS#
CAS#
ADDR
WE#
DQ
OE#
RAS#
10
CAS#
ADDR
WE#
DQ
OE#
RAS#
T2-3
T4-6
15
T2-4
10
T4-7
60
CAS#
ADDR
WE#
DQ
OE#
READ
RAS#
WRITE
1.
2.
3.
4.
5.
6.
REFRESH
hcnt
25.175MHz
hsi
pixel
hsyn
pixel
L.Baker. VHDL Programming With Advanced Topics. John Wiley and Sons, Inc. 1993, ISBN 0-471-57464-3
vsyn
hsw
hval
J.Bhasker. A VHDL Primer, Revised Edition. Prentice Hall 1995. ISBN 0-13-181447-
val
vper
lineas
vsi
vcnt
row
0..479
K.C.Chang. Digital Systems Design With VHDL and Synthesis. An inteegrated Approach. IEEE Computer
Society 1999. ISBN 0-7695-0023-4
lineas
hsyn
column
0..639
R. Dueck. Digital Design with CPLD. Applications and VHDL. DELMAR, Thomson Learning. ISBN 0-76681160-3
vsw
hval
val
S.S.Leung & M.AA.Shanblatt. ASIC System Design with VHDL: A Paradigm. 2nd.Edition, Kluwer Academic
Publishers, 1989, ISBN:0-7923-9032-6
lineas
F.Pardo & J.Boluda. VHDL Lenguaje para sntesis y modelado de circuitos. AlfaOmega 2000. ISBN 970-150443-7.
800
vper
hsw
95
vsw
hsi
657
vsi
491
M.J.S.Smith. Application Specific Integrated Circuits. Addison Wesley 1997. ISBN 0-201-50022-1
hcnt
640
vcnt
480
L.Ters et al. VHDL Lenguaje Estndar de Diseo Electrnico. McGraw Hill 1998, ISBN 84-481-1196-6
522
La interfase JTAG
Conceptos bsicos y detalles de
operacin de una moderna
metodologa de test
78
Sensor
Excitador
lneas JTAG/BST
Ncleo
lgico
Ncleo
lgico
Ncleo
lgico
multilayer
lneas a testear
.....
Ncleo
interno
TAP CONTROLLER
.....
TDI
TMS
TCK
nTRST
TDO
La cadena BST se intercala entre el ncleo y las patas de cada chip, y puede
forzar valores lgicos en las patas de salida y capturar el estado de las patas
de entrada (test esttico del PCB)
En ciertos casos esta cadena puede excitar a los ncleos con valores de
entrada programables y capturar sus respuestas (test esttico del chip)
Todo el esquema funciona como un gigantesco shift-register
79
JTAG
Dispositivo
con BST
Dispositivo
con BST
Dispositivo
con BST
C2
Dispositivo
sin BST
C1
B
Dispositivo
sin BST
Monitoreo en operacin
Usando BST para la captura de las entradas y/o salidas del chip
permite usar la cadena BST como un sistema de test funcional del
sistema, sin afectar su funcionamiento
Las celdas BST toman una muestra snapshot en forma
independiente de la operacin
PI
SI
SO
ncleo
lgico
PO
Las tareas bsicas de una celda BST son:
capturar datos presentes en su entrada paralela (PI)
forzar datos en su salida paralela (PO)
transferir datos en forma serial desde SI a SO
comportarse en modo transparente (PI aparece en PO)
Guillermo Jaquenod, 2001
Scan
Una celda bsica BST ofrece
Output
ShiftDR
4 modos de operacin:
PI
capturar datos presentes
en su entrada paralela sin
afectar la salida: ShiftDR =
0
Mode = 0, ClockDR^
D Q
D Q
1
forzar un dato en la salida
Ck
Ck
paralela: Mode = 1
actualizar los registros de
Update: UpdateDR^
ClockDR
UpdateDR
SI
recargar el shift register y
Scan
sacar los datos capturados Input
en modoserial: ShiftDR=1
y ClckDR^
Mode
0
1
PO
80
.valor a definir..
REGISTRO DE INSTRUCCION
TDI
......
UPDATEIR
CLOCKIR
SHIFTIR
TAP CONTROLLER
TMS
TCK
a TDO
Capture
clock
Shift Register
DECODIFICACION
Decodificacin
datos
REGISTRO DE BST
CLOCKDR
UPDATEDR
SHIFTDR
TAP
Controller
instrucciones
REGISTRO DE BYPASS
Update
......
Mantenimiento
REGISTRO IDCODE
......
REGISTRO UESCODE
......
REGISTROS ISP/ICR
......
..
nTRST
......
01
de TDI
TDO
ShiftDR
28 27
versin
de TDI
0
1
a TDO
1 0
fabricante
a TDO
Ck
ClockDR
ShiftDR
de TDI
12 11
nmero de parte
3
4
salida
tristate
3
1
entrada 2
4
3
4
2
4
salida
bidireccional
Guillermo Jaquenod, 2001
81
TDO (TEST DATA OUTPUT): salida serie de instrucciones, asi como datos
de test y programacin, actualizados en el flanco de bajada de TCK; va a
Tri-state cuando no se est sacando datos del dispositivo
Toda la operacin del TAP controller est definida por las lneas de
control TMS y el reloj TCK.
TRST (TEST RESET): seal asincrnica activa baja para reinicializar los
circuitos de test. La norma IEEE1149.1 la define como seal opcional, y est
disponible slo en ciertos dispositivos de ALTERA
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
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
TEST_LOGIC
/RESET
CAPTURE_DR
TMS=0
TMS=0
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
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
TMS=1
TMS=1
PAUSE_IR
TDO
TMS=0
TMS=0
UPDATE_DR
TMS=1
TMS=1
TAP
EXIT1_IR
EXIT2_DR
TMS=0
TDI
TMS=1
EXIT2_IR
TMS=1
TMS=1
UPDATE_IR
TMS=0
TEST_LOGIC RUN_TEST
SELECT_IR_SCAN CAPTURE__IR
/RESET
/IDLE
SELECT_DR_SCAN
SHIFT_IR
EXIT1_IR
82
Instrucciones BST
Otras instrucciones opcionales definidas por cada fabricante (en
Instancias de aplicacion
Creacin de vectores
test de interconexiones
test de memoria
identificacin de zonas no cubiertas por herramientas BST
Creacin de vectores
Para la validacin estructural del sistema: deteccin de
problemas
fsicos
ocasionados
por
el
proceso
de
83
CDIGO DE INSTRUCCIN
OE[7..0]
Modo
FLEX10K FLEX 8K
FLEX 6K
MAX9000 MAX7000S
10 bits
3 bits
3 bits
10 bits
10 bits
SAMPLE/
10H055
3B101
3B101
10H055
10H055
EXTEST
10H000
3B000
3B000
10H000
10H000
BYPASS
10H3FF
3B111
3B111
10H3FF
10H3FF
PRELOAD
D
CLK[3..0]
ENA
CLRN
UESCODE
10H007
-------
---------
IDCODE
10H006
-------
- ? -
--------10H059
--------
ENA[5..0]
CLR [1..0]
10H059
Al igual que en la
familia MAX7000S se
acta sobre la salida,
su control de tri-state
y la entrada
A diferencia de la
familia MAX7000S es
posible intercalarse
(adems de capturar
su valor) sobre la
lnea de entrada
84
SDO
0
1
OE[7..0]
D Q
D Q
CK
CK
D Q
D Q
CK
CK
D Q
D Q
SDO
pin
dedicado
a la lgica
interna
0
1
0
1
CLK[3..0]
0
1
D Q
CK
0
1
D Q
CK
0
1
VCC
0
1
D Q
CK
ENA
CLRN
ENA[5..0]
0
1
CK
CLR [1..0]
SDI SHIFT
CLOCK
0
1
GND
CK
UPDATE
0
1
D Q
CK
MODE
SHIFT
OPERACION NORMAL
CLOCK
SDI
UPDATE
MODE
BSDL
Boundary Scan Description
Languaje
Componentes de un archivo
de descripcin BSDL
Scan port identification: niveles activos de las lneas JTAG, y fmax de TCK
85
port (
86
En la EMP7128SLC84
attribute REGISTER_ACCESS
of EPM7128SL84 : entity
is "DEVICE_ID (IDCODE)";
Guillermo Jaquenod, 2001
Control
de OE
SDO
D Q
CK
GND
0
1
285
286
D Q
CK
SHIFT
D Q
CK
0
1
6
D Q
7 (BC_1,*,control, 0)
de la
macrocelda
8(BC_1,IO81,output3,X,7,0,Z)
0
0
D Q
al PIA
D Q
SDI
SHIFT
D Q
CLOCK
UPDATE
MODE
a la lgica
interna
VCC
D Q
0
0
0
1
SDO
0
287
CLOCK
SDI
87
RAM
64 x 8
cs
oe
wr
Fuente: ASHENDEN
Preguntas
Preguntas
Dibuje la cola de eventos de la seal z antes de la ejecucin
de cada sentencia WAIT y muestre la secuencia de valores
en el tiempo que toma la seal z
En algn package
En algn package
defino los tipos y en
defino los tipos y en
base a ellos el array
base a ellos el array
z <=
wait
z <=
wait
z <=
wait
z <=
wait
Fuente: TERS
transport
for 5 ns;
transport
for 8 ns;
transport
for 2 ns;
transport
for 1 ns;
1 after 10 ns;
0 after 7 ns;
1 after 10 ns;
0 after 3 ns;
Fuente: TERS
88