Introducción a los dispositivos
FPGAs. Análisis y ejemplos
de diseño.
Bozich, Eduardo Carlos
Director: Ing. Sergio Noriega
Modificada por Ing. F. Videla
Objetivo
Realización de un kit de implementación en
FPGA, para la cátedra de ‘Introducción a los
sistemas lógicos y digitales’ mediante la
plaqueta experimental UPx10K10, con el
dispositivo FLEX10K10
Contenido
• Tipos de lógica programada
•Estudio de implementación en AHDL:
 Medidor de frecuencia y período
 Adquisisdor autónomo de datos.
• Implementación en FLEX10K10
PLD
PLD (Programmable Logic Device)
características modificadas y almacenadas
mediante programación
Características de fabricación:
• Funcionabilidad completa
• Celdas de funciones universales
PLD:
 SPLD
 CPLD
 FPGA
SPLD
SPLD (Simple Programmable Logic Device)
Matrices de conexiones
• matriz de compuertas AND (intersección).
• matriz de compuertas OR (unión).
PLDs mas pequeños y de menor costo
SPLD:
 PLA
 PAL
 GAL
CPLD
CPLD (Complex Programmable Logic Device)
Bloques lógicos similares a un SPLD
Matriz de interconexión programable
Tecnologías de programación idem SPLD
FPGA
FPGA (Field Programmable Gate Array)
Mayor transferencia de datos y registros
Tecnología de programación: antifusible, SRAM y flash
FPGA: FLEX10K
FLEX: Flexible Logic Element matriX
Basados en LUT
Programación SRAM
576 a 12160 elementos
lógicos (LEs) (LUT de 4
entradas, flip-flop y lógica
adicional)
LABs de 8 LEs c/u
3 a 20 EABs de 2kbits por
bloque de RAM interna
Interconexión (Fast Track)
de LEs, EABs e IOEs
Implementaciones
Medidor de frecuencias y períodos
• Entradas de medición compatibles con lógica TTL
• Rango en modo frecuencia: 1Hz a 100MHz.
• Rango en modo período: 100ns a 10s.
• Representación mediante 6 dígitos.
• Comunicación con PC a través de puerto paralelo en modo SPP.
Adquisidor autónomo de datos
• Controlado desde PC a través de puerto paralelo en modo SPP.
• Control directo del proceso de adquisición de datos del
conversor analógico digital ADC0820.
• Capacidad de almacenamiento de hasta 500 muestras.
Dispositivo FPGA FLEX10K10 de Altera
Diagrama en bloques AHDL frecuencímetro
Frecuencímetro
Señal de
entrada
f señal 
Acondicionador
de señal
Generador de
base de tiempo
Control de
latch y drive
Contador
Latch y
drive de LEDs
Nº de pulsos contados
Tiempo
de medición
Displays de 7 segmentos
Señal de salida del Acondicionador
Salida del Generador de base de tiempo
Pulsos a contar por el contador
Frecuencímetro en AHDL
Señal de
entrada
Bloque
combinatorio
base de
tiempos
10 MHz
Selección
de base
10 MHz
BT
base de
tiempos
tiempo
tiempo
de conteo
Generador de
base de tiempos
6 Contadores sincrónicos
Z
w
Ubicación
del punto dp
tiempo
W
z
6 Latchs de 4bits c/u
tiempo
Señal Z: Maquina de Moore
(puesta a cero)
dp
S1/ 1
Cuádruple MUX 6:1
0
1
0
0
1
Decodificador
Decodificador BCD
a 7 segmentos
1
Señal W: flip-flop tipoD
a, b, c, d, e, f, g
base_tiempos
carga
Vcc
Displays de segmentos
S2/ 0
S0/ 0
Z
D
clk
clrn
Q
W
Frecuencímetro en AHDL
Bases de tiempos
selec_base[1..0]
“00” = 0
Duración del nivel alto
de la base de tiempos
10000 ms
“01” = 1
1000 ms
“10” = 2
100 ms
“11” = 3
10 ms
f señal 
Nº de pulsos contados
Tiempo
de medición
Ubicación del punto dp
selec_base[1..0]
Duración del nivel alto
de la base de tiempos
dígito que contiene
el punto
“00” = 0
10000 ms
5
“01” = 1
1000 ms
4
“10” = 2
100 ms
3
“11” = 3
10 ms
2
Medidor de períodos
Generador de
pulsos de período
definido
Señal de
entrada
T señal  Nº de pulsos
Acondicionador
de señal
Contador
Control de
latch y drive
Latch y
drive de LEDs
contados* Tpulsos
Displays de 7 segmentos
Medidor de períodos en AHDL
Señal de
entrada
Bloque
combinatorio
pulsos
10 MHz
Selección
de base
Divisor
10
MHz
base de tiempos
Generador
de pulsos
w
Ubicación
del punto
dp
pulsos
6 Contadores sincrónicos
z
6 Latchs de 4bits c/u
dp
Cuádruple MUX 6:1
Decodificador
Decodificador BCD
a 7 segmentos
a, b, c, d, e, f, g
Displays de 7 segmentos
Medidor de períodos en AHDL
Pulsos de período definido
selec_base[1..0]
“00” = 0
Período de la señal de
pulsos
0.1us
“01” = 1
1us
“10” = 2
10us
“11” = 3
100us
T señal  Nº de pulsos
contados* Tpulsos
Ubicación del punto dp
selec_base[1..0]
Período de la señal de
pulsos
dígito que contiene
el punto
“00” = 0
0.1us
5
“01” = 1
1us
4
“10” = 2
10us
3
“11” = 3
100us
2
Error y rango de mediciones
• Error de base de tiempos
Nº pulsos contados: 1 – 999999 pulsos
• Error de pulsos contados
Medidor de frecuencias
f señal 
Nº de pulsos contados
Tiempo
de medición
selec_base[1..0]
Duración del nivel alto
de la base de tiempos
Rango de frecuencias
a medir [Hz]
error [Hz]
“00” = 0
10000 ms
0.1 a 99999.9
 0.1
“01” = 1
1000 ms
1 a 999999
1
“10” = 2
100 ms
10 a 9999990
 10
“11” = 3
10 ms
100 a 99999900
 100
Medidor de períodos
selec_base[1..0]
T señal  Nº de pulsos
Período
contados* Tpulsos
Rango de períodos
a medir [ms]
error [us]
“00” = 0
0.1 us
0.0001 a 99.9999
 0.1
“01” = 1
1us
0.001 a 999.999
1
“10” = 2
10 us
0.01 a 9999.99
 10
“11” = 3
100 us
0.1 a 99999.9
 100
Error y rango de mediciones
Solución  Prescaler que divida por 10 la señal de entrada
Medidor de frecuencias con prescaler
selec_base[1..0]
Duración del nivel alto
de la base de tiempos
Rango de frecuencias
a medir [Hz]
error [Hz]
“00” = 0
10000 ms
1 a 999999
1
“01” = 1
1000 ms
10 a 9999990
 10
“10” = 2
100 ms
100 a 99999900
 100
“11” = 3
10 ms
1000 a 999999000
 1000
Medidor de períodos con prescaler
selec_base[1..0]
Período
Rango de períodos
a medir [ms]
error [us]
“00” = 0
0.1 us
0.00001 a 9.99999
 0.01
“01” = 1
1us
0.0001 a 99.9999
 0.1
“10” = 2
10 us
0.001 a 999.999
1
“11” = 3
100 us
0.01 a 9999.99
 10
Rango de mediciones
Rangos de medición teóricos para un error máximo del 10%
• Sin activación de prescaler
 Frecuencia: 0.1Hz a 99.9999MHz
 Período :
1us a 99.9999 seg.
• Con activación de prescaler
 Frecuencia:
 Período:
1Hz a 999.999MHz
100ns a 9.99999 seg
Limitación de la frecuencia máxima de la FPGA
Comunicación con PC
Por puerto paralelo en modo SPP
D7 a D0 como salidas y S6 a S3 como entradas
pin
puerto
sentido
Función
(D2..D0)
(S6..S3)
D7
datos
salida
activa_prescaler
“000” = 0
Overflow
D6
datos
salida
FoP
“001” = 1
valor dígito 1
D5
datos
salida
selec_base[1]
“010” = 2
valor dígito 2
D4
datos
salida
selec_base[0]
“011” = 3
valor dígito 3
D3
datos
salida
congela latchs
“100” = 4
valor dígito 4
(D2..D0)
datos
salida
selección dígito
“101” = 5
valor dígito 5
(S6..S3)
estado
entrada
overflow y valor dígito
“110” = 6
valor dígito 6
Secuencia programa de PC:
1.
(D7..D4) activo prescaler, modo frec o period., selec. base en forma
contínua.
2.
Activo carga mediante congelamiento de latch (D3).
3.
Secuencia 0-6 en (D2..D0) para cargar overflow y dígitos
4.
Se desactiva carga (D3) para refresco de latchs
5.
Repeticion de 2-4 de forma necesaria.
Adquisidor autónomo de datos
10MHz
/INT
datos[3..0]
full
clear
cargar_fifo
leer_fifo
HoL_nibble
clk_PC
FPGA
DB[7..0]
FIFO con
palabras
de 8 bits
ADC0820
/CS
/WR
/RD
ADC0820
en modo
WR-RD
Adquisidor autónomo de datos
máximo
tWR
50us
tWR = 800ns
600ns
tRD
600ns
tP
500ns
tINTH
225ns
tWR
Adoptamos
mínimo
tRD
tRD = 800ns
tP = 800ns
tINTH = 300ns
tP
/WR
tIINTH
/RD
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
x100ns
Adquisidor autónomo de datos con PC
Por puerto paralelo en modo SPP
D4 a D0 como salidas y S7 a S3 como entradas
pin
puerto
sentido
nodo
D0
datos
salida
clear
D1
datos
salida
cargar_fifo
D2
datos
salida
leer_fifo
D3
datos
salida
HoL_nibble
D4
datos
salida
clk_PC
S7
estado
entrada
full
(S6..S3)
estado
entrada
datos[3..0]
nibble
HoL_nibble
datos[3..0]
High
0
q[7..4]
Low
1
q[3..0]
Secuencia programa de PC:
1.
D0 en ‘1’ para limpiar memoria
2.
Activo carga de FIFO mediante D1 hata que S7=’1’(full).
3.
Activo lectura de FIFO con D2.
4.
Con D3 en bajo, genero pulso de reloj en D4 y cargo high nibble en (S6..S3).
5.
D3 en alto y cargo low nibble en (S6..S3).
6.
Repito pasos 3 – 5 hasta cargar totalidad de muestras en PC.
Implementación en FLEX10K10
Plaqueta UPx10K10
Implementación en FLEX10K10
Implementación en FLEX10K10
Plaqueta FPGA con puerto paralelo de PC
Implementación en FLEX10K10
Plaqueta Frecuencímetro
Implementación en FLEX10K10
Plaqueta Adquisidor
Estructura de un elemento lógico.
LE (logic element)
Modos de operación de los LEs
AHDL Base de tiempo
AHDL monoestable
AHDL salida W reset contador
AHDL Bloque cuenta (6 contadores)
AHDL Bloque de latchs
Caso general
AHDL Bloque MPX
AHDL decodificadores
BCD 7 SEG
AHDL punto
Medidor de periodos
Pines de control y datos FPGA
ADC0820
Lectura escritura FIFO
Visual Basic
AHDL
pin
puerto
sentido
Función
D7
datos
salida
activa_prescaler
D6
datos
salida
FoP
D5
datos
salida
selec_base[1]
D4
datos
salida
selec_base[0]
D3
datos
salida
congela latchs
(D2..D0)
datos
salida
selección dígito
(S6..S3)
estado
entrada
overflow y valor dígito
Programación de la FPGA
4.6.1.3 Programación de la FPGA. Posteriormente vamos a proceder a programar la FPGA. Para esto vamos a programar la EPC2 de la UPx10K10 a través de la
interfase ByteBlaster. Los pasos a seguir son los siguientes:
1.Verificamos que la EPC2 está en su zócalo, y que el jumper J1-EPC2 no está colocado.
2. Como no hay plaquetas enchufadas en CON1 o CON2, verificamos que también los jumpers J1-CON1 y J1-CON2, respectivamente, estén colocados.
3. Conectamos el cable de impresora entre la PC y la UPx10K10, y conectamos la fuente comprobando que tiene energía (LED encendido).
4. Generamos el archivo .pof de programación de la EPC2.
Para ello: • Con la ventana del Compiler abierta, vamos a la opción File de la línea superior y elija Convert SRAM Object File.
• Elegimos el archivo .sof a convertir y lo ingresamos mediante Add a la lista
5. Elegimos el Programmer en el MAX+PLUS II, vamos a OPTIONS→Hardware Setup, y seleccionamos como programador el ByteBlaster.
6. Aún en el Programmer en el MAX+PLUS II, colocamos en ON la opción MultiDevice JTAG Chain en el sub-menú JTAG.
7. Elegimos MultiDevice JTAG Chain Setup en ese submenú.
8. Seleccionamos EPC2 en la ventana Device Name.
9. Escribimos el nombre del archivo de programación en la ventana Programming File Name (para esta tarea también podemos usar el botón Select Programming
File). Este archivo puede tener la extensión .pof, aunque también .jam o .jbc.
10. Una vez elegidos el dispositivo y el archivo de programación, apretamos el botón Add para incorporar ambos a la ventana Device Names & Programming File
Names.
11. Seleccionamos ahora EPF10K10 en la ventana Device Name.
12. Borramos el contenido de la ventana Programming File Name y apretamos el botón Add para incorporar ambos a la ventana Device Names & Programming File
Names . En la zona correspondiente al archivo asociado a la EPF10K10 aparecerá como texto <none>.
13. Si todo se ha realizado correctamente, en la ventana Device Names & Programming File Names debe estar en el puesto 1º la EPF10K10 (con <none>) y en 2º
lugar la EPC2 (con su archivo .pof) como muestra la figura 4.32.
14. Apretamos el botón Detect JTAG Chain Info para verificar si todo
funciona bien. A través del ByteBlaster interno de la UPx10K10 el
MAX+PLUS II debe detectar la EPF10K10 y la EPC2.
15. Archivamos estas opciones mediante el botón Save .JCF (JTAG
Configuration File).
16. Finalmente volvemos al Programmer en el MAX+PLUS II, y
eligimos Program.
Comandos en VB para carga y descarga de
memoria FIFO
FIN
Descargar

Introducción a los dispositivos FPGAs. Análisis y