Documentos de Académico
Documentos de Profesional
Documentos de Cultura
VHDL
VHDL
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
Test-Bench y vectores
Prototipo
Detalle del
funcionamiento
Prototipado
Elaboracin de cmo
llegar a los resultados
ESPECIFICACIN
PARTICIN HARDWARE/SOFTWARE
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#
1024
1
256.0
0.5
33
8#21#
2#10.01#
2#1#E3
16#F0_0F#
8#31#
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
Arrayde
de44bits
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
muestraHIGH valdr 7
muestraLOW valdr 0
muestraRIGHT valdr 0
muestraLEFT valdr 7
muestraRANGE valdr 7 DOWNTO 0
muestraREVERSE RANGE valdr 0 TO 7
muestraLENGTH valdr 8
muestraASCENDING ser falso
Recordarlos!
Son MUY
usados!
se tiene:
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:
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:
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);
A
A
A
A
B
C
C
== XF3;
SRL 3;
XOR B;
+ B;
/= B10010
* D
/ D
Preguntas
Cunto
Cunto
Cunto
Cunto
Cunto
Cunto
Cunto
vale
vale
vale
vale
vale
vale
vale
Dado el type
numerosSUCC (3)?
numerosRIGHTOF(3)?
numerosLOW?
numerosHIGH?
numerosPOS(3)?
numerosVAL(2)?
numerosASCENDING?
Cunto
Cunto
Cunto
Cunto
Cunto
Cunto
Cunto
vale
vale
vale
vale
vale
vale
vale
numdwnSUCC (3)?
numdwnLOW?
numdwnHIGH?
numdwnPOS(3)?
numdwnVAL(2)?
numdwnASCENDING?
numdwnSUCC (numdwnHIGH)?
matrixLEFT
matrixLEFT(1)
matrixLEFT(2)
matrixRIGHT(3)
matrixLOW
matrixLOW(2)
matrixHIGH(3)
matrixRANGE
matrixRANGE(2)
matrixASCENDING(3)
matrixREVERSE_RANGE(2)
matrixLENGTH(3)
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
en VHDL93
VHDL93
[GENERIC(...);] [PORT(...);]
END [ENTITY] [<identificador>] ;
identificador
identificador
modo
modo
tipo
tipo
Agregado
Agregado
en
enVHDL93
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
De acceso
acceso
Discretos
Discretos
Boolean
Boolean
FALSE,
FALSE,TRUE
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
enVHDL-93
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
Severity Level
Level
NOTE,
NOTE,WARNING,
WARNING,ERROR,
ERROR,FAILURE
FAILURE
revisar
revisar STANDARD.VHD
STANDARD.VHD en
en C:\maxplus2\vhdl93\std
C:\maxplus2\vhdl93\std
Guillermo Jaquenod, 2001
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
delPackage
Package
Cuerpo
Cuerpodel
del
Package
Package
Fuente: ALTERA
11
La Library IEEE
La Library IEEE es muy usada en VHDL, pues no slo define
nuevos tipos de seales, sino tambin el comportamiento de los
operadores aritmticos y lgicos sobre esos nuevos tipos.
La Library IEEE contiene los siguientes packages:
std_logic_1164:
tipos STD_LOGIC, STD_LOGIC_VECTOR y overload de las
funciones relacionadas con estos tipos
std_logic_arith:
overload de funciones aritmticas, de conversin, y los tipos SIGNED
y UNSIGNED
std_logic_signed:
funciones aritmticas para STD_LOGIC_VECTOR con signo
std_logic_unsigned:
funciones aritmticas para STD_LOGIC_VECTOR sin signo
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
Bases de VHDL
Concurrencia y Secuencialidad
Seales y Variables
Sentencias de asignacin
Secuenciales
Declaracin de variables
Asignacin a variables
Sentencia IF..THEN..ELSE
Sentencia CASE
Sentencia LOOP
Sentencia RETURN
Sentencia NULL
Sentencia WAIT
temp
process
process
signals
signals
Concurrentes
Declaracin de seales
Sentencia WHEN..ELSE
Sentencia WITH..SELECT
Sentencia PROCESS
Sentencias BLOCK
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
Los
LosBIT_VECTOR
BIT_VECTORllevan
llevanla
laletra
letraBBal
alinicio!
inicio!
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
lista
lista de
de
sensibilidad
sensibilidad
[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:
a,b,c,d: eventos
eventos para
para WAIT
WAIT ON
ON
a,c:
a,c: eventos
eventos para
para WAIT
WAIT UNTIL
UNTIL
e,f,g,h:
eventos
e,f,g,h: eventos para
para WAIT
WAIT FOR
FOR
X
a b
X1
PROCESS BEGIN
X2 <= NOT(X); WAIT ON X;
END PROCESS;
X2
PROCESS BEGIN
WAIT ON X; X3 <= NOT(X);
END PROCESS;
X3
PROCESS BEGIN
WAIT UNTIL X=1; X4 <= NOT(X);
END PROCESS;
X4
PROCESS BEGIN
X5 <= NOT(X);
WAIT UNTIL X=1 FOR 10 ns;
END PROCESS;
X5
No
Nosintetizable!!!
sintetizable!!!
Guillermo Jaquenod, 2001
MAX+plusII slo
10 20 30 40
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
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;
--
CUIDADO!
Siaauna
unamisma
mismaseal
sealse
selele
CUIDADO!No
Noconfundirse:
confundirse:Si
asignan
asignandos
dosvalores
valoresdentro
dentrode
dedos
dosprocesos
procesossecuenciales
secuenciales
diferentes,
diferentes,ser
sernecesaria
necesariaalguna
algunafuncion
funcionde
deresolucin!
resolucin!
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;
CUIDADO!
Siaauna
unamisma
mismaseal
sealse
selele
CUIDADO!No
Noolvidar:
olvidar:Si
asignan
asignandos
dosvalores
valoresdentro
dentrode
dedos
dosprocesos
procesossecuenciales
secuenciales
diferentes,
diferentes,ser
sernecesaria
necesariaalguna
algunafuncion
funcionde
deresolucin!
resolucin!
Fuente: ALTERA
c, d)
00
b
c
d
01
10
11
sel
2
<=
<=
<=
<=
a;
b;
c;
d;
a
b
sel0
sel1
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
Muyusada
usada
Necesita
NecesitaIEEE_1164
IEEE_1164
yyseales
sealesSTD_LOGIC
STD_LOGIC
Equivalente
Equivalenteaalalade
deabajo,
abajo,
pero
peroredundante
redundante
PROCESS BEGIN
WAIT UNTIL reloj=1;
q <= d;
Slo
Slosisino
nose
senecesita
necesitaRESET/SET
RESET/SET
END PROCESS;
asincrnicos
asincrnicos
Fuente: ALTERA
clk
Cascade In
PRN
4 inp.
LUT
ENA
CLRN
Cascade Out
Fuente: SJOHOLM
ANALIZAR
ANALIZAR CMO
CMO FUNCIONA
FUNCIONACADA
CADA MTODO!
MTODO!
i1
Acepta
Aceptaflancos
flancosde
deX
XooZ
Zaa1
1
Tambin
Tambinsirve
sirvepara
paraseales
sealesBIT
BIT
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 QQ
D
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 QQ
D
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
Fuente: ALTERA
tipo_no_resuelto;
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:
PROCESS (s1) BEGIN
a <= s1;
END PROCESS;
PROCESS (s2) BEGIN
a <= s21;
END PROCESS;
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
incluir std_logic_unsigned
std_logic_unsigned
yystd_logic_1164)
std_logic_1164)
29
44Columnas
Columnas
De igual modo, luego de haber definido el valor de ciertos elementos de un vector, puede
usarse others para completar los restantes:
a <= (1 =>1, 3 => 1, OTHERS => 0);
33Filas
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
Elvalor
valorde
detodo
todoel
elarray
arraybbes
es
VARIABLE a,b : nibble;
copiado
copiadoen
entodo
todoel
elarray
arrayaa
....
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
Lasuma
suma
SubArray
SubArray
Fuente: BAKER
30
Condicional
label: IF <expresin booleana> GENERATE
[declaraciones...; BEGIN]
sentencia; ..; sentencia;
END GENERATE;
Atencin:
Atencin:IF
IF
GENERATE
GENERATEno
notiene
tiene
ELSE
ELSEGENERATE
GENERATE
como
comoel
elAHDL!
AHDL!
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
ARCHITECTURE
ARCHITECTURE nullex
nullex OF
OF uso_NULL
uso_NULL IS
IS
BEGIN
BEGIN
ejemplo:
ejemplo: PROCESS
PROCESS (a)
(a) BEGIN
BEGIN
s1
s1 <=
<= 0;
0;
s2
s2 <=
<= 0;
0;
s3
s3 <=
<= 0;
0;
Qu circuito se
CASE
CASE (a)
(a) IS
IS
generar ac?
Se inferir un
WHEN
WHEN B00
B00 =>
=>
LATCH?
s1
s1 <=
<= 1;
1;
WHEN
WHEN B01
B01 =>
=>
s2
s2 <=
<= 1;
1;
s3
s3 <=
<= 1;
1;
WHEN
WHEN OTHERS
OTHERS =>
=> NULL;
NULL;
END
END CASE;
CASE;
END
END PROCESS
PROCESS ejemplo;
ejemplo;
END
END ARCHITECTURE
ARCHITECTURE nullex;
nullex;
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
B10011010SLL
SLL33 ==B11010000
B11010000
B00001000
B00001000SLL
SLL-1
-1==B00000100
B00000100
SRL
FALSE
0
B10011010
B10011010SRL
SRL33 ==B00010011
B00010011
B00001000
B00001000SRL
SRL-1
-1==B00010000
B00010000
ROR
SLL -3 es lo mismo
que SRL 3!!
Rotaciones
Guillermo Jaquenod, 2001
SLA
B10011011
B10011011SLA
SLA33 ==B11011111
B11011111
B00001000
B00001000SLA
SLA-1
-1==B00000100
B00000100
SRA
B10011010
B10011010SRA
SRA33 ==B11110011
B11110011
B00001000
B00001000SRA
SRA-1
-1==B00010000
B00010000
En el SHIFT ARITMTICO se
conserva el valor del sitio que queda
vacante (LEFT en SRA y RIGHT en
SLA)
B10011010
B10011010ROL
ROL33 ==B11010100
B11010100
B00001001
B00001001ROL
ROL-1
-1==B10000100
B10000100
ROR
B10011010
B10011010ROR
ROR33 ==B01010011
B01010011
B10001000
B10001000ROR
ROR-1
-1==B00010001
B00010001
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
Formarpida
rpidade
de
asignar
IF clk=1' THEN a <= datos; end if;
asignarel
elmismo
mismovalor
valor
aatodo
END PROCESS registros;
todoel
elvector
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
Descripcinde
dela
la
FUNCTION
FUNCTION dentro
dentrode
de
una
unaarquitectura
arquitectura
Cada
Cadallamada
llamadaaamax
maxdevuelve
devuelve
un
unlargo
largodistinto:
distinto:amax
amaxtiene
tiene
largo
largo44yybmax
bmaxlargo
largo77
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
revisar
revisar c:\MAXPLUS2\VHDL93\IEEE\arith.vhd
c:\MAXPLUS2\VHDL93\IEEE\arith.vhd yy arithb.vhd
arithb.vhd !!!!
Guillermo Jaquenod, 2001
Fuente: ALTERA
34
Fuente: ALTERA
SIGNED'("0110") representa +6
Por ejemplo:
revisar
revisar c:\MAXPLUS2\VHDL93\IEEE\signed.vhd
c:\MAXPLUS2\VHDL93\IEEE\signed.vhd yy signedb.vhd,
signedb.vhd,
as
ascomo
como unsigned.vhd
unsigned.vhd yy unsignb.vhd
unsignb.vhd !!!!
Guillermo Jaquenod, 2001
largo=5
largo=5bits
bits
largo=6
largo=6bits
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
Usa
Usaaasu
suvez
veztres
tresfunciones:
funciones:
CONV_INTEGER
CONV_INTEGER(std_logic_vector)
(std_logic_vector)RETURN
RETURN(integer)
(integer)para
parapasar
pasarde
de
STD_LOGIC_VECTOR
STD_LOGIC_VECTORaaUNSIGNED.
UNSIGNED.Definida
Definidaen
enSTD_LOGIC_ARITH
STD_LOGIC_ARITH
CONV_STD_LOGIC_VECTOR
CONV_STD_LOGIC_VECTOR(integer,integer)
(integer,integer)RETURN
RETURN(std_logic_vector)
(std_logic_vector)
para
paralalafuncion
funcionopuesta.
opuesta.Definida
Definidaen
enSTD_LOGIC_ARITH
STD_LOGIC_ARITH
MAXIMUM
MAXIMUM(integer,integer)
(integer,integer)RETURN
RETURN(integer).
(integer).Definida
Definidapor
poreleldiseador
diseador
a
c
ENTITY
ENTITY add_ex1
add_ex1 IS
IS
PORT(a,b:IN
PORT(a,b:IN std_logic_vector(15
std_logic_vector(15 DOWNTO
DOWNTO 0);
0);
c,d:IN
c,d:IN std_logic_vector(15
std_logic_vector(15 DOWNTO
DOWNTO 0);
0);
input:IN
input:IN std_logic;
std_logic;
sum:OUT
sum:OUT std_logic_vector(15
std_logic_vector(15 DOWNTO
DOWNTO 0));
0));
END
END ENTITY
ENTITY add_ex1;
add_ex1;
b
d
MUX
sum
48
48LEs
LEs
22bloques
bloquesde
de16
16LEs
LEsc/u
c/u
usando
usandocadenas
cadenasde
deCarry
Carry
Fuente: ALTERA
3 inp.
LUT
Fuente: ALTERA
Cascade In
Carry In
Data1
Data2
ENA
CLRN
tambin
tambin48
48LEs,
LEs,pero
pero
slo
slo11bloque
bloquede
de16
16LEs
LEs
usa
usacadenas
cadenasde
deCarry
Carry
PRN
D
11 sumador
sumador
++
22 multiplexer:
multiplexer:
ARITMETICO
3 inp.
LUT
PRN
sum
input
22 sumadores
sumadores
++
11 multiplexer:
multiplexer:
b
d
input
ARCHITECTURE
ARCHITECTURE behavior
behavior OF
OF add_ex1
add_ex1 IS
IS
BEGIN
BEGIN
PROCESS(a,b,c,d,input)
PROCESS(a,b,c,d,input)
BEGIN
BEGIN
IF
IF input='0'
input='0' THEN
THEN sum
sum <=
<= aa ++ b;
b;
ELSE
sum
ELSE
sum <=
<= cc ++ d;
d;
END
END IF;
IF;
END
END PROCESS;
PROCESS;
END
END ARCHITECTURE
ARCHITECTURE behavior;
behavior;
a
c
ENTITY add_ex1 IS
PORT(a,b,c,d:IN std_logic_vector(15 DOWNTO 0);
input:IN std_logic;
sum:OUT std_logic_vector(15 DOWNTO 0));
END ENTITY add_ex1;
ENA
CLRN
Data3
Data4
4 inp.
LUT
PRN
D
ENA
CLRN
Cascade Out
3 inp.
LUT
3 inp.
LUT
PRN
D
ENA
CLRN
U/D
COUNTER
3 inp.
LUT
3 inp.
LUT
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
Fuente: ALTERA
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
Cmputo
de las
salidas
E(k)=EA
E(k+1)=EF=f(ent{},EA)
SAL{} = g(E(k))
memoria
reloj
MOORE
Guillermo Jaquenod, 2001
Registros
de estado
Entradas
Registros
de estado
SAL{} = g(E(k),ent{})
Entradas
Salidas
MEALY
Cmputo
del
estado
siguiente
Registros
de estado
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
Sincronizacin:
Sincronizacin:ZONA
ZONAPUBLICA!!
PUBLICA!!
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
ASSIGN TIMING
TIMING REQ
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
ASSIGN CLIQUE
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
Signal Processing & Telecom: cascadable adaptive FIR, Filter Library (FIR & IIR), Rank
Order Filter, Laplacian Edge detector, Complex Multiplier/Mixer, FFT/IFFT, Discrete
Cosine Transform, Image Processing Library, Floating Point Operator Library,
Convolutional (encoder, interleaver), Reed Solomon (encoder, variable (N,K) encoder,
decoder), Viterbi (Dual Constraint Length Decoder), DVB FEC Codec, LFSRs, Digital IF
receiver, Multi-Standard ADPCM, Early/Late Gate Symbol Synchronizer, QPSK Equalizer,
Digital Modulator, NCO, Binary Pattern Correlator
Communications: HDLC Controller (byte & bit oriented), Data encoder/decoder, Packet
over SONET (POS) Controller, SONET Interface, ATM Receive Processor, Generador de
tonos (DTMF, call progress, etc.), UTOPIA Level_2, 10/100 Ethernet MAC, Cell
Delineation (ATM sobre SONET o SDH)
PCI: 32bit/33MHz, 32bit/66MHz, 64bit 66MHz Master, Target, ambos, Bridge, Arbiter
Otros: CAN, IEEE1394, IEEE1284, I2C, DAI (Digital Audio Interface), USB
Microprocesadores: 49410, 8051, RAW8051, 8052, 2901, 2910, 6502, Z80, 6402, 6850,
8237,8251,8254, 8255, 8259, 16450, 165550, 6850,29116, SDRAM, DMA, PowerPC
USE lpm.lpm_components.ALL;
declaracin
declaracinusando
usando
un
unPackage
Package
ENTITY practica IS
GENERIC (prescaler_size: INTEGER := 23;...)
PORT ( clk: IN STD_LOGIC;.);
no
END ENTITY practica;
noes
esnecesario
necesariodeclarar
declararalal
componente
componenteen
enlalaarquitectura
arquitectura
ARCHITECTURE a OF practica IS
SIGNAL conta: STD_LOGIC_VECTOR (0 TO prescaler_size-1);
invocacin
invocacin
BEGIN
prescaler : LPM_COUNTER -- instanciacin del componente
GENERIC MAP (LPM_WIDTH => prescaler_size)
PORT MAP (clock => clk, q => conta);
Guillermo Jaquenod, 2001
44
la
la Instancia
Instancia
Nombre
Nombre del
del Componente
Componente
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
of Parameterized Modules
Para
Para usar
usar las
las primitivas
primitivas
la
library+package aa
la library+package
usar
usar son
sonaltera
altera yy
maxplus2!
maxplus2!
Fuente: ALTERA
Se indica el uso de la
Library LPM y del
package
LPM_COMPONENTS
Se instancia el
componente, dando
COMPONENT lpm_mux
Para
Para usar
usar LPMs
LPMs la
la
GENERIC (LPM_WIDTH: POSITIVE;
library+package
library+package aa usar
usar
LPM_WIDTHS: POSITIVE; LPM_PIPELINE: INTEGER := 0;
son
son lpm
lpm yy
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[]
Declaracin
Declaracin de
de LPM_MUX
LPM_MUX en
en lpm_components
lpm_components
COMPONENT
COMPONENT lpm_mux
lpm_mux
GENERIC
GENERIC (LPM_WIDTH:
(LPM_WIDTH: POSITIVE;
POSITIVE;
LPM_WIDTHS:
LPM_WIDTHS: POSITIVE;
POSITIVE;
LPM_PIPELINE:
LPM_PIPELINE: INTEGER:=
INTEGER:= 0;
0;
LIBRARY ieee;
LPM_SIZE:
POSITIVE;
LPM_SIZE:
POSITIVE;
USE ieee.std_logic_1164.all;
LPM_HINT:
LPM_HINT: STRING
STRING :=
:= UNUSED);
UNUSED);
USE ieee.std_logic_arith.all;
PORT
PORT (data:
(data: IN
IN STD_LOGIC_2D(LPM_SIZE-1
STD_LOGIC_2D(LPM_SIZE-1 DOWNTO
DOWNTO 0,
0,
LPM_WIDTH-1
USE ieee.std_logic_signed.all;
LPM_WIDTH-1 DOWNTO
DOWNTO 0);
0);
aclr:
aclr: IN
IN STD_LOGIC
STD_LOGIC :=
:= '0';
'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:
result: OUT
OUT STD_LOGIC_VECTOR(LPM_WIDTH-1
STD_LOGIC_VECTOR(LPM_WIDTH-1 DOWNTO
DOWNTO 0));
0));
END
END COMPONENT;
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
y:out std_logic_vector (15 downto 0));
Asignacinde
devalores
valores
aalos
END ENTITY tst_mux;
losparmetros
parmetros
Nombre
Nombrede
delalaLPM
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
Mapeode
delas
laspuertas
puertas
Nombre
Nombrede
delalaInstancia
Instancia
Fuente: ALTERA
Guillermo Jaquenod, 2001
COMPONENT lpm_decode
IrIralalHELP
HELP
del
del
MAX+plus
MAX+plusII!II!
data[]
aclr
enable
clk
clken
eq[]
47
IrIralalHELP
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
IrIralalHELP
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
IrIralalHELP
HELP
del
del
MAX+plus
MAX+plus
II!II!
IrIralalHELP
HELPdel
del
COMPONENT lpm_shiftreg
MAX+plus
MAX+plusII!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
Packagede
deLPMs
LPMs
Instanciacin
Instanciacindel
del
componente
componenteLPM
LPM
escribir,
=> salidas);
Fuente: ALTERA
COMPONENT LPM_FIFO
GENERIC (LPM_WIDTH: POSITIVE;
Un
UnLPM_FIFO
LPM_FIFO emplea
emplea un
unEAB
EAB ms
ms
LPM_WIDTHU: POSITIVE : = 1;
otros
otros recursos
recursos (contadores
(contadores de
de
lectura
LPM_TYPE: STRING := "LPM_FIFO";
lectura yyescritura)
escritura) cuya
cuya realizacin
realizacin
queda
queda oculta
oculta al
aldiseador.
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()
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
Declaracindel
del
componente
ARCHITECTURE a OF reg24 IS
componente
COMPONENT regvar
GENERIC(ANCHO: INTEGER);
PORT(d:IN STD_LOGIC_VECTOR(ANCHO- 1 DOWNTO 0);clk:IN STD_LOGIC;
q:OUT STD_LOGIC_VECTOR(ANCHO- 1 DOWNTO 0));
END COMPONENT;
BEGIN
reg12a : regvar
PORT MAP (d =>
reg12b : regvar
PORT MAP (d =>
END a;
GENERIC MAP
d(11 DOWNTO
GENERIC MAP
d(23 DOWNTO
(ANCHO=> 12)
0), clk => clk, q => q(11 DOWNTO 0));
(ANCHO=> 12)
12), clk => clk,q => q(23 DOWNTO 12));
Dos
Dosinstancias
instanciasdel
del
componente
componente
(cada
(cadauna
unaocupa
ocupa
una
unaregin
reginde
de
silicio),
silicio),dando
dando
valor
valoraalos
los
parmetros
parmetros
Fuente: ALTERA
Fuente: ALTERA
Fuente: ALTERA
Fuente: ALTERA
Fuente: ALTERA
50
Bases de VHDL
Posibles escenarios de diseo para
Sntesis + Place&Route + Simulacin:
Escoger
Escoger Show
Show All
All Node
Node Name
Name Synonyms
Synonyms
en
en la
la ventana
ventana de
de dilogo
dilogo Enter
Enter Nodes
Nodes from
from SNF
SNF
Escoger
Escoger Preserve
Preserve all
all Node
Node Name
Name Synonyms
Synonyms
en
en el
el men
men Processing
antes de
de compilar
compilar
Processing antes
Fuente: ALTERA
MAX+plus II
Compilador y Simulador
Slo MAX+plus II
EDA => MAX+plus II => EDA
MAX+plus II => EDA
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
No
Funcional
Temporal
Simulacin
Simulacin
OK?
Si
OK?
Si
Timing
SNF
Extractor
Compilacin
1
Probar otra
arquitectura
No
Habilitar Design
Doctor
Probar otras
Logic Options
Anlisis Temporal
Velo.?
No
Fuente: ALTERA
51
Sintaxis
Sintaxis coloreada
coloreada
Fuente: ALTERA
Ahora (VHDL93)
D <= x"FC";
edif
.edo
.lmf
MAX+plus II
Fuente: ALTERA
Segundo escenario
3rd
party
EDA
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
(edif
(edif miand3
miand3 (edifVersion
(edifVersion 22 00 0)
0) (edifLevel
(edifLevel 0)
0) (keywordMap
(keywordMap (keywordLevel
(keywordLevel 0))
0))
(status
(status (written(timeStamp
(written(timeStamp 2001
2001 66 16
16 10
10 22 56)(authorxx")(program
56)(authorxx")(program xx"
xx" (version
(version xx"))))
xx"))))
(library
(library ALTERA
ALTERA (edifLevel
(edifLevel 0)(technology
0)(technology (numberDefinition
(numberDefinition ))
))
(cell
(cell LUT
LUT (cellType
(cellType GENERIC)
GENERIC)
(view
(view PRIM
PRIM (viewType
(viewType NETLIST)
NETLIST)
(interface
(interface (port
(port IN1
IN1 (direction
(direction INPUT))(port
INPUT))(port IN2
IN2 (direction
(direction INPUT))
INPUT))
a
(port
(port IN3
IN3 (direction
(direction INPUT))(port
INPUT))(port IN4
IN4 (direction
(direction INPUT))
INPUT))
(port
(port A_OUT
A_OUT (direction
(direction OUTPUT))))))
OUTPUT))))))
b
(library
PrimLib
(edifLevel
0)(technology
(numberDefinition
)))
(library PrimLib (edifLevel 0)(technology (numberDefinition )))
c
(library
work
(edifLevel
0)(technology
(numberDefinition
))
(library work (edifLevel 0)(technology (numberDefinition ))
(cell
(cell miand3
miand3 (cellType
(cellType GENERIC)
GENERIC)
(view
(view aa (viewType
(viewType NETLIST)
NETLIST)
(interface
(interface (port
(port aa (direction
(direction INPUT))(port
INPUT))(port bb (direction
(direction INPUT))
INPUT))
(port
(port cc (direction
(direction INPUT))(port
INPUT))(port sal
sal (direction
(direction OUTPUT)))
OUTPUT)))
(contents
(contents (instance(rename
(instance(rename sal1
sal1 "sal")(viewRef
"sal")(viewRef PRIM
PRIM (cellref
(cellref LUT
LUT (libraryRef
(libraryRef ALTERA)))
ALTERA)))
(property
(property lut_function
lut_function (string
(string "((IN3
"((IN3 IN2
IN2 IN1))")))
IN1))")))
(net
(net aa (joined(portRef
(joined(portRef a)(portRef
a)(portRef IN1
IN1 (instanceRef
(instanceRef sal1))))
sal1))))
(net
(net bb (joined(portRef
(joined(portRef b)(portRef
b)(portRef IN2
IN2 (instanceRef
(instanceRef sal1))))
sal1))))
(net
(net cc (joined(portRef
(joined(portRef c)(portRef
c)(portRef IN3
IN3 (instanceRef
(instanceRef sal1))))
sal1))))
(net
(net VCC
VCC (joined))(net
(joined))(net GND
GND (joined(portRef
(joined(portRef IN4
IN4 (instanceRef
(instanceRef sal1))))
sal1))))
(net
(net sal
sal (joined(portRef
(joined(portRef A_OUT
A_OUT (instanceRef
(instanceRef sal1))(portRef
sal1))(portRef sal)))))))
sal)))))))
(design
(design miand3
miand3 (cellRef
(cellRef miand3
miand3 (libraryRef
(libraryRef work))))
work))))
miand3
LIBRARY
LIBRARY synplify
synplify
BEGIN
BEGIN
Fuente: SYNPLIFY
Extracto
Extractode
deSynplify.lmf
Synplify.lmf
FUNCTION
FUNCTION and3
and3 (IN1,IN2,IN3)
(IN1,IN2,IN3) RETURNS
RETURNS (OUT)
(OUT)
FUNCTION
FUNCTION "AND3"
"AND3" ("I0","I1","I2")
("I0","I1","I2") RETURNS
RETURNS ("OUT")
("OUT")
END
END
...
...
BEGIN
BEGIN
FUNCTION
FUNCTION dff
dff (D,CLK,CLRN,PRN)
(D,CLK,CLRN,PRN) RETURNS
RETURNS (Q)
(Q)
FUNCTION
FUNCTION "DFFNRS1"
"DFFNRS1" ("D0","C","RN","SN")
("D0","C","RN","SN") RETURNS
RETURNS ("Q0")
("Q0")
END
END
...
...
BEGIN
BEGIN
FUNCTION
tri
(IN,OE)
RETURNS
(OUT)
FUNCTION tri (IN,OE) RETURNS (OUT)
FUNCTION
FUNCTION "TRI1"
"TRI1" ("I0","E")
("I0","E") RETURNS
RETURNS ("OUT0")
("OUT0")
END
END
...
...
BEGIN
BEGIN
FUNCTION
FUNCTION carry
carry (IN)
(IN) RETURNS
RETURNS (OUT)
(OUT)
FUNCTION
FUNCTION "CARRY"
"CARRY" ("A_IN")
("A_IN") RETURNS
RETURNS ("A_OUT")
("A_OUT")
END
END
...
...
BEGIN
BEGIN
FUNCTION
FUNCTION global
global (IN)
(IN) RETURNS
RETURNS (OUT)
(OUT)
FUNCTION
FUNCTION "GLOBAL"
"GLOBAL" ("A_IN")
("A_IN") RETURNS
RETURNS ("A_OUT")
("A_OUT")
END
END
...
...
BEGIN
BEGIN
FUNCTION
FUNCTION lcell
lcell (IN)
(IN) RETURNS
RETURNS (OUT)
(OUT)
FUNCTION
FUNCTION "LCELL"
"LCELL" ("A_IN")
("A_IN") RETURNS
RETURNS ("A_OUT")
("A_OUT")
END
END
...
...
END
END
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
Recinen
enVHDL93!
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
LIBRARY
LIBRARY ieee;USE
ieee;USE ieee.std_logic_1164.ALL;
ieee.std_logic_1164.ALL; USE
USE ieee.numeric_std.ALL;
ieee.numeric_std.ALL;
ENTITY
ENTITY testbench
testbench IS
IS END;
END;
ARCHITECTURE
ARCHITECTURE xx
xx OF
OF testbench
testbench IS
IS
COMPONENT
usoarray
IS
PORT
(tabular_bus:
OUT
UNSIGNED
COMPONENT usoarray IS PORT (tabular_bus: OUT UNSIGNED (7
(7 DOWNTO
DOWNTO 0));
0));
END
END COMPONENT;
COMPONENT;
SIGNAL
SIGNAL out_tab:
out_tab: UNSIGNED
UNSIGNED (7
(7 DOWNTO
DOWNTO 0);
0);
BEGIN
BEGIN
dut:
dut: usoarray
usoarray PORT
PORT MAP
MAP (out_tab);
(out_tab);
END;
END;
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
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
Binario
GRAY
0000=0
0000=0
0001=1
0001=1
0010=2
0011=3
0011=3
0010=2
0100=4
0110=6
0101=5
0111=7
0110=6
0101=5
0111=7
0100=4
1000=8
1100=C
1001=9
1101=D
1010=A
1111=F
1011=B
1110=E
1100=C
1010=A
1101=D
1011=B
1110=E
1001=9
1111=F
1000=8
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
despl (2)=4
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
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
Ciclo
Cdigo GRAY
Dummy qt0
Ciclo
Cdigo GRAY
Dummy qt0
0000=0
1100=C
0001=1
1101=D
0011=3
1111=F
0010=2
1110=E
0110=6
1010=A
0111=7
1011=B
0101=5
1001=9
0100=4
1000=8
Contadores Johnson
Los contadores Johnson son
ineficientes en el uso de
registros, por cuanto la cantidad
de estados distintos es slo el
doble de los registros usados
En diseos de microelectrnica
de RF suelen ser usados como
prescalers en las primeras
etapas, dada su alta simplicidad
circuital y la rpida velocidad de
operacin
Estos beneficios ya no son tales
al usar lgica programable,
donde tienen igual performance
que un contador LFSR
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
Alser
serfuncin
funcinde
de22oo44
realimentaciones,
realimentaciones,bastan
bastanNNelementos
elementos
lgicos
para
un
LFSR
lgicos para un LFSR de
de NN bits
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
Uso38
38LEs:
LEs:
LEs para ena?
LIBRARY ieee; USE ieee.std_logic_unsigned.ALL;
22
22para
paracrcshift
crcshift
LIBRARY lpm; USE lpm.lpm_components.ALL;
99para
paraelelcontador
contador
ENTITY crc16 IS PORT (
33para
paraena
ena
init,reloj,txrx,din: IN std_logic;
33para
paraxpass
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
di
reloj
init
dout
R16
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]
R15
X8
X7
X6
X5
X4
X3
X2
X1
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:
T=8
R16
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
R16
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
Estediseo,
diseo,compilado
compilado
Este
conMAX+Plus
MAX+Plus II,
II,
con
requiere32
32LEs
LEs
requiere
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
Armoelel
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
ARCHITECTURE aa OF
OF cysel64
cysel64 IS
IS
SIGNAL
SIGNAL slo,shi0,shi1:
slo,shi0,shi1:
std_logic_vector(33
std_logic_vector(33 DOWNTO
DOWNTO 1);
1);
BEGIN
BEGIN
slo
<=
'0'&
a(32
DOWNTO
1)
slo <= '0'& a(32 DOWNTO 1)
++ b(32
b(32 DOWNTO
DOWNTO 1)
1) ++ cin;
cin;
shi0
<=
'0'&
a(64
DOWNTO
33)
shi0 <= '0'& a(64 DOWNTO 33)
++ b(64
b(64 DOWNTO
DOWNTO 33);
33);
shi1
shi1 <=
<= '0'&
'0'& a(64
a(64 DOWNTO
DOWNTO 33)
33)
++ b(64
DOWNTO
33)
+
b(64 DOWNTO 33) + '1';
'1';
s(32
s(32 DOWNTO
DOWNTO 1)
1) <=
<= slo(32
slo(32 DOWNTO
DOWNTO 1);
1);
s(64
s(64 DOWNTO
DOWNTO 33)
33) <=
<=
shi0
shi0 (32
(32 DOWNTO
DOWNTO 1)
1) WHEN
WHEN slo(33)='0'
slo(33)='0'
ELSE
shi1
(32
DOWNTO
1);
ELSE shi1 (32 DOWNTO 1);
cout
<=
shi0
(33)
WHEN
slo(33)='0'
cout <= shi0 (33) WHEN slo(33)='0'
ELSE
ELSE shi1
shi1 (33);
(33);
END
END a;
a;
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
ARCHITECTURE aa OF
OF seraddsub
seraddsub IS
IS
SIGNAL
SIGNAL c:
c: BIT;
BIT; --- carry/borrow
carry/borrow
BEGIN
BEGIN
PROCESS
(reloj,init)
BEGIN
PROCESS (reloj,init) BEGIN
IF
IF (init=1)
(init=1) THEN
THEN s<=0;
s<=0; c<=0;
c<=0;
ELSIF
ELSIF relojEVENT
relojEVENT AND
AND reloj=1
reloj=1 THEN
THEN
ss <=
<= aa XOR
XOR bb XOR
XOR c;
c;
IF
IF sr=1
sr=1
THEN
THEN --- sr=1
sr=1 indica
indica suma
suma
cc <=
<= (m
(m AND
AND s)
s)
OR
OR (m
(m AND
AND c)
c)
OR
OR (s
(s AND
AND c);
c);
ELSE
ELSE --- sr=0
sr=0 indica
indica resta
resta
cc <=
<= (NOT(m)
(NOT(m) AND
AND s)
s)
OR
OR (NOT(m)
(NOT(m) AND
AND c)
c)
OR
(s
AND
c);
OR (s AND c);
END
END IF;
IF;
END
END IF;
IF;
END
END PROCESS;
PROCESS;
END
END a;
a;
a
b
ENTITY
ENTITY seraddsub
seraddsub IS
IS PORT
PORT ((
m,s,sr,reloj,init:IN
m,s,sr,reloj,init:IN BIT;
BIT; s:OUT
s:OUT BIT);
BIT);
END
END seraddsub;
seraddsub;
Hacerlo
genrico!
ARCHITECTURE
ARCHITECTURE aa OF
OF seradd
seradd IS
IS
SIGNAL
SIGNAL c:
c: BIT;
BIT;
BEGIN
BEGIN
PROCESS
PROCESS (reloj,init)
(reloj,init) BEGIN
BEGIN
IF
IF (init=1)
(init=1) THEN
THEN s<=0;
s<=0; c<=0;
c<=0;
ELSIF
ELSIF relojEVENT
relojEVENT AND
AND reloj=1
reloj=1 THEN
THEN
ss <=
<= aa XOR
XOR bb XOR
XOR c;
c;
cc <=
<= (a
(a AND
AND b)
b) OR
OR (a
(a AND
AND c)
c) OR
OR (b
(b AND
AND c);
c);
END
END IF;
IF;
END
END PROCESS;
PROCESS;
END
END a;
a;
N/2 Adder
Cout
ACUMULADOR
ENTITY
ENTITY seradd
seradd IS
IS PORT
PORT ((
a,b,reloj,init:IN
a,b,reloj,init:IN BIT;
BIT; s:OUT
s:OUT BIT);
BIT);
END
END seradd
seradd ;;
BL
0
N/2 Adder
CONTROL
BH
SUMADOR
THRF=1?
LIBRARY
LIBRARY ieee;USE
ieee;USE ieee.std_logic_1164.ALL;
ieee.std_logic_1164.ALL;
LIBRARY
LIBRARY ieee;USE
ieee;USE ieee.std_logic_unsigned.ALL;
ieee.std_logic_unsigned.ALL;
ENTITY
ENTITY cysel64
cysel64 IS
IS
PORT
(a,b:IN
PORT (a,b:IN std_logic_vector(64
std_logic_vector(64 DOWNTO
DOWNTO 1);
1);
s:
OUT
std_logic_vector(64
s: OUT std_logic_vector(64 DOWNTO
DOWNTO 1);
1);
cin:IN
std_logic;
cin:IN std_logic; cout:OUT
cout:OUT std_logic);
std_logic);
END
cysel64;
END cysel64;
MULTIPLICADOR
ARCHITECTURE
ARCHITECTURE aa OF
OF iteramult
iteramult IS
IS
BEGIN
BEGIN
PROCESS
PROCESS (reloj)
(reloj) IS
IS
VARIABLE
VARIABLE cnt
cnt :: INTEGER
INTEGER RANGE
RANGE 00 TO
TO 8;
8;
VARIABLE
VARIABLE moshf:std_logic_vector(16
moshf:std_logic_vector(16 DOWNTO
DOWNTO 1);
1);
VARIABLE
VARIABLE mrshf:std_logic_vector(8
mrshf:std_logic_vector(8 DOWNTO
DOWNTO 1);
1);
BEGIN
BEGIN
IF
IF reloj='1'
reloj='1' THEN
THEN
IF
IF init
init == '1'
'1' THEN
THEN moshf:=
moshf:= X"00"
X"00" && mo;
mo; cnt:=0;
cnt:=0;
mrshf
mrshf :=
:= mr;
mr; res
res <=
<= X"0000";rdy
X"0000";rdy <=
<= '0';
'0';
ELSIF
ELSIF cnt
cnt << 88 THEN
THEN
IF
IF mrshf(1)
mrshf(1) == '1'
'1' THEN
THEN res
res <=
<= moshf+res;
moshf+res; END
END IF;
IF;
moshf
moshf :=
:= moshf
moshf (15
(15 DOWNTO
DOWNTO 1)
1) && '0';
'0';
mrshf
mrshf :=
:= '0'
'0' && mrshf(8
mrshf(8 DOWNTO
DOWNTO 2);
2);
if
if cnt/=7
cnt/=7 THEN
THEN rdy<='0';
rdy<='0'; ELSE
ELSE rdy<='1';
rdy<='1'; END
END IF;
IF;
cnt
cnt :=
:= cnt+1;
cnt+1;
END
END IF;
IF;
END
END IF;
IF;
END
END PROCESS;
PROCESS;
END
END ARCHITECTURE
ARCHITECTURE a;
a;
Cnt /=11?
S/L=1
Ack=0
Cnt++
TxC=0
MULTIPLICANDO
ENTITY
ENTITY iteramult
iteramult IS
IS PORT
PORT ((
mr,mo:IN
mr,mo:IN std_logic_vector
std_logic_vector (8
(8 DOWNTO
DOWNTO 1);
1);
init,reloj:
init,reloj: IN
IN std_logic;
std_logic; rdy:OUT
rdy:OUT std_logic;
std_logic;
res:
res: BUFFER
BUFFER std_logic_vector
std_logic_vector (16
(16 DOWNTO
DOWNTO 1));
1));
END
END ENTITY
ENTITY iteramult
iteramult ;;
D Q
Ck
CL
cO
D Q
Ck
CL
ENTITY
ENTITY com2dos
com2dos IS
IS PORT
PORT ((
a,reloj,init:IN
a,reloj,init:IN BIT;
BIT; s:OUT
s:OUT BIT);
BIT);
END
END com2dos;
com2dos;
ARCHITECTURE
ARCHITECTURE aa OF
OF com2dos
com2dos IS
IS
SIGNAL
SIGNAL flg:
flg: BIT;
BIT;
BEGIN
BEGIN
PROCESS
PROCESS (reloj,init)
(reloj,init) BEGIN
BEGIN
IF
IF (init=1)
(init=1) THEN
THEN
s<=0;
s<=0; flg
flg <=0;
<=0;
ELSIF
ELSIF relojEVENT
relojEVENT AND
AND reloj=1
reloj=1 THEN
THEN
ss
<=
a
XOR
flg;
<= a XOR flg;
flg
flg <=
<= aa OR
OR flg;
flg;
END
END IF;
IF;
END
END PROCESS;
PROCESS;
END
END a;
a;
a
D Q
Ck
CL
reloj
init
D Q
Ck
CL
Fuente: R.Andraka.
72
mr(N-2)
mr(1)
mr(0)
ENTITY
ENTITY umulser
umulser IS
IS GENERIC
GENERIC (N:INTEGER:=
(N:INTEGER:= 16);
16);
PORT
PORT (rel,init,m0:IN
(rel,init,m0:IN BIT;
BIT; mr:IN
mr:IN BIT_VECTOR(N
BIT_VECTOR(N DOWNTO
DOWNTO 1);
1);
res:OUT
res:OUT BIT);
BIT);
END
END umulser;
umulser;
mo
a
b
DFF
a
b
CSA
a
b
CSA
res
ARCHITECTURE
ARCHITECTURE aa OF
OF umulser
umulser IS
IS
COMPONENT
COMPONENT seradd
seradd PORT
PORT (a,b,reloj,init:IN
(a,b,reloj,init:IN BIT;
BIT; s:OUT
s:OUT BIT);
BIT); END
END COMPONENT;
COMPONENT;
SIGNAL
SIGNAL prod,chain:
prod,chain: BIT_VECTOR
BIT_VECTOR (N
(N DOWNTO
DOWNTO 1);
1);
CSA
rel
init
BEGIN
BEGIN
genprod:
genprod: FOR
FOR ii IN
IN NN DOWNTO
DOWNTO 11
GENERATE
GENERATE prod(i)
prod(i) <=
<= mr(i)
mr(i) AND
AND m0;
m0;
END
END GENERATE;
GENERATE;
gencsa:
gencsa: FOR
FOR ii IN
IN N-1
N-1 DOWNTO
DOWNTO 11
GENERATE
GENERATE chaincsa:
chaincsa: seradd
seradd PORT
PORT MAP(a=>prod(i),b=>chain(i+1),reloj=>rel,
MAP(a=>prod(i),b=>chain(i+1),reloj=>rel,
init=>init,
init=>init, s=>chain(i));
s=>chain(i));
END
END GENERATE;
GENERATE;
PROCESS
PROCESS (rel,init)
(rel,init) BEGIN
BEGIN
IF
IF (init=1)
(init=1) THEN
THEN chain(N)<=0;
chain(N)<=0;
ELSIF
ELSIF relEVENT
relEVENT AND
AND rel=1
rel=1 THEN
THEN chain(N)
chain(N) <=
<= prod(N);
prod(N);
END
END IF;
IF;
END
END PROCESS;
PROCESS;
res
<=
chain(1);
res <= chain(1);
END
END a;
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
BEGIN
BEGIN
genprod:
genprod: FOR
FOR ii IN
IN NN DOWNTO
DOWNTO 11
GENERATE
GENERATE prod(i)
prod(i) <=
<= mr(i)
mr(i) AND
AND m0;
m0;
END
END GENERATE;
GENERATE;
gencsa:
FOR
i
IN
N-1
gencsa: FOR i IN N-1 DOWNTO
DOWNTO 11
GENERATE
GENERATE
chaincsa:
chaincsa: seradd
seradd PORT
PORT MAP(a=>prod(i),
MAP(a=>prod(i), b=>chain(i+1),reloj=>rel,
b=>chain(i+1),reloj=>rel,
init=>init,
init=>init, s=>chain(i));
s=>chain(i));
END
END GENERATE;
GENERATE;
first:
first: com2dos
com2dos PORT
PORT MAP
MAP (a=>prod(i),reloj=>rel,init=>init,s=>chain(N));
(a=>prod(i),reloj=>rel,init=>init,s=>chain(N));
res
res <=
<= chain(1);
chain(1);
END
END a;
a;
a2
Ardy_n
b2
sa
Agnt
sb
Bgnt
b3
ARCHITECTURE
ARCHITECTURE aa OF
OF smulser
smulser IS
IS
COMPONENT
COMPONENT seradd
seradd PORT
PORT (a,b,reloj,init:IN
(a,b,reloj,init:IN BIT;
BIT; s:OUT
s:OUT BIT);
BIT); END
END COMPONENT;
COMPONENT;
COMPONENT
COMPONENT com2dos
com2dos PORT
PORT (a,reloj,init:IN
(a,reloj,init:IN BIT;
BIT; s:OUT
s:OUT BIT);
BIT); END
END COMPONENT;
COMPONENT;
SIGNAL
SIGNAL prod,chain:
prod,chain: BIT_VECTOR
BIT_VECTOR (N
(N DOWNTO
DOWNTO 1);
1);
Breq_n
b1
a3
Areq_n
sa
Agnt
sb
Bgnt
b3
Breq_n
LUT
LUT
LUT
LUT
Agnt
Bgnt
Brdy_n
LUT
Brdy_n
Ardy_n
LUT
Ardy_n
Brdy_n
!!
Un
Uncircuito
circuito tipo
tipoLatch
LatchRS
RS realizado
realizadoen
enbase
baseaatablas
tablasde
de LookUp
LookUpes
es
sumamente
porcuanto
cuantono
nocumple
cumplecon
con la
lasimetra
simetrade
de
sumamenteriesgoso,
riesgoso,por
retardos
retardospropia
propia de
de uno
uno realizado
realizado en
en base
base aa dos
dos compuertas
compuertasNAND
NAND
La
Larealimentacin
realimentacinde
dela
lasalida
salidade
dela
laLUT
LUT (datos
(datosde
deRAM)
RAM) aala
laentrada
entrada
(direcciones
(direccionesde
de RAM)
RAM) puede
puede dar
dar lugar
lugar aahazards
imprevisibles
hazards imprevisibles
NO
NOCONVIENE
CONVIENEEL
EL USO
USODE
DE ESTE
ESTETIPO
TIPO DE
DECIRCUITOS!
CIRCUITOS!
Adems...qu
Adems...qu pasa
pasa si
si AA yy BB piden
pidenel
elbus
bus simultneamente?
simultneamente?
Guillermo Jaquenod, 2001
73
gnt3
gnt1
gnt2
reloj
req0
req1
req2
req3
gnt0
gnt1
gnt2
gnt3
cycle
start
Un
Un arbitro
arbitro ROUND
ROUND ROBIN
ROBIN implementa
implementa un
un circuito
circuito
de
deprioridad
prioridad variable,
variable,donde
dondeen
enfuncin
funcindel
del estado
estado
actual
actual (gnt0..3)
(gnt0..3) yylas
lasentradas
entradas req0..3
req0..3 se
sedefine
definela
la
prioridad
de
atencin
a
esas
entradas.
prioridad de atencin a esas entradas.
por
porejemplo,
ejemplo,sisignt0
gnt0est
est activa,
activa, req1
req1tendr
tendrla
la
mxima
mximaprioridad,
prioridad, seguido
seguido por
por req2
req2 yy slo
slo
despus
despuspor
porreq3;
req3;al
al activarse
activarsegnt1,
gnt1,la
laprioridad
prioridad
ser
serahora
ahorade
dereq2
req2seguida
seguidapor
porreq3
req3 yyluego
luegopor
por
req0.
req0.
de
deeste
estemodo
modose
setrata
trata de
deasegurar
aseguraruna
unaasignacin
asignacin
de
de prioridades
prioridades equitativa.
equitativa.
Como
Comoseales
sealesauxiliares:
auxiliares:
start
avisacuando
cuandoel
el control
control del
del sistema
sistemase
se
start avisa
asigna
asignaaa un
unnuevo
nuevomaster
master
cycle
indica
al
rbitro
que
el
tiempo
disponible
indica
al
rbitro
que
el
tiempo
disponible
cycle
para
parael
elmaster
masteractual
actual se
seagot,
agot, por
porlo
loque
quesisi
hay
hayalgun
algunotro
otroen
enespera
esperale
leser
serasignado
asignadoel
el
control
control
req0
req1
req2
req3
actual
nuevo
Este diseo
ARCHITECTURE
ARCHITECTURE aa OF
OF rrobtab
rrobtab IS
IS
no funciona.
SIGNAL
SIGNAL concat:
concat: std_logic_vector
std_logic_vector (7
(7 DOWNTO
DOWNTO 0);
0);
Porqu?
BEGIN
BEGIN
concat
concat <=
<= actual&req;
actual&req;
WITH
concat
SELECT
WITH concat SELECT
nuevo
nuevo <=
<= "0001"
"0001" WHEN
WHEN "0001000X"|"001000X1"|"01000XX1"|"1000XXX1",
"0001000X"|"001000X1"|"01000XX1"|"1000XXX1",
"0010"
"0010" WHEN
WHEN "0001XX1X"|"001000X0"|"01000X10"|"1000XX10",
"0001XX1X"|"001000X0"|"01000X10"|"1000XX10",
"0100"
"0100" WHEN
WHEN "0001X10X"|"0010X1XX"|"01000X00"|"1000X100",
"0001X10X"|"0010X1XX"|"01000X00"|"1000X100",
"1000"
"1000" WHEN
WHEN "0001100X"|"001010XX"|"01001XXX"|"1000X000",
"0001100X"|"001010XX"|"01001XXX"|"1000X000",
"XXXX"
"XXXX" WHEN
WHEN OTHERS;
OTHERS;
END
END a;
a;
LIBRARY
LIBRARY ieee;
ieee; USE
USE ieee.std_logic_1164.ALL;
ieee.std_logic_1164.ALL;
LIBRARY
LIBRARY ieee;
ieee; USE
USE ieee.std_logic_1164.ALL;
ieee.std_logic_1164.ALL; LIBRARY
LIBRARY lpm;
lpm; USE
USE lpm.lpm_components.ALL;
lpm.lpm_components.ALL;
ENTITY
ENTITY rrobtab
rrobtab IS
IS PORT
PORT (req:
(req: IN
IN std_logic_vector
std_logic_vector (3
(3 DOWNTO
DOWNTO 0);
0);
actual
actual :: IN
IN std_logic_vector
std_logic_vector (3
(3 DOWNTO
DOWNTO 0);
0);
nuevo:OUT
nuevo:OUT std_logic_vector
std_logic_vector (3
(3 DOWNTO
DOWNTO 0));
0));
END
rrobtab
;
END rrobtab ;
req0
req1
req2
req3
actual
nuevo
0);
0);
X2";
X2"; ELSIF
ELSIF req(2)='1'
req(2)='1' THEN
THEN vnuevo
vnuevo :=
:= X4";
X4";
:=
:= X8";
X8"; ELSE
ELSE vnuevo
vnuevo :=
:= actual;
actual; END
END IF;
IF;
X"4";
X"4"; ELSIF
ELSIF req(3)='1'
req(3)='1' THEN
THEN vnuevo
vnuevo :=
:= X"8";
X"8";
:=
:= X"1";
X"1"; ELSE
ELSE vnuevo
vnuevo :=
:= actual;
actual; END
END IF;
IF;
X8";
X8"; ELSIF
ELSIF req(0)='1'
req(0)='1' THEN
THEN vnuevo
vnuevo :=
:= X"1";
X"1";
:=
:= X2";
X2"; ELSE
ELSE vnuevo
vnuevo :=
:= actual;
actual; END
END IF;
IF;
X"1";
X"1"; ELSIF
ELSIF req(1)='1'
req(1)='1' THEN
THEN vnuevo
vnuevo :=
:= X2";
X2";
:=
:= X4";
X4"; ELSE
ELSE vnuevo
vnuevo :=
:= actual;
actual; END
END IF;
IF;
ENTITY
ENTITY rndrob
rndrob IS
IS PORT
PORT (reloj,ini
(reloj,ini :: IN
IN std_logic;
std_logic; req:
req: IN
IN std_logic_vector
std_logic_vector (3
(3 DOWNTO
DOWNTO 0);
0);
grant:OUT
grant:OUT std_logic_vector
std_logic_vector (3
(3 DOWNTO
DOWNTO 0));
0));
END
END rndrob;
rndrob;
ARCHITECTURE
ARCHITECTURE aa OF
OF rndrob
rndrob IS
IS
COMPONENT
COMPONENT rrobtab
rrobtab PORT
PORT (req:
(req: IN
IN std_logic_vector(3
std_logic_vector(3 DOWNTO
DOWNTO 0);
0);
actual:
actual: IN
IN std_logic_vector(3
std_logic_vector(3 DOWNTO
DOWNTO 0);
0); nuevo:OUT
nuevo:OUT std_logic_vector
std_logic_vector (3
(3 DOWNTO
DOWNTO 0));
0));
END
END COMPONENT;
COMPONENT;
SIGNAL
SIGNAL act,nov:std_logic_vector(3
act,nov:std_logic_vector(3 DOWNTO
DOWNTO 0);
0); SIGNAL
SIGNAL tstop,rini,tout,lib:
tstop,rini,tout,lib: std_logic;
std_logic;
BEGIN
BEGIN
decis:
decis: rrobtab
rrobtab PORT
PORT MAP
MAP (req
(req =>
=> req,actual=>act,nuevo=>nov);
req,actual=>act,nuevo=>nov);
tstop
tstop <=
<= NOT(tout);
NOT(tout);
timer:
timer: lpm_counter
lpm_counter GENERIC
GENERIC MAP
MAP (LPM_WIDTH
(LPM_WIDTH =>
=> 3)
3)
PORT
PORT MAP
MAP (clock=>reloj,cnt_en
(clock=>reloj,cnt_en =>
=> tstop,
tstop, aclr=>rini,cout=>tout);
aclr=>rini,cout=>tout);
lib
lib <=
<= (not(req(0))
(not(req(0)) AND
AND act(0)
act(0) AND
AND not(nov(0)))
not(nov(0))) OR
OR (not(req(1))
(not(req(1)) AND
AND act(1)
act(1) AND
AND not(nov(1)))
not(nov(1)))
OR
OR (not(req(2))
(not(req(2)) AND
AND act(2)
act(2) AND
AND not(nov(2)))
not(nov(2))) OR
OR (not(req(3))
(not(req(3)) AND
AND act(3)
act(3) AND
AND not(nov(3)));
not(nov(3)));
grant
grant <=
<= act
act WHEN
WHEN (tout='0')
(tout='0') OR
OR (nov=act)
(nov=act) ELSE
ELSE "0000";
"0000";
PROCESS
PROCESS (reloj)
(reloj) BEGIN
BEGIN
IF
IF reloj='1'
reloj='1' THEN
THEN
IF
IF ini='1'
ini='1' THEN
THEN act
act <=
<= X"1";
X"1"; rini
rini <=
<= '1';
'1'; ELSIF
ELSIF lib='1'
lib='1' THEN
THEN act
act <=
<= nov;
nov; rini
rini <=
<= '1';
'1';
ELSE
ELSE rini
rini <=
<= '0';
'0'; END
END IF;
IF;
END
END IF;
IF;
END
END PROCESS;
PROCESS;
END
END a;
a;
Guillermo Jaquenod, 2001
ENTITY
ENTITY rrobtab
rrobtab IS
IS PORT
PORT ((
req:
req: IN
IN std_logic_vector
std_logic_vector (3
(3 DOWNTO
DOWNTO 0);
0);
actual
:
IN
std_logic_vector
actual : IN std_logic_vector (3
(3 DOWNTO
DOWNTO 0);
0);
nuevo:OUT
nuevo:OUT std_logic_vector
std_logic_vector (3
(3 DOWNTO
DOWNTO 0));
0));
END
END rrobtab;
rrobtab;
ARCHITECTURE
ARCHITECTURE aa OF
OF rrobtab
rrobtab IS
IS
BEGIN
BEGIN
PROCESS
PROCESS (actual,req)
(actual,req) IS
IS
variable
variable vnuevo:
vnuevo: std_logic_vector
std_logic_vector (3
(3 DOWNTO
DOWNTO
BEGIN
BEGIN
CASE
CASE actual
actual IS
IS
WHEN
X"0"
=>
vnuevo
:=
X"1";
WHEN X"0" => vnuevo := X"1";
WHEN
WHEN X"1"
X"1" =>
=> IF
IF req(1)='1'
req(1)='1' THEN
THEN vnuevo
vnuevo :=
:=
ELSIF
ELSIF req(3)='1'
req(3)='1' THEN
THEN vnuevo
vnuevo
WHEN
WHEN X2"
X2" =>
=> IF
IF req(2)='1'
req(2)='1' THEN
THEN vnuevo
vnuevo :=
:=
ELSIF
ELSIF req(0)='1'
req(0)='1' THEN
THEN vnuevo
vnuevo
WHEN
WHEN X4"
X4" =>
=> IF
IF req(3)='1'
req(3)='1' THEN
THEN vnuevo
vnuevo :=
:=
ELSIF
ELSIF req(1)='1'
req(1)='1' THEN
THEN vnuevo
vnuevo
WHEN
WHEN X8"
X8" =>
=> IF
IF req(0)='1'
req(0)='1' THEN
THEN vnuevo
vnuevo :=
:=
ELSIF
ELSIF req(2)='1'
req(2)='1' THEN
THEN vnuevo
vnuevo
WHEN
WHEN OTHERS
OTHERS =>
=> vnuevo
vnuevo :=
:= actual;
actual;
END
CASE;
END CASE;
nuevo
nuevo <=
<= vnuevo;
vnuevo;
END
END PROCESS;
PROCESS;
END
END a;
a;
LIBRARY
LIBRARY ieee;
ieee; USE
USE ieee.std_logic_1164.ALL;
ieee.std_logic_1164.ALL;
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
Ai+1 = Ai - di.artan(2-i)
16 LEs
sgex
Ry
di
sgex
FSM
rdy
CSAS
%16
%16
s0
y
FSM
init
A
di,s1,s0
i
rdy
s1,s0
RA
i
ROM
-di
+/-
x
2 LEs
2 LEs
sgex
Ry
y
init
+/-
-di
s0
y
s0
10 LEs
i
CSAS
di
16 LEs
Rx
A
x
-di
s0
Rx
-di
+/-
Ry
-di
SRA
SRA
Rx
s0
yi+1 = yi + xi.di.2-i
di
s0
-di
i
16 LEs
i
sgex
y
sgex
CSAS
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
Ejercicios complejos conVHDL
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
10
T2-3
T4-6
15
T2-4
10
T4-7
60
7 ... 0
ADDR
WE#
DQ
OE#
RAS#
CAS#
ADDR
WE#
DQ
OE#
CAS#
ADDR
WE#
DQ
hper
hcnt
P.Ashenden. The Students Guide to VHDL. Morgan Kaufmann Publishers Inc, 1998, ISBN 1-55860-520-7
pixel
hsw
hval
pixel
hsyn
L.Baker. VHDL Programming With Advanced Topics. John Wiley and Sons, Inc. 1993, ISBN 0-471-57464-3
vsyn
J.Bhasker. A VHDL Primer, Revised Edition. Prentice Hall 1995. ISBN 0-13-181447-
val
vper
vsi
vcnt
val
lineas
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
column
0..639
R. Dueck. Digital Design with CPLD. Applications and VHDL. DELMAR, Thomson Learning. ISBN 0-76681160-3
vsw
hval
25.175MHz
hsi
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
CAS#
OE#
hsyn
RAS#
RAS#
hsyn
READ
RAS#
WRITE
1.
2.
3.
4.
5.
6.
REFRESH
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
TDI (TEST DATA INPUT): entrada serie para instrucciones, asi como para
datos de test y programacin. Los datos son capturados en el flanco
creciente de TCK
TDO (TEST DATA OUTPUT): salida serie de instrucciones, asi como datos
de test y programacin, actualizados en el flanco de bajada de TCK; va a
Tri-state cuando no se est sacando datos del dispositivo
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
Toda la operacin del TAP controller est definida por las lneas de
control TMS y el reloj TCK.
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
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]
0
1
CLK[3..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
D Q
D Q
CK
CK
0
1
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
cs
oe
wr
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
RAM
64 x 8
Fuente: ASHENDEN
Preguntas
En
Enalgn
algnpackage
package
defino
definolos
lostipos
tiposyyen
en
base
baseaaellos
ellosel
elarray
array
Fuente: TERS
z <=
wait
z <=
wait
z <=
wait
z <=
wait
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