Documentos de Académico
Documentos de Profesional
Documentos de Cultura
1
Basado en el documento “Manejo de la Plataforma Digital DSP+FPGA para el control de Accionamientos”
Índice de Contenidos
Índice de Contenidos I
Índice de Figuras II
Bibliografı́a 41
i
Índice de Figuras
ii
2.1 Relaciones entre los módulos de la FPGA y el DSP. . . . . . . . . . . . . . . . . . . 26
Índice de Tablas
Índice de Ejemplos
iii
Capı́tulo 1
Durante muchos años los circuitos digitales se construyeron en base a integrados discretos, es
decir, circuitos integrados que contenı́an un pequeño número de operadores lógicos (generalmente
menos de 7) y que realizaban funciones bastante básicas: ANDs, ORs, contadores, etc... Esto hacı́a que
los circuitos lógicos fueran de gran tamaño y difı́ciles de rutear, incluso para aplicaciones simples.
Algunos ejemplos de este tipo de desarrollos se muestra en la Fig. 1.1.
Esto llevó al desarrollo de módulos con un mayor nivel de integración (densidad de elementos
por pastilla) y flexibilidad. Un primer paso en este sentido fueron las Programmable Logic Devices
o PLDs. La mayorı́a de estos dispositivos estaban formados por dos etapas:
Como su nombre lo indica, estos dispositivos son programables, especı́ficamente se pueden señalar
qué mintérminos (o maxtérminos) alimentan a cada FF, y de esta manera es posible realizar dife-
rentes funciones lógicas en una misma pastilla. Sin embargo las PLDs son de poca capacidad, en
torno a 10 entradas, 10 salidas y 10 FF, por lo que en el caso de funciones complejas es necesario
utilizar varias de ellas.
En los 90s surgen las Complex Programmable Logic Devices (CPLDs) dispositivos bastante
similares a las PLDs, pero con una densidad de compuertas entre 10 y 100 veces mayor (algunos
centenares de FF y de pines). Las principales diferencias eran que los FF de las CPLDs pueden
conectarse entre si, y que la función de los pines de las pastillas también es configurable, es decir,
dependiendo de la programación un pin puede utilizarse como entrada o salida. El diseño de la
interconexión interna de los diferentes módulos de un dispositivo es lo que se denomina usualmente
como Firmware.
1
Capı́tulo 1. Tarjeta basada en la FPGA. 2
Finalmente a finales de los 90s se desarrolla un último tipo de dispositivo, las Field Program-
mable Gate Array (FPGA), las que en la actualidad superan en varios órdenes de magnitud la
capacidad de las CPLDs (los modelos más grandes llegan a los cientos de miles de FF y varios mi-
llones de compuertas lógicas). Las FPGAs son absolutamente configurables, dando la posibilidad
de interconectar cualquier señal interna con cualquier módulo, desde este punto de vista pueden
considerarse como una gran caja llena de componentes digitales, los cuales pueden conectarse como
el usuario requiera de manera de generar múltiples funciones que trabajen en paralelo y/o encade-
nadas entre si. El precio a pagar por esta absoluta libertad de diseño es que las FPGAs, a diferencia
de las PLDs y CPLDs, pierden su programación cada vez que su polarización se desconecta, es por
esto que para aplicaciones stand-alone (autónomas) se necesita de un hardware especial que repro-
grame automáticamente la FPGA cada vez que esta se encienda. En el caso de la plataforma de
desarrollo con la que se cuenta en el laboratorio, dicho hardware existe y se basa en una memoria
programable tipo EPROM.
La FPGA a utilizar es de marca Xilinx modelo XC6SLX16, dentro de sus principales carac-
terı́sticas se encuentran:
La FPGA puede configurarse de múltiples maneras para realizar una infinidad de tareas. Ge-
neralmente disponer de tantos grados de libertad puede volverse un problema. Es por este motivo
que en el marco del trabajo de tı́tulo de Gonzalo Carrasco [1], se desarrolló un Firmware para la
versión previa de la Tarjeta FPGA. Buena parte de este diseño se ha actualizado para el manejo
de la tarjeta que usted utilizará.
Este diseño permite manejar de manera simple desde el DSP todos los periféricos que dispone la
Tarjeta FPGA, además de agregar funcionalidades de uso común en aplicaciones de la Electrónica
de Potencia. Algunas de los módulos programados son:
5 Timers de 16-bits, con reloj base configurable y generadores de interrupción por perı́odo,
underflow y cuenta máxima 1.2.1.b.
3 módulos PWM, uno por cada Timer. Cada uno de estos módulos permite manejar 3 modu-
ladores bipolares o 1 modulador unipolar, trabajar con polaridad positiva o negativa, ajustar
el tiempo muerto y establecer el momento para la carga sincrónica de la referencia a los
moduladores 1.2.1.c.
2 módulos para el manejo de los conversores A/D de 12 bits, uno por cada conversor, que
permiten realizar en conjunto hasta 4 mediciones simultáneas de entre los 24 canales disponi-
bles. El funcionamiento de los conversores es completamente configurable y sincronizable con
eventos de los Timers 1.2.1.d
2 módulos para el manejo de los conversores D/A de 12 bits, uno por cada conversor 1.2.1.e.
1 decodificador de Encoder 1.2.1.f.
Aún con este poderoso desarrollo, en algunas ocasiones puede ser necesario modificar este Firm-
ware o directamente crear uno nuevo. En la sección 1.1 se muestran algunas de las formas de modi-
ficar el Firmware de la FPGA, mientras que en la sección 1.2 se muestran los principales módulos
ya programados en la FPGA y el modo de utilizarlos en combinación con el DSP.
Como en cualquier sistema operativo Windows, el primer paso es ejecutar el archivo de instala-
ción, en este caso xsetup.exe. Instale el programa en una carpeta con nombre “simple”, es decir sin
espacios ni sı́mbolos. Durante el proceso de instalación, el instalador realiza una serie de consultas,
las que deben contestarse afirmativamente. El único punto en el que debe tenerse cuidado es en
seleccionar el modo de instalación ISE WebPACK, tal como se muestra en la Fig. 1.2. Este modo
es el más básico de los diaponibles, pero cumple con los requerimientos de esta asignatura y es de
uso libre.
Figura 1.3. Pantalla inicial del Xilinx Webpack v.8.2. (muy similar a ISE Project Navigator
14.x)
(a) (b)
Figura 1.4. Ventanas de creación de un nuevo proyecto: (a) Pantalla inicial; (b) Pantalla
de configuración.
(a) (b)
Figura 1.5. Ventanas para agregar archivos fuente: (a) Nuevo archivo fuente; (b) Archivo
fuente ya existente.
Speed: -5 (Velocidad).
Finalmente aparecen dos pantallas más (Fig. 1.5), que ofrecen la posibilidad de crear un nuevo
archivo fuente y de agregar un archivo fuente ya creado. Ambos pasos se pueden hacer manualmente
en forma posterior en los menus de Project→New Source... y Project→Add Source....
Una vez agregados todos los archivos fuente, el programa pasa a verse como se muestra en la
Fig. 1.6.
Acciones
Pantalla de mensajes
Ventana de archivos fuente: Donde se muestran todos los archivos utilizados en el proyecto y
eventualmente se dependencia de otros archivos.
Pantalla de Mensajes: Informa sobre el proceso actual que está en ejecución y ofrece un detalle
de los errores y advertencias.
Una manera simple de obtener un código fuente es a través de una representación gráfica. Los
archivos esquemáticos utilizan sı́mbolos comunes para representar elementos digitales tales como
ANDs, ORs, FFs (Flip-Flops), CBXXs (contadores de XX-bits), entre otros muchos. La interconexión
de estos elementos se realiza a través de lı́neas en forma similar a como se realizarı́an en un papel.
La Fig. 1.7 muestra algunos elementos de uso común y la forma de interconectarlos:
Elementos lógicos: Son estos Elementos los que realizan las funciones lógicas deseadas. Las
2
La ubicación de las ventanas es configurable, por lo que pueden encontrarse en posiciones distintas a las mostradas
en las siguientes figuras.
EA(5)
EA(6)
EA(7)
EA(0) EA(1) Strobe C CLR clk_150 C CLR
TINP1 INV
EA(0)
EA(1)
EA(2)
EA(3)
EA(4)
TINP0 EA(0)
INV
S0
S1
S2
S3
EDout0(23:0) ED0(23:0)
GND
DIR 000 ce2
ADC3-4 INV AND7
GND
ED8(23:0) mux16x24 INV AND7
ED9(23:0) T
AOE
o(23:0)
ED10(23:0) EDout(23:0) io(23:0) adc_7266_ce2
io(23:0)
ED11(23:0) EDin(23:0) Dat_ADC1
i(23:0) num_conv DC1(23:0) DC1(23:12)
num_conv_impar conv_adc1(23:0)
ED12(23:0) buf3e24b CS i(11:0) o(11:0)
CS_ADC_1_2
ED13(23:0) AND2B1 en_clk_adc en_clk_adc
VCC
FTC FTC adc_7266_ce2
Dat_ADC1
clk_75 num_conv
T Q T Q clk_tm num_conv_par conv_adc1(23:0) EDout11(23:0)
CS
BUFG
CS_ADC_1_2
AND2B2 en_clk_adc en_clk_adc
clk_150 C clk_150 C
clk_150 clk_150
CLR CLR
inicio inicio
GND
Figura 1.7. Ejemplo de un archivo fuente de tipo esquemático.
7
Capı́tulo 1. Tarjeta basada en la FPGA. 8
Sub-circuitos: Es frecuente que una estructura se repita varias veces dentro de un diseño
lógico. Los Sub-circuitos son circuitos esquemáticos transformados a sı́mbolos o elementos
definidos por el usuario, de esta manera se pueden utilizar como un Elemento más.
A diferencia de los archivos de esquemáticos, los archivos Verilog son archivos de texto, que
especifican mediante comandos especı́ficos el funcionamiento que se desea obtener. Para más in-
formación sobre el lenguaje Verilog véase [2], mientras que su aplicación concreta a los módulos
ya desarrollados se encuentra detallada en [1]. Un ejemplo de un programa simple en Verilog se
presenta en el Ej. 1.1.
En lı́neas generales Verilog funciona definiendo un module (módulo) que puede interpretarse
como un subsistema que visto desde afuera posee entradas y salidas que se comunican con el exterior,
las que son definidas al comienzo del módulo. Dentro de este módulo se definen las caracterı́sticas de
las señales “externas” (entrada, salida, entrada-salida, cantidad de bits por señal) las que conviven e
interactúan con señales internas del tipo combinacional (wire) o secuencial (reg), ası́ como elementos
lógicos que definen el funcionamiento del módulo. La ventaja del Verilog es que permite varias
formas de definir el funcionamiento del bloque, desde una descripción detallada de elementos lógicos,
hasta niveles de abstracción altos como el uso de operadores matemáticos y secuencias condicionales,
además de resultar sumamente simple escalar el tamaño de buses.
Para utilizar este módulo basta con crear un objeto. Este objeto debe tener un nombre, y
es asociado a un módulo tal como se muestra al final del Ej. 1.1. Note que mediante la sintaxis
.nombre se~ nal módulo(nombre se~ nal real) se asigna una señal real perteneciente al proyecto a
un pin del módulo, en forma similar a cuando en C, se asigna una variable como argumento de una
función. La diferencia con C que DEBE tenerse en mente es que cada vez que se crea un objeto
basado en un módulo, este nuevo objeto se crea fı́sicamente en la FPGA, tal como muestra la
Fig. 1.8.
Si bien este paso es en teorı́a opcional y se podrı́a dejar al compilador la tarea de asignar
los pines según mejor le parezca, en la práctica, debido a que la FPGA se encuentra instalada
fı́sicamente en una tarjeta ya desarrollada, es necesario que el usuario se haga cargo, de acuerdo a
las restricciones planteadas en [1].
La asignación de pines es una restricción (constrain en inglés) impuesta al compilador por
el usuario, y se incluye en un archivo con extensión .ucf (User Constrain File) o archivo de
restricciones del usuario. Además de la asignación de pines en el archivo .ucf se pueden agregar
restricciones sobre la utilización de ciertas área de la FPGA, tiempos máximos de propagación
entre señales, entre otros. El Ej. 1.2 muestra un extracto del archivo .ucf creado en [1].
D Q
cont
DSP
FPGA
(a) (b)
Figura 1.8. (a) Uso de objetos y módulos en Verilog; (b) Uso de funciones en C
Note que en la plataforma que dispone existen muchos pines para tareas especı́ficas y que no
debieran modificarse, salvo que se esté absolutamente seguro que es necesario y posible. Pero
por otro lado existe un número significativo de pines que pueden ser asignados libremente por el
usuario ya sea para tareas relacionadas con los moduladores PWM y/o cualquier otra actividad
tipo I/O que se requiera.
La FPGA es un dispositivo volátil, es decir, que pierde su programación cada vez que pierde su
polarización. Es por esto que se requiere de un dispositivo no volátil que mantenga la programación
del Firmware que se desea utilizar y lo grabe en la FPGA cada vez que ésta se polariza. En particular
en el caso de las plataformas desarrolladas se utilizan memorias de tipo EPROM para almacenar el
Firmware. En el caso de la plataforma basada en la Spartan 6 es la XCF04s. Es importante señalar
Archivo
principal
Análisis de la
lógica del sistema
Optimiza la
implementación de
la lógica en la FPGA
(a) (b)
Figura 1.9. (a) Selección del archivo principal; (b) Inicio del proceso de compilación.
que al polarizarse la plataforma, las EPROM tardan un par de segundos en programar a la FPGA,
por lo que durante este perı́odo de tiempo esta última puede no funcionar como estaba previsto.
Una vez terminados los archivos .sch y/o .v es necesario compilar el proyecto de manera de
generar un archivo que contenga la información necesaria para que la FPGA realice la tarea deseada,
archivo .bit. Luego es necesario crear un archivo de configuración para la EPROM (.mcs), basado
en el archivo .bit. Por lo que los pasos son:
Seleccione el archivo principal del proyecto, tal como se muestra en la Fig. 1.9(a), lo que
activará las opciones de compilación en la ventana de procesos (Processes), que se muestra
en la Fig. 1.9(b).
Haga click en la viñeta Generate Programming File, el menú desplegará tres opciones, haga
doble click en Generate PROM, ACE or JTAG File, lo que iniciará el proceso de compilación,
el que consta básicamente de tres pasos:
• Sı́ntesis del sistema: Se revisa la lógica del sistema, se reducen las ecuaciones lógicas y
se obtienen las expresiones mı́nimas para implementar el proyecto.
• Implementación: Se busca la mejor manera de implementar en la FPGA especı́fica las
ecuaciones lógicas obtenidas del proceso de sı́ntesis.
• Generación del archivo de configuración: Una vez que se ha determinado que elementos
internos de la FPGA se utilizarán, se crea un archivo de configuración para ser cargado
en la FPGA o PROM.
Figura 1.10. Creación de un archivo para la PROM: (a) Primer paso; (b) Segundo paso,
elección del formato del archivo para la PROM; (c) Tercer paso, elección de la PROM; (d) Cuarto
paso, elección de nombre del archivo .mcs y directorio donde se guardará.
Dependiendo del estado en que se encuentre cada uno de estos procesos, diferentes ı́conos
aparecerán a un costado de cada proceso:
Si el proceso finalizó con éxito (todos los procesos con el ı́cono ) se abrirá la ventana mostrada
en la Fig. 1.10(a), seleccione la opción Create PROM File nombre archivo principal.bit
con el archivo de configuración para la FPGA.
Aparecerá la ventana de la Fig. 1.10(b) donde se deben seleccionar la opcion Xilinx Flash
EPROM y presionar la flecha verde que se encuentra a la izquierda de esta ventana. Esto
habilitará el siguiente cuadro de diálogo.
Seleccione el modelo de la EPROM xcf04s y presione el botón Add Storage Device (ver
Fig. 1.4(b)(c)). Presionar la flecha verde que se encuentra a la izquierda de esta ventana. Esto
habilitará el siguiente cuadro de diálogo. mostradas.
En el casillero Output File Name escriba cualquier nombre que le parezca apropiado para
el archivo .mcs, preste atención al directorio (Output File Location) donde se guardará el
archivo (Fig. 1.10(d)).
Una nueva ventana solicitará elegir un archivo .bit para usar como base para el archivo de
configuración de la PROM. Presione OK, se abrirá una ventana de navegación, seleccione el
archivo nombre archivo principal.bit.
(a) (b)
Figura 1.11. (a)Paso final para generación de archivo de configuración para la PROM;(b)
Ventana del programa Adept para cargar el programa en la PROM.
Aparecerá una ventana similar a la mostrada en la Fig. 1.11(a), haga doble click en el co-
mando ⇒Generate File.... Si todo se hizo correctamente aparecerá el mensaje PROM File
Generation Succeeded, y el archivo se habrá generado.
Para cargar el archivo .mcs en la PROM conecte el cable USB proporcionado por el profesor
a su computador y el otro extremo al conector Programador mostrado en la Fig. 1.12. Preste
especial atención en el orden de los respectivos pines.
Entradas
ADCs Conector para
IOs programación
Zona FPGA
DACs
Fuentes
Conversores ADCs
Conector para
programación
IOs
Presione el botón Browse a un costado del botón PROM y seleccione el archivo .mcs recién
creado. Si lo ha cargado con anterioridad aparecerá en el menu desplegable entre el botón
PROM y el botón Browse.
Una vez que el nombre del archivo .mcs aparece en el menu desplegable, presione el botón
derecho sobre el botón PROM y elija la opción Program Device. En la ventana inferior se
entregará información sobre los pasos que está siguiendo el programa Adept. Una vez que
aparezca el mensaje Program Succesful el nuevo programa estará grabado en la PROM
En los siguientes puntos se muestra la funcionalidad de los diferentes módulos antes descritos, las
posibilidades que ofrecen y los registros involucrados en sus respectivas configuraciones. Finalmente
en la sección 2.2 se detallan todos los registros de configuración de los que se dispone.
La plataforma de la FPGA cuenta con un oscilador externo denominado OS1, conectado al pin
A10 de la FPGA. En general este oscilador se utiliza con una frecuencia de 150MHz5 . Este es el reloj
base para todos los procesos de la FPGA. Sin embargo en muchas ocasiones se requiere de relojes
más lentos o de diferente frecuencia, con el fin de adecuarse a ciertos periféricos o condiciones
externas. Es por eso que la FPGA cuenta con 4 señales de reloj internas, CLK0 a CLK3, que se
configuran en función de la señal entregada por OS1. La frecuencia de estos relojes está dada por:
fOS1
fCLKx = (1.1)
DIV CLKx
150e6
fCLKx = (1.2)
DIV CLKx
DIV CLKx puede tomar cualquier valor entero entre 2 y 65535. Utilizar el 0 o 1 hará que el
respectivo reloj se detenga. Para números mayores a 65535, sólo los 16-bits menos significativos
serán considerados.
La principal aplicación de los relojes configurables es la de permitir ajustar la frecuencia de los
Timers, descritos en la sección 1.2.1.b, agregando un grado de libertad adicional para el ajuste de
dicha frecuencia.
Es importante tener en cuenta que si bien las señales CLKx son libremente configurables, el
CLK3 es también utilizado como reloj base para el funcionamiento de los ADC. Es por esto que se
recomienda utilizarlo a una frecuencia de hasta 32MHz (DIV CLK3 ADC=5 para OS1=150MHz), si
fCLK3 32MHz los ADC pueden entregar resultados erroneos, mientras que a medida que fCLK3 baja
de 32MHz, la precisión mejora un poco, pero el tiempo que tardan las secuencias de conversión
puede volverse relevante dependiendo de la aplicación.
La Fig. 1.14 muestra las relaciones más importantes entre los diferentes relojes del sistema y
los módulos desarrollados en la FPGA.
1.2.1.b. Timers.
El Firmware cuenta con 5 Timers (Timer0 a Timer4) de 16-bits cada uno. Estos Timers pueden
configurarse para contar de manera ascendente, descendente y ascendente-descendente (Fig. 1.15)
enter 0x0000 y el valor del registro TnC MAX, el cual es especificado por el usuario.
5
Compruebe esto en su tarjeta.
Figura 1.14. Relaciones entre las señales de reloj y los módulos internos de la FPGA.
Los Timers incrementan (o decrementan) el valor de su cuenta en una unidad de acuerdo con
la frecuencia de los relojes base CLK0 a CLK3 los que se configuran como un divisor entero del reloj
principal de 150MHz.
Cada Timer puede configurarse para operar de manera absolutamente independiente de los
otros, lo que incluye modo de cuenta, valor máximo de cuenta, fuente de reloj base para la cuenta,
entre otros. Además se provee de un modo maestro-esclavos en el que uno o varios de los Timers
Timer1-Timer4 pueden ser sincronizados al Timer0, lo que permite generar señales triangulares
que operen con un desfase fijo, el que se determina para cada Timer de acuerdo al valor del registro
TnLOAD y el bit SLOPE INI del registro TnCTRL asociado el Timer.
IMPORTANTE: Para que el modo maestro-esclavos funcione adecuadamente, los bits de
configuración SEL CLK, MODE y la palabra TnC MAX de los Timers esclavos deben tener el mismo
valor que los del Timer maestro.
Tal como se muestra en las Fig. 1.15 y Fig. 2.1 los Timers se interconectan con prácticamente
todos los demás módulos de la FPGA, debido a que cumplen con dos tareas muy importantes:
Generadores de bases de tiempo para realizar tareas a tasas de muestreo constantes (como
evaluar controladores discretos). En concreto se comunican con:
• Los moduladores PWM, sincronizando la carga de los valores de comparación con dife-
rentes eventos de las triangulares.
• Los ADCs, dando la posibilidad de realizar mediciones a tasas de muestreo fijas y/o
sincronizadas con los diferentes contadores.
• El DSP, ya que en base a eventos de los Timers se pueden generar interrupciones al DSP.
El valor de la cuenta del Timer se encuentra disponible en todo momento en el registro TnCNT
respectivo.
La configuración de los Timers puede cambiarse en cualquier momento, pero el resultado de
este cambio puede tomar algunos ciclos de reloj. Para más información sobre este punto consulte
la sección 4.3.4.2 en [1].
Tres moduladores de tipo Bipolar (dos niveles de voltaje en la salida) o un modulador Unipolar
(tres niveles de voltaje en la salida), seleccionado por el bit PWMnCTRL(12).
Generador de tiempo muerto, definido por PWMnCTRL(10:1).
Generación de una salida directa SPx Tn y una señal cuasi-complementaria SNx Tn. Las
señales no son exactamente complementarias debido al efecto del tiempo muerto.
Selector de polaridad de la modulación PWM (PWMnCTRL(11)). Con polaridad positiva SPx Tn=1
si TnCMPRx>TnCNT, con polaridad negativa SPx Tn=0 si TnCMPRx>TnCNT. La polaridad tam-
bién afecta al funcionamiento del tiempo muerto, con polaridad positiva se genera el tiempo
muerto tradicional, con polaridad negativa se genera un “tiempo vivo” del largo correspon-
diente.
Selector del evento de sincronización de la referencia del modulador. Esta opción se utiliza
con el fin de evitar falsas conmutaciones, o glitches, que pueden ocurrir si la referencia es
actualizada en un momento distinto a cuando la cuenta es máxima o mı́nima (ver Fig. 1.16). El
sincronizador de referencia permite actualizar el valor de la referencia en cualquier momento,
pero esta queda retenida en un buffer, quedando disponible para el comparador sólo a partir
del instante de sincronismo seleccionado, tal como muestra el diagrama de la Fig. 1.17
Señal de inhabilitación del modulador PWM (PWMTRIP).
Figura 1.16. Patrones PWM con manejo de referencia: (a) Asincrónica; (b) Sincrónica.
En el modo Bipolar cada modulador puede modular hasta tres señales de referencia TnCMPR1,
TnCMPR2 y TnCMPR3, con n= 0, . . . , 4, generando tres señales PWM y sus respectivas señales cuasi-
complementarias. Por otra parte, en el modo Unipolar sólo se utiliza una señal de referencia, la
que genera dos señales PWM con sus señales cuasi-complementarias, tal como se muestra en la
Fig. 1.18.
Figura 1.18. Bloque PWM configurado para modulación: (a) Bipolar; (b) Unipolar.
El módulo generador de tiempo muerto es capaz de ajustar este tiempo con una precisión de
6.6ns en un rango desde los 6.6ns hasta los 6.82µs, de acuerdo con:
Cada submódulo de cada modulador puede ser deshabilitado de manera individual a través de
la señal PWMTRIP(m), permitiendo un control más detallado ante, por ejemplo, valores peligrosos de
voltaje y corriente. El detalle del uso del registro PWMTRIP se detalla en la sección 2.2.2.
Finalmente las Fig. 1.19(a) y Fig. 1.19(b) muestran la distribución fı́sica por defecto de los pines
relacionados con los diferentes moduladores PWM dependiendo si se usa el firmware normal o el
adaptado para el uso de fibra óptica. Es importante señalar que esta distribución puede modificarse
fácilmente en el archivo General.v, perteneciente a los archivos fuente del Firmware de la FPGA,
para acomodarse a aplicaciones especı́ficas. En la tarjeta Spartan 6, los puertos P8 y P9 no se
encuentran preasignados.
4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46
SN1 SN1 SN1 SN1 SN1 SN2 SN2 SN2 SN2 SN2 SN3 SN3 SN3 SN3 SN3
P5 2
GND
T0 T1 T2 T3 T4 T0 T1 T2 T3 T4
SP1 SP1 SP1 SP1 SP1 SP2 SP2 SP2 SP2 SP2
3.3V GND
T0 T1 T2 T3 T4
SP3 SP3 SP3 SP3 SP3
* 3.3V
48
GND 3.3V GND 3.3V
1 T0 T1 T2 T3 T4 T0 T1 T2 T3 T4 T0 T1 T2 T3 T4 47
P6 1 GND GND 5V 5V 3.3V 3.3V 5V 5V GND
24
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
(a)
4 6 8 10 12
14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46
SN1 SP1 SN2 SP2
SN3 SP3
P5 2
GND
T4 T4
SP1 SN1 SP2
T4
SN2
T4T4 T4
SP3 SN3 SP1 SN1
3.3V GND
SP2 SN2 SP3 SN3 SP1 SN1 SP2 SN2
*T0 3.3V
48
GND 3.3V GND 3.3V
1 T0 T0 T0 T0 T0 T0 T1 T1 T1 T1 T1 T1 T2 T2 T2 T2 min 47
SP3 SN3 SP1 SN1 SP2 SN2 SP3 SN3
P6 1 GND GND 5V 5V 3.3V 3.3V
T2 T2 T3 T3 T3 T3 T3 T3
5V 5V GND
24
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
(b)
Figura 1.19. Distribución por defecto de los pines de los moduladores PWM: (a) Normal;
(b) Para la versión compatible con Fibra óptica. (*Pin disponible sólo en Tarjeta Spartan 6)
4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34
GND 5V
2 36
P8
GND 3.3V
5V
1 35
P9 1 GND 5V
18
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
Una de las principales funciones de la FPGA es la de manejar los dos conversores AD de Analog
Devices AD7266 que posee la tarjeta. Las principales caracterı́sticas de estos conversores son las
siguientes:
Resultado en 12-bits.
Frecuencia de muestreo de hasta 2MSPS, es decir hasta dos millones de conversiones por
segundo.
12 entradas análogas, las que SIEMPRE son muestreadas en pares A1-B1, A2-B2, etc...
Ya que la tarjeta cuenta con dos de estas pastillas se pueden realizar hasta 24 conversiones AD,
de las cuales 4 pueden hacerse de manera simultánea. Estas 24 conversiones pueden dividirse en
dos tipos:
1. Entradas directas: Las entradas análogas ADCn A3-ADCn B3, ADCn A4-ADCn B4, ADCn A5-ADCn B5
y ADCn A6-ADCn B6 de los integrador AD7266, se encuentran disponibles directamente en el
conector P1 de la tarjeta, por lo que cualquier voltaje que se aplique en este conector apa-
recerá automáticamente en los ADCs. Por este motivo es MUY IMPORTANTE que los
voltajes aplicados en estas entradas NUNCA supere los 5V ni caiga de 0V, de otro modo se
corre el riesgo de dañar los conversores.
2. Entradas diferenciales: Las entradas análogas ADCn A1-ADCn B1 y ADCn A2-ADCn B2 no son
accesibles directamente por el usuario, sino que se encuentran conectadas a un circuito di-
ferencial, al que se accede a través de los conectores P3 y P4. Estos circuitos diferenciales
permiten convertir voltajes de entrada en el rango ±10[V] (dependiendo de la configuración
del diferencial), los que son adaptados para ser convertidos apropiadamente por los conver-
sores.
La Fig. 1.21 muestra la distribución fı́sica de los conectores y un esquema funcional del amplificador
diferencial.
Figura 1.21. Tarjeta Spartan 3: (a) Distribución de las entradas análogas en la tarjeta;
(b) Pines de los conectores relacionados con los ADCs; Tarjeta Spartan 6: (c) Distribución de las
entradas análogas en la tarjeta; (d) Pines de los conectores relacionados con los ADCs.
Las conversiones AD se pueden configurar para realizarse en secuencias que, tal como se señaló
en la sección 1.2.1.b, pueden coordinarse con eventos relacionados con los Timers o bien comandados
directamente desde el DSP, dependiendo de la configuración de los bits ADCnCTRL(20:10), tal como
se muestra en la Fig. 1.22.
Figura 1.22. Módulo para inicio de secuencias de conversión AD. Cada ADC cuenta con
uno de estos módulos.
Es importante señalar que en el caso de sincronizarse con los Timers, el conversor ADC se
sincronizará con la ocurrencia de un evento en el Timer, es decir cuando:
Se genera un evento de underflow (la cuenta del Timer llegue a 0), cuando esto ocurre
TxMIN=1.
Se genera un evento de perı́odo (la cuenta del Timer llegue al valor máximo al que se ha
configurado TnC MAX), cuando esto ocurre TxMAX=1.
No es necesario que estén habilitadas las interrupciones del Timer para que se inicie
la conversión AD basta que la cuenta del Timer pase por 0 o TnC MAX.
Finalmente recuerde que los conversores ADC0 y ADC1 son módulos completamente indepen-
dientes, por lo que pueden configurarse para trabajar a partir de eventos diferentes.
Cada conversor cuenta con un registro secuenciador de seis posiciones (ADCnCHS) que indi-
ca que canales serán convertidos y en que orden se realizarán dichas conversiones, mientras que
los bits ADCnCTRL(6:4) indican cuantas de las seis conversiones (comenzando por la definida por
ADCnCHS(2:0)) se llevarán a cabo, tal como muestra la Fig. 1.23. Los secuenciadores son absoluta-
mente independientes, por lo que pueden realizar un número diferente de conversiones y/o convertir
canales en diferente orden. Asimismo pueden o no trabajar de manera simultánea, dependiendo de
la configuración de los registros ADC0CTRL y ADC1CTRL.
Un punto especialmente sensible es el del almacenamiento del resultado de las conversiones.
Como se mencionó anteriormente, cada conversión arroja un resultado de 12-bits, y siempre las
conversiones se realizan en pares, luego el resultado total es de 24-bits correspondientes al par
nAx-nBx, n=0,1 conversor utilizado y x=1. . .6 canal convertido. Dado que el bus de datos entre el
DSP y la FPGA es justamente de 24-bits, y con el fin de disminuir el tiempo de transferencia de
datos entre los dispositivos, el resultado total de una conversión se almacena en un único registro de
24-bits llamado ADCn CONVxA xB donde los 12-bits más significativos corresponden a la conversión
del canal xA y los 12-bits menos significativos a la conversión del canal xB, tal como se muestra en
la Fig. 1.24. Es de responsabilidad del usuario separar apropiadamente en el DSP este
resultado total, de manera de obtener el(los) datos correctos.
Figura 1.24. Formato de los datos almacenados en los registros ADCn CONVxA xB.
Es muy importante señalar que el orden de llenado de los registros de resultado está relacionado
con el orden en el que se realizan las conversiones AD y no con el número del canal convertido, por
lo tanto:
Siempre el resultado total de la primera conversión se almacenará en el registro
ADCn CONV1A 1B, el resultado de la segunda conversión se almacenará en el registro
ADCn CONV2A 2B y ası́ sucesivamente.
Por lo tanto si se desea realizar una secuencia de tres conversiones en el conversor 0, es decir
ADC0CTRL(6:4)=(011), en el orden (ChA3, ChA1, ChB2) se obtendrá el siguiente resultado:
A diferencia de todos los demás periféricos de la FPGA, los cuales son manejados a través del
Bus de Memoria, los DAC son manejados por comunicación serial a través del Bus McBSP0.
Al ser un bus serial, la palabra de datos enviada por el DSP es recibida bit a bit por la
FPGA. Esta palabra básicamente debe contener la información de a qué DAC va dirigido el dato
(Dato(11:0)), además de en que DAC (C=0,1) y en que canal (Ch=0,1) se desea escribir. Estos
dos últimos datos son utilizados por la FPGA para direccionar correctamente los datos hacia la
pastilla adecuada, tal como se muestra en la Fig. 1.25.
Figura 1.25. (a) Esquema del funcionamiento del módulo DAC; (b) Distribución de pines
tarjeta Spartan 3; (c) Distribución de pines tarjeta Spartan 6.
Es importante tener en cuenta que Dato(11:0) debe ser un número entero en el rango 0-4095,
ya que de otro modo se obtendrán resultados inesperados. Debido a esta restricción frecuentemente
se deberán utilizar ganancias y ajustes de offset de modo de adaptar las variables.
La FPGA tiene programado un resolvedor de encoder, que permite contar de manera automática
la cantidad de conmutaciones, incrementando o decrementando el valor de la cuenta dependiendo
del sentido de giro del encoder. Las señales A, B y Z del encoder pueden llegar a la FPGA de dos
maneras diferentes:
Modo diferencial: El encoder envı́a las señales normales y sus valores complementarios A,
B y Z. El uso de las señales complementarias permite disminuir notablemente el efecto del
ruido en las señales desde el encoder, pero se requiere del doble de señales. Para utilizar
este modo las resistencias Rz0 a Rz5 deben encontrarse soldadas en la placa de la
FPGA, con resistencias de 0Ω.
Modo directo: Sólo se utilizan las señales normales provenientes del encoder. Esto aumenta el
ruido en las señales, pero la construcción del cable es más simple. Para utilizar este modo
las resistencias Rz6 a Rz11 deben encontrarse soldadas en la placa de la FPGA,
con resistencias de 0Ω.
La Fig. 1.26 muestra alguna de las posibilidades del módulo de decodificación de encoder, entre
estas destacan:
Multiplicador de pulsos, que permite aumentar la resolución del encoder en cuatro veces su
número de pulsos nominales.
Posibilidad de entregar la cuenta en valor absoluto (encoder absoluto), al utilizar la señal de
cero, Z, para reiniciar el contador cada vez que se da una vuelta completa.
Figura 1.26. Diagrama con alguna de las posibilidades del módulo de decodificación de Encoder.
El valor de la cuenta puede almacenarse en un registro especial cada vez que alguno de los
Timers llegue a su valor máximo y/o su valor mı́nimo. De esta forma se garantiza que las
lecturas de la cuenta del encoder se realice de manera periódica.
El registro que almacena la cuenta es de 16-bits, por lo que el valor máximo de la cuenta es de
65.535, una vez alcanzado este valor la cuenta vuelve automáticamente a cero.
Los conectores de interfase entre la tarjeta de la FPGA y del DSP proporcionan cuatro pines
que son capaces de interrumpir al DSP. De estos cuatro contactos, tres de ellos se encuentran
conectados a la FPGA, de acuerdo a la Tabla 1.1.
Tabla 1.1
Relación entre la FPGA y las Interrupciones del DSP.
Cualquier evento interno de la FPGA puede ser enviado a alguno de estos pines editando el
archivo .ucf, generando asi un evento de interrupción, que de estar bien configurado dentro del
DSP generará una interrupción de la CPU de éste.
En el firmware base de la FPGA se encuentran programadas dos tipos de interrupciones:
Ext Int4: Esta interrupción puede habilitarse a partir de los eventos TxMAX, TxMIN y/o TxMIN
de cualquiera de los cinco Timers o el fin de secuencia de conversión de los ADC0 y/o ADC1,
tal como se muestra en la Fig. 1.27.
Ext Int5: A diferencia de la interrupción anterior, en este caso el evento que gatilla la inte-
rrupción proviene desde una fuente externa a la FPGA, especı́ficamente de una señal digital
que se ingresa por el pin P6 7. Esta señal puede utilizarse, por ejemplo, como una señal de
emergencia externa que ejecute un código especial cuando se detecte algún error en el sistema.
T0_0xFFFF
T0CTRL(2)
T0CTRL(3) [T0CTRL(7)]
E_INT
T0MAX
T0CTRL(2)
T0MIN
T0CTRL(3)
T1_0xFFFF
T1CTRL(2) INT_CTRL
T1CTRL(3) [T1CTRL(7)]
E_INT
T1MAX
[INT_CTRL(2)]
T1CTRL(2)
INT_EXT EXT_INT5
T1MIN Pin P6_7
T1CTRL(3)
T2_0xFFFF
T2CTRL(2)
T2CTRL(3) [T2CTRL(7)]
E_INT
T2MAX
T2CTRL(2)
INT_TIMERS
T2MIN
T2CTRL(3)
[INT_CTRL(0)]
T3_0xFFFF
T3CTRL(2)
T3CTRL(3)
[T3CTRL(7)]
E_INT
T3MAX
T3CTRL(2)
EXT_INT4
T3MIN
T3CTRL(3)
T4_0xFFFF
T4CTRL(2)
T4CTRL(3)
[T4CTRL(7)]
E_INT
T4MAX
T4CTRL(2)
La Fig. 1.27 muestra un diagrama que relaciona los diferentes eventos de interrupción con
sus habilitadores y señales de interrupción. Note que en muchos casos la señal de habilitación se
denomina E Int, sin embargo este nombre hace referencia a bits de diferentes registros. Para que
una señal de interrupción efectivamente llegue al DSP deben estar habilitadas tanto la señal de
interrupción como el selector de evento del módulo en cuestión.
Los diferentes módulos se relacionan de manera diferente con el DSP, tal como se muestra en
la Fig. 2.1, dependiendo de las caracterı́sticas de los periféricos que manejan, ası́ por ejemplo, los
ADCs reciben señales de control desde el DSP y a cambio le envı́an grupos de bits con los resultados
de las conversiones; de manera diferente los DACs reciben señales de control y bits de datos, sin
devolver nada al DSP.
DSP
DAC 2
ADC 1 ADC 2
DAC 1
Bits de control
Gen. de
Reloj Timers Buses de datos
Dec.
Encoder
Mod. Mod. Mod. Mod. Mod.
PWM PWM PWM PWM PWM
FPGA
26
Capı́tulo 2. Uso de la plataforma DSP+FPGA. 27
Ejemplo 2.1 (Definición de direcciones en el archivo spartan3 v1 3.h para uso de pe-
riféricos definidos en la FPGA.).
Ejemplo 2.2 (Definición de máscaras en el archivo spartan3 v1 3.h para uso de periféri-
cos definidos en la FPGA.).
que simplifica bastante el trabajo. Para esto hay que tener siempre en cuenta que dentro de la
FPGA se han definido una serie de direcciones que vistas desde el DSP se encuentran a partir del
0xA0000000 en pasos de 4 direcciones.
Las primeras lı́neas del archivo spartan3 v1 3.h asignan nombres bastante descriptivos a las
direcciones de memoria definidas en la FPGA, tal como muestra el Ej. 2.1. Mientras que el Ej. 2.2,
muestra la definición de las máscaras que permiten realizar la configuración de los periféricos de
manera mucho mpas natural.
De esta forma, para configurar al Timer 0 como un contador que utiliza como base al reloj 1
y que cuenta en modo up-down, generando una interrupción cada vez que llega al valor mı́nimo,
basta con ingresar la siguiente lı́nea en el programa en C:
T0CTRL = SEL_CLK1 + MODE_UP_DOWN + SEL_INT_UND + E_INT;
2.2.1. Timers
Tabla 2.1
Registros de configuración de módulo de Timers
Registro Nombre Corto (R/W) Dirección
Divisor de Reloj 0 DIV CLK0 W 0xA0000000
Divisor de Reloj 1 DIV CLK1 W 0xA0000004
Divisor de Reloj 2 DIV CLK2 W 0xA0000008
Divisor de Reloj 3 DIV CLK3 ADC W 0xA000000C
Control de Timer0 T0CTRL W 0xA0000020
Cuenta máxima del Timer0 T0C MAX W 0xA0000028
Cuenta del Timer0 T0CNT R 0xA0000038
Control de Timer1 T1CTRL W 0xA0000040
Valor de precarga del Timer1 T1LOAD W 0xA0000044
Cuenta máxima del Timer1 T1C MAX W 0xA0000048
Cuenta del Timer1 T1CNT R 0xA0000058
Control de Timer2 T2CTRL W 0xA0000060
Valor de precarga del Timer2 T2LOAD W 0xA0000064
Cuenta máxima del Timer2 T2C MAX W 0xA0000068
Cuenta del Timer2 T2CNT R 0xA0000078
Control de Timer3 T3CTRL W 0xA0000080
Valor de precarga del Timer3 T3LOAD W 0xA0000084
Cuenta máxima del Timer3 T3C MAX W 0xA0000086
Cuenta del Timer3 T3CNT R 0xA0000098
Control de Timer4 T4CTRL W 0xA00000A0
Valor de precarga del Timer4 T4LOAD W 0xA00000A4
Cuenta máxima del Timer4 T4C MAX W 0xA00000A8
Cuenta del Timer4 T4CNT R 0xA00000B8
11 10 9 8 7 6 5 4 3 2 1 0
DIV_CLKx
DIV CLKx Bits 15-0 Valor del divisor para el reloj base CLKx.
6
El divisor de reloj DIV CLK3 ADC es utilizado para el funcionamiento de los conversores AD, por lo que debe
ser inicializado con un valor mayor a 5 si el reloj externo de la FPGA es de 150MHz. Mientras mayor sea este valor
más tardarán las conversiones AD
11 10 9 8 7 6 5 4 3 2 1 0
V_LOAD
11 10 9 8 7 6 5 4 3 2 1 0
C_MAX
Tabla 2.2
Registros de configuración del módulo PWM
Registro Nombre Corto (R/W) Dirección
Control del Modulador 0 PWM0CTRL W 0xA0000140
Valor de referencia 1 para PWM0 T0CMPR1 W 0xA000002C
Valor de referencia 2 para PWM0 T0CMPR2 W 0xA0000030
Valor de referencia 3 para PWM0 T0CMPR3 W 0xA0000034
Control del Modulador 1 PWM1CTRL W 0xA0000144
Valor de referencia 1 para PWM1 T1CMPR1 W 0xA000004C
Valor de referencia 2 para PWM1 T1CMPR2 W 0xA0000050
Valor de referencia 3 para PWM1 T1CMPR3 W 0xA0000054
Control del Modulador 2 PWM2CTRL W 0xA0000148
Valor de referencia 1 para PWM2 T2CMPR1 W 0xA000006C
Valor de referencia 2 para PWM2 T2CMPR2 W 0xA0000070
Valor de referencia 3 para PWM2 T2CMPR3 W 0xA0000074
Control del Modulador 3 PWM3CTRL W 0xA000014C
Valor de referencia 1 para PWM3 T3CMPR1 W 0xA000008C
Valor de referencia 2 para PWM3 T3CMPR2 W 0xA0000090
Valor de referencia 3 para PWM3 T3CMPR3 W 0xA0000094
Control del Modulador 4 PWM4CTRL W 0xA0000150
Valor de referencia 1 para PWM4 T4CMPR1 W 0xA00000AC
Valor de referencia 2 para PWM4 T4CMPR2 W 0xA00000B0
Valor de referencia 3 para PWM4 T4CMPR3 W 0xA00000B4
Inhibidores de patrón PWM PWMTRIP W 0xA0000154
23 22 21 20 19 18 17 16 15 14 13 12
11 10 9 8 7 6 5 4 3 2 1 0
REFx
2.2.3. ADCs
Tabla 2.3
Registros de configuración del módulo convertidores ADC
Registro Nombre Corto (R/W) Dirección
Control del ADC0 ADC0CTRL W 0xA00000C0
Selección de canales ADC0CHS W 0xA00000C4
Inicio manual del ADC0 ADC0START W 0xA00000C8
Resultado 1º conv. del ADC0 ADC0CONV1A 1B R 0xA00000D0
Resultado 2º conv. del ADC0 ADC0CONV2A 2B R 0xA00000D4
Resultado 3º conv. del ADC0 ADC0CONV3A 3B R 0xA00000D8
Resultado 4º conv. del ADC0 ADC0CONV4A 4B R 0xA00000DC
Resultado 5º conv. del ADC0 ADC0CONV5A 5B R 0xA00000E0
Resultado 6º conv. del ADC0 ADC0CONV6A 6B R 0xA00000E4
Control del ADC1 ADC1CTRL W 0xA0000100
Selección de canales ADC1CHS W 0xA0000104
Inicio manual del ADC1 ADC1START W 0xA0000108
Resultado 1º conv. del ADC1 ADC1CONV1A 1B R 0xA0000110
Resultado 2º conv. del ADC1 ADC1CONV2A 2B R 0xA0000114
Resultado 3º conv. del ADC1 ADC1CONV3A 3B R 0xA0000118
Resultado 4º conv. del ADC1 ADC1CONV4A 4B R 0xA000011C
Resultado 5º conv. del ADC1 ADC1CONV5A 5B R 0xA0000120
Resultado 6º conv. del ADC1 ADC1CONV6A 6B R 0xA0000124
11 10 9 8 7 6 5 4 3 2 1 0
T0MAX T0MIN E_INT NUM_CONV
11 10 9 8 7 6 5 4 3 2 1 0
AN4 AN3 AN2 AN1
11 10 9 8 7 6 5 4 3 2 1 0
11 10 9 8 7 6 5 4 3 2 1 0
xª CONVERSIóN B
2.2.4. Encoder
Tabla 2.4
Registros de configuración y lectura del decodificador de encoder
Registro Nombre Corto (R/W) Dirección
Registro de control ENCCTRL W 0xA0000180
Cuenta y flags ENCCOUNTER R 0xA0000184
11 10 9 8 7 6 5 4 3 2 1 0
READ_MAX READ_MIN SINC_SEL SINC_READ RESET_Z
11 10 9 8 7 6 5 4 3 2 1 0
CUENTA
Tabla 2.5
Registro de configuración de interrupciones
Registro Nombre Corto (R/W) Dirección
Registro de control INT CTRL W 0xA0000160
11 10 9 8 7 6 5 4 3 2 1 0
INT_EXT INT_ADC INT_TIMERS
INT EXT Bit 2 Habilita las interrupciones al DSP desde un pin externo de la FPGA
INT ADC Bit 1 Habilita las interrupciones al DSP desde los ADCs
INT TIMERS Bit 0 Habilita las interrupciones al DSP desde los Timers
2.2.6. Otros
Tabla 2.6
Registro de configuración de interrupciones
Registro Nombre Corto (R/W) Dirección
Inicio secuencia de prueba TEST ENEABLE W 0xA00001C0
Manejo de LEDs de la tarjeta FPGA LED DSP SET W 0xA0000200
Estado del DIP-Switch de la tarjeta FPGA DIP DSP READ R 0xA0000204
TEST Bit 0 1 Inicia una secuencia de prueba que hace que la mayorı́a de los
IOs y LEDs comiencen una secuencia de encendido y apagado
Tabla 2.7
Registro de configuración de interrupciones
Registro Nombre Corto (R/W) Dirección
Configuración de registro de eventos de Timers CONFIG T REG W 0xA0000014
Registro de último evento de Timer T REG R 0xA0000018
CONFIG T REG, (W) Registro de configuración para registro de último evento de los Timer
que generó un evento de interrupción
23 22 21 20 19 18 17 16 15 14 13 12
11 10 9 8 7 6 5 4 3 2 1 0
T4_MAX T4_MIN T3_MAX T3_MIN T2_MAX T2_MIN T1_MAX T1_MIN T0_MAX T0_MIN
T4 MAX Bit 9 1 Permite que se registre cuando el Timer 0 llega a “T4 MAX”.
0 No registra cuando el Timer 4 llega a “T4 MAX”.
T4 MIN Bit 8 1 Permite que se registre cuando el Timer 0 llega a “0”.
0 No registra cuando el Timer 4 llega a “0”.
T3 MAX Bit 7 1 Permite que se registre cuando el Timer 0 llega a “T3 MAX”.
0 No registra cuando el Timer 3 llega a “T3 MAX”.
T3 MIN Bit 6 1 Permite que se registre cuando el Timer 0 llega a “0”.
0 No registra cuando el Timer 3 llega a “0”.
T2 MAX Bit 5 1 Permite que se registre cuando el Timer 0 llega a “T2 MAX”.
0 No registra cuando el Timer 2 llega a “T2 MAX”.
T2 MIN Bit 4 1 Permite que se registre cuando el Timer 0 llega a “0”.
0 No registra cuando el Timer 2 llega a “0”.
T1 MAX Bit 3 1 Permite que se registre cuando el Timer 0 llega a “T1 MAX”.
0 No registra cuando el Timer 1 llega a “T1 MAX”.
T1 MIN Bit 2 1 Permite que se registre cuando el Timer 0 llega a “0”.
0 No registra cuando el Timer 1 llega a “0”.
T0 MAX Bit 1 1 Permite que se registre cuando el Timer 0 llega a “T0 MAX”.
0 No registra cuando el Timer 0 llega a “T0 MAX”.
T0 MIN Bit 0 1 Permite que se registre cuando el Timer 0 llega a “0”.
0 No registra cuando el Timer 0 llega a “0”.
T REG, (R) Registro de último evento de los Timer que generó un evento de interrupción
23 22 21 20 19 18 17 16 15 14 13 12
11 10 9 8 7 6 5 4 3 2 1 0
T4_MAX T4_MIN T3_MAX T3_MIN T2_MAX T2_MIN T1_MAX T1_MIN T0_MAX T0_MIN
[1] Gonzalo Carrasco, “Diseño e Implementación de Módulos de Firmware para uso de FPGA en
Aplicaciones de Potencia,” Memoria para optar el tı́tulo de Ingeniero Civil Electrónico, Enero
2008.
41