• Nenhum resultado encontrado

O módulo seguinte, freq_shift, tem por objetivo realizar deslocamentos em frequên- cia de sinais dentro de uma faixa. No modelo implementado tal tarefa seria realizada através da multiplicação do sinal por uma nova portadora, entretanto a implementação em hardware realizada neste trabalho se vale de um CORDIC e um acumulador de fase. As entradas deste módulo estão descritas à seguir:

∙ Sinais Padrão

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

∙ 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;

∙ Sinais de controle

∙ start_in (1 bit entrada): sinal deve ser acionado durante um pulso de clock (nível alto) e leva o circuito a um estado de preparação previa ao início de sua operação;

∙ ready_out (1 bit saída): quando ativo (nível alto) indica que o circuito concluiu sua preparação e está pronto para receber e fornecer dados;

∙ f_sample_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;

qual a frequência de deslocamento desejada; ∙ Entrada de dados

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

in_data_real e in_data_imag possuem dados válidos;

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

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

∙ Saída de dados

∙ out_valid (1 bit saída): quando ativado (nível alto) indica que os sinais out_data_real e out_data_imag são válidos;

∙ out_data_real (largura configurável saída): representando um valor inteiro, ou não, com sinal, indica o valor da parte real do dado de saída;

∙ out_data_imag (largura configurável saída): representando um valor in- teiro, ou não, com sinal, indica o valor da parte imaginária do dado de saída. Este circuito também dispõe de dos seguintes parâmetros: “G_DEBUG”, que habi- lita estruturas internas utilizadas na verificação e “G_INPUT_WIDTH”, que determina qual a largura dos dados de entrada e saída.

Além de alguma lógica de topo, responsável pelo alinhamento dos sinais de dado e controle que trafegam entre os módulos internos, o freq_shift é composto por um módulo

CORDIC e pelo módulo phase_gen2.

Durante a operação do freq_shift o módulo phase_gen2 produz variações de fase correspondentes à da portadora necessária para o deslocamento informado por f_shift_in, estes dados de variação de fase são direcionados ao CORDIC, que os combina com os dados de entrada produzindo uma nova sequência de dados equivalente à de entrada, porém deslocada em frequência (rotação de faixa de frequência).

5.2.1

COordinate Rotation DIgital Computer : CORDIC

O módulo CORDIC utilizado neste projeto foi previamente desenvolvido no Ins- tituto Eldorado e é capaz de realizar uma série de operações matemáticas complexas sem o uso de multiplicadores, ou outras estruturas que demandem grande consumo de área (ERCEGOVAC; LANG, 2004) (VOLDER, 1959).

O emprego do CORDIC neste trabalho deve-se à necessidade de deslocamentos de frequência em passos variáveis e configuráveis, portanto, o mesmo foi configurado para a realização da operação descrita em (5.1), sendo 𝐾1 constante e aproximadamente igual à

1, 64676 e os outros valores dados por entradas e saídas do módulo conforme descrito à seguir:

∙ Sinais Padrão

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

∙ 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);

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

∙ output_clear_n (1 bit entrada): quando habilitado (nível baixo) limpa os registros internos do módulo;

∙ Entrada de dados

∙ X_in (largura configurável entrada): representando um valor inteiro, ou não, com sinal, indica o valor da variável 𝑥𝑖𝑛 de entrada;

∙ Y_in (largura configurável entrada): representando um valor inteiro, ou não, com sinal, indica o valor da variável 𝑦𝑖𝑛 de entrada;

∙ Z_in (largura configurável entrada): representando um valor inteiro, ou não, com sinal, indica o valor da variável 𝑧𝑖𝑛 de entrada;

∙ Saída de dados

∙ X_out (largura configurável saída): representando um valor inteiro, ou não, com sinal, indica o valor da variável 𝑥𝑓 de saída;

∙ Y_out (largura configurável saída): representando um valor inteiro, ou não, com sinal, indica o valor da variável 𝑦𝑓 de saída;

∙ Z_out (largura configurável saída): representando um valor inteiro, ou não, com sinal, indica o valor da variável 𝑧𝑓 de saída;

𝑥𝑓 = 𝐾1 (︁ 𝑥𝑖𝑛cos(𝑧𝑖𝑛) − 𝑦𝑖𝑛sin(𝑧𝑖𝑛) )︁ ; 𝑦𝑓 = 𝐾1 (︁ 𝑥𝑖𝑛sin(𝑧𝑖𝑛) + 𝑦𝑖𝑛cos(𝑧𝑖𝑛) )︁ . (5.1)

Na implementação realizadas as saídas X_out (𝑥𝑓) e Y_out (𝑦𝑓) representam, res- pectivamente a componente real e imaginária do sinal produzido a partir das componentes real X_in (𝑥𝑖𝑛) e imaginária Y_in (𝑦𝑖𝑛) do sinal de entrada. Sendo a entrada Z_in (𝑧𝑖𝑛) responsável por determinar o nível de rotação a ser aplicado a cada uma das amostras de entrada do sinal.

parâmetro “C_WIDTH”, além deste outros parâmetros do módulo podem ser utiliza- dos para estender a precisão de bits (“C_EXT_PRECISION”), configurado em 2; de- terminar o número de iterações de células de CORDIC (“C_ITER”), configurado em 16; além de outros utilizados para determinar a operação de (5.1) (“C_START_IT”, “C_BITS_GUARD”, “C_COORDINATE”, “C_MODE”).

5.2.2

Gerador de Fase: phase_gen2

O módulo phase_gen2 tem como função prover ao CORDIC a fase utilizada em seu cálculo, ou seja o 𝑧𝑖𝑛 em (5.1). Este módulo tem como entradas e saídas os seguintes sinais:

∙ Sinais Padrão

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

∙ 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;

∙ Sinais de controle

∙ start_in (1 bit entrada): sinal deve ser acionado por um pulso de clock (nível alto) e leva o circuito a um estado de preparação previa ao início de sua operação; ∙ ready_out (1 bit saída): quando ativo (nível alto) indica que o circuito concluiu

sua preparação e está pronto para receber e fornecer dados;

∙ fs_value_in (18 bit entrada): representando um valor inteiro sem sinal, in- forma a frequência de amostragem, em kHz, utilizada na geração dos passos de fase;

∙ freq_des_in (19 bit entrada): representando um valor inteiro com sinal, in- forma qual a frequência de deslocamento desejada;

∙ Entrada de dados

∙ valid_in (1 bit entrada): quando ativado (nível alto) indica a necessidade de geração de um novo valor de fase;

∙ Saída de dados

∙ valid_out (1 bit saída): quando ativado (nível alto) indica que o sinal phase_out é valido;

∙ phase_out (largura configurável saída): representando um valor real com sinal, sendo sua representação com um bit de sinal, dois bits inteiros e os outros bits fracionários.

O único parâmetro presente no módulo é o “C_WIDTH”, que indica a largura do sinal phase_out. Uma constante interna, chamada “C_PRECISION_BITS”, configurada em 2, pode ser utilizada para determinar uma maior precisão no cálculo de fase, permi- tindo assim que a frequência produzida esteja mais próxima à configurada pelo parâmetro

freq_des_in.

Internamente a variável 𝜋 está armazenada com 64 bits de precisão, entretanto a quantidade de bits utilizados é dada pela expressão C _WIDTH +C _PRECISION _BITS . Desta forma, pode-se garantir a máxima precisão nos cálculos internos para até 64 bits de precisão total configurada no módulo.

Uma vez que o sinal start_in é acionado, o circuito bloqueia a saída de dados, efe- tua a multiplicação do valor absoluto do sinal freq_des_in por 2𝜋 e em seguida divide tal valor pelo valor contido em fs_value_in. A divisão é realizada por um método de subtra- ções sucessivas, que podem ser de 4096 · fs_value_in, 512 · fs_value_in, 64 · fs_value_in, 8 · fs_value_in ou 1 · fs_value_in. Em cada etapa de subtração o valor correspondente à multiplicação de fs_value_in é somado a outra variável, a mesma subtração é realizada enquanto o dividendo for maior que o valor que está sendo subtraído, o processo persiste até que o dividendo seja menor que fs_value_in, neste momento caso o resto seja maior que 1/2 · fs_value_in o resultado final é acrescido de um (arredondamento) e em seguida o resultado estará pronto.

O valor obtido é, então, acrescido sucessivamente a uma variável que se inicia em −𝜋 e cujo valor vai a no máximo 𝜋. Desta forma sempre que o valor somado exceder 𝜋 o excedente será somado a −𝜋 e as somas sucessivas continuarão. O resultado de tal soma é, então, levado à saída phase_out.

O sinal do phase_out é multiplicado por -1 quando freq_des_in é positivo, resul- tando em uma variação de 𝜋 a −𝜋, e por 1 quando freq_des_in é negativo, resultando em uma variação de −𝜋 a 𝜋.

Documentos relacionados