Configuración FPGA Spartan 6 vía USB
Configuración FPGA Spartan 6 vía USB
Autor:
Guillermo Sagrado Salvador
Tutor:
Santiago de Pablo Gómez
Se diseña una tarjeta que contenga las conexiones entre ambos dispositivos y que se
conecta al host a través de USB. El trabajo abarca desde la búsqueda de las conexiones
entre dispositivos hasta la fabricación de la tarjeta.
Palabras clave
Abstract
The following project give us a solution so that we can configurate and comunicate with
a FPGA Spartan 6 model by the electronic manufacturer Xilinx through an intermediate
device which is an USB controller.
A carrier board which contains all the connections between both devices will be planned
in this project. This work is not only about the connections research but the product
manufacture.
Another of the tasks that have been carried out through this project has been the
development of the JTAG configuration interface for testing purpose, executing the
bitstream folder, first of all by wire and finally with the manufactured product.
Keywords
La principal ventaja que tienen las FPGA´s es que son reprogramables, si bien es cierto
que hay ciertos fabricantes cuentan con modelos que solo pueden ser reprogramados
una vez. Uno de los inconvenientes del uso de estas tarjetas de lógica programable es
encontrar un diseño comercial que satisfaga las necesidades de nuestro proyecto en
cuanto a interfaces disponibles y los conectores que permiten el acceso a los mismos
se refiere.
En este trabajo de fin de grado se dará una solución para la conexión de un dispositivo
intermedio entre el PC y la FPGA tanto para el interfaz de comunicaciones como para
el de programación, así como el diseño y funcionamiento de una PCB que albergue
las conexiones necesarias entre ambos dispositivos.
Los dispositivos elegidos para este trabajo serán: FPGA Spartan 6 del fabricante Xilinx,
su carrier board TE0303 del mismo fabricante y el controlador de USB FT-2232H del
fabricante FTDI.
1
El primer objetivo de este trabajo es el diseño y fabricación de una tarjeta que
albergue las conexiones necesarias entre los dos dispositivos anteriormente descritos
tanto para el interfaz de datos como para el de programación. Este segundo objetivo
trae consigo la adquisición de una serie de competencias como son:
Una vez hayamos dejado claros tanto el planteamiento como el punto de partida del
proyecto pasaremos en la segunda parte de la memoria a detallar todo lo relativo a
las conexiones entre el dispositivo de lógica programable y el controlador del USB.
Este apartado, que corresponderá con el capítulo 3 del trabajo, se centrará también
en la elaboración de los esquemáticos del trabajo con el programa OrCad Capture CIS.
En el capítulo 4, también perteneciente a esta parte de la memoria, encontraremos
el diseño de la tarjeta en PCB Editor, dividiéndose a su vez en varios apartados como
diseño, layout o routing.
2
2. Herramientas Hardware/Software utilizados
Algunas de las razones que llevaron a elegir este controlador de USB en detrimento
de los competidores de mercado es que es un chip económico y de fácil disponibilidad
ya que lo podemos adquirir a través de los distribuidores comunes de productos
electrónicos. A parte de esto, tiene un doble puerto que nos permite implementar los
interfaces de comunicación y de programación y es el componente utilizado en
algunas placas de evaluación de Xilinx, por lo que se ajusta bastante a los
requerimientos.
En este proyecto no vamos a trabajar en sí con este controlador de USB puesto que la
implementación de los interfaces ya se realizó en el trabajo comentado
anteriormente, pero si que es importante conocer tanto la arquitectura como los
datos técnicos de este dispositivo debido a que se encuentra dentro de nuestro
diseño y deben ser tenidos en cuenta por alguien que en un futuro use nuestra tarjeta.
3
2.1.2 Arquitectura Interna
Internamente, se distinguen varios modos funcionales:
4
Figura 1 Arquitectura interna del dispositivo FT2232H.
5
2.1.4 Configuración por EEPROM
La presencia o no de una EEPROM externa al chip FT2232H es clave en el
funcionamiento de este. Si no conectamos un EEPROM, o si esta está vacía, el
controlador USB adoptara el protocolo UART 323 Mode, que es el protocolo por
defecto. En este trabajo vamos a utilizar otro protocolo, que ya hemos descrito
anteriormente, como es el 245 FIFO. Para ello como se ha comentado anteriormente
es imprescindible conectar el dispositivo a una EEPROM y especificar en la memoria
el protocolo deseado.
Debemos tener en cuenta que este modo de funcionamiento tiene dos posibilidades
la síncrona y la asíncrona, si utilizamos la primera el segundo canal queda desactivado
estando únicamente operativo el puerto A, debido a que este modo utiliza todos los
recursos de memoria del integrado.
Para comenzar veremos un desglose de las diferentes señales con las que cuenta este
bus de comunicación:
• Señales de control:
- Tenemos una señal de reloj CLKOUT con una frecuencia constante de
60MHz.
- Una señal para pedir la lectura/salida RXF#, es activa a nivel alto. Cuando
RFX# está a nivel bajo quiere decir que todavía no existen datos leídos. El
RFX es considerado como buffer de recepción no vacío todavía. Cuando
permanece a nivel alto, el último byte de datos en el buffer permanece
en el bus de datos y no cambia.
- Tenemos también una petición de escritura/salida TXE# que al igual que
la de lectura es activa a nivel alto. Cuando se encuentra a nivel bajo quiere
decir que existe espacio en el buffer interno de transmisión para escribir
los datos en el controlador del USB. Sin embargo, cuando está a nivel alto
nos dice que está llena y no pide operación de escritura.
- #OE, señal que habilita los datos de entrada. Tiene que estar forzada a
uno por el slave, antes de que el dato vaya a ser leído por el master.
- RD#, señal mandada por el slave para confirmar una operación de lectura.
- WR#, similar a la señal anterior, pero confirma una operación de
escritura.
• 8 pines bidireccionales para datos y direcciones que van desde la señal D0
hasta la señal D7.
En los dos siguientes apartados vamos a dar unas pequeñas pinceladas sobre el modo
de funcionamiento FIFO, tanto el síncrono como el asíncrono. No vamos a entrar en
detalles de su funcionamiento teórico, pero sí que mostraremos los diagramas de
tiempos y las especificaciones temporales. Ambos, diagrama y tabla de tiempos, los
daremos tanto para lectura como escritura y para FIFO síncrona y FIFO asíncrona.
6
Mostramos el diagrama y la tabla de tiempos porque son datos a tener en cuenta para
alguien que vaya a trabajar con la tarjeta que se persigue diseñar y fabricar en este
trabajo.
7
Tabla 1: Especificaciones temporales de lectura síncrona
8
Figura 4: Diagrama de tiempo de lectura asíncrona
9
2.1.6 MPSSE
El modo MPSEE ha sido deseñado para proveer al circuito del FT2232H de un interfaz
eficiente con protocolos como JTAG, I2C y SPI.
Tabla 5: Correspondencia de pinout del modo MPSSE con los principales buses serie
También es interesante ver el diagrama de tiempos de las señales que forman este
interfaz y la tabla de tiempos asociada a estas señales.
10
Figura 6: Diagrama de tiempos asociados a las señales para interfaz JTAG
60 MHz
Data Speed =
((1 + divisor) + 2)
11
usuario y puede configurarse de manera independiente para cada uno de los
sentidos de transferencia de los datos.
Todas las comunicaciones en las que usemos el interfaz JTAG son LSB first, lo que
quiere decir que los datos son desplazados a través de la máquina de estados en el
flanco de subida. Esto implica que el interfaz MPSSE debe sacar los datos en el anterior
flanco de bajada para garantizar el tiempo de setup.
12
2.2 FDI Mini-Module
El FT2232H Mini Module es un módulo de desarrollo de USB a serie/FIFO que el chip
visto anteriormente FT2232H de dos puertos USB de alta velocidad para manejar los
dos protocolos y la señalización de USB. Es ideal para tareas de desarrollo, pues
permite demostrar de forma rápida la funcionalidad al añadir USB a un diseño de
destino.
El FT2232H en el Mini Module permite el acceso al pinout del integrado del chip
mediante dos tiras dobles de conectores. Estos dos conectores los denominaremos
CN2 Y CN3 y tienen en cada fila 13 pines, por lo que, cada conector tiene un total de
26 pines distintos. Más tarde veremos el pinout y explicaremos con más detenimiento
cuál es la función de cada uno de estos pines. El espaciado entre pines de este mini
módulo es de 2.54mm, lo que equivale a una décima de pulgada.
• Es compatible con USB 2.0 de alta velocidad, pero también lo es con USB 1.0
al igual que ocurría con el chip FT2232H.
• Tiempo de desarrollo reducido.
• Rápida integración en sistemas existentes.
• Puede alimentarse a través del USB, no se requiere alimentación externa,
pero también cuenta con esa posibilidad.
• Basado en el dispositivo FT2232H USB de alta velocidad.
• Protocolo USB manejado íntegramente por módulo USB.
• Velocidades de transferencia de datos serie asíncrona de 300 baudios a
12Mbaudios a niveles TTL.
• Velocidades de transferencia de datos serie asíncrona de hasta 30Mbps en
JTAG.
13
• Soporta suspensión y reanudación de USB.
• Compatible con controlador host UHCI / OHC I/ EHCI.
Ahora veremos la presentación de las tablas con la función de cada pin dentro del
integrado del mini módulo.
14
Tabla 7: Pinout conector CN2
15
Tabla 8: Pinout conector CN3
16
- VCC, entrada de alimentacion de 5V a partir de la cual se generan V3V3,
VPLL y VIO.
- V3V3, tensión de salida 3,3V generada a partir de VCC.
- VIO, tensión de alimentación para los bancos de entrada/salida, también
de 3.3V.
• Interfaz serie, buses de datos que vamos a usar para la comunicación,
distinguimos aquí dos grupos de señales perfectamente diferenciadas:
- Buses de datos, comunes para el modo simétrico y asimétrico.
- Buses de control formado por las señales RXF#, TXE#, WR#, RD#, OE# y
CLK. Las dos últimas señales únicamente son necesarias si estamos
utilizando el modo síncrono.
• Interfaz de programación, formado como hemos explicado anteriormente por
las señales definidas en el estándar IEEE 1149.1, TDO, TDI, TMS y TCK.
17
Figura 9: Esquemático del dispositivo FT2232H Mini Module
Para concluir con el tema de la alimentación, únicamente hacer una última aclaración
sobre lo presentado en este capítulo. Las dos opciones que nos da el fabricante para
alimentar el dispositivo no son las únicas y en la fase de diseño veremos alguna más
y razonaremos cuál de todas ellas es por la que vamos a optar.
En este trabajo, uno de los objetivos descritos anteriormente en esta memoria era el
diseño de una tarjeta que albergase varios dispositivos, entre ellos este módulo, por
lo que será de gran utilidad tener un plano de fabricación del dispositivo que estamos
tratando, porque más tarde en la fase de diseño necesitaremos saber y tener en
cuenta las dimensiones del módulo.
Aquí vemos un plano de planta del FT2232H Mini Module y un alzado donde vemos
su espesor.
18
Figura 10: Plano planta fabricación FT2232H Mini Module
Todas las dimensiones de los planos están expresadas en milímetros. Los dos
conectores CN2 y CN3 están montados en la parte de debajo de la placa base. El
espesor total de la pieza es de 8.5 mm y todos los pines están en una cuadrícula de
decima de pulgada.
19
2.3 TE0630 (SPARTAN-6)
La TE0630 de Trenz Electronics es un mini módulo de FPGA destinada al uso industrial
que se compone principalmente por la FPGA, del fabricante Xilinix, Spartan-6, un
puerto mini USB 2.0 una SDRAM DDR3 de 1Gbit y 8Mbyte de memoria flash para
configuración y operación. Además, cuenta también con una fuente de alimentación
para todos los conectores de la placa.
Tiene un número considerable de entradas/salidas configurables de alta velocidad.
Todos los componentes de este mini módulo tienen un rango de temperaturas de
operación de entre -40ºC y 85ºC, aunque este rango está sujeto a variaciones en
función del diseño donde vaya montado este dispositivo.
20
Figura 13: TE0630 planta inferior
21
Todas las dimensiones del anterior plano están en milímetros.
[Link] Alimentación.
El módulo puede ser alimentado a través de conector B2B J5 o a través del conector
del USB. En caso de que los dos modos de alimentación estén disponibles, el conector
B2B tiene preferencia sobre la alimentación del USB, deshabilitándola
automáticamente.
A continuación, describiremos la alimentación de los distintos conectores que
encontramos en el módulo.
22
En este caso otros componentes, como pueden ser extensiones de una
carrier board, serán alimentados con los 5V del conector B2B.
• Conexiones de alimentación en la placa: Tres reguladores de tensión ubicados
en la placa son los que proveen de alimentación a las conexiones que
necesitan los componentes del módulo.
Vemos un diagrama de la alimentación de la placa.
23
• Simples
• Pares diferenciales en las que cada par es configurable como 2
entradas/salidas simples.
• Pares diferenciales, los cuales pueden ser usados como señales de reloj
entrantes, cada par puede ser configurable como 2 entradas/salidas simples.
En la tabla siguiente podemos ver las entradas/salidas disponibles para los conectores
J4 y J5.
El módulo tiene dos conectores board to board, que son los conectores J4 y J5 para
un total de 160 pines. En la siguiente imagen podemos ver cómo son físicamente los
conectores.
24
Figura 19: Conector JTAG
25
2.4.1 Especificaciones técnicas
Todas las señales disponibles en los conectores J1, J2, J3, J4 están en una cuadrícula
de 2.54mm que equivale a décima de pulgada. Tenemos 42 pares diferenciales para
las señales de alta velocidad y 26 señales simples para las señales de media o baja
velocidad.
Alimentación a través de Jack DC o bus USB.
Además de esto, tenemos varios conectores compatibles con JTAG, como son el J9,
J10 y J11.
Como hemos hablado de varios conectores, será mejor ver el plano de ensamblaje
para hacer una mejor idea de la situación de estos.
26
[Link] Bancos de entrada/salida
La carrier board tiene un total de 26 señales simples, conectadas a los bancos J1, J2,
J3 y J4. Estas conexiones pueden ser utilizadas para bajas o medias velocidades.
También cuenta con 42 pares de señales diferenciales que están conectadas con una
impedancia de 100 ohm a los conectores del J1 al J4. Estas conexiones están
reservadas para señales de alta velocidad.
Por último, el conector j11, este se ha añadido para facilitar el uso de la herramienta
de Trenz Electronic, un programador de JTAG que en este trabajo no utilizaremos.
27
Tabla 13: Pinout conector J1
Más tarde explicaremos por qué razón hemos elegido el conector J1 para hacer
nuestras conexiones, es por esto por lo que solo se mostrará el pinout de este
conector.
Si queremos ver el pinout de los demás conectores del dispositivo deberemos visitar
la datasheet del fabricante.
Por último, veremos una imagen del esquemático del conector J1 para hacernos una
mejor idea de como están distribuidas las señales.
28
2.5 Herramientas software utilizadas.
El software utilizado en este trabajo ha sido el OrCad Cadence 16.6. Orcad es un
software propietario utilizado para automatización de diseño electrónico. El software
es usado por técnicos e ingenieros de diseño, fundamentalmente para simulación
electrónica, crear esquemas electrónicos y elaborar esquemas de circuito impreso
para manufacturar placas de circuito impreso.
Dentro de este programa hay una gran cantidad de aplicaciones para distintas
funcionalidades pero que están todas conectadas entre sí.
Durante el trascurso de este proyecto se han utilizado sobre todo dos de estos
pequeños programas que están dentro del software.
A estos dos programas del entorno OrCad podríamos añadirle alguno más como
PSpice que es usado para ver simulaciones eléctricas de los circuitos creados en
Capture, o Padstack Editor con el que podemos editar y crear todo tipo de pines.
Una herramienta muy potente y con múltiples posibilidades, pero a su vez poco
intuitiva y difícil de comprender para alguien que se esté iniciando en el diseño de
PCB.
29
30
3. Planteamiento del diseño
• Diseño
• Económicos
• Robustez del dispositivo fabricado
• Alimentación
31
• Para empezar, debemos tener en cuenta los conectores que tienen los dos
dispositivos con los que vamos a trabajar, por lo tanto, debemos hacer un
estudio del pinout de ambos. Por un lado, tenemos el mini módulo del
controlador de USB, en este caso el trabajo es algo más sencillo debido a que
están claras las señales que vamos a usar, pero por el lado de la FPGA tenemos
que ver las señales libres que tenemos y elegir el conector adecuado al que
conectarlas.
• El segundo paso será elegir exactamente las conexiones, teniendo en cuenta
ya un posterior diseño en PCB, lo que implica situación de los conectores y
que no haya cruces de señales en la medida que sea posible.
• Una vez tengamos claras las conexiones que tenemos que realizar, nos iremos
a la herramienta de software OrCad en el entorno de trabajo Capture CIS y
continuaremos haciendo los esquemas de los conectores que vamos a poner
en nuestro diseño.
• Por último, presentaremos los resultados de los esquemas en un formato
adecuado para simplificar el trabajo del diseño de la placa posteriormente en
la herramienta de OrCad PCB Editor.
32
Vamos a hacer un recuento de las señales que tenemos en este dispositivo
distinguiéndolas entre alimentación, comunicación de datos, configuración y de
control.
- Señales de control: Son en total 6 señales de control, RXF, TXE, WR_N, RD_N,
OE_N y CLK. Aunque ya explicamos a que se dedicaba cada una de estas señales
cuando describíamos el controlador de USB, podemos recordar que RXF, TXE,
WR_N y RD_N las usábamos en la lectura y escrituro en el modo de
funcionamiento 245 FIFO, mientras que CLK es el reloj propio del core del
controlador de USB.
- Por último, nos queda la alimentación, este tema lo tratamos también cuando
describimos el mini módulo y las posibilidades que había de alimentarlo.
Explicaremos más adelante la solución implementada para la alimentación del
dispositivo y de la placa en general, de momento vamos a hacer un recuento de
las señales de alimentación que tienen los conectores y que significado tiene cada
una.
Tenemos para empezar VBUS, que son los 5V que provienen del bus del USB y es
una señal de salida. VCC es una señal de entrada de 5V también. V3V3 son señales
de salida de 3.3V, mientras que VIO son las señales de 3.3v de entrada que
alimentan las entradas/salidas del conector.
33
Figura 25: Distribución conectores TE0303
Vamos a seguir el mismo procedimiento que con el anterior dispositivo para ello
vamos a ver el pinout de cada uno de los cuatro conectores que luego están
conectados con la FPGA.
34
Figura 26: Esquemático J1
Empezaremos primero por el conector J1, vamos a hacer un recuento de las señales
que tiene. En las señales 1, 2 ,3 y 4 vemos un Vb2b que son 5V de salida que pueden
servir para alimentar algún otro dispositivo. Vemos en el pin 6 una señal llamada /MR
y en el 8 una señal de /RESET, son ambas señales para resetear la FPGA. Los pines 11,
12, 19, 20, 27 y 28 están conectados a tierra, mientras que el resto son pines libres, a
lo cuales podemos llevar señales del mini módulo.
En definitiva, en este conector tenemos:
El conector J3 tiene un aspecto similar con algún que otro matiz. Tenemos 10 señales
conectadas a tierra que no podremos utilizar para nuestro diseño. El resto en principio
son señales libres que podremos utilizar sin problema, a excepción de los pines 1, 7 y
8 que están destinados a funciones para controlar la frecuencia de reloj de la FPGA.
Por lo tanto, tendríamos:
35
• 10 pines conectados a tierra.
• 2 pines destinados a gestiones del reloj de la FPGA.
• 27 pines libres a los que podremos llevar señales.
Una vez analizados estos dos conectores pasaremos a analizar los otros dos restantes.
Son similares a estos, pero se encuentran en el extremo opuesto de la tarjeta. Para
ello vamos a ver una imagen del pinout de estos dos conectores.
36
• 26 entradas/salidas con pines libres.
Nos queda únicamente un conector de los 4 principales por analizar. En este conector
J4 encontramos de nuevo 4 pines con señales relacionadas con el reloj de la FPGA.
También tenemos 10 pines conectados a tierra, que ya no podremos utilizar. El resto
son pines libres a los que tenemos acceso.
En resumen:
Una vez hemos analizado los 4 conectores a los que llevaremos las señales de
comunicación de datos y de control, hemos visto que en estos 4 conectores no
tenemos ningún pin dedicado al interfaz JTAG. Como hemos comentado
anteriormente en la descripción de la carrier board tiene unos conectores destinados
a JTAG que vamos a describir a continuación.
Los conectores que vamos a ver son el J9, J10 y J11.
37
Figura 29: Pinout conector J10
Tiene únicamente una fila de 6 pines, el pin 6 debe estar conectado a 3.3V, el pin 5 a
tierra y los demás son los habituales del interfaz JTAG.
Ya hemos visto la distribución de pines de todos los dispositivos que tenemos que
conectar. La situación es la siguiente, tenemos en el FT2232H Mini Module una serie
de señales que debemos llevar a la TE0303, a parte debemos resolver el problema de
cómo alimentar nuestra placa.
Esto es lo que haremos en el siguiente apartado donde elegiremos las conexiones que
habrá posteriormente en nuestro diseño y justificaremos cada una de ellas.
38
3.4.1 Conectores de nuestra tarjeta.
Para aclarar un poco el diseño de nuestra placa, aunque entraremos posteriormente
más en detalle, como necesitamos crear una tarjeta para conectar el mini módulo con
la carrier board de la FPGA, tendremos un conector de 2 x 20 del estilo de los
conectores J1, J2, J3 y J4, luego especificaremos a cuál va conectado. Además,
incorporaremos dos conectores de 2 x 13 como los del FT2232H Mini Module, donde
irá conectado, y un conector JTAG de 1 x 6.
• Conectar los pines VBUS a VCC (en el conector CN3, pin1 a pin3 del CN3). De
esta manera utilizaremos la tensión proporcionada por el bus USB para
alimentar el regulador interno del módulo.
• Conectar los pines V3V3 A VIO (pines 1, 3 y 5 del conector CN2 a los pines 11
y 21 del mismo conector y pines 12 y 22 del conector CN3 para proporcionar
alimentación a los bancos de entrada/salida.
Esto sería una alimentación del USB simple. En este proyecto le hemos intentado dar
una vuelta a esta alimentación, o al menos hemos encontrado una variante a esta
forma de alimentación y en vez de tener que quedarnos con una de las dos, hemos
intentado incorporar las dos a nuestro diseño aportándonos versatilidad y robustez,
que es lo que se intenta en un prototipo como este, en caso de que alguna de las dos
falle.
Debemos ahora explicar cómo hemos tratado esta cuestión de elegir entre dos tipos
de alimentación. Para saber cómo encajar ambas alimentaciones debemos
preguntarnos como integrar los 5V que vienen de la TE0303 en el formato de
alimentación que tenemos a través del USB. En la alimentación a través del USB
39
conectamos el pin VBUS que es el que tiene los 5V al pin VCC, las demás conexiones
que hemos hecho después es para alimentar al resto de los pines. Por lo tanto, es ahí
donde está la cuestión para incorporar los 5V provenientes de la otra tarjeta.
J5
VBUS 1
VCC 2
VB2B 3
Como vemos en el esquema, la única condición que le debemos poner es que el pin
VCC esté en el centro, para que podamos seleccionarlo tanto con VBUS como con
Vb2b. El resto de las conexiones que comentamos para el modo de alimentación a
través del USB deben ser permanente, tanto cuando alimentamos con USB como
cuando alimentemos a través de la carrier board.
40
VB2B
J1
1 2
3 4 3V3V
5 6 CN2 CN3
7 8
9 10 1 2 VBUS 1 2
11 12 3 4 VCC 3 4
13 14 5 6 5 6
15 16 7 8 7 8
17 18 9 10 9 10
19 20 11 12 11 12
21 22 13 14 13 14
23 24 15 16 15 16
25 26 17 18 17 18
27 28 19 20 19 20
29 30 21 22 21 22
31 32 23 24 23 24
33 34 25 26 25 26
35 36
37 38
39 40
3V3V
J5
VBUS 1
VCC 2
VB2B 3
Esas 8 señales debemos llevarlas a los pines del conector J1. No podemos llevarlas a
cualquier pin, únicamente a los que dijimos anteriormente que estaban libres para
entradas/salidas.
41
Vamos a ver también en un esquema para saber cómo quedan ubicados dichos pines.
En el esquema únicamente se representan aquellos pines libres para entradas y
salidas, los que no son para ello están representados con una x, pero pueden ser
utilizados para otras señales de otro tipo, como alimentación.
J1
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
De esos pines debemos elegir 8 a donde deben llegar las 8 señales de datos. Para ello
debemos tener en cuenta la orientación que va a tener el conector J1 en la PCB. Como
el conector J1 está girado 180º, con respecto al del anterior esquema, en la carrier
board, así pondremos nosotros también nuestro conector J1 para que coincida
físicamente con el de la tarjeta que contiene la FPGA.
42
Esta sería la distribución elegida, teniendo en cuenta las señales que deberemos
mandar más tarde, como son las de control y las alimentaciones que antes hemos
tratado ya.
En esta imagen el conector J1 ya está correctamente orientado, por si quedaba alguna
duda de cómo sería su posición final.
CN3
1 2
3 4
5 6
7 8
9 10
11 12
13 14
15 16
17 18
19 20
21 22
TMS 23 24 TDO
TDI 25 26 TCK
Estas señales tenemos que llevarlas a la carrier board, igual que hicimos con las de
control. No podemos llevarlas al conector J1 porque no son señales de entrada/salida,
sino que se tienen que conectar a unos pines determinados que también estén
destinados a configuración JTAG.
Los conectores de la carrier board que contienen estos pines configurados para JTAG
son el J9, J10 y J11. El problema que se nos presenta es que tienen una posición muy
complicada para acceder a ellos a través de nuestra placa, por lo que la solución que
hemos llevado a cabo es la siguiente.
En vez de llevar los pines del JTAG a los conectores de la carrier board, incorporaremos
en nuestra placa un conector 1 x 6 destinado al JTAG y llevaremos las señales a este
conector. Más tarde, cuando el montaje esté completo llevaremos las señales hasta
la FPGA mediante un conector con cable.
El conector que vamos a poner en nuestra PCB es similar al J10, un diseño sencillo. En
la siguiente imagen podemos ver mejor como quedaría el conector.
43
J4
TMS 1
TDI 2
TDO 3
TCK 4
5
6
GND
Figura 37: Conector 1 x 6 destinado a JTAG
Esos cuatro pines de JTAG, TMS, TDI, TDO y TCK irán conectados a los 4 del conector
CN3.
44
CN2
1 2
3 4
5 6
7 8 RESET#
9 10
11 12
13 14
15 16
TXE 17 18 RXF
WR_N 19 20 RD_N
21 22
OE_N 23 24 CLK
25 26
Hemos seguido el mismo proceso para llevar estas señales a la carrier board que con
las señales de datos, a través de varios croquis a mano alzada teniendo en cuenta
todas las señales que tenemos que llevar e intentando que no se cruzasen. El
resultado en el conector J1 es el siguiente. Solamente hemos presentado como ha
quedado el conector con las señales de control conectadas, no se muestran el resto
de las señales.
Al igual que en las señales de datos hemos presentado el resultado con el conector J1
en la orientación que va a tener finalmente en la PCB.
Como podemos observar, la señal de reset se llama de diferente forma en un conector
que, en el otro, esto es debido a que hay algunas conexiones entre medias de los dos
pines. Vamos a explicar a continuación esta señal.
La señal reset es activa a nivel bajo, entonces, para que no haya problemas de
conflicto, haremos un pull-up para mantener esta señal a 1. Esto evita que se hagan
lecturas erróneas. El pull-up se hace a través de una resistencia y una fuente de
tensión, en este caso a 3.3V y la resistencia tiene un valor de 10kohm.
45
A mayores del pull-up le hemos añadido un jumper de dos pines con uno de ellos
conectado a tierra por si queremos no utilizar esta señal, en un primer momento
íbamos a poner un interruptor para la señal, pero al ser un prototipo pensamos que
con esta solución temporal sería suficiente. Vamos a ver a continuación un esquema
de cómo queda la conexión del pull-up y del jumper de 3 pines.
J6
R3 RST# 1
3V3V 2
3
10k
RESET#
J8
1
2
GND
Figura 40: Esquema conexión RESET#
46
Figura 41: Esquema señal /MR conectores J1 y CN2
Como vemos en esta imagen, ocurre igual que con la señal de reset en el anterior
apartado, como la señal /MR es activa a nivel bajo debemos mantener la señal a 1 con
un pull-up para no tener problemas. Podemos ver en la siguiente las conexiones que
existen entre ambos pines de esta señal. Lo mismo nos ocurre con las señales de
control RD_N y WR_N y lo que hemos decidido es conectar 3 resistencias de 10k
ohmios como indica la figura inferior.
J7
1
2
/MR M_RST
R1
3V3V
10k
R3
RD_N 3V3V
10k
R4
WR_N 3V3V
10k
Figura 42: Esquema pull-up señales control
Para las otras dos señales de control que son de salida, hemos creído conveniente
conectarlas también a un pull-up debido que son activas a nivel bajo. En este caso
las resistencias que hemos elegido son de 150 ohmios.
R5
/TXE TXE
150
R6
/RXF RXF
150
47
Con esto hemos concluido la presentación de señales de control tanto de la carrier
board al controlador de USB como en sentido contrario.
CN2 CN3
1 2 1 2
3 4 3 4
5 6 5 6
7 8 7 8
9 10 9 10
11 12 11 12
13 14 13 14
15 16 15 16
17 18 17 18
19 20 19 20
21 22 21 22
23 24 23 24
25 26 25 26
GND GND
Figura 44: Esquema pines conectados a tierra en CN2 y CN3
J4
1
2
3
4
5
6
GND
Figura 45: Esquema pines conectados a tierra en JTAG
48
3.5 Presentación esquemas en OrCad Capture CIS.
Vamos a presentar los resultados respetando el orden que hemos seguido hasta
ahora. Por lo tanto, lo dividiremos en: alimentación, datos, configuración, control y
un plano general.
J1
1 2
3 4 3V3V
5 6 CN2 CN3
7 8
9 10 1 2 VBUS 1 2
11 12 3 4 VCC 3 4
13 14 5 6 5 6
15 16 7 8 7 8
17 18 9 10 9 10
19 20 11 12 11 12
21 22 13 14 13 14
23 24 15 16 15 16
25 26 17 18 17 18
27 28 19 20 19 20
29 30 21 22 21 22
31 32 23 24 23 24
33 34 25 26 25 26
35 36
37 38
39 40
3V3V
J5
VBUS 1
VCC 2
VB2B 3
49
3.5.3 Esquema configuración. JTAG.
CN3
1 2
3 4
J4 5 6
7 8
TMS 1 9 10
TDI 2 11 12
TDO 3 13 14
TCK 4 15 16
5 17 18
6 19 20
21 22
TMS 23 24 TDO
TDI 25 26 TCK
GND
Figura 48: Esquema general configuración. JTAG
J11
40 39 RST#
38 37
36 35
34 33 CN4
32 31
30 29 1 2
28 27 3 4
26 25 5 6
24 23 7 8 RESET#
22 21 9 10
20 19 11 12
18 17 13 14
TXE 16 15 RXF 15 16
WR_N 14 13 RD_N TXE 17 18 RXF
12 11 WR_N 19 20 RD_N
OE_N 10 9 CLK 21 22
8 7 OE_N 23 24 CLK
6 5 25 26
4 3
2 1
J12
R4 RST# 1
3V3V 2
3
10k
RESET#
J14
J13
1
1 2
2
/MR M_RST
GND
R3
3V3V
10k
50
3.5.5 Esquema general
J1
40 39 RST#
38 37
36 35 3V3V
34 33 CN2 CN3
32 31 AD0
30 29 D1 1 2 VBUS 1 2
28 27 3 4 VCC 3 4
26 25 5 6 5 6
D2 24 23 D3 AD0 7 8 RESET# 7 8
D5 22 21 D4 D2 9 10 D1 9 10
20 19 11 12 D3 11 12
D7 18 17 D6 D5 13 14 D4 13 14
TXE 16 15 RXF D7 15 16 D6 15 16
WR_N 14 13 RD_N TXE 17 18 RXF 17 18
12 11 WR_N 19 20 RD_N 19 20
OE_N 10 9 CLK 21 22 21 22
8 7 OE_N 23 24 CLK TMS 23 24 TDO
/MR 6 5 25 26 M_RST TDI 25 26 TCK
4 3
2 1
3V3V
VB2B J6
GND
/MR M_RST
GND
R1
3V3V
10k
51
52
4. Diseño de la tarjeta
Una vez hemos hecho una introducción con los pasos que hemos seguido,
comenzaremos a trabajar en el diseño.
53
• Dos jumpers de 2 pines, J7 y J8.
• Dos resistencias de 10k llamadas R1 y R2.
4.3.1 Conector J1
Acabamos de comentar que el conector J1 tiene dos tiras de pines de 20 cada una,
por lo tanto, es un conector de 2x20. Para su diseño debemos tener en cuenta el
conector que le vamos a colocar encima, debido a que debemos respetar el espacio
que vaya a ocupar dicho conector y por supuesto tendremos que dimensionar los
agujeros de nuestra placa para que quepan las patillas del conector.
En la tarjeta que vamos a usar necesitaremos conectores macho, por lo que hemos
buscado en el fabricante Trenz Electronics algún componente que nos pueda servir.
Un conector como el de la figura superior nos viene bien para nuestro diseño. Para el
conector J1 deberíamos poner dos como estos en paralelo.
A la hora de crear nuestro footprint, como hemos comentado antes, nos hace falta
saber el tamaño del conector tanto de ancho como de largo y el diámetro de las
patillas.
El conector de largo mide 5.2 cm y de ancho alrededor de 0.5 cm. Por lo que esos
datos tomaremos a la hora de crearlo. En cuanto a las patillas del conector son de 0.5
mm.
Esto nos afecta para dimensionar el agujero de los pines en los que ira conectado.
Como la patilla del conector es cuadrada debido a que esta torneada, su diagonal
haciendo el cálculo son 0.7071 milímetros, esto pasado a pulgadas serían 0.0278
pulgadas, lo que equivale a 28 milésimas de pulgada, que es la medida que tienen los
agujeros en el programa. Debemos dejar al menos 10 milésimas de pulgada de
54
tolerancia por lo que cogeremos un agujero circular de 35 mils de diámetro. Esto nos
valdrá para todos los pines ya que los conectores que usaremos serán los mismos.
Para elegir el pad, tomaremos 20 mil más de lo que hemos tomado como diámetro
del agujero, por lo tanto, nos iremos mínimo a 55, y el siguiente que encontramos es
60 por lo que elegiremos este. Pad60cir35d será nuestra elección para todo el trabajo.
Con las consideraciones que hemos hecho anteriormente el footprint del elemento
quedaría de la siguiente manera.
Englobamos a estos dos conectores en este apartado debido a que son idénticos. La
única diferencia reseñable respecto del anterior conector es que este tiene dos tiras
de pines de 13 cada una. El conector que usaremos en este caso será el mismo, pero
55
con 7 pines menos por fila, por tanto, el agujero y el pad elegidos en el anterior caso,
nos valdrá también para este.
En este caso el footprint del elemento nos quedaría de la siguiente manera.
4.3.3 Conector J4
Este conector es el dedicado al interfaz de configuración JTAG y tiene una
composición de una única fila con 6 pines. Ya hemos descrito en otros capítulos las
señales incorporadas en este conector. Como hemos dicho en los demás casos
usaremos un conector similar por lo que los pines elegidos serán los mismos, tanto el
agujero como el pad.
El footprint del conector quedaría de la siguiente manera.
56
Figura 55: Footprint conector J4
57
Tabla 14: Dimensiones resistencia
En función de la tabla anterior hemos elegido dejar una distancia entre pines de 4 décimas
de pulgada. El footprint del elemento nos quedaría de la siguiente manera.
4.3.5 Jumpers
En el apartado de jumpers necesitamos de dos tipos, dos de 3 pines y otros dos de 2
pines. Han sido creados de la misma forma y tienen la misma distancia entre pines
que los demás elementos, décima de pulgada. Los jumpers los trataremos como si
fuesen un conector de dos o tres pines.
58
Figura 58: Footprint Jumper 1x3
Ahora que hemos creado todos los footprints de los elementos, el siguiente paso será
asignar los footprints a los componentes en el esquema, para más tarde tenerlos
asociados en PCB Editor.
59
Figura 60: Dimensiones resistencia 150 ohmios
En este caso hemos elegido una resistencia 0805. Las unidades están en milílimetros
(pulgadas).
60
componentes y pulsaremos el botón derecho del ratón para que se nos despliegue el
menú de opciones. Iremos a Edit Properties y allí veremos la siguiente ventana.
Para ello debemos abrir PCB y crear una nueva board. Vamos a elegir una PCB
rectangular, de dimensiones 6mm de alto por 5mm de ancho, estas medidas, que
pudiesen parecer un tanto aleatorias, son el resultado de un proceso de optimización
del espacio en la tarjeta. Comenzamos con tamaños mucho mayores hasta que hemos
conseguido reducirla hasta estas dimensiones.
La tarjeta que vamos a fabricar tendrá dos capas y ambas serán tanto de alimentación
como de señales, esto lo hemos creído oportuno debido a que la densidad de señales
no es muy grande como para hacer más capas intermedias, pero tampoco podemos
hacerlo todo en una parte debido a que habría demasiados cruces de señales, por lo
que hemos decidido que esta sería la mejor opción.
Otra de las opciones que deberíamos tener en cuenta a la hora de crear la tarjeta será
la rejilla que usemos para el diseño, en nuestro caso, hemos elegido rejilla cuadrada
de 1 décima de pulgada de espacio, debido a que todos los espacios entre pines son
de esa dimensión.
Una vez hayamos creado la tarjeta nos quedaría algo similar a lo de la siguiente
imagen, como podemos ver las líneas exteriores son el contorno de la placa.
61
Figura 63: Contorno tarjeta en PCB Editor
Al abrirse la ventana para elegir las posibilidades que tenemos al importar los
archivos, lo que debemos tener en cuenta es importarlas a la tarjeta que hemos
creado anteriormente.
62
Figura 65: Create a Netlist
Tanto el apartado Input Board File como en Output Board File debemos rellenarlo con
el archivo donde anteriormente guardamos nuestro diseño de tarjeta.
Cuando le demos a Aceptar el programa nos abrirá el PCB Editor y una vez en el
comenzaremos a orientar y colocar los elementos de acuerdo con nuestros
requerimientos.
En la imagen siguiente vamos a ver la disposición que hemos elegido nosotros y en
base a qué condicionantes o restricciones lo hemos tenido que hacer.
63
Figura 66: Disposición componentes PCB
64
El resto de los elementos se han orientado y posicionado de acuerdo con que las
señales no se cruzasen más tarde cuando pasemos a conectarlas. Los conectores CN2
y CN3 están orientados verticalmente ya que así ahorramos algo de espacio, puesto
que la distancia vertical de la placa de 6cm es inevitable ya que está condicionada por
el largo del conector J1, pero el ancho si que podíamos reducirlo si lo colocábamos de
esta manera.
Como hemos dicho antes con el tamaño de la tarjeta, que los componentes se
encuentren distribuidos de esta manera, es el resultado de un proceso de prueba y
error en el que hemos tenido que empezar de cero varias veces.
Para que nos hagamos una mejor idea vamos a ver una imagen de como quedarían
ya conectadas ambas capas.
65
Figura 67: Routing capa inferior
Como podemos ver, las señales con mayor grosor son las de alimentación, debido a
que por ellas pasa mayor intensidad de corriente. Hemos decidido hacer un diseño en
el que las señales del CN2 que van hacia el J1 pasen a través del espacio entre sus
pines para reducir el ancho de la tarjeta y así reducir también su coste.
Podemos dividir las señales en 3, las de la parte izquierda son las señales de
comunicación de datos, las del centro las de alimentación y las del flanco derecho son
las señales del interfaz JTAG.
Como podemos ver este diseño cumple con los requisitos que anteriormente
habíamos mencionado.
Ahora vamos a pasar a ver la capa superior, que hemos dicho que estaba compuesta
por el plano de tierra y las señales de alimentación de 3.3V. En ambas imágenes
vemos también el contorno de la tarjeta para que nos podamos hacer una idea de
cómo están aprovechados los extremos.
66
Figura 68: Routing capa superior
El plano de tierra debía pasar por aquellos pines que tienen que estar conectados a
tierra. Se elige un plano como solución para la tierra debido a que es lo que menos
impedancia tiene. El resto de las señales que vemos son gruesas debido a que son las
de la alimentación de 3.3V.
67
4.8 Fabricación
La tarjeta la hemos fabricado en el laboratorio de la escuela. Es por ello, que debido
a la tecnología que existe actualmente hemos tenido que hacer algunas correcciones
a nuestro diseño inicial, para adecuarnos al procedimiento que se usa para la
fabricación.
Algunas de las correcciones han sido:
• El plano de tierra debe únicamente pasar por aquellos puntos que estén
conectados a tierra. Inicialmente el plano que diseñamos ocupaba todo el
espacio de la tarjeta a excepción del que ocupa la alimentación de 3.3V, pero
para fabricarla hay complicaciones en los pines no conectados a tierra y que
están dentro del plano.
• Las señales tienen cuellos en los estrechamientos de otros pines. Antes, todas
las señales a excepción de las de alimentación eran del grosor de los
estrechamientos, pero facilita las cosas hacer las señales más gruesas donde
sea posible.
• El espacio entre el pad de los pines y el plano de tierra debía ser apreciable a
simple vista en los planos de fabricación.
• En un principio la alimentación de 3.3V de la cara superior también iba a ser
mediante un plano, pero los dos planos quedarían demasiado cerca, lo que
complicaría enormemente la fabricación.
68
Figura 70: Plano fabricación capa inferior
69
Figura 71: Plano fabricación capa superior
Como vemos, el plano de la cara superior es una imagen reflejada del plano real. Esto
es para que en el proceso de fabricación ambas capas coincidan.
70
5. Interfaz de programación
71
Para la implementación de esta arquitectura necesitamos:
• Un interfaz serie formado por los cuatro pines habituales del interfaz JTAG,
pudiendo añadirle un quinto en ciertas circunstancias.
- TCK: Señal del reloj utilizada por el bus, esta señal de reloj deberá ser
independiente del resto de los relojes del integrado y es a través de la
cual se manejan los datos de entrada y salida.
- TMS: Tes Mode Select, es una entrada del sistema cuyo valor,
dependiendo de si es 0 o 1, nos permitirá movernos a través de la
máquina de estados del TAP.
- TDI: Test Data In, entrada de datos al sistema.
- TDO: Test Data Out, salida de datos del sistema.
- TCR: Test Command Reset, pin de entrada opcional que permite resetear
la máquina de estados del TAP.
72
Figura 73: Arquitectura BST para fabricante Xilinx
73
interno de manera que se encuentre manteniendo el valor 1 en caso de que
no esté siendo manejada por ningún dispositivo.
• TCK: Es la entrada de reloj para el controlador del TAP y el circuito del BST.
74
Como podemos observar en esta máquina existen dos secuencias de operaciones
paralelas que se pueden realizar sobre un registro de datos o sobre el de
instrucciones, DR o IR respectivamente. Podemos distinguir en cada una de esas
secuencias tres operaciones: CAPTURE, SHIFT y UPDATE.
A continuación, vamos a explicar una a una las operaciones que nos encontramos en
la máquina de estados del TAP.
75
Ejecutar una instrucción es conectar los puertos TDI y TDO a un registro de
instrucciones. Para actuar sobre este registro navegaremos por el controlador del TAP
para realizar las operaciones que deseemos.
[Link] SAMPLE/PRELOAD
Esta instrucción tiene dos opciones, SAMPLE o PRELOAD. Mientras la ejecución de la
instrucción se conectará el registro a las señales TDI y TDO.
Por un lado, SAMPLE carga una imagen del estado actual del sistema en el registro del
BST. Las celdas del BST captura el valor de las entradas de todos sus pines y los valores
de las salidas del dispositivo. Esto ocurrirá mientras estemos en el estado CAPTURE-
DR y más tarde en el estado SHIFT-DR serán desplazados en cada señal de reloj bit a
bit.
PRELOAD, sin embargo, coge el valor cargado dentro del BS registro desplazándolo a
través de la salida paralelo.
76
[Link] EXTEST
Permite muestrear los valores de los pines de entrada, pero a diferencia de las
anteriores, fuerza los valores de las salidas de manera simultánea. Durante la
ejecución de esta instrucción el registro de BST está conectado entre TDI y TDO. Los
valores de las entradas los capturaremos en el estado [Link], la instrucción se
transmitirá bit a bit durante el estado SHIFT-DR del TAP para forzar las salidas cuando
estemos en el estado UPDATE-DR.
[Link] BYPASS
Solemos utilizar esta instrucción para atravesar diferentes dispositivos de una misma
cadena de manera rápida y sin que, si hacemos pruebas sobre un elemento de esa
cadena, afecten al resto de dispositivos.
En esta instrucción se conecta la entrada TDI y TDO a un registro bypass.
77
[Link] Otras instrucciones para FPGA´s Xilinx.
78
• JPROGRAM: La ejecución de esta instrucción tendrá el efecto equivalente a la
activación de la entrada PROGRAM del dispositivo.
• JSTART: Permite iniciar la secuencia de arranque cuando el reloj seleccionado
es TCK.
• JSHUTDOWN: Activa la secuencia de apagado del dispositivo.
79
Figura 76: Registro Boundary Scan
80
Cada una de las celdas tiene cuatro puertos, entrada serie SI, salida serie SO, entrada
paralelo PI y salida paralelo PO. Los puertos SI y SO de cada una de las celdas estarán
conectadas en serie a las demás del BTS.
Dicha cadena empieza en el pin TDI y recorrerá todos los pines del dispositivo hasta
terminar en el pin de salida TDO, recorriendo los datos de test de la cadena en su
desplazamiento.
Los puertos PI y PO de cada una de las celdas están conectados a la lógica interna de
los buffers de entrada/salida. Cada operación de tipo Boundary Scan afecta a cada pin
de entrada/salida de forma independiente.
Todos los pines por defecto se encuentran configurados como bidireccionales con
control triestado. Después de su configuración pasarán a ser entradas/salidas o
triestado dependiendo del valor cargado. De todos modos, los tres bits del registro
estarán disponibles para todos los pines.
En el caso de encontrarse seleccionado este registro y acceder a él mediante el
controlador del TAP, se cargará el valor del registro. El orden de transmisión de los
bits para este registro será el siguiente: primero el correspondiente a la entrada,
seguido de la salida y finalmente el valor de control del buffer triestado.
La secuencia de bits de un dispositivo se puede obtener del fichero bsdl. Esta
secuencia mantendrá siempre el mismo orden y el número de bits a transmitir será
independiente del diseño.
5.4.1 Introducción
Las FPGA’s del fabricante Xilinx deben ser configuradas mediante la descarga de un
fichero de programación denominado bitstream, que se encuentra almacenado en la
memoria interna. Las FPGA’s pueden descargar el fichero de una memoria externa o
utilizando un dispositivo intermedio, como es nuestro caso, con el controlador de
81
USB. Podemos diferenciar dos formas de configuración, bus serie o paralelo. El bus
serie lo utilizamos para minimizar el número de pines que debemos usar en el proceso
de configuración, mientras que el bus paralelo tiene un ancho de datos de 8 o 16 y
aumenta la velocidad de configuración y se adapta mejor a los estándares.
Como también ocurre con los procesadores, las FPGA’s de Xilinx podemos
reprogramarlas las veces que sean necesarias.
El almacenamiento de estas FPGA’s utiliza la tecnología CMOS, esto implica que la
información se almacena de manera volátil y es eliminada en cada apagado. Por lo
que cada vez que encendamos la FPGA debemos recargar el fichero de configuración
que hemos nombrado anteriormente bitstream. Este proceso lo podemos ejecutar de
varias maneras. El modo en que carguemos el bitstream dependerá del valor de los
pines de configuración M [0:1] en el arranque según la siguiente tabla. Estos pines de
configuración deben estar conectado a VCCO_2 del dispositivo o a tierra mediante
pull up o pull down, cuyo valor encontramos en el manual de la Spartan-6.
Los términos que vemos en la tabla anterior de maestro y esclavo hacen alusión a la
dirección de configuración del reloj encargado de la operación. En este caso está
configurada la FPGA como maestro y sería ella la encargada de generar el reloj CCLK.
El valor de la frecuencia de configuración se determina como una opción en la
herramienta que genera el bitstream.
El objetivo que perseguimos es utilizar el interfaz de configuración JTAG disponible en
la FPGA Spartan-6 del fabricante Xilinx para configurarla teniendo en cuenta el
dispositivo intermedio FT2232H. Es posible configurar un único dispositivo, que sería,
o varios dispositivos en cadena. Cada uno de los dispositivos debe ser configurado de
manera independiente, puenteando el resto.
Es necesario conocer el tamaño del registro de instrucciones de cada uno de los
dispositivos que tuviéramos en la cadena para determinar la secuencia de datos.
Podemos encontrar esta información en los archivos BDSL de cada uno de los
dispositivos y en las diferentes datasheets.
A continuación, veremos un esquema de como funcionaría varios dispositivos en
cadena con el interfaz de configuración JTAG. A esta configuración en cadena la
denominamos Daisy chain.
82
Figura 79: Esquema configuración en Daisy chain
83
[Link] Set up
El proceso de inicialización es parecido en todos los interfaces de configuración. La
Spartan-6 se encenderá desde el reset, debe iniciar su memoria de configuración
interna y determinar el interfaz de configuración mediante el muestreo de sus pines.
84
Figura 81: Timing del Power-on-Reset
85
Cuando el pin INIT_B deje de estar forzado a nivel alto, la Spartan-6 muestreará los
pines M [2.:0] y comenzará a generar la señal de reloj.
[Link].1 Sincronización
Una vez el dispositivo ha sido sincronizado, el identificador del dispositivo debe pasar
antes de que los datos de configuración sean cargados. Esto evita que sea cargado un
bitstream de otro dispositivo distinto al nuestro. El chequeo de la identidad del
dispositivo está dentro del código del bitstream, haciendo este proceso transparente
a la mayoría de los diseñadores. La comprobación de la identidad del dispositivo es a
86
través de comandos desde el bitstream hasta la lógica de configuración no a través
del registro JTAG IDCODE en este caso.
87
Una vez la palabra de sincronización ha sido cargada y se ha comprobado la identidad
del dispositivo, los frames de datos serán cargados. Este proceso es transparente para
la mayoría de los usuarios.
Mientras se cargan los frames de datos en la Spartan-6, esta irá calculando el código
de redundancia cíclica de los datos recibidos. Una vez que todos los frames de datos
hayan sido cargados y antes de la detección de la palabra de desincronización, el
fichero de configuración puede contener una instrucción de comprobación del código
CRC seguido por el código CRC esperado.
Una vez que el fichero de configuración haya sido carga debemos ordenar a la
Spartan-6 que comience la secuencia de Start-up.
La secuencia se realizará de manera síncrona con la fuente de reloj que se haya
configurado anteriormente en la creación del bitstream configurando la herramienta
BitGen como hemos descrito con anterioridad, pudiendo ser:
88
En nuestro caso, deberemos usar la señal de reloj TCK puesto que usaremos el interfaz
de configuración JTAG.
La siguiente tabla describe los comandos del controlador del TAP que se requieren
para configurar la Spartan-6.
89
Tabla 20: Comandos controlador del TAP Spartan-6
90
FT_GetDeviceInfoList, nos devuelve la información de cada uno de los dispositivos
que ha identificado previamente.
FT_Open, nos permite abrir el dispositivo a través del manejador que hemos
usado en la función previa.
2. Configurar el puerto para ser usado en modo MPSSE. Una vez hayamos abierto el
puerto debemos configurar algunos parámetros para poder usar las
comunicaciones:
- Resetear los periféricos llamando a la función FT_ResetDevice.
- Dimensionar el tamaño de los buffers de recepción y transmisión del USB.
FT_SetUSBParameters.
- Configurar la generación de eventos y definir los caracteres erróneos, para ellos
utilizaremos la función FT_SetChars.
- Configurar los timeouts de lectura y escritura.
- Configurar el tiempo que debemos esperar para enviar un paquete incompleto de
vuelta al periférico del host. Llamada a la función FT_SetLatencyTimer.
91
5.7 Solución implementada
Tras haber fabricado la anterior tarjeta que permite configuración y comunicación con
la Spartan-6, el segundo objetivo que perseguimos es conseguir configurar la FPGA.
Para este trabajo contamos con el código de una Spartan-3 por lo que debíamos
cambiar el código para conseguir configurar una Spartan-6.
En esta ocasión no tuvimos que desarrollar la lógica programable dentro de la FPGA
ya que pudimos utilizar la lógica de la que dispone la propia FPGA.
92
Int check_ftdi (DWORD] dwNumDevs, FT_HANDLE * ftHandle, int
devToOpen, bool verbose, FILE * report)
93
Figura 91: Conjunto de funciones controlador TAP
Las funciones anteriores son semejantes, todas tienen la misma estructura. En cada
flanco de subida deberemos forzar el pin de salida del TMS al valor lógico que
necesitemos para pasar de un estado a otro. Para hacernos una idea de cómo trabaja
alguna de estas funciones vamos a ver un ejemplo.
94
[Link] Identificación Daisy Chain
Durante esta etapa vamos a identificar cuantos dispositivos forman la cadena de
configuración. El modo Daisy Chain quiere decir que los dispositivos están conectados
en serie, esto se hace para únicamente establecer un puerto JTAG.
El sistema funciona de la siguiente manera, si queremos configurar cualquiera de los
equipos de la cadena, debemos poner los demás en modo bypass. Los pines TDI y TDO
son conectado a un registro de instrucciones de ancho de 1 bit, lo que introduce un
ciclo de retraso por cada dispositivo que este conectado a la cadena.
Cuando la cadena JTAG tiene más de un dispositivo no podemos movernos a través
del controlador del TAP, sino que debemos hacerlo de manera independiente para
cada uno.
95
Lo que hace la función es limpiar el buffer RX, leer los datos del buffer de entrada y
enviar ocho para determinar cuántos dispositivos se asignan a la cadena JTAG.
[Link] Acceso a registros básicos dentro del TAP del primer dispositivo de la cadena
JTAG
A continuación, vamos a ver las funciones a través de las que podemos acceder a los
registros de datos y la de registro de instrucciones.
96
Para entender lo que realiza la función vamos a hacer un pequeño resumen.
Lo primero será escribir comando con la función wjtag_command y navegamos hasta
el registro de datos. La función limpia los primeros bits que provienen de otros
dispositivos asignados a la cadena. Más tarde limpia el buffer de recepción y lee los
datos de entrada para seguir con el código de identificación. Se navega hasta
actualizar el estado de los registros de datos. Si es una solicitud de ID, Print ID CODE,
97
se realiza una comprobación, ya que la función puede ser reutilizada para leer otros
registros.
Con ella lo que hacemos es abrir el fichero en modo lectura binaria, recorrerlo
buscando los parámetros de la cabecera del fichero .bit, almacenamos el bitstream
en un buffer intermedio e imprimimos la cabecera por consola o fichero dependiendo
de los parámetros de la función.
98
int jtag:wdata (FT_HANDLE ftHandle, unsigned char *wdata, unsigned int
wdatalen, bool verbose, FILE*report)
99
100
6. Conclusiones
A la hora de valorar los objetivos que pusimos a principio del trabajo, lo hacemos
de manera positiva ya que se ha conseguido el diseño y fabricación de la tarjeta
de forma satisfactoria y posteriormente hemos comprobado, tanto el correcto
funcionamiento de la tarjeta como del código para la Spartan-6.
En cuanto a posibles líneas futuras de este trabajo hay un proyecto claro, que es
el de conseguir programar la comunicación de datos a través del controlador de
USB. Con ese objetivo cumplido, se acabaría por completo el funcionamiento que
se espera de la tarjeta que aquí hemos fabricado.
101
102
7. Bibliografía
RS Components ([Link]/web/p/resistencias-fijas-de-orificio-
pasante/0150928/)
RS Components ([Link]/web/p/resistencias-fijas-de-orificio-
pasante/0150928/)
103
104