martes, 5 de mayo de 2009

Módulo FFT(III): Documentación "Definitiva"

Esta é a suposta versión definitiva da documentación do Módulo FFT. Saúdos!


-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Modelo VHDL do Módulo FFT

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

----------------------------------- Pablo Losada Sanisidro.

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

1.- Descrición do Módulo FFT:

Este circuito realiza o cálculo do módulo da DFT de 512 puntos dun sinal real. As mostras do sinal de entrada x(n) deben estar cuantificadas con 18 bits en Ca2, mentres que os datos presentados á saída teñen 9 bits de ancho e veñen expresados nun formato sen signo.



Internamente o circuito utiliza o algoritmo FFT (Fast Fourier Transform) para o cálculo das mostras complexas da DFT, e unha vez calculadas estas, obtén os seus módulos elevando as partes real e imaxinaria ó cadrado, sumando ambos resultados, e aplicando o algoritmo Cordic modificado para o cómputo da raíz cadrada disto. Todos estes pasos lévanse a cabo nos dous compoñentes fundamentais que forman a ruta de datos do Módulo FFT: un circuito que implementa o algoritmo FFT e unha Unidade de cálculo de Módulos, que opera sobre os resultados do anterior.

Para evitar desbordamentos durante o proceso de cálculo da FFT existe a posibilidade de aplicar un desprazamento á dereita ó resultado dalgunhas mariposas dun certo número de bits, que se pode elixir a través dun bus de entrada. Isto supón que cando se empregue esta posibilidade o resultado da FFT non coincida exactamente coa DFT de 512 puntos do sinal x(n), senón cunha versión escalada en ampritude desta. A expresión do factor de escala como función dos desprazamentos á dereita é

S = 2^-(sum(bi))

onde bi é o número de bits desprazados á dereita á saída da mariposa da i-ésima etapa da FFT.

En canto á Unidade de Cálculo de Módulos, esta acada internamente unha precisión de 19 bits nos seus resultados, polo que para presentalos no bus de saída de 9 bits faise necesaria unha adaptación de valores. Para isto existe un circuito de saturación que evita os erros por desbordamento que se producirían cunha asignación directa dos 9 bms ás liñas do bus. O funcionamento deste circuito é tal que cando a magnitude dos datos de entrada é igual ou inferior a un límite arbitrario (entre 1 e 511) estes refléxanse na saída sen verse alterados, mentres que todos aqueles que o superen quedan saturados a este valor.

Adicionalmente a Unidade de Cálculo de Módulos ofrece a posibilidade de realizar un desprazamento á dereita sobre os valores dos módulos de 19 bits de precisión antes da etapa de saturación. Os bits que se desprezan pódense truncar simplemente ou ben redondear, o que supón que cando estes bits superen certo valor increméntase nunha unidade a parte non desprezada. Ademais, a cantidade de bits a desprazar elíxese a través dun bus de entrada, podendo ser de 0, 3, 6, ou 9 bits.

O modo de operación con redondeo ou con truncamento, así coma o límite de saturación da saída, pode seleccionarse durante a implementación do Módulo FFT mediante asignacións ós parámetros xenéricos do seu modelo VHDL.

Por último, o Módulo FFT posúe buses e sinais especiais á saída que lle permiten gobernar directamente unha memoria RAM síncrona de alomenos 512 posicións e palabras de datos de 9 bits de ancho.

Cabe destacar que o desprazamento previo á saturación permite realizar unha especie de 'zoom' nos datos de saída, xa que se non se realiza ningún desprazamento obteriámo-los módulos da DFT co máximo grao de resolución posíbel en 9 bits, con aqueles que superasen o máximo valor representábel saturados. Variando o número de bits desprazados antes da saturación pérdese resolución e precisión, pero a cambio conservarianse as ampritudes relativas das compoñentes espectrais, xa que os desprazamentos equivalen a escalados por unha potencia de dous menor ca 1 (é dicir, 2^-b), co que xa non serían necesarias as saturacións.




2.- Terminais de Entrada e Saída:

Os buses e sinais de entrada do circuito son os seguintes:

· Nova_Mostra: sinal activo a nivel alto e síncrono que indica que existe unha nova mostra dispoñíbel no bus xn. A captura do valor da mostra xn ten lugar no seguinte flanco ascendente do reloxo á detección do sinal Nova_Mostra activado. É dicir, unha vez que se estableza un nivel alto en Nova_Mostra = '1' e ocorra un flanco ascendente no reloxo, a circuitería interna memorizará o valor do bus xn no próximo flanco ascendente do sinal de reloxo.

· Inicio: Sinal activo a nivel alto e síncrono que solicita o inicio dun novo ciclo de cálculos no circuito, é dicir, fai que este se prepare para a carga de 512 mostras, o cálculo da súa FFT e a posterior descarga dos resultados. A captura deste sinal efectúase nos flancos ascendentes do reloxo, e ten efecto sempre e cando o circuito non estea xa en proceso de carga de datos, cálculo dunha FFT, ou realizando a descarga de resultados: nestes casos este sinal Inicio ignórase.

· xn: Bus onde se introduce o valor de cada mostra de entrada (18 bits en Ca2).

· scale_sch: Bus de 18 bits no que se establece o valor de escalado anti-overflow para os cálculos internos da FFT. As liñas do bus divídense en parellas que indican o número de desprazamentos á dereita do resultado de cada mariposa ou etapa da circiutería da FFT (1, 2, 3 ou 4 bits desprazados), de maneira que a parella de bits menos significativos correspóndese coa primeira etapa, a seguinte parella coa segunda, e así ata a novena parella, asociada á última etapa da FFT. O número de desprazamentos codifícase en binario natural nos dous bits da parella.

· scale_sch_we: Sinal de habilitación de captura do valor de escalado anti-overflow. A captura do valor do bus scale_sch ocorre cando se produce un flanco ascendente no sinal de reloxo e scale_sch_we ='1'.

· escala: Bus de dúas liñas onde se especifica un valor asociado ós desprazamentos á dereita dos módulos da DFT de 19 bits antes do circuito de saturación (zoom). Permítense catro valores de escala, dende 0 (máis detalle, sen redondeo/truncamento) a 3 (mínimo detalle,máximo redondeo/truncamento). A cantidade de bits desprazados á dereira é de 3*(Escala).

· escala_WE: terminal de habilitación de captura do valor do bus Escala. A captura ocorre sempre que escala_WE estea a nivel alto e se produza unflanco ascendente.

Os buses e sinais de saída son os seguintes:

· ram_we: Sinal síncrono de habilitación de escritura para a RAM conectada á saída.Este sinal actívase durante un ciclo de reloxo completo cando existe unvalor válido no bus xk_mod. A captura deste valor debe producirse noseguinte flanco positivo de reloxo dende o momento no que se activa ram_we(memoria RAM con escritura síncrona).

· ram_addr: Bus de 9 bits de direccionamento para unha memoria RAM síncronade saída. A cada un dos módulos calculados da DFT asóciaselle unha posiciónda memoria RAM, comezando dende 0 para a mostra 0 da DFT.

· xk_mod: Bus de 9 bits co valor de cada un dos módulos das mostrasda DFT. Nos ciclos nos que se active o sinal ram_we existirá undato válido neste bus, que estará estábel no momento no que ocorra oseguinte flanco ascendente do reloxo.

· fin: sinal síncrono que indica o fin dun ciclo de carga, cálculo e descargacompleta de datos do Módulo FFT. Este sinal actívase durante un ciclo dereloxo unha vez que tódolos valores dos módulos da DFT aparecesen nos busesxk_mod, xunto coa correspondente activación do sinal ram_we e adirección apropiada no bus ram_addr.

· CARGA_busy: sinal síncrono que se activa durante toda a fase de carga devalores das mostras x(n). Actívanse cando se comeza o proceso de carga dedatos,e desactívase unha vez que se cargan as 512 mostrasdo sinal de entrada e comezan os cálculos.

· FFT_busy: sinal síncrono que se activa durante os cálculos da FFT.Actívase logo do fin do proceso de carga e desactívase xusto antes docomezo da descarga de datos.

· DESCARGA_busy: sinal síncrono que se activa durante a descarga dosmódulos da DFT calculada. Permanece activada durante toda a fase de descarga de datos, e unha vez queaparece na saida o último módulo calculado, desactívase.

· Ovflo: sinal síncrono que se activa cando se produce un overflow duranteo cálculo da FFT das mostras x(n). Permanece activado durante o resto dociclo de cálculos e a descarga, e desactívase no inicio do seguinte ciclo ou ben ante a activación dun reset.

Os terminais de simulación reflexan valores calculados internamente, ese non se empregan deben deixarse abertos na instanciación (open).

· XK_IM_SIM, XK_RE_SIM: partes real e imaxinaria de cada mostra da DFT.

· X_mod_SIM, X_mod2_SIM: módulo e módulo ó cadrado de cada mostra da DFT.

· FFT_DV_SIM: sinal síncrona activa a nivel alto que se activa candoaparecen datos válidos nos buses XK_**_SIM, é dicir, durante a descarga dedatos do circuito que calcula a DFT.

· FFT_CE_SIM: sinal síncrona de habilitación de reloxo para o circuito que calcula a DFT. Só para labores de depuración: non se pode asignar dende o exterior.

· RFD_SIM: sinal síncrona que indica que o circuito de cálculo da FFT está listo para recibir datos de entrada. Só se emprega para depuración.

· XN_INDEX_SIM: bus que indica o número de mostra de saída durante a descarga de datos do circuito que calcula a FFT, dende 0 a 511.

3.- Funcionamento do circuito:

O funcionamento do Módulo FFT é moi simple:

- Dende o arranque en frío é necesario activar o sinal Reset durante un ciclo de reloxo alomenos. Isto establece as condicións iniciais básicas na circuitería de control.

- O primeiro paso antes de comeza-los cálculos co Módulo FFT é proporcionar un valor de escala anti-overflow. Para iso establécese o valor desexado no bus scale_sch e logo actívase durante un ciclo de reloxo o sinal scale_sch_we. Estas dúas operacións poden realizarse nun único ciclo de reloxo, pois o único requisito para que se completen correctamente é que os datos do bus estean estábeis no flanco ascendente do sinal de reloxo no que se capturan. O valor de escala anti-overflow queda memorizado entre os sucesivos ciclos de cálculos, co que só é necesario proporcionalo unha vez despois de cada reset efectuado.

- O seguinte paso é proporcionar un valor de escala de representación (ou zoom) para a adaptación dos resultados. Para isto é necesario activar un ciclo de reloxo o sinal escala_WE e establecer simultaneamente o valor desexado no bus Escala. Esta operación pode repetirse en calquera momento excepto durante as descargas de datos, momentos nos que se opera co valor introducido. Ademais sempre é absolutamente necesario proporcionar alomenos unha escala de representación logo de cada reset.

- A continuación o circuito está listo para a activación do sinal Inicio. Se se establece un nivel alto durante un ciclo de reloxo neste terminal o Módulo FFT realizará inmediatamente as operacións internas necesarias para prepararse para a carga de datos. Estas operacións precisan tres ciclos de reloxo para completarse, nos que se ignoran por completo tódolos terminais de entrada excepto o RESET. Unha vez transcorridos, o circuito estará listo para a carga de 512 mostras do sinal a analizar a través do bus xn e a liña Nova_Mostra.

- A carga dunha mostra realízase activando o sinal Nova_Mostra durante un ciclo de reloxo, e establecendo o valor da mostra no bus xn. A memorización do valor do bus prodúcese no seguinte ciclo de reloxo ó da activación de Nova_Mostra, no instante do flanco ascendente de reloxo, co que a única restricción para a operación de carta é que o dato do bus xn se atope estábel no momento da súa captura. É dicir, o dato de entrada pode establecerse no bus no mesmo ciclo cá activación da liña Nova_Mostra, sempre que logo se manteña durante o seguinte ciclo de reloxo, no que realmente se memoriza.

- Cando se carguen as 512 mostras o circuito procederá ó cálculo da súa DFT co algoritmo FFT; logo calculará os módulos de cada mostra espectral, e finalmente tras un tempo de latencia proporcioná os resultados nos buses de saída de forma secuencial e continua. As operacións realizadas en cada momento amósanse nos terminais FFT_busy, CARGA_busy, DESCARGA_busy, e FIN.

RESTRICCIÓNS:

O funcionamento do Sistema Secuencial Síncrono que controla a carga de datos impón

os seguintes límites:

- Entre a activación de Inicio e a primeira activación de Nova mostra han de pasar, alomenos, TRES ciclos de reloxo, nos que se prepara a circuitería interna para a recepción de datos. Nestes ignórase Nova_Mostra, e polo tanto non se realiza ningunha carga.

- A carga dunha mostra precisa de dous ciclos de reloxo: no primeiro actívase Nova_Mostra, e no segundo adquírese realmente o valor do bus xn, de forma exclusiva. É dicir, NON é posíbel realizar unha carga contínua de mostras, solapando a captura dunha mostra coa activación do sinal Nova_Mostra para a seguinte.

- Tra-la activación do sinal FFT_Fin, deben transcorrer dous ciclos de reloxo antes dunha nova activación do sinal Inicio. Isto débese ás operacións internas da circuitería de control, que debe deixar en espera a toda a circuitería operativa.

4.- Estructura e implementación:

O Módulo FFT descomponse internamente en catro bloques fundamentais:

· Un Sistema Secuencial Síncrono de Control, que goberna os demáis circuitos do módulo, controla os procesos de carga e descarga de datos, etc.

· Unha implementación do algoritmo FFT basado no IPCore FFT v3.0 de Xilinx (UD_FFT).

. Un circuito de cálculo do módulo de cada mostra da DFT e procesado posterior, incluindo o circuito de escala ou desprazamento para a representación ( zoom)e un circuito de saturación (UD_MODULO).

· Un contador de 9 bits que se utiliza con dous propósitos: serve como xerador das direccións do bus ram_addr e intervén nas labores de control do SSS no proceso de carga de datos.

Estes últimos tres compoñentes integran unha unidade operativa ou ruta de datos do Sistema Secuencial de Control.

O modelo VHDL do Módulo FFT posúe tres parámetros xenéricos cos que se pode controlar a estructura interna da circuitería que forma o circuito de cálculo de módulos (UD_MODULO). A descripción de cada un e o seu funcionamento atópase no arquivo fonte deste circuito.

Por último, para que o Módulo FFT funcione correctamente o IPCore FFT de Xilinx debe posuir certas funcionalidades, co que é preciso establece-las seguintes opcións á hora da súa xeración:

* A lonxitude da DFT debe ser fixa e de 512 puntos, e debe empregarse unha única canle.

* Débese seleccionar a estructura Radix 2 lite ou Radix 2 como estructura das mariposas.

* Os datos de entrada deben estar en punto fixo e ter un ancho de 18 bits.

* Internamente debe empregar aritmética escalada, e é obrigatorio implementa-los terminais SCLR, CE e OVFLO.

O resto de parámetros poden elixirse arbitrariamente: a orde de descarga dos datos de saída só afecta á orde na que estes se presentan nos bus de saída, e o modo de truncado e a lonxitude dos factores de fase só afectan á precisión dos cálculos.

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

----------------------------------------------------------------------------


No hay comentarios:

Publicar un comentario