Criando uma UART e mostrando os dados recebidos em VHDL

Como criar um pino no FPGA com uma função de RX de uma UART, enviando dados do computador para o FPGA e mostrando o valor no display de 4 dígitos disponíveis na placa de desenvolvimento

Este projeto tem como função criar parte de uma UART (apenas o reciver), que ao receber um valor enviado por um computador, apresente seu valor em hexadecimal no display de 7 segmentos por 4 dígitos.

A UART consiste de uma entrada que recebe um byte, transmitindo-o de forma sequencial e alterando os estados desta porta. Por se tratar de uma comunicação assíncrona, é necessário que tanto o receptor quanto o transmissor saibam a velocidade de comunicação (baut rate).

Um ótimo artigo, que apresenta, detalhadamente, como detectar automaticamente o valor de baud rate é: “UART Autobaud em VHDL” escrito por Fábio Pereira.

Aqui, diferente do artigo citado, vamos nos concentrar em um projeto prático e mais simples, como enviar o valor de uma tecla de um computador para uma porta no FPGA.

Tabela Ascii

Nesta proposta, cada caractere recebido é mostrado no display com seu valor definido na tabela Ascii em hexadecimal. Essa tabela é definida na Wikipedia como :

A tabela ascii é a (do inglês American Standard Code for Information Interchange; “Código Padrão Americano para o Intercâmbio de Informação”) — geralmente pronunciado [áski] — é um código binário (cadeias de bits: 0s e 1s) que codifica um conjunto de 128 sinais: 95 sinais gráficos (letras do alfabeto latino, algarismos arábicos, sinais de pontuação e sinais matemáticos) e 33 sinais de controle, utilizando 7 bits para representar todos os seus símbolos.

Abaixo podemos ver uma representação da tabela Ascii.

Tabela Ascii
fonte: TechTudo

Portanto, esperamos verificar o valor do caractere enviado no display de 4 dígitos, como no exemplo: Tecla “m” = Display “006D”

Hardware

Para executar o projeto é necessário um hardware intermediário entre o computador e a placa de desenvolvimento. Para tanto utilizaremos um conversor USB para RS232. 

A seguir, podemos ver um esquemático que representa a conexão do sistema.

TeraTerm

O envio de dados é feito utilizando o software open source TeraTerm, com o conversor UBS conectado. Para configurar, vá na guia Setup > Serial Port e a seguinte tela será apresentada.

image 26

Ajuste o item Speed como 115200. Esse parâmetro representa o baud rate.

Top Level

Na figura abaixo é possível verificar o top level do projeto. Ele consiste em uma entrada de comunicação serial, quatro conversores bcd para sete segmentos e um multiplexador para separar os dígitos no display de 7 segmentos por 4 dígitos (os dois últimos citados, estão presentes no projeto anterior).

UART

Máquina de estados

Para o controle do Reciver é necessário desenvolver uma máquina de estados composta de 5 estados:

Idle_s: Detecta o start bit foi para 0.

RX_Start_Bit_s: Verifica mais uma vez se o start bit continua em 0.

RX_Data_Bits_s: Responsável por coletar os bits de dados.

RX_Stop_Bits_s: Sinaliza o fim da recepção e ativa o RX_DV_r.

Cleanuo_s: Desativa RX_DV_r e retorna para Idle_s.

UART

UART RX

Como base para esse trecho do projeto, usamos a descrição de hardware disponibilizada no site Nandland. Um dos pontos mais interessantes desta exposição é a forma como devemos calcular o baud rate, (seguindo a fórmula abaixo) e então passarmos este valor através do parâmetro genérico CLKS_PER_BIT_g.

Valor = Frequência de clock / Frequência de uart

No caso dessa concepção, o cristal de clock disponível na placa de desenvolvimento é de 50 Mhz, e o baud rate que usaremos é 115200, sendo assim, a conta resultante é:

Valor = 50.000.000 / 115200 ≈ 434

Podemos ver a descrição do pino RX, a seguir.

TOP Level VHDL

Quando recebido o stop_bit, o dado do byte coletado fica disponível em um vetor com 8 posições (RX_Byte_o), na qual os 4 bits mais significativos irão para o conversor BCD para sete segmentos, e os outros 4 bits são conectados ao outro conversor BCD.

A apresentação desse componente e do multiplexador de 4 dígitos estão disponíveis abaixo e sua explicação está detalhada no projeto anterior.

BCD para 7 segmentos

Mux para 4 dígitos

Teste

Após efetuar a compilação do projeto devemos fazer o pin planer (a conexão entre o pino físico e o pino gerado pela descrição), a tabela está disponível na figura abaixo.

UART

E, por último, conectamos o TX e o GND do conversor FTDI aos pinos i_UART_RX (76 do conector P2) e GND (do conector P2), respectivamente.

Com o sistema ligado, ao pressionarmos uma tecla no TeraTerm podemos ver o resultado no display da placa de desenvolvimento, como no vídeo a seguir:

UART

Conclusão

Uma vantagem do FPGA é poder utilizar grande parte dos pinos como parte de UART, independentes entre si. O exemplo apresentado é apenas para fins didáticos, mas ajuda a compreender a mecânica da comunicação serial.

Na próxima etapa devo apresentar a descrição de hardware do TX juntamente com o Testbench do RX e TX, então acompanhe o blog para mais novidades.

Caso deseje consultar, os arquivos deste projeto estão disponíveis neste link do Github. Em caso de dúvidas por favor entre em contato.

Saiba Mais

Tabela ASCII

VERILOG vs VHDL – Precisamos falar sobre esse assunto

Dica de livro: VHDL – Descrição e Síntese de Circuitos Digitais

Notificações
Notificar
guest
3 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
Marco Gonzaga
Marco Gonzaga
20/07/2021 10:21

Muito bom ! Parabens pelo exemplo vai me ajudar muito aqui. Estou precisando de uma implementação para ler/gravar um SDCARD. Existe aqui no embarcados algum exemplo ? Voce teria como me ajudar ? Obrigado.

Marco Gonzaga
Marco Gonzaga
Reply to  Vinicius Mylonas
21/07/2021 10:58

Olá Vinicius !
Muito obrigado pela resposta. Estarei te enviando um email.

Abraço.

WEBINAR

Visão Computacional para a redução de erros em processos manuais

DATA: 23/09 ÀS 17:00 H