Interface Serial UART

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

3. Segunda Versão do Gerador

3.7 Interface Serial UART

O programa do projeto contemplava a criação de uma interface de acesso para que o usuário pudesse facilmente configurar o gerador a partir de um computador. A interface escolhida para comunicação entre o circuito e um aplicativo no computador foi a UART (Universal Assynchronous Receiver Transmitter).

Essa escolha se deu ao fato de a comunicação assíncrona só utilizar 2 pinos de IO, no caso da unidirecional, e 3 pinos no caso da bidirecional e ser um padrão bem popular, com um número bem grande de conversores USB-UART a baixo preço no mercado, e de fácil desenvolvimento de softwares de acesso. Os pinos usados são um para envio de dados, um para recebimento e um para tensão de referência. Outro fator que motivou a escolha da interface UART foi o fato de que a placa de desenvolvimento utilizada no projeto já compreendia um conversor USB-UART integrado, o que permitia ligar a placa diretamente na porta USB do computador para controlar o circuito, nos poupando da necessidade de adquirir hardware adicional para executar o projeto. A grande maioria das placas de desenvolvimento para FPGA atuais já compreende algum tipo de circuito conversor USB-UART.

Na Figura 14 podemos ver a porta USB utilizada no projeto.

Figura 15: Placa Avnet LX9 conectada à USB pela porta UART.

A interface UART é dividida em 2 blocos, um responsável pela recepção dos dados e outro responsável pelo envio.

3.7.1 Protocolo Serial

O protocolo de comunicação utilizado no projeto é o RS-232 com níveis de tensão de 0V a 3.3V.

Os dados no protocolo RS-232, na forma configurada no projeto, são enviados byte a byte, através de um frame que compreende 10 bits. Enquanto ociosa, a linha fica com sinal lógico 1. Para indicar o início da transmissão de um byte é enviado o chamado Start Bit que é sempre igual a ‘0’. Em seguida são enviados os 8 bits do byte e ao final é enviado o chamado Stop Bit, sendo este sempre ‘1’, para indicar que o byte já foi transmitido. A linha pode ou continuar em ‘1’ indicando ociosa, ou emendar em um bit ‘0’ indicando que outro byte está sendo recebido.

O protocolo é apresentado a seguir na Figura 15:

Figura 16: Configuração do protocolo UART usada no projeto.

3.7.2 Unidade Rx

A Unidade Rx é a unidade receptora UART. Ela é responsável por receber o frame de 10 bits através da porta serial, filtrar os 8 bits de dados e expô-los em uma saída paralela.

A Unidade Rx recebe dois sinais de entrada e dois de saída. Como entrada temos o clock interno da placa e o sinal de dados proveniente do pino receptor da porta serial. Como saída temos um sinal tipo flag que indica quando um byte foi recebido e está pronto para ser lido, e o outro é um barramento de 8 bits por onde o byte recebido pode ser lido.

A unidade Rx compreende uma máquina de estado, um registrador de deslocamento de 8 bits que guarda em sequência os bits recebidos, um contador para marcar o tempo de cada bit, um contador para controlar o número de bits já recebidos, um registrador que guarda os 8 bits recebidos ao final de cada leitura e um flip-flop que representa o flag indicador de byte recebido.

O receptor UART foi implementado através de uma máquina de estado, contendo quatro estados que podemos observar na imagem abaixo (Figura 16), seguido de uma explicação sobre cada estado.

Figura 17: Diagrama de estados da máquina de estado da unidade UART receptora.

Wait_Start_bit (Espera Start bit): É o estado inicial do receptor. Neste estado o receptor fica aguardando uma transição de nível alto para nível baixo no sinal de entrada da porta serial. No padrão RS232, uma porta em estado ocioso fica

em nível lógico alto constante e o que caracteriza o início da transmissão é a transição de ‘1’ para ‘0’ no sinal durante o tempo de um bit. Isto é o que caracteriza o “start bit”.

Start_bit (Recebe Start bit): Logo que o start bit é identificado, o receptor entra neste estado. Um contador é iniciado do zero e ele esperar o tempo equivalente a um bit e meio. Isto porque no próximo estado o receptor efetuará a leitura dos bit e é mais seguro que a leitura seja efetuada no centro da janela de tempo entre o início e final de cada bit. Esperando um bit e meio, o start bit passará por completo e o primeiro bit de dados estará aproximadamente na metade.

• Lendo_bits (Lê 1 bit): É o estado em que o receptor guarda o valor recebido na porta serial. Ligado à entrada da porta serial há um registrador de deslocamento de 8 bits que é deslocado de 1 e isto que caracteriza a leitura de um bit. Neste estado o receptor efetua a leitura de 1 bit, incrementa um contador de bits recebidos e espera mais o tempo equivalente a 1 bit para efetuar a leitura do próximo, até que o número de bits contados seja 8. Ao chegar neste ponto, o receptor seta a flag Rx_Flag, que indica que o byte recebido está pronto para ser lido na saída do bloco receptor da UART, e avança para o próximo estado, Stop_bit. A Rx_Flag fica em nível alto até o fim da transmissão do stop bit.

Stop_bit (Recebe Stop bit): Neste estado, como os 8 bits de dados já estão guardados no registrador de deslocamento, o receptor apenas esperar a passagem do stop bit para então voltar ao estado inicial onde fica aguardando um novo start bit para iniciar uma nova transmissão. Ao terminar o stop bit e voltar para o estado inicial, o receptor zera o contador e reseta a flag Rx_Flag.

3.7.3 Unidade Tx

A Unidade Tx é a unidade transmissora UART. Ela é responsável por montar e enviar um frame de 10 bits através do pino de saída da porta serial, a partir dos 8 bits de dados de um barramento interno.

O bloco que compõe a Unidade Tx recebe três sinais de entrada e dois de saída. Os sinais de entrada são um sinal de clock, uma entrada paralela de 8 bits e um sinal para iniciar a transmissão chamado de “go”. Na saída temos um sinal responsável pela transmissão dos

frames do protocolo serial com os bits serializados e um sinal tipo flag “Busy” para indicar se que a porta serial está ocupada, ou seja, está em processo de envio de bits.

A unidade Tx, assim como a unidade Rx, também compreende uma máquina de estado, no entanto, esta só tem dois estado: o em espera (Idle) e o enviando (Sending). A unidade Tx adicionalmente compreende um registrador de 10 bits usado para montar o frame do protocolo serial, um registrador de deslocamento e um contador de tempo que define a velocidade de transmissão e outro que conta o número de bits enviados.

O primeiro estado, o estado “Idle”, corresponde ao período ocioso da porta serial.

Neste período o nível lógico da saída fica continuamente em ‘1’. Quando há transição do sinal

“go” de nível lógico baixo para alto, ou seja, borda de subida, a unidade Tx inicia a transmissão. Neste momento, o byte na entrada paralela de dados da unidade Tx é guardado no buffer interno de 10 bits “outBuff” juntos com o Start bit e o Stop bit, ambos os contadores são zerados e a operação de envio se inicia. O flag “Busy” é setado e a máquina avança para o próximo estado, o “Sending”.

O próximo estado é o “Sending”, responsável pelo envio do frame serial armazenado no buffer interno “outBuff” no estado anterior. A unidade Tx desloca um bit do buffer

“outBuff” para a saída e inicia um contador que indicará quando passou o tempo equivalente a um bit. Passado este tempo, o contador de bits enviados é incrementado de um, o contador de tempo é reiniciado e o buffer interno é deslocado novamente, caracterizando assim a transmissão do próximo bit. O processo é repetido até que 10 bits sejam enviados. Quando isto ocorre, o estado da máquina retorna a “Idle” ou em espera e o flag “Busy” é resetado.

Enquanto um byte está sendo transmitido e por isto a flag “Busy” está setada, é possível deixar agendado a transmissão do próximo byte. Se a unidade Tx estiver em estado Idle, um pulso na entrada “go” iniciará a transmissão do byte na entrada. Se a unidade Tx estiver em estado Sending, a transmissão do próximo byte ficará agendada e será realizada assim que a transmissão atual for concluída. Se a unidade Tx estiver em estado Sending e já houver um byte a ser transmitido em espera, qualquer pulso na entrada Go será ignorado.

Deste modo evitamos que haja um delay entre cada byte enviado pois o circuito utilizando a porta serial não precisa esperar o término de cada envio para ordenar o próximo, no entando, ainda é preciso agendar o envio de cada byte à medida que os anteriores forem sendo enviados.

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