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 𝜋.