Exibindo caracteres ASCII com controlador VGA – Parte 3

Confira neste artigo um procedimento para exibir caracteres ASCII com controlador VGA, que descreve sinais de sincronismo e varredura de frame.
VGA controlador VGA caracteres ASCII com controlador VGA
Este post faz parte da série Controlador VGA. Leia também os outros posts da série:

Olá, caro leitor. Recentemente escrevi sobre o controlador VGA, descrevendo os sinais de sincronismo e o processo de varredura de um frame. Como procedimento de teste, foram utilizados os sinais de controle das componentes RGB para demonstrar as possíveis combinações de cores. Neste artigo, apresentarei um procedimento para exibir caracteres ASCII com controlador VGA, criado anteriormente.  

Caracteres ASCII

ASCII é acrônimo de American Standard Code for Information Interchange (em português significa Código Padrão Americano para o Intercâmbio de Informação). Esses códigos são valores binários utilizados para representar caracteres, sendo 7 bits utilizados para esse fim. Os caracteres são mostrados na Figura 1.

Tabela ASCII.
Figura 1: Tabela ASCII.

Representação dos caracteres

O procedimento mostrado aqui é propriedade do Dr. Pong P. Chu. Todo material dele pode ser encontrado neste link. A estrutura proposta por Chu é a seguinte. Todos os 128 caracteres são armazenados em uma memória, em que um determinado byte corresponde à parte da representação de um caractere.

O arquivo font_rom.vhd, que representa essa memória, pode ser verificado neste link (code listing – capítulo 13). Basicamente, esse módulo define um array de valores do tipo std_logic_vector e possui um conjunto de sinais para determinar o endereço os dados de leitura. Essas operações são sincronizadas pelo sinal de clock.

De modo geral, um caractere completo é composto por 16 linhas. Por conseguinte, um caractere ocupa 16 bytes de memória, ou 16×8 bits. Assim, a largura de um caractere é de 8 pixels. A Figura 2 mostra como o caractere ‘A’ é armazenado na memória.

Representação dos caracteres armazenados na memória.
Figura 2: Representação dos caracteres armazenados na memória.

Cabe ressaltar que cada pixel é representado por um bit. O código abaixo mostra o procedimento executado sempre que ocorre uma borda de subida no sinal de clock. Uma pequena alteração no módulo foi realizada para que sua saída seja alterada conforme endereço determinado no momento do evento de clock.

Para acessar toda a informação de um caractere, basta saber o seu endereço base. Dessa maneira, o código ASCII do caractere determina os bits mais significativos do endereço. Já os bits menos significativos determinam a linha, ou região, atual que está sendo exibida. 

Exibindo caracteres

Para exibir os caracteres, somente o módulo PixelGen será alterado. É importante lembrar que tal módulo já recebia como entrada as coordenadas X e Y, relativas aos processo de varredura definido no controlador VGA. Assim, esse valores serão utilizados como estrutura condicional para apresentar no monitor a frase “portal embarcados”. Antes de descrever o procedimento para escrita, vamos definir os sinais que serão utilizados no módulo PixelGen.

O endereço que será acessado na memória de caracteres é composto pelo código do caractere e da respectiva linha. É importante lembrar que os caracteres possuem 16 linhas. Logo, os 4 bits menos significativos da posição vertical definem qual byte da representação do caractere será acessado. Esse procedimento é mostrado abaixo, em que o endereço completo é a concatenação dos sinais char_addr com row_addr.

Além disso, o conteúdo dessa posição deve ser lido corretamente. Considerando o sinal X da varredura horizontal e o tamanho de 8 bits da largura de um caractere, tem-se que os 3 bits menos significativos representam o pixel que deve ser acessado. Porém, a ordem dos bits é inversa, pois quando X é “000”, o bit acessado deve ser o da posição 7. O procedimento que faz essa operação é mostrado abaixo. 

Tendo essas definições, basta definir quais caracteres serão apresentados e sua respectiva posição. Para isso, um sinal booleano indica quando as coordenadas X e Y estão dentro da região que a frase será exibida. Já em outro trecho de código, com base na posição X, um caractere será selecionado. É importante lembrar que esse código do caractere compõe o endereço acessado na memória ROM.

Neste exemplo, a frase será exibida a partir da posição X=320 e Y=292. No sinal pix_x, são verificados somente os bits da posição 7 até 3. Isso ocorre pois os 3 bits menos significativos indicam a coluna do caractere. Portanto, a cada 8 posições, um novo caractere é exibido. Dessa maneira, esses bits representam qual caractere deve ser exibido.

Além disso, o trecho de código abaixo realiza o acionamento das componentes RGB. É importante destacar que isso depende do sinal que indica a região ativa do frame VGA ‘F_ON’, da regra ‘txt_on’ que define se a mensagem deve ser exibida e do próprio valor do pixel ‘font_bit’.

Antes de testar, cabe ressaltar que a leitura dos caracteres implica em um atraso de um ciclo de clock. Logo, o sinal de clock da font_rom é oposto ao clock principal, de forma que os sinais de controle estejam em sincronismo com os valores do pixel. Isso foi exibido no trecho de código acima.

Além disso, o módulo principal foi alterado para acionar os pinos de controle VGA conforme o sinal de clock. Esse procedimento é importante para que os sinais de controle sejam estabelecidos nos pinos no mesmo instante.

O controlador VGA em operação é mostrado na Figura 3.

Teste do controlador VGA.
Figura 3: Teste do controlador VGA.

O código completo de Pixelgen.vhd é mostrado abaixo.

Já o módulo principal:

Após as alterações, o novo controlador VGA é mostrado na Figura 4.

Controlador VGA.
Figura 4: Controlador VGA.

Para saber mais

Para quem quiser se aprofundar, outras metodologias são propostas por Chu. Por exemplo, os caracteres que devem ser exibidos podem ser armazenados em uma segunda memória. Dessa maneira, os endereços que são acessados na memória de fonte dependem dos caracteres armazenados na outra memória além das coordenadas XY. Em outros exemplos você pode até jogar Pong! Vale a pena conferir o material.

Referências

Outros artigos da série

<< Controlador VGA – Parte 2

Fascinado por computação, especialmente na interface entre hardware e software, me engajei na área de sistemas embarcados. Atuo com desenvolvimento de sistemas embarcados e sou docente da Faculdade de Engenharia de Sorocaba.

Para mais informações: https://about.me/fdelunogarcia

Notificações
Notificar
guest
2 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
Ricardo
Ricardo
28/12/2020 10:53

bom dia, professor Fernando, estou em um projeto com meu professor, e estou utilizando como base seus artigos sobre VGA. Mas preciso programar em C, como posso enrar em contato contigo, para lhe passar mais detalhes, caso possa me ajudar?

Rodolfo Diego
Rodolfo Diego
30/09/2018 22:31

Olá camarada, estou fazendo um projeto de criptografia em FPGA, com uma interface de entrada(teclado PS/2) e uma interface de saída(VGA/monitor), estou tendo dificuldade na parte do texto, pois estou querendo exibir no monitor o texto claro e depois que mandar um comando através do teclado PS/2 o texto criptografado também, o problema é que meu módulo de criptografia a entrada e a saída ambas são de 64 bits e a saída do meu módulo de tratamento de PS/2 é 7 bits, como eu posso criar um tipo de memória para acumular saídas de 7 bits até chegar em 64… Leia mais »

WEBINAR

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

DATA: 23/09 ÀS 17:00 H