sábado, 4 de abril de 2009

Deseño final do Analizador Espectral

Logo de revisar toda a documentación dispoñíbel de Xilinx sobre os seus IPCores, as follas de características da placa XUP Virtex2 de Digilent e dos seus compoñentes, e tras un longo proceso de análise de posibilidades acadamos un deseño estructural para o analizador que nos propuxemos construir. Está basado nos esbozos que podemos ver na entrada anterior, sobre os que incluimos unha serie de compoñentes adicionais que agora explicaremos. Tódalas decisións que tomamos en canto ó procesado de mostras e á arquitectura do Core FFT se manteñen.
Primeiramente decatámonos de que o Core FFT de Xilinx segue un protocolo para a captura de mostras tal que por cada ciclo de reloxo carga un valor da entrada x[n]. O deseño deste Core está orientado ó uso dunha memoria RAM como buffer de mostras de entrada, o que permite unha carga de datos moi rápida, pero como non temos restriccións temporais fortes e a memoria RAM suporía unha cantidade de recursos considerábel, decidimos empregar un Sistema Secuencial Síncrono para o control da carga de datos. O funcionamento é o seguinte: o Core FFT dispón dun terminal de habilitación de reloxo; como as mostras só se presentan cada 1/48000 s, o SSS deshabilitará o reloxo tra-la captura de cada dato ata a chegada do seguinte. Deste xeito conseguimos unha reducción considerábel de recursos empregados.
Este Core tamén dá pé ó uso dunha RAM como buffer para as mostras X[k] de saída co protocolo de descarga que implementa. Seguindo a mesma filosofía, o noso deseño non precisa tal rapidez: buscamos a reducción de recursos empregados, polo que nos decantamos por outro SSS que controle a descarga de mostras, deshabilitando o circuito FFT cando sexa necesario.
Unha vez que xa decidimos como obte-las mostras X[k] da FFT, debemos adaptalas para a representación na pantalla. Xa que cada un dos X[k] é un valor complexo en xeral, e dado que do Core obtemos a súa parte real como a súa parte imaxinaria, precisamos un bloque que calcule o módulo de cada unha das mostras do espectro. Inicialmente propuxémonos calculalo en unidades logarítmicas, pero Xilinx non ofrece ningún IPCore capaz de computa-lo logaritmo dun número enteiro (poderíase emprega-lo algoritmo Cordic para isto, pero a súa implementación sería probábelmente tan difícil como o analizador enteiro e non moito mellor ca algunhas xa existentes). No lugar de empregar unha táboa de consulta en memoria, a expensas dun incremento de recursos empregados, conformámonos co cálculo de |X[k]| en unidades naturais.
Para iso primeiramente elevamos a parte real e imaxinaria ó cadrado multiplicándoas por si mesmas, e logo sumamos os resultados para obter |X[k]|^2. Xilinx si que ofrece un IPCore para o cálculo da raíz cadrada dun número enteiro basado no algoritmo Cordic (Core Cordic v3.0), co que o cálculo do módulo simplifícase enormemente.
Unha vez que obtemos cada unha das mostras |X[k]|, deben ser almaceadas nunha RAM de dobre porto, á que accederá tamén o circuito controlador do monitor VGA para a representación final.
Pero volvendo ás especificacións do monitor VGA, decidimos unha representación cunha resolución de 640x480 píxeles, co que cada |X[k]|, independentemente do seu valor numérico, debe ser expresado cun máximo de 9 bits (512 niveis), xa que non se pode iluminar a medias un píxel. Isto implica que, antes do almaceamento na RAM de dobre porto, cada unha das mostras |X[k]| debe atravesar un circuito de redondeo/truncado e saturación: neste compoñente cada |X[k]| é adecuadamente redondeada ou truncada, e se o resultado excede dun valor máximo, a saída do circuito satúrase (quedan tódolos bits activados) evitando un resultado erróneo debido ó desbordamento.
Para a captura de datos empregamos un conversor AD LM4550, que envía cada un dos resultados da conversión en serie, polo que como no Core FFT de Xilinx os valores de cada mostra se capturan en paralelo, precisamos un circuito de conversión Serie-Paralelo (S-P). Este circuito debe recibir a trama serie do CAD, extrae-lo valor da mostra, e unha vez feito isto, activar un sinal de nova mostra que lle indique ó SSS de carga a presenza dun novo dato.
Por último, débese empregar un SSS máis que controle o inicio da captura de datos para cada FFT de modo que se consigan unhas 50 por segundo (aínda non decidimos a frecuencia de cálculo, hai tempo en tódolos sentidos), a configuración do CAD LM4550 inicial segundo as especificacións, e outros aspectos que vaian xurdindo.

En resumo, o analizador lóxico funcionará da seguinte maneira: inicialmente un SSS principal configurará o CAD para unha conversión a 48KHz con cuantificación de 18 bits por mostra. Cada 20ms aproximadamente, este SSS ordeará o comezo do cálculo dunha FFT para actualiza-la RAM de mostras |X[k]|, co que o SSS de carga introducirá 512 mostras no Core FFT. A introducción de cada mostra faise cada 1/48000 s, isto é, cando estea dispoñíbel á saída do conversor S-P. Mentres non haxa novas mostras manterá o reloxo do Core FFT deshabilitado. Unha vez que se cargan tódolos datos de entrada e se computen as |X[k]|, o SSS de saída comezará a descarga de datos, controlando o proceso de cálculo do módulo e almaceando cada un dos datos |X[k]| válidos na RAM de saída. Cando todos e cada un dos datos queden almaceados na RAM, o conxunto de circuitos esperará a que o SSS principal ordee un novo cálculo. Por outra banda, en paralelo o circuito controlador VGA irá lendo datos da RAM de saída e amosaráos na pantalla.

No hay comentarios:

Publicar un comentario