UNIVERSIDAD NACIONAL DEL SUR DEPARTAMENTO DE INGENIERIA ELECTRICA Y DE COMPUTADORAS
Experiencias del diseño y puesta en marcha de un prototipo basado en FPGA
Diseño de Circuiros Lógicos de Alta Complejidad
AUTOR: Ing. Christian L. Galasso PROFESOR: Dr. Ricardo L. Cayssials
FECHA DE ENTREGA:
pg 1 de 20
pg 2 de 20
Índice de contenido
1 Introducción................................................................................................................................4 Parte 1: Premisas del diseño del hardware externo......................................................................5 2 Rango de temperatura del dispositivo.......................................................................................5 3 Capacidad lógica.........................................................................................................................5 4 Los puerto de E/S........................................................................................................................5 4.1 Capacidad de manejo de corriente Vs. SLEW RATE..........................................................5 4.2 Pines no utilizados...............................................................................................................7 5 La alimentación...........................................................................................................................7 5.1 Alimentación del núcleo......................................................................................................7 5.2 Alimentación de los puertos...............................................................................................8 6 La configuración de la FPGA......................................................................................................8 6.1 Los pines de modo y la configuración Internal Master SPI mode.....................................8 6.2 Otros pines asociados a la configuración...........................................................................9 6.3 El puerto JTAG.....................................................................................................................9 6.4 En resumen.........................................................................................................................9 7 El reloj del sistema...................................................................................................................10 Parte 2: Descripción del HW mediante VHDL.............................................................................11 8 Sobre el registro desplazamiento de salida.............................................................................11 9 Dominios de reloj y reset..........................................................................................................12 10 Condiciones de carrera..........................................................................................................16 11 Corrección del jitter del reloj serie entrante.........................................................................17 12 Bibliografía..............................................................................................................................20
pg 3 de 20
1
Introducción
A continuación se presenta un resumen de experiencias en el trabajo de re-ingeniería de una placa de comunicaciones perteneciente a una computadora naval que data del año 1980. En el mismo, se describen cuestiones prácticas de implementación que se conjugaron para lograr un prototipo 100% compatible y funcional. Luego de que se tuvo suficiente información de la placa para determinar que la misma podía remplazarse por otra cuya unidad central fuera una FPGA, se comenzó con la escritura del VHDL. Mientras se trabajaba en la definición del Kit sobre el cuál hacer el desarrollo se fue describiendo el hardware del mismo. El hecho de no tener decidido siquiera la empresa, introdujo la premisa de que el VHDL que se escribiera fuera completamente genérico, sin usar las primitivas de ninguna empresa para permitir la portabilidad. Sin importar la empresa que se eligiera, una cosa era segura, se requeriría una adaptación de los niveles lógicos, tanto de tensión como de corriente, dado que la lógica de la computadora naval era TTL y las FPGAs actuales soportan, a lo sumo, LVTTL. Son varios los métodos de adaptación actuales, y como se verá más adelante, el método que se utilice influye directamente en la configuración de los puertos de E/S de la FPGA. En el presente informe comentaremos algunos de ellos brevemente y se entrará un poco más en detalle en los dos que se utilizaron. Se eligió para el desarrollo el Kit 3PA1[1] diseñado y fabricado por la empresa EMTECH[2], el cuál está basado en una FPGA de ACTEL (Microsemi). Esta FPGA se utilizó hasta el segundo prototipo luego del cuál por problemas en la provisión de la misma y por resultar de dimensiones considerablemente mayores a las necesarias (capacidad lógica de 600,000 compuertas) para el proyecto se optó por una de Xilinx de menor envergadura (capacidad lógica de 50,000 compuertas), la cuál resultó más económica y de fácil obtención. Por otro lado, para la descripción del hardware del prototipo mediante VHDL, se fueron estableciendo pautas de señales de E/S y los distintos temporizados de los módulos que cumplen cada una de las funciones de la placa original. El nuevo diseño reutilizó la división modular de la placa original con algunas variantes, manteniendo el nombre de los módulos originales pero variando en ocasiones la funcionalidad de los mismos. En el diseño original se reutilizaron muchas señales para reducir el número de la lógica, por ocupar ésta gran cantidad de espacio. No fue así en nuestro caso. Donde se ponderó que el diseño fuera fácil de seguir y entender para la realización de las futuras correcciones. Entre la premisas del diseño se pueden mencionar: •
El VHDL no podía contener ninguna primitiva de ninguna empresa para que sea portable.
•
La capacidad lógica de cualquier FPGA actual es alta, por lo cuál el ahorro de compuertas no fue una premisa en el diseño.
•
Se necesitaba encapsulados de montaje superficial, pero no BGA, dadas las limitaciones en la capacidad de soldado que se poseían.
•
El número de pines de E/S disponibles para el debía ser mayor o igual a 84. Esto limita los encapsulados que pueden utilizarse.
•
La aplicación final era del tipo industrial con lo cuál, la familia de la FPGA elegida y del resto de los componentes debía poseer dispositivos de rango de temperatura extendido.
•
El bus al cuál la placa iría conectada es de un manejo de corriente elevado por lo que dependiendo del método de adaptación que se eligiera es un punto importante a tener en cuenta.
El presente informe se dividirá en dos partes: premisas del diseño del hardware externo y descripción del HW mediante VHDL.
pg 4 de 20
Parte 1: Premisas del diseño del hardware externo A continuación presentaremos una serie de consideraciones que fueron necesarias para obtener un prototipo funcional. La mayor parte de las mismas surgieron del hecho de tener que cambiar la FPGA del desarrollo por los problemas de provisión antes mencionados. Ante dicho inconveniente se encaró la tarea de hallar un reemplazo apropiado. Entre los diferentes dispositivos analizados se eligió la Espartan 3AN por poseer memoria de configuración interna, dado que inicialmente se había trabajado con una FPGA de Actel que la poseía y por mejorar el aprovechamiento del espacio entre otras cosas.
2
Rango de temperatura del dispositivo
Lo primero que se buscó fue que dentro de la familia del dispositivo hubiera alguno que fuera de rango extendido de temperatura, dado que no todos los dispositivos tienen versiones de rango de temperatura, industrial, automotriz, militar o aeroespacial. Sino que muchas veces los dispositivos sólo vienen en el rango comercial de temperatura. Para el caso de la 3AN se tiene: C = Comercial (0°C a 85°C) I = Industrial (-40°C a 100°C)
3
Capacidad lógica
Lo siguiente a revisar fue la capacidad lógica de la FPGA. Algunos fabricantes suelen poner el número equivalente de compuertas que el dispositivo contiene. Para el prototipo en cuestión luego de realizar la síntesis se pudo saber que requeríamos menos de 5000 compuertas con lo que el dispositivo de más baja gama de la familia 3AN, la XC3S50AN, que posee el equivalente a 50K compuertas era más que suficiente. TABLE I. Dispositiv o
4
CAPACIDADES LÓGICAS DE LOS DISTINTOS DISPOSITIVOS. Compue rtas del sistema
Equivale nte en celdas lógicas
XC3S50AN
50K
1584
176
704
XC3S200AN
200K
4032
448
1792
XC3S400AN
400K
8064
896
3584
XC3S700AN
700K
13248
1472
5888
XC3S1400AN
1400K
25344
2816
11264
CLBs
Slices
Los puerto de E/S
4.1 Capacidad de manejo de corriente Vs. SLEW RATE Dado que el prototipo a desarrollar tenía 84 pines, de los cuáles 44 son entradas y 40 salidas. La cantidad de pines de E/S disponibles para el tenía que ser acorde. Esta cantidad siempre está ligada al encapsulado que se elija. Dado que para una misma familia se puede tener distintas cantidades de pines de E/S disponibles. Para nuestro diseño usamos el TQFP (TQ144/TQG144), el cuál tiene 108 pines de E/S disponibles para con la aclaración de que 7 de esos pines son Sólo Entrada.
pg 5 de 20
Lo siguiente a corroborar fueron los niveles de tensión y corriente que pueden manejar los puertos de E/S. Dado que el prototipo terminaría colocado en una computadora industrial de 30 años de antigüedad, se sabía de un principio que debían utilizarse integrados de adaptación (level shifters, bi-directional low voltage translator o buffers). La Espartan 3 puede manejar niveles lógicos de las familias: LVCMOS, LVTTL, HSTL y SSTL. Una vez selectados los niveles lógicos de tensión se pueden elegir diferentes capacidades de corriente con ciertas salvedades. Si bien, se planteaba el uso de integrados de adaptación, en el caso de los buffers no es necesario preocuparse por la corriente dado que la misma será provista por el mismo buffer, pero a la hora de usar level shifters o bi-directional low voltage translator [acá se puede hacer referencias a hojas de datos y al AN de adaptación], se vuelve necesario conocer las capacidades de corriente del dispositivo a adaptar dado que estos últimos modifican los niveles de tensión, pero la corriente que se requiere para escribir en el bus de datos debe ser provista por el integrado a adaptar. TABLE II.
CARACTERÍSTICAS DE CONTINUA DE LOS PINES DE E/S ESTÁNDAR.
Tipo de Lógica
CONDICIONES DE TESTEO
NIVELES LÓGICOS
IOL
VOL Max(V)
IOH
(mA)
LVTTL
(mA)
2
2
-2
4
4
-4
6
6
-6
8
8
-8
12
12
-12
16
16
-16
24
24
-24
VOH Min(V)
0,4
2,4
Se mencionó que existen ciertas salvedades, las cuáles están basadas en las recomendaciones del fabricante para el número máximo de pines en conmutación simultánea (Simultaneous Switching Outputs: SSOs [3]). En las mismas se detalla la forma de calcular, en función de la corriente selectada, el número máximo de pines que pueden conmutar en la misma dirección de manera simultánea, de manera de mantener el ruido de conmutación en niveles seguros de operación. Este ruido tiene efecto directo sobre los márgenes internos de la relación señal ruido y en última instancia sobe la calidad de la señal. TABLE III. Dispositiv o
NUMERO DE PARES VCCO/GND POR BANCO
Encapsulado TQG1 44
FTG2 56
FGG4 00
FGG4 84
FGG6 76
XC3S50AN
2
3
-
-
-
XC3S200AN
-
4
-
-
-
XC3S400AN
-
4
5
-
-
XC3S700AN
-
-
-
5
-
XC3S1400AN
-
-
-
6
9
La siguiente ecuación permite calcular el número de pines de E/S por banco, que pueden conmutar en la misma dirección de manera de mantener niveles seguros de ruido de conmutación:
SSO MAX / IOBank=TablaIII∗TablaIV
pg 6 de 20
TABLE IV.
NUMERO DE PARES VCCO/GND POR BANCO Encapsulado
Signal Standard (IOSTANDARD)
LVTTL
FTG256, FGG400, FGG484, FGG676
TQG144
Top, Bottom Banks 0,2
Left, Right Banks 1,3
Top, Bottom Banks 0,2
Left, Right Banks 1,3
2
20
20
60
60
4
10
10
41
41
6
10
10
29
29
8
6
6
22
22
12
6
6
13
13
16
5
5
11
11
24
4
4
9
9
Fast
...
..
...
…
...
Quiet IO
...
...
...
...
...
Slow
A modo de ejemplo: Si se elije una capacidad de corriente de 6 mA por pin, se obtiene un máximo de 20 salidas que pueden conmutarse sin introducir ruido. Esta última tabla está hecha para las diferentes configuraciones de SLEW RATE que se le puede asignar a los pines de los puertos de E/S. En este caso, por ser 4MHz la frecuencia de la señal más rápida, se le asignó “SLOW”. Se debe tener en cuenta el hecho de que el ruido debido a la conmutación es tanto mayor cuanto mayor es la rapidez de la misma: flancos muy verticales producen más ruido que flancos suaves, ya que el efecto inductivo de las variaciones de intensidad aumenta con dI/dt [4]. Esto ha sido tenido en cuenta por los fabricantes de dispositivos programables complejos o de circuitos integrados de aplicación específica y por ello es común que exista la posibilidad de optar entre flancos más o menos rápidos. Es conveniente optar por flancos suaves para aquellas señales que no precisan muy alta velocidad 5. Es más, en el caso de las FPGAs, éstas suelen poder configurarse los puertos independientemente con lo cuál se pueden agrupar todas las señales rápidas en uno o algunos de los puertos y las más lentas en los otros y usar diferente SLEW RATE.
4.2 Pines no utilizados Los pines no utilizados de la FPGA, tanto los de configuración como las E/S o los solo entrada pueden dejarse al aire ya que luego de la configuración internamente no estarán conectados a nada. Además puede seleccionarse desde el ISE (Entorno de desarrollo de Xilinx), en las propiedades de “Generate Programming File”, si dichos pines quedarán luego de la configuración queden con un PULLUP, un PULLDOWN, o flotantes.
5
La alimentación
5.1 Alimentación del núcleo VCCINT: Pin de alimentación del núcleo interno de la lógica. El número de pines dedicados varía con el encapsulado, para el TQG144 son 4. Todos deben conectarse a +1V2. VCCAUX: Pin de alimentación auxiliar. La memoria flash interna (Spartan 3AN) está alimentada por el mismo. Todos deben conectarse a +3V3.
pg 7 de 20
5.2 Alimentación de los puertos En el caso de utilizar la FPGA con lógicas del tipo LVTTL debemos tener presente que: VCCO: Pin encargado de la alimentación de los bancos de E/S. Para algunos de los estándares de valores lógicos, establece los valores de referencia. Todos deben conectarse. Para LVTTL deben conectarse a +3V3. VREF: Pin de doble propósito. Como solo entrada cuando el estándar de niveles lógicos lo permite (LVTTL). Y como tensión de referencia de los niveles lógicos escogidos (por ejemplo HSTL o SSTL); en cuyo caso deberán estar todos los pines conectados a la tensión de referencia. Para LVTTL se pueden utilizar como PINES DE SOLO ENTRADA. (Para mas detalle ver datasheet, table 13, pag 17: Recommended Operating Conditions for I/Os Using Single-Ended Standards)
6
La configuración de la FPGA
6.1 Los pines de modo y la configuración Internal Master SPI mode Lo mas importante a la hora de llevar a la práctica un diseño sobre FPGA es como configurar la misma y siendo que la Spartan-3AN tiene varios modos de configuración, dado que puede configurarse desde una memoria externa o desde la memoria interna del integrado. Y como la memoria interna tiene capacidad para cargar dos configuraciones completas de manera de tener un doble booteo, son múltiples las opciones de configuración. Nuestro interés se centró en como poder realizar la escritura de la memoria interna vía JTAG, para luego pasar a utilizar la memoria interna del integrado para la configuración en cada arranque (la FGPA se configura cada vez que se la alimenta). Para poder almacenar la configuración de la FPGA en la memoria interna de la misma(esto es sólo aplicable a la 3AN) a través del puerto JTAG, la misma debe estar en MODO Internal Master SPI mode. De forma que a través de comandos enviados vía JTAG la FPGA se ponga en modo configuración y grabe la misma en la SPI PROM interna. Luego de la misma, en cada booteo, se leen los pines M[2:0], y para que la FPGA se configure en base a lo almacenado en la memoria interna debe estar en: M[2:0] = <0:1:1>, Internal Master SPI mode [5]. Es IMPORTANTE RECORDAR que este modo de configuración requiere que VCCaux sea 3V3. Si se realiza la configuración con los pines de modo seteados en el modo JTAG [ 6,7], M[2:0] = <1:0:1>, la configuración de la FPGA no se completará. Para finalizarla se debe cambiar los pines de modo a Internal Master SPI mode y luego enviar un pulso al pin PROG para iniciar una nueva configuración de la FPGA o hacerlo mediante el software “iMPACT”.
Figura 1: Spartan-3AN FPGA using Internal Master SPI Flash Mode.
pg 8 de 20
6.2 Otros pines asociados a la configuración Estos pines están dedicados a la configuración del dispositivo. No están disponibles como pines de I/O para el . Ambos son alimentados por la tensión VCCAUX. Pin DONE: La FPGA maneja activamente el Pin DONE, poniéndolo en estado bajo durante la configuración. Cuando el proceso de configuración se completó satisfactoriamente, este pin se pone en estado alto a través un una resistencia de pull-up interna o externa, dependiendo de lo configurado por el [8]. Pin Prog_B [9]: Por medio del pin Prog_B se fuerza el inicio del proceso de configuración. La FPGA, también inicia el proceso de configuración ni bien es alimentada. Este pin es una entrada de control asincrónica. Cuando esta bajo, este pin resetea la FPGA, inicializando la memoria de configuración. Una vez que este pin vuelve a estado alto, comienza el proceso de configuración. Pin SUSPENDED: Este pin es de uso dedicado, no disponible para propósitos generales. Permite suspender la FPGA, reduciendo el consumo de potencia del sistema. Esta alimentado por VCCAUX. Este pin se debe conectar a GND en el caso de no ser utilizado [10].
6.3 El puerto JTAG Buscando la forma correcta de conexionado de este puerto encontramos muchas versiones distintas. La que finalmente funcionó en la Espartan 3AN es la siguiente:
Figura 2: Conexión del puerto JTAG, para configurar la Espartan.
6.4 En resumen 1. Para que la FPGA se configure a partir de su memoria interna los pines de modo deben estar, M(2): '0', M(1): '1' y M(0): '1'. 2. VCCAUX debe ser de 3.3V. 3. El pin INIT_B sirve para múltiples propósitos durante el proceso de configuración. Luego esta disponible como pin I/O. 4. El pin DONE pasará a estado alto cuando la FPGA esté completamente configurada. 5. Los pines que no estén involucrados en el proceso de configuración que se esté llevando a cavo estarán en 'Z' (los pines involucrados en el proceso de configuración pueden variar de un modo a otro)[11].
pg 9 de 20
7
El reloj del sistema
Para la elección del reloj del sistema se debe tener en cuenta que cada elemento de la familia Spartan-3 [12] ofrece 8 relojes globales de alta velocidad y bajo Skew, para mejorar la performance. Estos son utilizados automáticamente por las herramientas de síntesis de Xilinx. Aún si la frecuencia es baja, es importante usar los recursos de enrutamiento de reloj globales para eliminar cualquier posibilidad de problemas en el temporizado del diseño. Es importante, por tanto, entender como se definen y como se toma ventaja de los mismos. Los dispositivos Spartan-3 tiene 8 pines de entrada de reloj global, denominados GCLK0 a GCLK7. GCLK0 a GCLK3 se encuentran ubicados en la zona central inferior del encapsulado, más precisamente en los pines 57 a 60. GCLK4 a GCLK7 e encuentran ubicados en la zona central superior del encapsulado, más precisamente en los pines 124 a 127. Cualquiera de los 8 pines puede conectarse indistintamente a cualquier recurso o diseño dentro del chip. Estos no tienen restricciones por cuadrante y no tienen diferenciación entre primario o secundario para simplificar la ubicación de la lógica sintetizada y de las E/S. Además en la familia de FPGAs Spartan-3 ninguno de los pines de reloj comparte funcionalidad con pines de configuración, solamente con pines de E/S. El software de síntesis utiliza los buffers inferior y superior como primera opción para el enrutamiento de las señales de reloj de alto fanout (que se conectan a muchos de los módulos de nuestro diseño, cuando el mismo tiene múltiples dominios de reloj). Si existiesen más de 8 relojes en un diseño pueden usarse los semi buffers laterales(left-/right-half buffers). Floorplanning se recomienda para diseños que requieran más de ocho relojes, ya que las cargas sobre los buffers de la parte izquierda o derecha está restringidos a diseños sintetizados sobre dichas partes o se limitan a un cuadrante dado (como puede observarse en la siguiente figura), para dar mayor libertad a la entrada global utilizando el mismo recurso de enrutamiento.
Figura 3: Spartan-3E and Extended Spartan-3A Family Internal Quadrant-Based Clock Structure.
pg 10 de 20
Parte 2: Descripción del HW mediante VHDL 8
Sobre el registro desplazamiento de salida
La placa de comunicaciones realiza una conversión paralelo serie a la salida y serie paralelo a la entrada. Para ello hace uso de sendos registros desplazamiento. El registro de salida lo inferimos con carga sincrónica, mediante la señal “load”. Al finalizar el pulso en '0' de load, en el próximo pulso de la señal “fmc1d1”, comenzará el desplazamiento. La señal “fmc1d1” se pone en '1' cuando hay un flanco ascendente del reloj de 1MHz pero se mantiene en '1' solo 125 ns, de forma que no haya más de un comienzo de transmisión. De esta manera hacemos que el reloj global sea el de 4MHz y mediante “fmc1d1” hacemos que la lógica se sincronice con el reloj de 1MHz usando los CLOCK ENABLE de la lógica interna de la FPGA. proc_registro_desplazamiento: Process (reset, mc2d, s_load, fmc1d1, datos_u24, sp, s_registro27bit) begin if reset = '0' then--ACTIVO BAJO!!! s_registro27bit <= (others => '1'); dato_serie <= '1'; ultimo_bit <= '0'; elsif mc2d' event and mc2d = '1' then if s_load = '0' then--CARGA SINCRONICA POR '0' con el reloj de 4MHz s_registro27bit (1) <= '1';--esto es para que al final de la Tx me quede --la salida serie en '1' s_registro27bit (2) <= sp;--Last Bit ultimo_bit <= sp;--Last Bit para el "mco_4.VHD" s_registro27bit (26 downto 3) <= not datos_u24; s_registro27bit (27) <= '0';--bit de start elsif fmc1d1='1' then s_registro27bit (27 downto 2) <= s_registro27bit (26 downto 1); --asigno el último pin del registro desplazamientoa la señal dato serie dato_serie <= s_registro27bit (27); end if; end if; end process;
pg 11 de 20
9
Dominios de reloj y reset
El diseño del VHDL de la placa es modular, las partes de la misma se fueron resolviendo por separado para terminar uniéndose mediante una estructura que es en resumen un cableado de los módulos. Los distintos módulos pueden trabajar a dos velocidades, 1 MHz y 4 MHz. Ahora bien, no es conveniente tener más de un dominio de reloj en un diseño. Así mismo, es deseable tener en cada módulo un reset unido al reset global para asegurar un estado conocido de inicio de operación. Veremos a continuación dos formas de describir el mismo HW, la primera usando dos dominios de reloj, uno para “MC2D” y otro para “MC1D1”, y la segunda para un único dominio de reloj y de reset. En los ejemplos se intenta inferir un registro desplazamiento de 27 bit, cuyo último bit es siempre '1', esto es para que al final del desplazamiento el registro quede cargado con todos '1' lógicos. Esta última, es una condición de contorno del diseño.
pg 12 de 20
Diseño ICI, pg 13 de 20
UTN-FRBB-Dpto Electronica. Proyecto PIDDEF
Para la primer forma tenemos: --en este proceso infiero el registro desplazamiento proc_registro_desplazamiento: Process (reset, s_load, mc1d1, datos_u24, sp) begin if reset = '0' then--ACTIVO BAJO!!! s_registro27bit dato_serie ultimo_bit
<= (others => '1'); <= '1'; <= '0';
elsif s_load = '0' then--CARGA ASINCRONICA POR '0'
Usando un único dominio de clk y reset: --en este proceso infiero el registro desplazamiento proc_registro_desplazamiento: Process (reset, mc2d, s_load, mc1d1, datos_u24, sp, s_registro27bit) begin if reset = '0' then--ACTIVO BAJO!!! s_registro27bit dato_serie ultimo_bit
<= (others => '1'); <= '1'; <= '0';
elsif mc2d' event and mc2d = '1' then if s_load = '0' then--CARGA SINCRONICA POR '0' con el reloj de 4MHz s_registro27bit (1) <= '1';--esto es para que al final de s_registro27bit (1) <= '1';--esto es para que al final la Tx me quede la salida serie en '1' de la Tx me quede la salida serie en '1' s_registro27bit (2) <= sp;--Last Bit s_registro27bit (2) <= sp;--Last Bit ultimo_bit <= sp;--Last Bit para el "mco_4.VHD" ultimo_bit <= sp;--Last Bit para el s_registro27bit (26 downto 3) <= datos_u24; "mco_4.VHD" s_registro27bit (27) <= '0';--bit de start s_registro27bit (26 downto 3) <= datos_u24; s_registro27bit (27) <= '0';--bit de start elsif mc1d1'event and mc1d1='1' then elsif mc1d1='1' then s_registro27bit (27 downto 2) <= s_registro27bit (26 downto 1); s_registro27bit (27 downto 2) <= s_registro27bit (26 downto 1); --asigno el último pin del registro desplazamientoa la señal dato serie --asigno el último pin del registro desplazamientoa la dato_serie <= s_registro27bit (27); señal dato serie dato_serie <= s_registro27bit (27); end if; end process; end if; end if; end process; --realizo otro proceso que me lleve la cuenta de los bits transmitidos el mismo --realizo otro proceso que me lleve la cuenta de los bits transmitidos el mismo
Diseño ICI, pg 14 de 20
--carga de manera asincrónica y cuenta con los mismos pulsos de clk que se TX proceso_contador_hasta26: process (s_load, mc1d1) begin
UTN-FRBB-Dpto Electronica. Proyecto PIDDEF
--carga de manera asincrónica y cuenta con los mismos pulsos de clk que se TX proceso_contador_hasta26: process (reset, mc2d, s_load, mc1d1, s_contador_hasta26_siguiente) begin if reset = '0' then s_contador_hasta26 <= "00000"; elsif mc2d' event and mc2d = '1' then if s_load = '0' then
if s_load = '0' then s_contador_hasta26 <= "11010";--recargo el contador con
26
elsif (mc1d1' event and mc1d1 = '1' and s_contador_hasta26 > "00000") then then s_contador_hasta26 <= s_contador_hasta26_siguiente; end if; end process; s_contador_hasta26_siguiente <= s_contador_hasta26 - 1;
s_contador_hasta26 <= "11010";--recargo el contador
con 26
elsif (mc1d1 = '1' and s_contador_hasta26 > "00000")
s_contador_hasta26 <= s_contador_hasta26_siguiente; end if; end if; end process;
s_contador_hasta26_siguiente <= s_contador_hasta26 - 1; --cuando el contador llega a cero se activa la señal FIN DE TX fin_tx <= '0' when s_contador_hasta26 = "00000" else --cuando el contador llega a cero se activa la señal FIN DE TX '1'; fin_tx <= '0' when s_contador_hasta26 = "00000" else '1';
Puede verse que mientras en el ejemplo de la izquierda se utiliza “mc1d1” como reloj, en el de la derecha se utiliza “mc2d” que es el reloj global del sistema. Además de tener un reset asincrónico global que define un estado inicial. El código visto como solución, no fue el definitivo ya que generó un nuevo inconveniente, al ser el clk de 4 MHz y el CLK ENABLE de 1 MHz, el FF efectuaba 2 secuencias de operación antes de que la señal en CLK ENABLE pudiera deshabilitar el mismo. Para solucionar este inconveniente se necesitó generar una señal de CLK ENABLE de igual o mayor velocidad que MC2D (el reloj global de 4MHz). Se optó por implementar un detector de flanco que se denominó FMC1D1 (F, por flanco y MC1D1 por el reloj de 1 MHz). La señal FMC1D1 se pone en 1 cuando detecta un flanco ascendente del reloj MC1D1 y permanece en '1' el mismo tiempo que MC2D permanece en dicho estado, para luego volver a '0' hasta que haya un nuevo flanco del reloj MC1D1. En vez de crear uno nuevo, se modificó el módulo “divisor4a1.vhd” cambiando la antigua salida del reloj “mc1d1” por “fmc1d1”. architecture Behavioral of divisor4a1 is signal s_cuenta2b
: std_logic_vector (2 downto 1);
signal s_mc1d1 : std_logic; signal s_mc1d1_anterior : std_logic; begin process (reset, mc2d, s_cuenta2b) begin if reset = '0' then--ACTIVO BAJO!!! s_cuenta2b <= (others => '0'); elsif mc2d'event and mc2d ='1' then s_cuenta2b <= s_cuenta2b + 1; end if; end process; s_mc1d1 <= s_cuenta2b(2);--asigno el segundo bit que varía una ves c/4 pulsos de reloj proc_detecta_flanco_mc1d1 : process (reset, mc2d, s_mc1d1, s_mc1d1_anterior) begin if reset = '0' then s_mc1d1_anterior <= '0'; elsif mc2d' event and mc2d = '1' then s_mc1d1_anterior <= s_mc1d1; end if; end process; fmc1d1 <= '1' when ((not s_mc1d1_anterior) and s_mc1d1) = '1' else '0'; mc1d1 <= s_mc1d1; end Behavioral;
Finalmente se realizaron cambios en el resto del código para que “MC2D” sea el reloj de todos los módulos y “FMC1D1” sea el CE (habilitación de reloj) en vez de MC1D1.
pg 15 de 20
10 Condiciones de carrera Uno de los mensajes que daba la herramienta de síntesis es que detectaba en cierta parte del código una condición de carrera o race condition (si bien sería mejor hablar de estado de carrera, igual que se habla de estado de espera). Múltiples procesos están en condición de carrera si el resultado de los mismos depende del orden en que se ejecute. En circuitos electrónicos se da una Condición de carrera cuando la salida de un sistema o subsistema depende del orden en que se hayan activado o desactivado sus componentes. El diagrama a continuación ejemplifica la situación:
Figura 4: Ejemplo de condición de carrera en una lógica.
Puede observarse que durante un tiempo ∆t2 tendremos a la salida un estado no deseado o incorrecto, dado por el retardo en la propagación del valor lógico a través del inversor. Dicha situación se presentaba (según el chequeo de sintaxis del ISE de Xilinx) en el siguiente código, encargado de mantener en '1' la señal de reloj serie “BS” mientras la AR-ICI recibe un pulso de RESET por parte de la MU: --con la siguiente lógica habilito/des la salida serie del reloj mediante --la señal RESD s_osrcl <= '1' when reset = '0' else mc1d1; Se solucionó cambiándolo por el siguiente código: --con la siguiente lógica habilito/des la salida serie del reloj mediante --la señal RESD proc_hab_deshab_BS: Process (reset, mc2d, mc1d1) begin if reset = '0' then s_osrcl <=
'1';
elsif mc2d' event and mc2d = '1' then if mc1d1 = '1' then s_osrcl <=
'1';
s_osrcl <=
'0';
else
end if; end if; end process;
pg 16 de 20
11 Corrección del jitter del reloj serie entrante En las capturas múltiples hechas con el analizador lógico, durante las pruebas hechas en la embarcación, encontramos que el reloj entrante serie (de 1MHz) estaba, en ocasiones, desplazado algunos nanosegundos con respecto al reloj que la placa recibe desde el procesador central en la que está colocada (MC2D: 4MHz). Esto producía en la lógica interna, que se pierdan algún flanco de reloj o que se genere un flanco que no existe, lo que terminaba por cortar la comunicación. Recordemos que para la lógica original estas diferencias de tiempo no son un problema porque su tiempo de establecimiento es mucho mayor. Se utilizó el primer método que propone Pong P. Chu [13]. Sincronizando el reloj entrante al módulo de ingreso de palabras del puerto serie por medio de un Flip Flop que entregaba la nueva señal de reloj en fase con la señal de reloj del sistema.
Figura 5: Ejemplo de sistema con na entrada asincrónica arriba y el mismo sistema con la entrada sincronizada mediante un Flip Flop[13].
architecture Behavioral of conversor_sp is --señales internas --señal de reloj serie entrante del bus serie signal s_bsi: std_logic; --señal del reloj serie entrante pero sincronizada con el MC2D de nuestra MU signal s_bsi_en_sinc: std_logic; --señal para detectar el flanco ascendente del reloj serie entrante ya sincronizado signal s_bsi_anterior: std_logic; --señal que se pone en '1' con el flanco ascendente del reloj serie entrante signal s_fbsi: std_logic; --señal para inferir el registro desplazamiento signal s_registro26bit : std_logic_vector (26 downto 1); --señal para negar la palabra recibida antes de sacarla por el puerto paralelo signal s_palabra_negada : std_logic_vector (24 downto 1); --cuando el DCL de entrada está esperando un dato esta señal va a ser '1' signal s_esperando_dato : std_logic; --señal que voy a utilizar para hab o deshab el reloj que ingresa por el puerto --serie y de esa manera retener la ultima palabra recibida -- signal s_recibiendo : std_logic; begin --ASIGNACION DE SEÑALES pg 17 de 20
--s_bsi <= (not bsi) and s_recibiendo; s_bsi <= (not bsi) and s_registro26bit(26); s_esperando_dato <= esperando_dato; --Primero sincronizamos el reloj serie entrante con nuestro reloj para corregir --cualquier clase de JITTER que pudiera ocasionarnos una pérdida del sincronismo proc_sincroniza_bsi : process (reset, mc2d, s_bsi) begin if reset = '0' then s_bsi_en_sinc
<= '0';
elsif mc2d' event and mc2d = '1' then s_bsi_en_sinc
<= s_bsi;
end if; end process; --Ahora identificamos los flancos ascendentes del reloj serie entrante sincronizado --con el reloj MC2D de nuestra MU proc_detecta_flanco_bsi : process (reset, mc2d, s_bsi_en_sinc) begin if reset = '0' then s_bsi_anterior
<= '0';
elsif mc2d' event and mc2d = '1' then s_bsi_anterior
<= s_bsi_en_sinc;
end if; end process; --en el flanco ascendente el BSI anterior es '0' y BSI es '1', con lo cual --la AND nos da '1' s_fbsi <= '1' when ((not s_bsi_anterior) and s_bsi_en_sinc) = '1' else '0'; proc_registro_desplazamiento: process (reset, mc2d, s_esperando_dato, s_fbsi, dato_serie) begin --la señal esperando_dato es un pulso que dura como mucho un período del reloj --de 1MHz = 1us. La usamos para identificar cuando esperamos una nueva --palabra if reset = '0' then--RESET ACTIVO BAJO!!! --ponemos todos los bits en '1' s_registro26bit <= (others => '1'); --en c/pulso del reloj que recibo por el puerto serie desplazo un bit --escrito de esta forma el CLK es mc2d y fbsi es el CE elsif mc2d'event and mc2d = '1' then if s_esperando_dato = '0' then--RESET ACTIVO BAJO!!! s_registro26bit <= (others => '1'); elsif s_fbsi = '1' then s_registro26bit (26 downto 2) <= s_registro26bit (25 downto 1);
--asigno el primer pin del registro desplazamientoa a la señal pg 18 de 20
dato serie
s_registro26bit (1) <= dato_serie; end if;
end if; end process;
pg 19 de 20
12 Bibliografía (1) http://www.emtech.com.ar/index.php? option=com_content&view=article&id=15&Itemid=11&lang=es#descripcion_general (2) http://www.emtech.com.ar/ (3) DS557 (v4.1). Spartan-3 – Spartan-3AN FPGA Family Data Sheet - Product Specification. “Simultaneously Switching Output Guidelines”. April 1, 2011, pp 43. (4) http://diec.s.unizar.es/~tpollan/libro/Apuntes/digT3.pdf (5) UG332 (v1.6). Spartan-3 Generation Configuration Guide. October 26, 2009. Cap 10. pp 217. (6) UG332 (v1.6). Spartan-3 Generation Configuration Guide. October 26, 2009. Chapter 9, “JTAG Configuration Mode and Boundary-Scan”. pp 199. (7) UG332 (v1.6). Spartan-3 Generation Configuration Guide. October 26, 2009. “Mode Pin Considerations when Programming a Spartan-3AN FPGA via JTAG using iMPACT”. Pp 215. (8) UG332 (v1.6). Spartan-3 Generation Configuration Guide. October 26, 2009. pp 52. (9) UG332 (v1.6). Spartan-3 Generation Configuration Guide. October 26, 2009. pp 56. (10) XAPP480 (v1.0). Using Suspend Mode in Spartan-3 Generation FPGAs. Application Note: Spartan-3A, Spartan-3AN, Spartan-3A DS. May 2, 2007. (11) UG332 (v1.6). Spartan-3 Generation Configuration Guide. October 26, 2009. pp 49. (12) UG331 (v1.8). Spartan-3 Generation FPGA Guide. June 13, 2011. Chapter 2. “Using Global Clock Resources”. Pp 45. (13) RTL hardware design using VHDL. Autor: Pong P. Chu.pp 617.
pg 20 de 20