3. Segunda Versão do Gerador

3.6 Gerador Controlável

O coração do projeto é o bloco gerador de pulsos. Este foi projetado de modo independente do restante do circuito para que tivesse a versatilidade de poder ser implementado em qualquer plataforma e também poder ser duplicado dentro de um projeto para que seja possível obter quantos canais de saída foram necessários.

O gerador é controlado por quatro parâmetros de 16 bits e 2 sinais de controle conforme a Figura 9.

Figura 10: Representação do bloco da segunda versão do gerador.

O que o diferencia da versão anterior apresentada na Figura 4, em termos de entrada, é a substituição do sinal “reset” pelos sinais “trigger” e “veto” que são responsáveis por disparar e interromper o funcionamento do gerador respectivamente e um sinal de clock adicional que é somente para a geração de pulsos. Isto permitiu um maior controle do gerador e uma implementação mais simplificada da interface de controle. Outra grande diferença é que este gerador é síncrono enquanto a versão antiga era assíncrono.

Esta versão possui dois clocks. Um é proveniente de um divisor de frequência externo ao gerador e através dele pode-se criar pulsos mais longos, não ficando limitado aos pulsos com período de 16 bits de ciclos do clock principal. Este é usado na unidade geradora de pulsos e no atrasador. O outro é o clock principal do circuito e é usado para os circuitos que detectam quando há mudança nos sinais. Uma vez que o circuito agora é síncrono, os contadores não são mais disparados por sinais ligados direto na entrada de clock, mas sim de comparadores formados por flip-flops que comparam o sinal anterior com o atual. Flip-flops

esses que são disparados com o clock do sistema, que deve ser o mais rápido possível e com frequência igual ou maior ao clock do gerador.

O gerador é disparado na subida o sinal de trigger e começa a gerar após “delay”

ciclos de clock. Passado o tempo de delay, o gerador emitirá “N” pulsos de largura “width”

com distância “period” entre eles. O gerador cessará os pulsos automaticamente quando o número de pulsos dados alcançar N ou quando o sinal de “veto” ir de zero para um. Caso “N”

seja igual a zero, o gerador emitirá pulsos indefinidamente até que ocorra a subida do sinal de veto.

A segunda versão do gerador compreende os seguintes blocos:

• Unidade geradora (Generator Unit): Responsável pera geração dos pulsos.

Atrasador (delayer): Responsável pelo atraso do delay.

Contador de pulsos (Pulses Counter): Responsável por cessar a geração de pulsos após alcançado o número de pulsos pretendido.

• Degrau: Bloco responsável por transformar a subida do VETO em um sinal interno de degrau com o objetivo de vetar o gerador até que haja um novo gatilho.

Pulso: Bloco responsável por transformar a subida do TRIGGER em um pulso interno que iniciará a operação do gerador.

O diagrama de blocos da segunda versão do gerador pode ser visto na Figura 10 (as entradas correspondentes aos parâmetros de controle de 16 bits foram omitidas para melhor visualização):

Figura 11: Diagrama de blocos da segunda versão do gerador.

3.6.1 Delayer

A unidade Delayer é responsável por atrasar o início da operação da unidade geradora.

Dessa forma é possível configurar defasagem entre diferentes canais.

O bloco de delayer recebe o parâmetro “delay” de 16 bits, um sinal de reset, o sinal de clock do gerador e o sinal de clock do sistema. Quando é dado o trigger do gerador, um contador começa a contar os ciclos do clock do gerador e mantém a unidade geradora desabilitada até que o contador alcançe o número de clocks correspondente ao parâmetro delay. Ao alcançar este, ele habilita a unidade geradora para que esta começe a emitir pulsos.

Desta forma é obtido o atraso em ciclos de clock, antes do início da operação do gerador após um sinal de trigger.

Para que a unidade delayer haja de forma síncrona ele utiliza dois clocks. O clock do sistema e o clock do gerador. O clock do sistema é o que engatilha cada comparação entre o

estado atual e o último estado do clock do gerador. Cada vez que o estado atual do clock do gerador for 1 e o estado anterior for 0 significa que houve uma subida do clock e então o contador é incrementado em um.

Inicialmente o próprio sinal do clock do gerador engatilhava o contador, tornando o circuito bem mais simples. No entanto, devido a limitação do FPGA usar os sinais de gatilho de flip-flops através das vias especiais de clock, se fez necessário a mudança.

Sempre que há um evento de subida no sinal de trigger do gerador, o contador é zerado e volta a contar do zero. Quando o contador alcança o valor de delay, este também cessa sua operação até que haja um novo sinal de trigger.

Abaixo na Figura 11 vemos uma ilustração da operação do bloco delayer, onde a primeira forma de onda é o sinal de trigger do gerador, a segunda é o contador do delayer e a terceira é a saída do gerador.

Figura 12: Ilustração do funcionamento do bloco delayer.

3.6.2 Pulses Counter

Este bloco é responsável por vetar o sinal de saída do gerador quando o número de pulsos emitidos atingir o numero de pulsos desejado.

O bloco consiste em um contador que conta o número de pulsos emitidos. Consiste em um registrador de 16 bits que incrementa de um sempre engatilhado quando há borda de descida do sinal de saída do gerador. Os flip-flops do contador não são engatilhados diretamente pelo sinal de saída do gerador devido ao problema de clock assíncrono já mencionado anteriormente. No lugar disto, usamos um flip-flop que a cada pulso do clock registra o sinal de saída do gerador e um comparador, que compara o valor desse flip-flop ao valor da saída do gerador. O valor do flip-flop sempre corresponderá ao valor anterior ao

presente do sinal de saída do gerador. Comparando este sinal com o sinal atual podemos atestar que houve uma mudança no sinal do gerador. Como mencionado, sempre que essa mudança é uma borda de descida, ou seja, quando o sinal anterior é ‘1’ e o atual é ‘0’, o contador é incrementado de uma unidade.

O bloco recebe um parâmetro de entrada de 16 bits correspondente ao número de pulsos que deve ser emitido por cada trem de pulsos. Este valos fica guardado num resgistrador e um comparador avalia se o numero de pulsos dados registrado no contador já alcançou o número de pulsos a serem dados. O sinal desse comparador vai para ‘1’ quando o contador alcança o número de pulsos a ser dado. A saída deste comparador é ligada à entrada de veto do gerador e por isto os pulsos cessam quando a saída do comparador é setado.

Na Figura 12 podemos observar o comportamento do bloco contador de pulsos.

Figura 13: Ilustração do funcionamento da unidade pulses conter.

3.6.3 Generator Unit

A unidade geradora de pulsos é a responsável pela geração propriamente dita dos pulsos, é o coração do gerador.

Esta recebe dois parâmetros de 16 bits, que são a largura de pulso ‘width’ e a distância entre o início de cada pulso ou período ‘period’. Ambos os parâmetros são dados em ciclos de clock e guardados em registradores externos ao gerador.

O gerador compreende um contador que conta os ciclos do clock do gerador, um circuito comparador para indicar quando o contador alcança o valor de ‘width’ e outro para indicar quando o contador alcança o valor de ‘period’.

Partindo do zero, o contador inicia a contagem quando ocorre a transição de subida do sinal de trigger. Neste momento o sinal de saída do gerador vai para ‘1’ e permanece até que o valor do contador atinja o valor especificado pelo parâmetro ‘width’. Quando isto ocorre o sinal de saída do gerador retorna a ‘0’ e permanece até o reset do contador. O contador segue incrementando 1 a cada ciclo de clock do gerador até que este atinja o valor do período, que é dado pelo parâmetro ‘period’ decrescido de uma unidade. Neste momento o contador é zerado, o sinal de saída do gerador volta a ‘1’ e o contador inicia a contagem do zero.

Desta forma a unidade geradora gera pulsos que permanecem em nível lógico alto durante ‘width’ ciclos de clock e retorna a nível lógico baixo até que atinja ‘period’ ciclos de clock.

O contador só permanece ativo enquanto seu sinal de reset está em nível lógico baixo.

A qualquer momento em que este sinal está em nível alto, o contador é zerado e a saída do gerador resetada.

Na Figura 13 podemos ver um gráfico que ilustra o funcionamento da unidade geradora.

Figura 14: Ilustração do funcionamento da unidade geradora.

No documento GERADOR DE PULSOS DIGITAIS E INTERFACE SERIAL PARA CONTROLE IMPLEMENTADOS EM FPGA (páginas 36-42)