• Nenhum resultado encontrado

O módulo full_scanner foi criado para ser o topo da implementação do algoritmo de busca cega de sinais proposto neste trabalho. Desta forma, tal módulo, além de conter todos os outros módulos utilizados neste trabalho, ainda possui estruturas de controle que determinam como e quando, tais módulos devem operar a fim de executar adequadamente o algoritmo proposto.

A organização interna do módulo full_scanner segue um estilo de desenvolvimento com processos de gerenciamento e módulos periféricos, ou seja, os processos implementa- dos no full_scanner, tais como o connect_matrix e main_control, são responsáveis por poucas operações, entretanto possuem papel fundamental no gerenciamento dos módulos periféricos (freq_shift, fir_filter, RAM e sr_search). Tal abordagem, similar à utilizada em

desenvolvimentos do tipo hardware/software co-design, nos permitiria, por exemplo, subs- tituir o connect_matrix e main_control por um software operando em um processador e gerenciando os mesmos periféricos aqui empregados (GUPTA, 2001). Tal desenvolvimento agrega vantagens como menor área de circuito utilizada, já que o processador também pode substituir outras tarefas de outros blocos do projeto, além de menor risco ao projeto, uma vez que um erro em um código operando em um processador pode ser facilmente corrigido, entretanto um erro em código HDL, após a fabricação, só pode ser corrigido através de um novo processo de fabricação. Por fim, tal abordagem nos permitiria lançar mão do uso de maior quantidade de memória para cálculos de média, uma vez que o algoritmo poderia utilizar a memória disponível para o processador deste SoC (da sigla em inglês: System On Chip) que, normalmente, é maior do que a restrita a um único bloco de circuitos do projeto.

As portas de entrada e saída do full_scanner são: ∙ Sinais Padrão

∙ clk (1 bit entrada): responsável por prover o clock para o circuito;

∙ enable (1 bit entrada): quando habilitado (nível alto) indica que o circuito deve executar sua operação;

∙ reset_n (1 bit entrada): quando habilitado (nível baixo) leva todo o circuito para um estado conhecido e inicial. O circuito só é capaz de voltar a operar quando este sinal é desabilitado (nível alto);

∙ clear (1 bit entrada): quando habilitado (nível alto) leva o circuito a seu estado inicial. Diferentemente do reset_n tal comportamento é obtido através de lógicas específicas e não diretamente nos registradores;

∙ Entrada de dados no protocolo Ready-Valid

∙ in_ready (1 bit saída): quando ativado (nível alto) indica que o circuito está pronto para receber dados de entrada;

∙ in_valid (1 bit entrada): quando ativado (nível alto) indica que os sinais

real_in e imag_in possuem dados válidos;

∙ real_in (largura configurável entrada): representando um valor inteiro com sinal, indica o valor da parte real do dado de entrada;

∙ imag_in (largura configurável entrada): representando um valor inteiro com sinal, indica o valor da parte imaginária do dado de entrada;

∙ Sinais de controle

∙ unbalance_fix_in (24 bit entrada): sinal destinado ao bloco de FFT, repre- senta um inteiro com sinal que é adicionado aos valores de entrada do bloco de

FFT a fim de se melhorar os resultados do cálculo de FFT;

∙ fs_value_in (18 bit entrada): representando um valor inteiro sem sinal, in- forma a frequência de amostragem, em kHz, utilizada na captura dos sinais de entrada;

∙ centre_freq_in (32 bit entrada): representando um valor inteiro sem sinal, informa a frequência central, em kHz, da faixa em análise;

∙ average_num_in (4 bit entrada): pode assumir os valores 1, 2, 4 ou 8 e representa a quantidade de amostras que deve ser utilizada para se extrair a média dos resultados do Algoritmo de Detecção de Cicloestacionaridade antes da pesquisa pelo pico. Atualmente tal variável encontra-se limitada aos valores 1 ou 2;

∙ guard_delta_in (18 bit entrada): representando um valor inteiro sem sinal, informa a largura de frequência, em kHz, do outer_step, ou seja, o passo utilizado para deslocar a faixa de frequência no laço externo do algoritmo proposto; ∙ step_size_in (18 bit entrada): representando um valor inteiro sem sinal, in-

forma a largura de frequência, em kHz, do inner_step, ou seja, o passo utilizado para deslocar a faixa de frequência no laço interno do algoritmo proposto;

∙ threshold_fix_in (24 bit entrada): representando um valor inteiro sem sinal, determina o tamanho mínimo de um pico de cicloestacionaridade para que ele possa ser considerado válido (minMag);

∙ threshold_mult_in (6 bit entrada): representando um valor inteiro sem sinal, determina o fator de multiplicação mínimo do pico em relação à sua redondeza (multDiff );

∙ Saída de dados no protocolo Ready-Valid

∙ out_ready (1 bit entrada): quando ativado (nível alto) indica que o circuito de destino dos dados está pronto para receber os dados de saída deste bloco; ∙ out_valid (1 bit saída): quando ativado (nível alto) indica que os sinais eof_out,

fs_out e centre_out são válidos;

∙ eof_out (1 bit saída): quando ativado (nível alto) indica o final de uma trans- missão de dados;

∙ fs_out (18 bit saída): representando um valor inteiro sem sinal, indica o valor de largura de banda, em kHz, de um sinal encontrado. Cado retorne zero indica que nenhum sinal foi encontrado;

∙ centre_out (32 bit saída): representando um valor inteiro sem sinal, indica o valor da posição central, em kHz, do sinal reportado em fs_out.

O circuito ainda possui três parâmetros de entrada: 1) “G_DEBUG_SIM”, utili- zada na verificação do circuito em simuladores HDL, salva em arquivos as entradas dos mó- dulos freq_shift, fir_filter e sr_search, permitindo assim que tais dados sejam carregados pelo Octave e confrontados com os obtidos no modelo; 2) “G_DEBUG_FIRST_SIGNAL”, utilizado na verificação do protótipo, habilita uma memória de monitoramento que salva os dados entregues ao sr_search na primeira ocorrência de detecção de sinal reportada por tal circuito, permitindo assim, que tal sinal seja avaliado no modelo; 3) “G_INPUT_WIDTH”, que determina qual a largura dos dados de entrada oriundos do conversor AD.

Internamente as seguintes constantes são empregadas:

∙ C_FFT_SIZE = 8192 : informa a quantidade de amostras requeridas pela FFT; ∙ C_SLACK_BITS = 17 : informa a quantidade de amostras extras que devem ser armazenadas devido às amostras que ficam retidas nos pipelines internos de alguns circuitos;

∙ C_INTERNAL_DATA = 2 + G_INPUT _WIDTH : informa a largura dos dados em uso internamente no circuito;

∙ C_RAM_SIZE = 2(2C _FFT _SIZE + 5n_taps + 5C _SLACK _BITS ) + 1: informa a quantidade de palavras da memória necessária para armazenar todos os dados para a condição máxima de média e zoom possíveis, o parâmetro n_taps é oriundo da biblioteca chamada para se utilizar o módulo fir_filter e representa a quantidade de coeficientes utilizados no filtro;

∙ C_RAM_LOGDEPTH = 15 : informa a quantidade de bits necessários para endereçar todas as posições da memória;

∙ C_FILTERBAND = 25000 : informa a largura de banda do filtro utilizado em kHz;

∙ C_MINIMUM_FS = 200 : informa a largura mínima de banda que o circuito irá pesquisar em kHz (minSpan).

Uma vez que os cálculos de deslocamento e filtragem podem ser realizados sobre si próprios, a constante “C_INTERNAL_DATA” determinará quantos bits serão utilizados nestes cálculos, de forma a manter o nível de precisão do circuito dentro dos padrões requeridos, neste caso particular estabelecidos pela norma DVB-S2.

Uma vez que o fluxo de entrada de dados é constante e não pode ser reprimido através do sinal in_ready, sem a utilização de uma FIFO que armazene os valores para serem utilizados posteriormente. Isto porque o conversor AD realiza amostragens do sinal de entrada em uma frequência fixa, a qual o próprio circuito se vale para realizar seus cálculos adequadamente. Entretanto o circuito interno deve recusar a recepção de dados, por exemplo por já ter seus armazenamentos internos cheios, ou por estar em modo de re-

pouso. Portanto uma vez que o sinal in_ready é desativado, deve-se entender que qualquer nova amostra coletada pelo conversor AD será descartada. Desta forma, a FIFO pode ser descartada economizando área de circuitos e sem qualquer prejuízo para a operação do circuito.

O sinal in_valid, por sua vez, é utilizado quando o clock de amostragem do con- versor AD é menor que o clock de trabalho do circuito implementado. Note que o fluxo de dados deve se manter constante para que o circuito não perca nenhuma amostra rele- vante do conversor AD, isto significa que o circuito implementado só poderá operar em uma frequência menor que a do AD, caso ele consuma mais de uma amostra deste a cada

in_valid, o que não ocorre na implementação proposta. Portanto o circuito implemen-

tado pode operar em uma frequência maior que a do AD que o alimenta, com o fluxo de dados controlado pelo sinal in_valid, ou com frequência igual à do AD, neste caso, sem necessidade de controle de fluxo pelo in_valid. A utilização de uma menor frequên- cia de processamento que a do AD, como anteriormente observado, também é possível, porém demandaria uma leve mudança de arquitetura, por exemplo, com a adição de uma FIFO interna ao módulo, armazenando os dados recebidos na mesma taxa em que são produzidos, e desta forma adaptando o fluxo externo mais alto ao interno mais lento.

Sempre que o circuito inicia sua operação a primeira tarefa realizada é preencher a memória interna com os dados que serão posteriormente utilizados no cálculo de busca por cicloestacionaridade. A matriz de conexões direciona a entrada diretamente para o módulo freq_shift para que a banda de entrada seja posicionada na região inicial para operação do algoritmo. A saída do módulo freq_shift é direcionada ao fir_filter e, por fim, a saída deste último é direcionada à memória. O valor de deslocamento realizado depende das iterações previamente realizadas, começando em C _FILTERBAND/2 −

fs_value_in/2 e aumentando à medida que o circuito opera até que toda a faixa tenha sido

processada, conforme descrição do outerLoop. Por outro lado, a quantidade de memória a ser armazenada depende do número de médias a ser realizada dentro do Algoritmo de Detecção de Cicloestacionaridade e do nível de zoom em uso. Este procedimento garante que uma parte da faixa de frequência da largura da banda do filtro e amostrada em

fs_value_in, foi isolada e está armazenada na memória.

Caso o zoom seja necessário, durante o armazenamento em memória, uma dizi- mação por dois será realizada, ou seja, será gravada uma amostra na memória e outra será descartada alternadamente, isto garantirá que uma parte da faixa de frequência da largura do filtro estará armazenada, porém, na metade da frequência de amostragem pa- drão (fs_value_in/2). Em seguida, os dados devem ser lidos da memória e direcionados ao freq_shift, que deslocará a faixa previamente armazenada em −C _FILTERBAND/2, posicionando-a de forma que o bloco seguinte, fir_filter, elimine metade da banda da faixa previamente armazenada, resultando em um trecho da faixa inicial de largura igual

á metade da largura do filtro utilizado (C _FILTERBAND/2) e com frequência de amos- tragem ainda equivalente a fs_value_in/2. Caso um novo zoom seja necessário, o processo de dizimação será realizado novamente durante a escrita na memória e na etapa seguinte o mesmo deslocamento e filtragem serão realizados, resultando em um trecho de faixa de um quarto da largura do filtro inicial (C _FILTERBAND/4) e frequência de amostragem equivalente a fs_value_in/4. O circuito implementado não permite que um novo zoom seja realizado devido à limitações na quantidade de memória interna ao circuito criado.

Note, que cada processo de zoom exige o descarte de metade das amostras previ- amente coletadas, isto significa que a cada processo de zoom realizado pouco mais que o dobro da memória necessária para o processamento pelo Algoritmo de Detecção de Cicloestacionaridade será requerida na etapa anterior. A constante “C_RAM_SIZE”, previamente apresentada, nos informa a quantidade máxima de memória utilizada no cir- cuito. Note que quanto maior a quantidade de coeficientes dos filtros, ou amostras que ficam presas no pipeline dos circuitos internos, maior será o requisito de memória para operação do circuito, entretanto a parte mais significativa do consumo de memória fica por conta do tamanho da FFT empregada e quantidade de médias requeridas. A limi- tação atual para média de até dois bins é resultado das limitações de memória interna disponíveis para o circuito, bem como consequência da não utilização de memória externa ao circuito. Note que caso fosse necessário garantir médias de até 8 amostras, um total de aproximadamente 2 Mbit de memória seria necessária, ao passo que na condição atual apenas 0,52 Mbit de memória é necessária.

Uma vez que todas as amostras requeridas estejam armazenadas na memória, o circuito inicia as operações do Algoritmo de Detecção de Cicloestacionaridade e redução sucessiva da largura da faixa em análise. Então, os dados da memória são direcionados para o módulo freq_shift, em seguida para o fir_filter e finalmente para o sr_search, de onde a resposta acerca da presença, ou não, de um sinal na faixa será aguardada. Con- forme descrição do comportamento do innerLoop realizada na subseção 3.2, na primeira iteração o módulo freq_shift é configurado para um deslocamento igual a zero, este valor aumentará step_size_in a cada nova iteração. Este laço se repete até que a banda efetiva de análise torna-se menor, ou igual, a C _FILTERBAND/2, caso nenhum zoom esteja configurado; ou C _FILTERBAND/4, caso um zoom de duas vezes esteja configurado; ou “C_MINIMUM_FS”, caso um zoom de quatro vezes esteja configurado. Ao final de cada uma das etapas o circuito reinicia a captura de dados sob a configuração de um novo

zoom, ou caso todos os zooms tenham sido utilizados, a captura se reiniciará sem zoom e

na faixa guard_delta_in à frente da atual, conforme descrito pelo outerLoop.

Em qualquer momento do processo, caso um sinal seja detectado, o laço se en- cerra e o circuito inicia uma nova busca por cicloestacionaridade no trecho de faixa

de frequência da posição corrente e banda são armazenados e comparados a cada nova busca no trecho guard_delta_in à frente. Caso a busca no trecho seguinte retorne um valor de magnitude inferior ao anteriormente observado a posição anterior é dada como o centro do sinal encontrado e a largura deste sinal é adicionada ao deslocamento da faixa (outerAcc), de forma que a próxima pesquisa inicie-se à frente do sinal encontrado. Por outro lado, caso nenhum sinal seja encontrado na pesquisa seguinte à que um pico foi encontrado, tal pico será dado como sendo o centro de frequência do sinal encontrado. Por fim, caso o deslocamento externo seja maior que fs_value_in − C _MINIMUM _FS , ou a soma do deslocamento e do sinal encontrado maior que fs_value_in, a pesquisa é dada por encerrada.

No envio do último sinal encontrado, ou ao término de uma pesquisa sem resulta- dos, o sinal eof_out é acionado por um pulso de clock, indicando que o circuito retornou a seu estado de repouso. Durante o estado de repouso caso o sinal enable seja acionado o circuito novamente entrará em operação sendo possível, portanto, iniciar a leitura de novas faixas de frequência.

Uma vez que a operação de tal circuito está intimamente ligada à operação de todos os outros módulos que compõe o mesmo, seu tempo de simulação mostrou-se proi- bitivo, sobretudo pela alta demanda computacional do cálculo de FFT em simulação HDL. Para contornar tal problema e permitir uma verificação mais veloz do full_scanner um modelo comportamental do bloco sr_search foi implementado. Este modelo apenas retorna respostas pré-estabelecidas aos estímulos desejados, ou seja, o modelo verificava se o estímulo corrente possuía alguma resposta positiva para a presença de um sinal, em caso negativo, responde informando a ausência de um sinal e em caso positivo responde com valores pré-definidos de magnitude e banda. Evidentemente tanto o peso computa- cional, quanto o atraso para tal resposta são sensivelmente menores do que na simulação completa possibilitando, portanto, que os mecanismos criados para simulação do circuito como um todo possam avaliar um amplo conjunto de situações, tais como operação até o final do outerLoop, operação em situações que nenhum sinal é encontrado, operações em que muitos sinais são encontrados e determinação de posição de um sinal em função da variação de magnitude de seu pico.

Durante as simulações de verificação do full_scanner três tipos de dados foram utilizados, com diferentes finalidades. Em um primeiro momento dados produzidos pelo modelo em Octave foram utilizados, e as respostas obtidas a partir de tais dados eram contrastadas com as respostas obtidas pelo modelo, garantindo que conformidade entre ambas as implementações. Em seguida, dados coletados em bancada foram utilizados a fim de se observar o comportamento dos circuitos e ajustar o range de bits utilizados internamente, para o caso de uso do mag_est, por exemplo. Nesta etapa, utilizam-se tanto dados produzidos por um gerador de sinais DVB-S2, obtendo sinais com alta relação

sinal/ruído, quanto dados coletados diretamente da antena receptora de sinais de satélite, obtendo sinais com mais baixa relação sinal/ruído e outras degradações típicas do sistema de transmissão/recepção de sinais de satélite.

O testbench implementado para verificação é ainda capaz de armazenar os dados enviados ao sr_search, bem como dados de entrada e saída do fir_filter e freq_shift, atra- vés do acionamento do parâmetro “G_DEBUG_SIM”, de forma a possibilitar a produção de gráficos, ou processamento dos dados no modelo em Octave (EATON et al., 2009), em qualquer ponto e momento das iterações do circuito. Pequenos scripts criados em Octave, por exemplo, para capturar e plotar dados, filtrar e comparar resultados, dentre outros, auxiliaram na função de verificação do bloco criado.

Documentos relacionados