O padrão VGA, apesar de antigo, ainda é encontrado em muitos monitores. Por conta disso, é interessante conhecer como a troca de informações ocorre neste padrão. Desta forma, este post mostrará como este padrão funciona.
O que é o VGA
Conceito
Antes de ver o funcionamento do VGA, é importante entender o que ele é exatamente.
Bem, VGA significa “Video Graphics Array”. E, o nome não deixa exatamente claro, mas ele é um padrão de vídeo criado para facilitar a comunicação entre computadores (principalmente) e monitores.
Este padrão diz respeito a forma como os dados são transmitidos do computador para o monitor. Consequentemente, o conector para ligar os dois dispositivos também é padronizado.
E o conector é normalmente chamado de conector VGA, mas seu nome correto é DE-15 (o 15 é devido aos 15 pinos presentes no conector). As figuras abaixo mostram o conector DE-15 macho e fêmea.
Características gerais
A resolução (quantidade de pixels da tela) normalmente tratada no padrão VGA é de 640×480. Entretanto, alguns monitores com padrão “VGA” podem apresentar resoluções maiores ou menores que esta. Na realidade, estes outros casos recebem outros nomes, como CGA (320×200).
Além disto, o VGA pode apresentar dois modos de cores: 16 ou 256 cores. Isto quer dizer que a variação máxima de cores do monitor será 16 ou 256. O que é pouco comparado com as telas dos dias de hoje que podem apresentar até 1 bilhão de cores diferentes.
Pinos do conector VGA
O primeiro passo para entender o funcionamento é conhecer os pinos do padrão VGA e quais são seus propósitos.
Formato
A imagem abaixo mostra os pinos e a numeração correspondente do conector fêmea.
A numeração do conector macho é espelhada, isto é, o 1 começa na parte superior esquerda da imagem.
A partir da imagem temos os principais pinos:
- 1 – Canal da cor vermelha.
- 2 – Canal da cor verde.
- 3 – Canal da cor azul.
- 5 – Terra.
- 6 – Terra do canal da cor vermelha.
- 7 – Terra do canal da cor verde.
- 8 – Terra do canal da cor azul.
- 10 – Terra do sincronismo.
- 13 – Sincronismo horizontal.
- 14 – Sincronismo vertical.
Canais de cores
Os 3 primeiros pinos servem para definir a cor de um pixel, sendo o primeiro responsável pela cor vermelha, o segundo pela verde e o terceiro pela azul (RGB). Estes devem receber tensões de 0 a 0,7V. E, a cor reproduzida no pixel será conforme:
- A intensidade da tensão, nos pinos.
- Ex: 0.7V intensidade máxima da cor e 0V intensidade mínima.
- Somatória das cores nos três canais.
Exemplo: os 3 pinos em 0.7V produzem pixels brancos, pois a somatória das cores vermelho, verde e azul produz a cor branca. E, se os 3 estiverem em 0V, a cor resultante será preto (ausência das três cores). As demais combinações formam outras cores (amarelo, laranja, cinza etc).
Pinos de sincronismo
O padrão VGA possui dois pinos responsáveis por ditar os tempos de “escrita” do vídeo. Portanto, eles são responsáveis pelo sincronismo da comunicação. Para entendê-los, temos que imaginar que a tela do monitor é dividida em várias linhas. No caso da resolução 640×480, é como se houvessem 480 linhas com 640 pixels em cada uma.
O pino do sincronismo horizontal é responsável pelo sincronismo de cada linha da tela. Isto é, toda vez que o monitor começa a desenhar uma nova linha. Já o pino de sincronismo vertical é responsável pelo sincronismo da atualização da tela. Isto é, toda vez que o monitor começa a desenhar uma nova tela.
Os níveis de tensão nestes pinos são de acordo com a lógica digital (TTL).
Funcionamento
A explicação será baseada na resolução de 640×480 pixels com uma taxa de atualização de 60Hz.
O funcionamento do VGA gira em torno dos pinos de sincronismo, portanto vamos entender o que eles fazem.
Sincronismo vertical
Como o sincronismo vertical está relacionado com a atualização da tela, ele está ligado diretamente com a taxa de atualização do monitor. E, o valor comum desta taxa é 60Hz. Isto significa que o monitor é atualizado a cada 16,67ms (1/60).
Tendo disto isto, o sincronismo vertical deve ser um pulso com as seguintes características:
- Deve repetir a cada 16,67ms para uma taxa de atualização de 60Hz.
- Isto nada mais é do que o período do sinal de sincronismo vertical.
- Deve possuir uma largura equivalente ao tempo para escrever 2 linhas.
- Este tempo será discutido mais adiante.
Veja o formato do sinal de sincronismo vertical abaixo:
Sincronismo horizontal
O sincronismo horizontal deve ser um pulso com as seguintes características:
- Deve se repetir a cada início de linha.
- Isto nada mais é do que o período do sinal.
- Deve possuir uma largura equivalente ao tempo para “escrever” 96 pixels.
- Este tempo será discutido mais adiante.
Veja o formato do sinal de sincronismo horizontal abaixo:
Repare que o tempo de uma linha será bastante inferior aos 16,67ms do sincronismo vertical, pois dentro de uma mesma tela existem diversas linhas.
Estrutura do vídeo
Obs.: Usarei a palavra “vídeo” para descrever a imagem momentaneamente formada. De qualquer forma, um vídeo (movimento) é basicamente uma sucessão de imagens passando de forma rápida.
Para entender como o funcionamento do sincronismo se junta com o dos pinos dos canais de cores, é importante entender o diagrama de pixels enviados para formar o vídeo (imagem momentânea).
O diagrama nada mais é do que o conjunto de todos os pixels enviados para o monitor. E não é algo intuitivo como apenas os 640×480 pixels da imagem. Veja o diagrama abaixo para entender (ele contem muita informação, portanto será explicado com calma).
Na realidade, os pixels não são “enviados”, eles são formados de acordo com o valor de tensão dos canais de cores no momento em que o sincronismo horizontal está formando a linha deste determinado pixel. Ou seja, no momento da “varredura” do sincronismo horizontal, a cor do pixel é ditada pela tensão dos canais de cores.
A explicação da imagem está dividida nos tópicos seguintes.
Pixels adicionais do vídeo
Os conjuntos de pixels que estão além do vídeo exibido (Back porch, Front porch etc) possuem diferentes funções. Os de sincronismo vertical e horizontal servem justamente como sincronismo para o monitor.
Já os conjuntos Back porch e Front porch tanto vertical quanto horizontal, serviam a um propósito muito importante em monitores antigos de tubo. Que no caso era de gerar um atraso na comunicação para dar tempo do “cursor” do tubo de raios catódicos retornar para o começo de uma linha ou para o começo da tela. Mas eles ainda existem no padrão atual do VGA.
Obs.: Não existe uma tradução boa para os termos back porch e front porch, então utilizei o nome original mesmo. Se quiser ler um pouco mais sobre o propósito deles, recomendo ler esta resposta.
Tempo de cada linha
De acordo com o diagrama de pixels enviados, podemos perceber que são enviados na realidade 800×525 pixels. Com isto, podemos calcular o tempo de duração de cada linha e de cada pixel.
No caso, a imagem toda demora 16,67ms para ser formada, portanto, se dividirmos este valor por 525 (quantidade de linhas) teríamos o tempo de duração de cada linha:
Então, cada linha do vídeo demora 31,75μs para ser formada. Conforme foi dito anteriormente, este tempo é igual ao período do sinal de sincronismo horizontal. E a largura do pulso do sincronismo vertical será 2 vezes este tempo (~63,5μs).
Tempo de cada pixel
O cálculo do tempo de cada pixel não tem mistério, pois basta dividir o tempo que demora para formar a imagem toda (16,67ms) pela quantidade total de pixels enviados (800*525):
Este valor vezes 96 equivale à largura do pulso de sincronismo horizontal.
Então, a formação de cada pixel dura 39,68ns, que é um tempo bem pequeno. Tanto é que, para um sistema ser capaz de processar os pixels, ele precisaria de um clock de no mínimo 25,200MHz.
Considerando os computadores modernos, este clock é desprezível, já que os processadores atuais possuem clock na faixa de GHz. Entretanto, os sistemas com microcontroladores mais simples trabalham com clock na faixa de alguns MHz (ex: 16MHz). Logo, estes sistemas (com microcontroladores) não são capazes de lidar com o processamento do vídeo de forma completa.
Vídeo exibido
Conforme foi dito, o pixel da imagem é formado durante a “varredura” do sincronismo horizontal:
Isto ocorre no momento em que a comunicação chega na região do “Vídeo exibido”. Que é 35 linhas após o começo da tela mais o tempo de 144 pixels (96+48). Como sabemos o tempo de cada linha e o tempo de cada pixel, dá para calcular o momento em que a comunicação chega nesta parte.
Desta forma, durante toda a região do “Vídeo exibido”, os pixels da imagem serão formados a partir do valor de tensão que chega nos canais de cores.
Para exemplificar, considere que a comunicação acabou de entrar na região do “Vídeo exibido”:
As tensões em cima dos canais são iguais a 0,7V (exemplo), então o primeiro pixel da imagem será branco. Após 39,68ns o próximo pixel será formado, mas desta vez a tensão em cima dos canais é 0V (exemplo), então o 2º pixel será preto. E assim os pixels da linha vão sendo formados.
Por definição, quando a linha chega no front porch horizontal (últimos 16 pixels), os canais de cor devem ficar zerados. Se isto não for obedecido, os pixels da linha podem ser “desfeitos”.
Enfim, o procedimento todo ficará mais claro com o exemplo do tópico seguinte.
Exemplo em uma comunicação real
Sinal amostrado
Para exemplificar melhor como o padrão VGA funciona, utilizei um analisador lógico (“osciloscópio digital”) para extrair os sinais de uma comunicação real. No caso, a comunicação foi entre um Arduino e um monitor VGA (mostrarei como fazer isto em outro post).
Os sinais analisados foram do sincronismo vertical, horizontal e do canal da cor verde. E, nas imagens seguintes, o sinal mais acima é o do sincronismo vertical, o do meio é o do sincronismo horizontal e o mais abaixo é o sinal do canal da cor verde.
A indicação é de apenas nível alto ou baixo. No caso do canal de cor, considere o nível alto como sendo 0,7V (apesar de ser 5V na realidade, pois tem o mesmo efeito prático que o 0,7V). E, a imagem sendo gerada é uma tela totalmente verde, portanto o canal verde ficará em alta o tempo todo na região do “Vídeo exibido”.
Explicação
Na primeira imagem podemos ver que o período do sincronismo vertical é de fato 16,67ms e a duração do pulso, apesar de não estar indicado, é de 64μs (tempo de 2 linhas). E, durante todo o período do sincronismo vertical, a imagem é formada.
Repare que o canal da cor verde só aparece um tempo após o pulso vertical e desaparece um tempo antes do período acabar. Isto é porque o sinal do canal da cor verde só está presente na região do “Vídeo exibido”. Ou seja, ele só começa após o back porch vertical e termina antes do front porch vertical.
Na segunda imagem, é possível observar isto também, mas para o sincronismo horizontal: O sinal do canal da cor verde só fica presente após o back porch horizontal e termina antes do front porch horizontal (~400ns).
E, a partir da segunda imagem, vemos que o período do sincronismo horizontal é próximo dos 31,75μs. A imprecisão advêm do fato de que o sinal gerado foi de um Arduino UNO (configuração imprecisa da geração do sinal).
Referências
A seguir estão alguns links úteis que utilizei como base para o post:
hola en este momento estoy haciendo un proyecto de visualizacion en monitor via VGA QUISIERA SABER SI TIENEN ESTE PROGRAMA EN MPLAB PIC32
Hola, Henry! Desafortunadamente, solo tengo el código en Arduino, como puedes ver en este post.
OLÁ ENRRIQUE PODE FAZER O CONTROLADOR VGA NO MPLAB?
Excelente explicação! Estou trabalhando em um projeto de criar um jogo simples em FPGA para ser exibido através de uma conexão VGA. Me ajudou bastante.